diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 5140a0743b1..21e66ec05be 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -26,7 +26,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v4.0.0 + placeholder: v4.0.1 validations: required: true - type: dropdown @@ -34,10 +34,9 @@ body: label: Python Version description: What version of Python are you currently running? options: - - "3.8" - - "3.9" - "3.10" - "3.11" + - "3.12" validations: required: true - type: textarea diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 83125b4fa01..671fdbf87a2 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: v4.0.0 + placeholder: v4.0.1 validations: required: true - type: dropdown diff --git a/contrib/generated_schema.json b/contrib/generated_schema.json index b6632dd4c1e..fe9d56b34cb 100644 --- a/contrib/generated_schema.json +++ b/contrib/generated_schema.json @@ -353,6 +353,8 @@ "800gbase-x-qsfpdd", "800gbase-x-osfp", "1000base-kx", + "2.5gbase-kx", + "5gbase-kr", "10gbase-kr", "10gbase-kx4", "25gbase-kr", diff --git a/contrib/uwsgi.ini b/contrib/uwsgi.ini index d6480315857..a8bedc1d752 100644 --- a/contrib/uwsgi.ini +++ b/contrib/uwsgi.ini @@ -11,8 +11,24 @@ master = true ; clear environment on exit vacuum = true +; make SIGTERM stop the app (instead of reload) +die-on-term = true + ; exit if no app can be loaded need-app = true ; do not use multiple interpreters single-interpreter = true + +; change to the project directory +chdir = netbox + +; specify the WSGI module to load +module = netbox.wsgi + +; workaround to make uWSGI reloads work with pyuwsgi (not to be used if using uwsgi package instead) +binary-path = venv/bin/python + +; only log internal messages and errors (reverse proxy already logs the requests) +disable-logging = true +log-5xx = true diff --git a/docs/development/adding-models.md b/docs/development/adding-models.md index 7de897a9738..823789641ae 100644 --- a/docs/development/adding-models.md +++ b/docs/development/adding-models.md @@ -77,7 +77,7 @@ Create the following for each model: ## 13. GraphQL API components -Create a Graphene object type for the model in `graphql/types.py` by subclassing the appropriate class from `netbox.graphql.types`. +Create a GraphQL object type for the model in `graphql/types.py` by subclassing the appropriate class from `netbox.graphql.types`. Also extend the schema class defined in `graphql/schema.py` with the individual object and object list fields per the established convention. diff --git a/docs/development/release-checklist.md b/docs/development/release-checklist.md index 48f72aa9f8d..875b2b869f6 100644 --- a/docs/development/release-checklist.md +++ b/docs/development/release-checklist.md @@ -72,7 +72,7 @@ In cases where upgrading a dependency to its most recent release is breaking, it ### Update UI Dependencies -Check whether any UI dependencies (JavaScript packages, fonts, etc.) need to be updated by running `yarn outdated` from within the `project-static/` directory. [Upgrade these dependencies](http://0.0.0.0:9000/development/web-ui/#updating-dependencies) as necessary, then run `yarn bundle` to generate the necessary files for distribution. +Check whether any UI dependencies (JavaScript packages, fonts, etc.) need to be updated by running `yarn outdated` from within the `project-static/` directory. [Upgrade these dependencies](./web-ui.md#updating-dependencies) as necessary, then run `yarn bundle` to generate the necessary files for distribution. ### Rebuild the Device Type Definition Schema diff --git a/docs/installation/4b-uwsgi.md b/docs/installation/4b-uwsgi.md index 3b7b5f76cd2..c8d1437a0a4 100644 --- a/docs/installation/4b-uwsgi.md +++ b/docs/installation/4b-uwsgi.md @@ -17,7 +17,7 @@ pip3 install pyuwsgi Once installed, add the package to `local_requirements.txt` to ensure it is re-installed during future rebuilds of the virtual environment: ```no-highlight -sudo sh -c "echo 'pyuwgsi' >> /opt/netbox/local_requirements.txt" +sudo sh -c "echo 'pyuwsgi' >> /opt/netbox/local_requirements.txt" ``` ## Configuration diff --git a/docs/integrations/graphql-api.md b/docs/integrations/graphql-api.md index 724e4e73d9c..3ccb4d4a19f 100644 --- a/docs/integrations/graphql-api.md +++ b/docs/integrations/graphql-api.md @@ -1,6 +1,6 @@ # GraphQL API Overview -NetBox provides a read-only [GraphQL](https://graphql.org/) API to complement its REST API. This API is powered by the [Graphene](https://graphene-python.org/) library and [Graphene-Django](https://docs.graphene-python.org/projects/django/en/latest/). +NetBox provides a read-only [GraphQL](https://graphql.org/) API to complement its REST API. This API is powered by [Strawberry Django](https://strawberry-graphql.github.io/strawberry-django/). ## Queries @@ -47,7 +47,7 @@ NetBox provides both a singular and plural query field for each object type: For example, query `device(id:123)` to fetch a specific device (identified by its unique ID), and query `device_list` (with an optional set of filters) to fetch all devices. -For more detail on constructing GraphQL queries, see the [Graphene documentation](https://docs.graphene-python.org/en/latest/) as well as the [GraphQL queries documentation](https://graphql.org/learn/queries/). +For more detail on constructing GraphQL queries, see the [GraphQL queries documentation](https://graphql.org/learn/queries/). For filtering and lookup syntax, please refer to the [Strawberry Django documentation](https://strawberry-graphql.github.io/strawberry-django/guide/filters/). ## Filtering diff --git a/docs/plugins/development/graphql-api.md b/docs/plugins/development/graphql-api.md index 05f11704c39..603b0ceadf0 100644 --- a/docs/plugins/development/graphql-api.md +++ b/docs/plugins/development/graphql-api.md @@ -2,7 +2,7 @@ ## Defining the Schema Class -A plugin can extend NetBox's GraphQL API by registering its own schema class. By default, NetBox will attempt to import `graphql.schema` from the plugin, if it exists. This path can be overridden by defining `graphql_schema` on the PluginConfig instance as the dotted path to the desired Python class. This class must be a subclass of `graphene.ObjectType`. +A plugin can extend NetBox's GraphQL API by registering its own schema class. By default, NetBox will attempt to import `graphql.schema` from the plugin, if it exists. This path can be overridden by defining `graphql_schema` on the PluginConfig instance as the dotted path to the desired Python class. ### Example diff --git a/docs/plugins/development/index.md b/docs/plugins/development/index.md index 9aa75ce4a19..c042be6ec7e 100644 --- a/docs/plugins/development/index.md +++ b/docs/plugins/development/index.md @@ -55,18 +55,20 @@ project-name/ - template_content.py - urls.py - views.py + - pyproject.toml - README.md - - 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. +* `pyproject.toml` - is a standard configuration file used to install the plugin package within the Python environment. * `README.md` - 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 to enable human-friendly display. * The plugin source directory. This must be a valid Python package name, typically comprising only lowercase letters, numbers, and underscores. 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, discussed below. +**Note:** The [Cookiecutter NetBox Plugin](https://github.com/netbox-community/cookiecutter-netbox-plugin) can be used to auto-generate all the needed directories and files for a new plugin. + ## 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: @@ -136,31 +138,48 @@ Apps from this list are inserted *before* the plugin's `PluginConfig` in the ord Any additional apps must be installed within the same Python environment as NetBox or `ImproperlyConfigured` exceptions will be raised when loading the plugin. -## Create setup.py +## Create pyproject.toml -`setup.py` is the [setup script](https://docs.python.org/3.10/distutils/setupscript.html) used to package and 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 control the package creation as well as to provide metadata about the plugin. An example `setup.py` is below: +`pyproject.toml` is the [configuration file](https://packaging.python.org/en/latest/guides/writing-pyproject-toml/) used to package and install our plugin once it's finished. It is used by packaging tools, as well as other tools. The primary function of this file is to call the build system to create a Python distribution package. We can pass a number of keyword arguments to control the package creation as well as to provide metadata about the plugin. There are three possible TOML tables in this file: -```python -from setuptools import find_packages, setup +* `[build-system]` allows you to declare which build backend you use and which other dependencies (if any) are needed to build your project. +* `[project]` is the format that most build backends use to specify your project’s basic metadata, such as the author's name, project URL, etc. +* `[tool]` has tool-specific subtables, e.g., `[tool.black]`, `[tool.mypy]`. Consult the particular tool’s documentation for reference. + +An example `pyproject.toml` is below: + +``` +# See PEP 518 for the spec of this file +# https://www.python.org/dev/peps/pep-0518/ + +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" + +[project] +name = "my-example-plugin" +version = "0.1.0" +authors = [ + {name = "John Doe", email = "test@netboxlabs.com"}, +] +description = "An example NetBox plugin." +readme = "README.md" + +classifiers=[ + 'Development Status :: 3 - Alpha', + 'Intended Audience :: Developers', + 'Natural Language :: English', + "Programming Language :: Python :: 3 :: Only", + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', +] + +requires-python = ">=3.10.0" -setup( - name='my-example-plugin', - version='0.1', - description='An example NetBox plugin', - url='https://github.com/jeremystretch/my-example-plugin', - 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). - -!!! info - `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) +Many of these are self-explanatory, but for more information, see the [pyproject.toml documentation](https://packaging.python.org/en/latest/specifications/pyproject-toml/). ## Create a Virtual Environment @@ -178,11 +197,12 @@ echo /opt/netbox/netbox > $VENV/lib/python3.10/site-packages/netbox.pth ## Development Installation -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`): +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 `pip` from the plugin's root directory with the `-e` flag: ```no-highlight -$ python setup.py develop +$ pip install -e . ``` +More information on editable builds can be found at [Editable installs for pyproject.toml ](https://peps.python.org/pep-0660/). ## Configure NetBox diff --git a/docs/release-notes/version-4.0.md b/docs/release-notes/version-4.0.md index 4f8b0f29a00..42926243b29 100644 --- a/docs/release-notes/version-4.0.md +++ b/docs/release-notes/version-4.0.md @@ -1,5 +1,34 @@ # NetBox v4.0 +## v4.0.1 (2024-05-09) + +### Enhancements + +* [#15148](https://github.com/netbox-community/netbox/issues/15148) - Add copy-to-clipboard button for config context data +* [#15328](https://github.com/netbox-community/netbox/issues/15328) - Add a virtual machines UI tab for host devices +* [#15451](https://github.com/netbox-community/netbox/issues/15451) - Add 2.5 and 5 Gbps backplane Ethernet interface types +* [#16010](https://github.com/netbox-community/netbox/issues/16010) - Enable Prometheus middleware only if metrics are enabled + +### Bug Fixes + +* [#15968](https://github.com/netbox-community/netbox/issues/15968) - Avoid resizing quick search field to display clear button +* [#15973](https://github.com/netbox-community/netbox/issues/15973) - Fix AttributeError exception when modifying cable termination type +* [#15977](https://github.com/netbox-community/netbox/issues/15977) - Hide all admin menu items for non-authenticated users +* [#15982](https://github.com/netbox-community/netbox/issues/15982) - Restore the "assign IP" tab for assigning existing IP addresses to interfaces +* [#15992](https://github.com/netbox-community/netbox/issues/15992) - Fix AttributeError exception when Sentry integration is enabled +* [#15995](https://github.com/netbox-community/netbox/issues/15995) - Permit nullable fields referenced by unique constraints to be omitted from REST API requests +* [#15999](https://github.com/netbox-community/netbox/issues/15999) - Fix layout of login form labels for certain languages +* [#16003](https://github.com/netbox-community/netbox/issues/16003) - Enable cache busting for `setmode.js` asset to avoid breaking dark mode support on upgrade +* [#16011](https://github.com/netbox-community/netbox/issues/16011) - Fix site tenant assignment by PK via REST API +* [#16020](https://github.com/netbox-community/netbox/issues/16020) - Include Python version in system UI view +* [#16022](https://github.com/netbox-community/netbox/issues/16022) - Fix database migration failure when encountering a script module which no longer exists on disk +* [#16025](https://github.com/netbox-community/netbox/issues/16025) - Fix execution of scripts via the `runscript` management command +* [#16031](https://github.com/netbox-community/netbox/issues/16031) - Render Markdown content in script log messages +* [#16051](https://github.com/netbox-community/netbox/issues/16051) - Translate "empty" text for object tables +* [#16061](https://github.com/netbox-community/netbox/issues/16061) - Omit hidden fields from display within event rule edit form + +--- + ## v4.0.0 (2024-05-06) !!! tip "Plugin Maintainers" diff --git a/netbox/circuits/api/serializers_/circuits.py b/netbox/circuits/api/serializers_/circuits.py index b59c73f09cc..a0d0e5e134b 100644 --- a/netbox/circuits/api/serializers_/circuits.py +++ b/netbox/circuits/api/serializers_/circuits.py @@ -48,7 +48,7 @@ class CircuitCircuitTerminationSerializer(WritableNestedSerializer): class CircuitSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuit-detail') provider = ProviderSerializer(nested=True) - provider_account = ProviderAccountSerializer(nested=True, required=False, allow_null=True) + provider_account = ProviderAccountSerializer(nested=True, required=False, allow_null=True, default=None) status = ChoiceField(choices=CircuitStatusChoices, required=False) type = CircuitTypeSerializer(nested=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/circuits/api/serializers_/providers.py b/netbox/circuits/api/serializers_/providers.py index 302c2da5a8c..fa448978777 100644 --- a/netbox/circuits/api/serializers_/providers.py +++ b/netbox/circuits/api/serializers_/providers.py @@ -45,6 +45,7 @@ class ProviderSerializer(NetBoxModelSerializer): class ProviderAccountSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provideraccount-detail') provider = ProviderSerializer(nested=True) + name = serializers.CharField(allow_blank=True, max_length=100, required=False, default='') class Meta: model = ProviderAccount diff --git a/netbox/circuits/tests/test_api.py b/netbox/circuits/tests/test_api.py index c8ec08943f3..d3745f2b155 100644 --- a/netbox/circuits/tests/test_api.py +++ b/netbox/circuits/tests/test_api.py @@ -141,7 +141,7 @@ class CircuitTest(APIViewTestCases.APIViewTestCase): { 'cid': 'Circuit 6', 'provider': providers[1].pk, - 'provider_account': provider_accounts[1].pk, + # Omit provider account to test uniqueness constraint 'type': circuit_types[1].pk, }, ] @@ -237,7 +237,7 @@ class ProviderAccountTest(APIViewTestCases.APIViewTestCase): 'account': '5678', }, { - 'name': 'Provider Account 6', + # Omit name to test uniqueness constraint 'provider': providers[0].pk, 'account': '6789', }, diff --git a/netbox/dcim/api/serializers_/devices.py b/netbox/dcim/api/serializers_/devices.py index 7d160188245..edfac3072da 100644 --- a/netbox/dcim/api/serializers_/devices.py +++ b/netbox/dcim/api/serializers_/devices.py @@ -122,6 +122,7 @@ class DeviceWithConfigContextSerializer(DeviceSerializer): class VirtualDeviceContextSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualdevicecontext-detail') device = DeviceSerializer(nested=True) + identifier = serializers.IntegerField(allow_null=True, max_value=32767, min_value=0, required=False, default=None) tenant = TenantSerializer(nested=True, required=False, allow_null=True, default=None) primary_ip = IPAddressSerializer(nested=True, read_only=True, allow_null=True) primary_ip4 = IPAddressSerializer(nested=True, required=False, allow_null=True) diff --git a/netbox/dcim/api/serializers_/sites.py b/netbox/dcim/api/serializers_/sites.py index 8063278a7f1..1e5e410695c 100644 --- a/netbox/dcim/api/serializers_/sites.py +++ b/netbox/dcim/api/serializers_/sites.py @@ -51,7 +51,7 @@ class SiteSerializer(NetBoxModelSerializer): status = ChoiceField(choices=SiteStatusChoices, required=False) region = RegionSerializer(nested=True, required=False, allow_null=True) group = SiteGroupSerializer(nested=True, required=False, allow_null=True) - tenant = TenantSerializer(required=False, allow_null=True) + tenant = TenantSerializer(nested=True, required=False, allow_null=True) time_zone = TimeZoneSerializerField(required=False, allow_null=True) asns = SerializedPKRelatedField( queryset=ASN.objects.all(), @@ -83,7 +83,7 @@ class SiteSerializer(NetBoxModelSerializer): class LocationSerializer(NestedGroupModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='dcim-api:location-detail') site = SiteSerializer(nested=True) - parent = NestedLocationSerializer(required=False, allow_null=True) + parent = NestedLocationSerializer(required=False, allow_null=True, default=None) status = ChoiceField(choices=LocationStatusChoices, required=False) tenant = TenantSerializer(nested=True, required=False, allow_null=True) rack_count = serializers.IntegerField(read_only=True) diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index b00784265f7..a21530d5962 100644 --- a/netbox/dcim/choices.py +++ b/netbox/dcim/choices.py @@ -848,6 +848,8 @@ class InterfaceTypeChoices(ChoiceSet): # Ethernet Backplane TYPE_1GE_KX = '1000base-kx' + TYPE_2GE_KX = '2.5gbase-kx' + TYPE_5GE_KR = '5gbase-kr' TYPE_10GE_KR = '10gbase-kr' TYPE_10GE_KX4 = '10gbase-kx4' TYPE_25GE_KR = '25gbase-kr' @@ -1008,6 +1010,8 @@ class InterfaceTypeChoices(ChoiceSet): _('Ethernet (backplane)'), ( (TYPE_1GE_KX, '1000BASE-KX (1GE)'), + (TYPE_2GE_KX, '2.5GBASE-KX (2.5GE)'), + (TYPE_5GE_KR, '5GBASE-KR (5GE)'), (TYPE_10GE_KR, '10GBASE-KR (10GE)'), (TYPE_10GE_KX4, '10GBASE-KX4 (10GE)'), (TYPE_25GE_KR, '25GBASE-KR (25GE)'), diff --git a/netbox/dcim/forms/connections.py b/netbox/dcim/forms/connections.py index b57f4ad2cd5..44bea047ac9 100644 --- a/netbox/dcim/forms/connections.py +++ b/netbox/dcim/forms/connections.py @@ -90,14 +90,14 @@ def get_cable_form(a_type, b_type): class _CableForm(CableForm, metaclass=FormMetaclass): def __init__(self, *args, initial=None, **kwargs): - initial = initial or {} + if a_type: - ct = ContentType.objects.get_for_model(a_type) - initial['a_terminations_type'] = f'{ct.app_label}.{ct.model}' + a_ct = ContentType.objects.get_for_model(a_type) + initial['a_terminations_type'] = f'{a_ct.app_label}.{a_ct.model}' if b_type: - ct = ContentType.objects.get_for_model(b_type) - initial['b_terminations_type'] = f'{ct.app_label}.{ct.model}' + b_ct = ContentType.objects.get_for_model(b_type) + initial['b_terminations_type'] = f'{b_ct.app_label}.{b_ct.model}' # TODO: Temporary hack to work around list handling limitations with utils.normalize_querydict() for field_name in ('a_terminations', 'b_terminations'): @@ -108,8 +108,17 @@ def get_cable_form(a_type, b_type): if self.instance and self.instance.pk: # Initialize A/B terminations when modifying an existing Cable instance - self.initial['a_terminations'] = self.instance.a_terminations - self.initial['b_terminations'] = self.instance.b_terminations + if a_type and self.instance.a_terminations and a_ct == ContentType.objects.get_for_model(self.instance.a_terminations[0]): + self.initial['a_terminations'] = self.instance.a_terminations + if b_type and self.instance.b_terminations and b_ct == ContentType.objects.get_for_model(self.instance.b_terminations[0]): + self.initial['b_terminations'] = self.instance.b_terminations + else: + # Need to clear terminations if swapped type - but need to do it only + # if not from instance + if a_type: + initial.pop('a_terminations', None) + if b_type: + initial.pop('b_terminations', None) def clean(self): super().clean() diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 0a3931696f9..52b850b244c 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -10,6 +10,7 @@ from dcim.models import * from extras.models import ConfigTemplate from ipam.models import ASN, RIR, VLAN, VRF from netbox.api.serializers import GenericObjectSerializer +from tenancy.models import Tenant from utilities.testing import APITestCase, APIViewTestCases, create_test_device from virtualization.models import Cluster, ClusterType from wireless.choices import WirelessChannelChoices @@ -152,6 +153,7 @@ class SiteTest(APIViewTestCases.APIViewTestCase): Site.objects.bulk_create(sites) rir = RIR.objects.create(name='RFC 6996', is_private=True) + tenant = Tenant.objects.create(name='Tenant 1', slug='tenant-1') asns = [ ASN(asn=65000 + i, rir=rir) for i in range(8) @@ -166,6 +168,7 @@ class SiteTest(APIViewTestCases.APIViewTestCase): 'group': groups[1].pk, 'status': SiteStatusChoices.STATUS_ACTIVE, 'asns': [asns[0].pk, asns[1].pk], + 'tenant': tenant.pk, }, { 'name': 'Site 5', @@ -230,7 +233,7 @@ class LocationTest(APIViewTestCases.APIViewTestCase): 'name': 'Test Location 6', 'slug': 'test-location-6', 'site': sites[1].pk, - 'parent': parent_locations[1].pk, + # Omit parent to test uniqueness constraint 'status': LocationStatusChoices.STATUS_PLANNED, }, ] @@ -2307,6 +2310,6 @@ class VirtualDeviceContextTest(APIViewTestCases.APIViewTestCase): 'device': devices[1].pk, 'status': 'active', 'name': 'VDC 3', - 'identifier': 3, + # Omit identifier to test uniqueness constraint }, ] diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index ca37084f23b..abe8301a22a 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -28,7 +28,9 @@ from utilities.permissions import get_permission_for_model from utilities.query import count_related from utilities.query_functions import CollateAsChar from utilities.views import GetReturnURLMixin, ObjectPermissionRequiredMixin, ViewTab, register_model_view +from virtualization.filtersets import VirtualMachineFilterSet from virtualization.models import VirtualMachine +from virtualization.tables import VirtualMachineTable from . import filtersets, forms, tables from .choices import DeviceFaceChoices from .models import * @@ -2085,6 +2087,25 @@ class DeviceRenderConfigView(generic.ObjectView): } +@register_model_view(Device, 'virtual-machines') +class DeviceVirtualMachinesView(generic.ObjectChildrenView): + queryset = Device.objects.all() + child_model = VirtualMachine + table = VirtualMachineTable + filterset = VirtualMachineFilterSet + template_name = 'generic/object_children.html' + tab = ViewTab( + label=_('Virtual Machines'), + badge=lambda obj: VirtualMachine.objects.filter(cluster=obj.cluster, device=obj).count(), + weight=2200, + hide_if_empty=True, + permission='virtualization.view_virtualmachine' + ) + + def get_children(self, request, parent): + return self.child_model.objects.restrict(request.user, 'view').filter(cluster=parent.cluster, device=parent) + + class DeviceBulkImportView(generic.BulkImportView): queryset = Device.objects.all() model_form = forms.DeviceImportForm diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 229d9423267..1d7b69ac324 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -279,10 +279,7 @@ class EventRuleForm(NetBoxModelForm): FieldSet('name', 'description', 'object_types', 'enabled', 'tags', name=_('Event Rule')), FieldSet('type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end', name=_('Events')), FieldSet('conditions', name=_('Conditions')), - FieldSet( - 'action_type', 'action_choice', 'action_object_type', 'action_object_id', 'action_data', - name=_('Action') - ), + FieldSet('action_type', 'action_choice', 'action_data', name=_('Action')), ) class Meta: diff --git a/netbox/extras/management/commands/runscript.py b/netbox/extras/management/commands/runscript.py index 160e8813f4a..ef1bd514197 100644 --- a/netbox/extras/management/commands/runscript.py +++ b/netbox/extras/management/commands/runscript.py @@ -85,6 +85,7 @@ class Command(BaseCommand): module_name, script_name = script.split('.', 1) module, script = get_module_and_script(module_name, script_name) + script = script.python_class # Take user from command line if provided and exists, other if options['user']: diff --git a/netbox/extras/migrations/0109_script_model.py b/netbox/extras/migrations/0109_script_model.py index 7570077a771..6bfd2c14c88 100644 --- a/netbox/extras/migrations/0109_script_model.py +++ b/netbox/extras/migrations/0109_script_model.py @@ -60,7 +60,10 @@ def get_module_scripts(scriptmodule): return cls.full_name.split(".", maxsplit=1)[1] loader = SourceFileLoader(get_python_name(scriptmodule), get_full_path(scriptmodule)) - module = loader.load_module() + try: + module = loader.load_module() + except FileNotFoundError: + return {} scripts = {} ordered = getattr(module, 'script_order', []) diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index 8da3ea93a7c..3738f31028d 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -545,7 +545,7 @@ class ScriptResultsTable(BaseTable): template_code="""{% load log_levels %}{% log_level record.status %}""", verbose_name=_('Level') ) - message = tables.Column( + message = columns.MarkdownColumn( verbose_name=_('Message') ) @@ -566,22 +566,17 @@ class ReportResultsTable(BaseTable): time = tables.Column( verbose_name=_('Time') ) - status = tables.Column( - empty_values=(), - verbose_name=_('Level') - ) status = tables.TemplateColumn( template_code="""{% load log_levels %}{% log_level record.status %}""", verbose_name=_('Level') ) - object = tables.Column( verbose_name=_('Object') ) url = tables.Column( verbose_name=_('URL') ) - message = tables.Column( + message = columns.MarkdownColumn( verbose_name=_('Message') ) diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index fb1c123c38b..2ae380d6389 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -574,7 +574,7 @@ class IPRange(PrimaryModel): if not self.end_address > self.start_address: raise ValidationError({ 'end_address': _( - "Ending address must be lower than the starting address ({start_address})" + "Ending address must be greater than the starting address ({start_address})" ).format(start_address=self.start_address) }) diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 24d82d18680..044474ec4eb 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -781,6 +781,7 @@ class IPAddressView(generic.ObjectView): class IPAddressEditView(generic.ObjectEditView): queryset = IPAddress.objects.all() form = forms.IPAddressForm + template_name = 'ipam/ipaddress_edit.html' def alter_object(self, obj, request, url_args, url_kwargs): diff --git a/netbox/netbox/navigation/__init__.py b/netbox/netbox/navigation/__init__.py index d13282f7ecf..b4f7dbd9f58 100644 --- a/netbox/netbox/navigation/__init__.py +++ b/netbox/netbox/navigation/__init__.py @@ -32,6 +32,7 @@ class MenuItem: link: str link_text: str permissions: Optional[Sequence[str]] = () + auth_required: Optional[bool] = False staff_only: Optional[bool] = False buttons: Optional[Sequence[MenuItemButton]] = () diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index 4fe16e773a4..2a58b277e76 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -371,6 +371,7 @@ ADMIN_MENU = Menu( MenuItem( link=f'users:user_list', link_text=_('Users'), + auth_required=True, permissions=[f'auth.view_user'], buttons=( MenuItemButton( @@ -390,6 +391,7 @@ ADMIN_MENU = Menu( MenuItem( link=f'users:group_list', link_text=_('Groups'), + auth_required=True, permissions=[f'auth.view_group'], buttons=( MenuItemButton( @@ -409,12 +411,14 @@ ADMIN_MENU = Menu( MenuItem( link=f'users:token_list', link_text=_('API Tokens'), + auth_required=True, permissions=[f'users.view_token'], buttons=get_model_buttons('users', 'token') ), MenuItem( link=f'users:objectpermission_list', link_text=_('Permissions'), + auth_required=True, permissions=[f'users.view_objectpermission'], buttons=get_model_buttons('users', 'objectpermission', actions=['add']) ), @@ -425,16 +429,19 @@ ADMIN_MENU = Menu( items=( MenuItem( link='core:system', - link_text=_('System') + link_text=_('System'), + auth_required=True ), MenuItem( link='core:configrevision_list', link_text=_('Configuration History'), + auth_required=True, permissions=['core.view_configrevision'] ), MenuItem( link='core:background_queue_list', - link_text=_('Background Tasks') + link_text=_('Background Tasks'), + auth_required=True ), ), ), diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 7c4c400beea..8fba7cffcbd 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -25,7 +25,7 @@ from utilities.string import trailing_slash # Environment setup # -VERSION = '4.0.0' +VERSION = '4.0.1' HOSTNAME = platform.node() # Set the base directory two levels up BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -372,7 +372,6 @@ if not DJANGO_ADMIN_ENABLED: # Middleware MIDDLEWARE = [ "strawberry_django.middlewares.debug_toolbar.DebugToolbarMiddleware", - 'django_prometheus.middleware.PrometheusBeforeMiddleware', 'corsheaders.middleware.CorsMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', @@ -386,8 +385,14 @@ MIDDLEWARE = [ 'netbox.middleware.RemoteUserMiddleware', 'netbox.middleware.CoreMiddleware', 'netbox.middleware.MaintenanceModeMiddleware', - 'django_prometheus.middleware.PrometheusAfterMiddleware', ] +if METRICS_ENABLED: + # If metrics are enabled, add the before & after Prometheus middleware + MIDDLEWARE = [ + 'django_prometheus.middleware.PrometheusBeforeMiddleware', + *MIDDLEWARE, + 'django_prometheus.middleware.PrometheusAfterMiddleware', + ] # URLs ROOT_URLCONF = 'netbox.urls' @@ -522,7 +527,6 @@ if SENTRY_ENABLED: sentry_sdk.init( dsn=SENTRY_DSN, release=VERSION, - integrations=[sentry_sdk.integrations.django.DjangoIntegration()], sample_rate=SENTRY_SAMPLE_RATE, traces_sample_rate=SENTRY_TRACES_SAMPLE_RATE, send_default_pii=True, diff --git a/netbox/netbox/tables/tables.py b/netbox/netbox/tables/tables.py index d8db511a28e..38f7248e647 100644 --- a/netbox/netbox/tables/tables.py +++ b/netbox/netbox/tables/tables.py @@ -52,7 +52,7 @@ class BaseTable(tables.Table): # 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" + self.empty_text = _("No {model_name} found").format(model_name=self._meta.model._meta.verbose_name_plural) # Determine the table columns to display by checking the following: # 1. User's configuration for the table diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 6c0d46b5344..58c419b3d4e 100644 --- a/netbox/project-static/dist/netbox.js +++ b/netbox/project-static/dist/netbox.js @@ -1,6 +1,6 @@ (()=>{var lh=Object.create;var _a=Object.defineProperty,ch=Object.defineProperties,uh=Object.getOwnPropertyDescriptor,dh=Object.getOwnPropertyDescriptors,fh=Object.getOwnPropertyNames,cu=Object.getOwnPropertySymbols,hh=Object.getPrototypeOf,uu=Object.prototype.hasOwnProperty,ph=Object.prototype.propertyIsEnumerable;var Gl=(ii,ti,ei)=>ti in ii?_a(ii,ti,{enumerable:!0,configurable:!0,writable:!0,value:ei}):ii[ti]=ei,Ui=(ii,ti)=>{for(var ei in ti||(ti={}))uu.call(ti,ei)&&Gl(ii,ei,ti[ei]);if(cu)for(var ei of cu(ti))ph.call(ti,ei)&&Gl(ii,ei,ti[ei]);return ii},Fn=(ii,ti)=>ch(ii,dh(ti)),du=ii=>_a(ii,"__esModule",{value:!0});var Ga=(ii,ti)=>()=>(ti||ii((ti={exports:{}}).exports,ti),ti.exports),fu=(ii,ti)=>{du(ii);for(var ei in ti)_a(ii,ei,{get:ti[ei],enumerable:!0})},mh=(ii,ti,ei)=>{if(ti&&typeof ti=="object"||typeof ti=="function")for(let ni of fh(ti))!uu.call(ii,ni)&&ni!=="default"&&_a(ii,ni,{get:()=>ti[ni],enumerable:!(ei=uh(ti,ni))||ei.enumerable});return ii},zo=ii=>mh(du(_a(ii!=null?lh(hh(ii)):{},"default",ii&&ii.__esModule&&"default"in ii?{get:()=>ii.default,enumerable:!0}:{value:ii,enumerable:!0})),ii);var Pn=(ii,ti,ei)=>(Gl(ii,typeof ti!="symbol"?ti+"":ti,ei),ei);var $s=(ii,ti,ei)=>new Promise((ni,ri)=>{var si=di=>{try{li(ei.next(di))}catch(yi){ri(yi)}},ai=di=>{try{li(ei.throw(di))}catch(yi){ri(yi)}},li=di=>di.done?ni(di.value):Promise.resolve(di.value).then(si,ai);li((ei=ei.apply(ii,ti)).next())});var Id=Ga((exports,module)=>{(function(ii,ti){typeof define=="function"&&define.amd?define([],ti):typeof module=="object"&&module.exports?module.exports=ti():ii.htmx=ii.htmx||ti()})(typeof self!="undefined"?self:exports,function(){return function(){"use strict";var Q={onLoad:F,process:zt,on:de,off:ge,trigger:ce,ajax:Nr,find:C,findAll:f,closest:v,values:function(ii,ti){var ei=dr(ii,ti||"post");return ei.values},remove:_,addClass:z,removeClass:n,toggleClass:$,takeClass:W,defineExtension:Ur,removeExtension:Br,logAll:V,logNone:j,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:!1,scrollBehavior:"smooth",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get"],selfRequestsOnly:!1,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null},parseInterval:d,_:t,createEventSource:function(ii){return new EventSource(ii,{withCredentials:!0})},createWebSocket:function(ii){var ti=new WebSocket(ii,[]);return ti.binaryType=Q.config.wsBinaryType,ti},version:"1.9.12"},r={addTriggerHandler:Lt,bodyContains:se,canAccessLocalStorage:U,findThisElement:xe,filterValues:yr,hasAttribute:o,getAttributeValue:te,getClosestAttributeValue:ne,getClosestMatch:c,getExpressionVars:Hr,getHeaders:xr,getInputValues:dr,getInternalData:ae,getSwapSpecification:wr,getTriggerSpecs:it,getTarget:ye,makeFragment:l,mergeObjects:le,makeSettleInfo:T,oobSwap:Ee,querySelectorExt:ue,selectAndSwap:je,settleImmediately:nr,shouldCancel:ut,triggerEvent:ce,triggerErrorEvent:fe,withExtensions:R},w=["get","post","put","delete","patch"],i=w.map(function(ii){return"[hx-"+ii+"], [data-hx-"+ii+"]"}).join(", "),S=e("head"),q=e("title"),H=e("svg",!0);function e(ii,ti){return new RegExp("<"+ii+"(\\s[^>]*>|>)([\\s\\S]*?)<\\/"+ii+">",ti?"gim":"im")}function d(ii){if(ii==null)return;let ti=NaN;return ii.slice(-2)=="ms"?ti=parseFloat(ii.slice(0,-2)):ii.slice(-1)=="s"?ti=parseFloat(ii.slice(0,-1))*1e3:ii.slice(-1)=="m"?ti=parseFloat(ii.slice(0,-1))*1e3*60:ti=parseFloat(ii),isNaN(ti)?void 0:ti}function ee(ii,ti){return ii.getAttribute&&ii.getAttribute(ti)}function o(ii,ti){return ii.hasAttribute&&(ii.hasAttribute(ti)||ii.hasAttribute("data-"+ti))}function te(ii,ti){return ee(ii,ti)||ee(ii,"data-"+ti)}function u(ii){return ii.parentElement}function re(){return document}function c(ii,ti){for(;ii&&!ti(ii);)ii=u(ii);return ii||null}function L(ii,ti,ei){var ni=te(ti,ei),ri=te(ti,"hx-disinherit");return ii!==ti&&ri&&(ri==="*"||ri.split(" ").indexOf(ei)>=0)?"unset":ni}function ne(ii,ti){var ei=null;if(c(ii,function(ni){return ei=L(ii,ni,ti)}),ei!=="unset")return ei}function h(ii,ti){var ei=ii.matches||ii.matchesSelector||ii.msMatchesSelector||ii.mozMatchesSelector||ii.webkitMatchesSelector||ii.oMatchesSelector;return ei&&ei.call(ii,ti)}function A(ii){var ti=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,ei=ti.exec(ii);return ei?ei[1].toLowerCase():""}function s(ii,ti){for(var ei=new DOMParser,ni=ei.parseFromString(ii,"text/html"),ri=ni.body;ti>0;)ti--,ri=ri.firstChild;return ri==null&&(ri=re().createDocumentFragment()),ri}function N(ii){return/",0),si=ri.querySelector("template").content;return Q.config.allowScriptTags?oe(si.querySelectorAll("script"),function(ai){Q.config.inlineScriptNonce&&(ai.nonce=Q.config.inlineScriptNonce),ai.htmxExecuted=navigator.userAgent.indexOf("Firefox")===-1}):oe(si.querySelectorAll("script"),function(ai){_(ai)}),si}switch(ei){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return s(""+ni+"
",1);case"col":return s(""+ni+"
",2);case"tr":return s(""+ni+"
",2);case"td":case"th":return s(""+ni+"
",3);case"script":case"style":return s("
"+ni+"
",1);default:return s(ni,0)}}function ie(ii){ii&&ii()}function I(ii,ti){return Object.prototype.toString.call(ii)==="[object "+ti+"]"}function k(ii){return I(ii,"Function")}function P(ii){return I(ii,"Object")}function ae(ii){var ti="htmx-internal-data",ei=ii[ti];return ei||(ei=ii[ti]={}),ei}function M(ii){var ti=[];if(ii)for(var ei=0;ei=0}function se(ii){return ii.getRootNode&&ii.getRootNode()instanceof window.ShadowRoot?re().body.contains(ii.getRootNode().host):re().body.contains(ii)}function D(ii){return ii.trim().split(/\s+/)}function le(ii,ti){for(var ei in ti)ti.hasOwnProperty(ei)&&(ii[ei]=ti[ei]);return ii}function E(ii){try{return JSON.parse(ii)}catch(ti){return b(ti),null}}function U(){var ii="htmx:localStorageTest";try{return localStorage.setItem(ii,ii),localStorage.removeItem(ii),!0}catch(ti){return!1}}function B(ii){try{var ti=new URL(ii);return ti&&(ii=ti.pathname+ti.search),/^\/$/.test(ii)||(ii=ii.replace(/\/+$/,"")),ii}catch(ei){return ii}}function t(e){return Tr(re().body,function(){return eval(e)})}function F(ii){var ti=Q.on("htmx:load",function(ei){ii(ei.detail.elt)});return ti}function V(){Q.logger=function(ii,ti,ei){console&&console.log(ti,ii,ei)}}function j(){Q.logger=null}function C(ii,ti){return ti?ii.querySelector(ti):C(re(),ii)}function f(ii,ti){return ti?ii.querySelectorAll(ti):f(re(),ii)}function _(ii,ti){ii=p(ii),ti?setTimeout(function(){_(ii),ii=null},ti):ii.parentElement.removeChild(ii)}function z(ii,ti,ei){ii=p(ii),ei?setTimeout(function(){z(ii,ti),ii=null},ei):ii.classList&&ii.classList.add(ti)}function n(ii,ti,ei){ii=p(ii),ei?setTimeout(function(){n(ii,ti),ii=null},ei):ii.classList&&(ii.classList.remove(ti),ii.classList.length===0&&ii.removeAttribute("class"))}function $(ii,ti){ii=p(ii),ii.classList.toggle(ti)}function W(ii,ti){ii=p(ii),oe(ii.parentElement.children,function(ei){n(ei,ti)}),z(ii,ti)}function v(ii,ti){if(ii=p(ii),ii.closest)return ii.closest(ti);do if(ii==null||h(ii,ti))return ii;while(ii=ii&&u(ii));return null}function g(ii,ti){return ii.substring(0,ti.length)===ti}function G(ii,ti){return ii.substring(ii.length-ti.length)===ti}function J(ii){var ti=ii.trim();return g(ti,"<")&&G(ti,"/>")?ti.substring(1,ti.length-2):ti}function Z(ii,ti){return ti.indexOf("closest ")===0?[v(ii,J(ti.substr(8)))]:ti.indexOf("find ")===0?[C(ii,J(ti.substr(5)))]:ti==="next"?[ii.nextElementSibling]:ti.indexOf("next ")===0?[K(ii,J(ti.substr(5)))]:ti==="previous"?[ii.previousElementSibling]:ti.indexOf("previous ")===0?[Y(ii,J(ti.substr(9)))]:ti==="document"?[document]:ti==="window"?[window]:ti==="body"?[document.body]:re().querySelectorAll(J(ti))}var K=function(ii,ti){for(var ei=re().querySelectorAll(ti),ni=0;ni=0;ni--){var ri=ei[ni];if(ri.compareDocumentPosition(ii)===Node.DOCUMENT_POSITION_FOLLOWING)return ri}};function ue(ii,ti){return ti?Z(ii,ti)[0]:Z(re().body,ii)[0]}function p(ii){return I(ii,"String")?C(ii):ii}function ve(ii,ti,ei){return k(ti)?{target:re().body,event:ii,listener:ti}:{target:p(ii),event:ti,listener:ei}}function de(ii,ti,ei){jr(function(){var ri=ve(ii,ti,ei);ri.target.addEventListener(ri.event,ri.listener)});var ni=k(ti);return ni?ti:ei}function ge(ii,ti,ei){return jr(function(){var ni=ve(ii,ti,ei);ni.target.removeEventListener(ni.event,ni.listener)}),k(ti)?ti:ei}var pe=re().createElement("output");function me(ii,ti){var ei=ne(ii,ti);if(ei){if(ei==="this")return[xe(ii,ti)];var ni=Z(ii,ei);return ni.length===0?(b('The selector "'+ei+'" on '+ti+" returned no matches!"),[pe]):ni}}function xe(ii,ti){return c(ii,function(ei){return te(ei,ti)!=null})}function ye(ii){var ti=ne(ii,"hx-target");if(ti)return ti==="this"?xe(ii,"hx-target"):ue(ii,ti);var ei=ae(ii);return ei.boosted?re().body:ii}function be(ii){for(var ti=Q.config.attributesToSettle,ei=0;ei0?(ri=ii.substr(0,ii.indexOf(":")),ni=ii.substr(ii.indexOf(":")+1,ii.length)):ri=ii);var si=re().querySelectorAll(ni);return si?(oe(si,function(ai){var li,di=ti.cloneNode(!0);li=re().createDocumentFragment(),li.appendChild(di),Se(ri,ai)||(li=di);var yi={shouldSwap:!0,target:ai,fragment:li};!ce(ai,"htmx:oobBeforeSwap",yi)||(ai=yi.target,yi.shouldSwap&&Fe(ri,ai,ai,li,ei),oe(ei.elts,function(pi){ce(pi,"htmx:oobAfterSwap",yi)}))}),ti.parentNode.removeChild(ti)):(ti.parentNode.removeChild(ti),fe(re().body,"htmx:oobErrorNoTarget",{content:ti})),ii}function Ce(ii,ti,ei){var ni=ne(ii,"hx-select-oob");if(ni)for(var ri=ni.split(","),si=0;si0){var si=ri.replace("'","\\'"),ai=ni.tagName.replace(":","\\:"),li=ii.querySelector(ai+"[id='"+si+"']");if(li&&li!==ii){var di=ni.cloneNode();we(ni,li),ei.tasks.push(function(){we(ni,di)})}}})}function Oe(ii){return function(){n(ii,Q.config.addedClass),zt(ii),Nt(ii),qe(ii),ce(ii,"htmx:load")}}function qe(ii){var ti="[autofocus]",ei=h(ii,ti)?ii:ii.querySelector(ti);ei!=null&&ei.focus()}function a(ii,ti,ei,ni){for(Te(ii,ei,ni);ei.childNodes.length>0;){var ri=ei.firstChild;z(ri,Q.config.addedClass),ii.insertBefore(ri,ti),ri.nodeType!==Node.TEXT_NODE&&ri.nodeType!==Node.COMMENT_NODE&&ni.tasks.push(Oe(ri))}}function He(ii,ti){for(var ei=0;ei-1){var ti=ii.replace(H,""),ei=ti.match(q);if(ei)return ei[2]}}function je(ii,ti,ei,ni,ri,si){ri.title=Ve(ni);var ai=l(ni);if(ai)return Ce(ei,ai,ri),ai=Be(ei,ai,si),Re(ai),Fe(ii,ei,ti,ai,ri)}function _e(ii,ti,ei){var ni=ii.getResponseHeader(ti);if(ni.indexOf("{")===0){var ri=E(ni);for(var si in ri)if(ri.hasOwnProperty(si)){var ai=ri[si];P(ai)||(ai={value:ai}),ce(ei,si,ai)}}else for(var li=ni.split(","),di=0;di0;){var ai=ti[0];if(ai==="]"){if(ni--,ni===0){si===null&&(ri=ri+"true"),ti.shift(),ri+=")})";try{var li=Tr(ii,function(){return Function(ri)()},function(){return!0});return li.source=ri,li}catch(di){return fe(re().body,"htmx:syntax:error",{error:di,source:ri}),null}}}else ai==="["&&ni++;Qe(ai,si,ei)?ri+="(("+ei+"."+ai+") ? ("+ei+"."+ai+") : (window."+ai+"))":ri=ri+ai,si=ti.shift()}}}function y(ii,ti){for(var ei="";ii.length>0&&!ti.test(ii[0]);)ei+=ii.shift();return ei}function tt(ii){var ti;return ii.length>0&&Ze.test(ii[0])?(ii.shift(),ti=y(ii,Ke).trim(),ii.shift()):ti=y(ii,x),ti}var rt="input, textarea, select";function nt(ii,ti,ei){var ni=[],ri=Ye(ti);do{y(ri,Je);var si=ri.length,ai=y(ri,/[,\[\s]/);if(ai!=="")if(ai==="every"){var li={trigger:"every"};y(ri,Je),li.pollInterval=d(y(ri,/[,\[\s]/)),y(ri,Je);var di=et(ii,ri,"event");di&&(li.eventFilter=di),ni.push(li)}else if(ai.indexOf("sse:")===0)ni.push({trigger:"sse",sseEvent:ai.substr(4)});else{var yi={trigger:ai},di=et(ii,ri,"event");for(di&&(yi.eventFilter=di);ri.length>0&&ri[0]!==",";){y(ri,Je);var pi=ri.shift();if(pi==="changed")yi.changed=!0;else if(pi==="once")yi.once=!0;else if(pi==="consume")yi.consume=!0;else if(pi==="delay"&&ri[0]===":")ri.shift(),yi.delay=d(y(ri,x));else if(pi==="from"&&ri[0]===":"){if(ri.shift(),Ze.test(ri[0]))var vi=tt(ri);else{var vi=y(ri,x);if(vi==="closest"||vi==="find"||vi==="next"||vi==="previous"){ri.shift();var Ei=tt(ri);Ei.length>0&&(vi+=" "+Ei)}}yi.from=vi}else pi==="target"&&ri[0]===":"?(ri.shift(),yi.target=tt(ri)):pi==="throttle"&&ri[0]===":"?(ri.shift(),yi.throttle=d(y(ri,x))):pi==="queue"&&ri[0]===":"?(ri.shift(),yi.queue=y(ri,x)):pi==="root"&&ri[0]===":"?(ri.shift(),yi[pi]=tt(ri)):pi==="threshold"&&ri[0]===":"?(ri.shift(),yi[pi]=y(ri,x)):fe(ii,"htmx:syntax:error",{token:ri.shift()})}ni.push(yi)}ri.length===si&&fe(ii,"htmx:syntax:error",{token:ri.shift()}),y(ri,Je)}while(ri[0]===","&&ri.shift());return ei&&(ei[ti]=ni),ni}function it(ii){var ti=te(ii,"hx-trigger"),ei=[];if(ti){var ni=Q.config.triggerSpecsCache;ei=ni&&ni[ti]||nt(ii,ti,ni)}return ei.length>0?ei:h(ii,"form")?[{trigger:"submit"}]:h(ii,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:h(ii,rt)?[{trigger:"change"}]:[{trigger:"click"}]}function at(ii){ae(ii).cancelled=!0}function ot(ii,ti,ei){var ni=ae(ii);ni.timeout=setTimeout(function(){se(ii)&&ni.cancelled!==!0&&(ct(ei,ii,Wt("hx:poll:trigger",{triggerSpec:ei,target:ii}))||ti(ii),ot(ii,ti,ei))},ei.pollInterval)}function st(ii){return location.hostname===ii.hostname&&ee(ii,"href")&&ee(ii,"href").indexOf("#")!==0}function lt(ii,ti,ei){if(ii.tagName==="A"&&st(ii)&&(ii.target===""||ii.target==="_self")||ii.tagName==="FORM"){ti.boosted=!0;var ni,ri;if(ii.tagName==="A")ni="get",ri=ee(ii,"href");else{var si=ee(ii,"method");ni=si?si.toLowerCase():"get",ri=ee(ii,"action")}ei.forEach(function(ai){ht(ii,function(li,di){if(v(li,Q.config.disableSelector)){m(li);return}he(ni,ri,li,di)},ti,ai,!0)})}}function ut(ii,ti){return!!((ii.type==="submit"||ii.type==="click")&&(ti.tagName==="FORM"||h(ti,'input[type="submit"], button')&&v(ti,"form")!==null||ti.tagName==="A"&&ti.href&&(ti.getAttribute("href")==="#"||ti.getAttribute("href").indexOf("#")!==0)))}function ft(ii,ti){return ae(ii).boosted&&ii.tagName==="A"&&ti.type==="click"&&(ti.ctrlKey||ti.metaKey)}function ct(ii,ti,ei){var ni=ii.eventFilter;if(ni)try{return ni.call(ti,ei)!==!0}catch(ri){return fe(re().body,"htmx:eventFilter:error",{error:ri,source:ni.source}),!0}return!1}function ht(ii,ti,ei,ni,ri){var si=ae(ii),ai;ni.from?ai=Z(ii,ni.from):ai=[ii],ni.changed&&ai.forEach(function(li){var di=ae(li);di.lastValue=li.value}),oe(ai,function(li){var di=function(yi){if(!se(ii)){li.removeEventListener(ni.trigger,di);return}if(!ft(ii,yi)&&((ri||ut(yi,ii))&&yi.preventDefault(),!ct(ni,ii,yi))){var pi=ae(yi);if(pi.triggerSpec=ni,pi.handledFor==null&&(pi.handledFor=[]),pi.handledFor.indexOf(ii)<0){if(pi.handledFor.push(ii),ni.consume&&yi.stopPropagation(),ni.target&&yi.target&&!h(yi.target,ni.target))return;if(ni.once){if(si.triggeredOnce)return;si.triggeredOnce=!0}if(ni.changed){var vi=ae(li);if(vi.lastValue===li.value)return;vi.lastValue=li.value}if(si.delayed&&clearTimeout(si.delayed),si.throttle)return;ni.throttle>0?si.throttle||(ti(ii,yi),si.throttle=setTimeout(function(){si.throttle=null},ni.throttle)):ni.delay>0?si.delayed=setTimeout(function(){ti(ii,yi)},ni.delay):(ce(ii,"htmx:trigger"),ti(ii,yi))}}};ei.listenerInfos==null&&(ei.listenerInfos=[]),ei.listenerInfos.push({trigger:ni.trigger,listener:di,on:li}),li.addEventListener(ni.trigger,di)})}var vt=!1,dt=null;function gt(){dt||(dt=function(){vt=!0},window.addEventListener("scroll",dt),setInterval(function(){vt&&(vt=!1,oe(re().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(ii){pt(ii)}))},200))}function pt(ii){if(!o(ii,"data-hx-revealed")&&X(ii)){ii.setAttribute("data-hx-revealed","true");var ti=ae(ii);ti.initHash?ce(ii,"revealed"):ii.addEventListener("htmx:afterProcessNode",function(ei){ce(ii,"revealed")},{once:!0})}}function mt(ii,ti,ei){for(var ni=D(ei),ri=0;ri=0){var ai=wt(ei);setTimeout(function(){xt(ii,ti,ei+1)},ai)}},ri.onopen=function(si){ei=0},ae(ii).webSocket=ri,ri.addEventListener("message",function(si){if(!yt(ii)){var ai=si.data;R(ii,function(Ei){ai=Ei.transformResponse(ai,null,ii)});for(var li=T(ii),di=l(ai),yi=M(di.children),pi=0;pi0){ce(ii,"htmx:validation:halted",ai);return}ni.send(JSON.stringify(pi)),ut(ei,ii)&&ei.preventDefault()}):fe(ii,"htmx:noWebSocketSourceError")}function wt(ii){var ti=Q.config.wsReconnectDelay;if(typeof ti=="function")return ti(ii);if(ti==="full-jitter"){var ei=Math.min(ii,6),ni=1e3*Math.pow(2,ei);return ni*Math.random()}b('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function St(ii,ti,ei){for(var ni=D(ei),ri=0;ri0?setTimeout(ri,ni):ri()}function Ht(ii,ti,ei){var ni=!1;return oe(w,function(ri){if(o(ii,"hx-"+ri)){var si=te(ii,"hx-"+ri);ni=!0,ti.path=si,ti.verb=ri,ei.forEach(function(ai){Lt(ii,ai,ti,function(li,di){if(v(li,Q.config.disableSelector)){m(li);return}he(ri,si,li,di)})})}}),ni}function Lt(ii,ti,ei,ni){if(ti.sseEvent)Rt(ii,ni,ti.sseEvent);else if(ti.trigger==="revealed")gt(),ht(ii,ni,ei,ti),pt(ii);else if(ti.trigger==="intersect"){var ri={};ti.root&&(ri.root=ue(ii,ti.root)),ti.threshold&&(ri.threshold=parseFloat(ti.threshold));var si=new IntersectionObserver(function(ai){for(var li=0;li0?(ei.polling=!0,ot(ii,ni,ti)):ht(ii,ni,ei,ti)}function At(ii){if(!ii.htmxExecuted&&Q.config.allowScriptTags&&(ii.type==="text/javascript"||ii.type==="module"||ii.type==="")){var ti=re().createElement("script");oe(ii.attributes,function(ni){ti.setAttribute(ni.name,ni.value)}),ti.textContent=ii.textContent,ti.async=!1,Q.config.inlineScriptNonce&&(ti.nonce=Q.config.inlineScriptNonce);var ei=ii.parentElement;try{ei.insertBefore(ti,ii)}catch(ni){b(ni)}finally{ii.parentElement&&ii.parentElement.removeChild(ii)}}}function Nt(ii){h(ii,"script")&&At(ii),oe(f(ii,"script"),function(ti){At(ti)})}function It(ii){var ti=ii.attributes;if(!ti)return!1;for(var ei=0;ei0;){var ai=ni.shift(),li=ai.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/);si===0&&li?(ai.split(":"),ri=li[1].slice(0,-1),ei[ri]=li[2]):ei[ri]+=ai,si+=Bt(ai)}for(var di in ei)Ft(ii,di,ei[di])}}function jt(ii){Ae(ii);for(var ti=0;tiQ.config.historyCacheSize;)ri.shift();for(;ri.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(ri));break}catch(li){fe(re().body,"htmx:historyCacheError",{cause:li,cache:ri}),ri.shift()}}}function Yt(ii){if(!U())return null;ii=B(ii);for(var ti=E(localStorage.getItem("htmx-history-cache"))||[],ei=0;ei=200&&this.status<400){ce(re().body,"htmx:historyCacheMissLoad",ei);var ni=l(this.response);ni=ni.querySelector("[hx-history-elt],[data-hx-history-elt]")||ni;var ri=Zt(),si=T(ri),ai=Ve(this.response);if(ai){var li=C("title");li?li.innerHTML=ai:window.document.title=ai}Ue(ri,ni,si),nr(si.tasks),Jt=ii,ce(re().body,"htmx:historyRestore",{path:ii,cacheMiss:!0,serverResponse:this.response})}else fe(re().body,"htmx:historyCacheMissLoadError",ei)},ti.send()}function ar(ii){er(),ii=ii||location.pathname+location.search;var ti=Yt(ii);if(ti){var ei=l(ti.content),ni=Zt(),ri=T(ni);Ue(ni,ei,ri),nr(ri.tasks),document.title=ti.title,setTimeout(function(){window.scrollTo(0,ti.scroll)},0),Jt=ii,ce(re().body,"htmx:historyRestore",{path:ii,item:ti})}else Q.config.refreshOnHistoryMiss?window.location.reload(!0):ir(ii)}function or(ii){var ti=me(ii,"hx-indicator");return ti==null&&(ti=[ii]),oe(ti,function(ei){var ni=ae(ei);ni.requestCount=(ni.requestCount||0)+1,ei.classList.add.call(ei.classList,Q.config.requestClass)}),ti}function sr(ii){var ti=me(ii,"hx-disabled-elt");return ti==null&&(ti=[]),oe(ti,function(ei){var ni=ae(ei);ni.requestCount=(ni.requestCount||0)+1,ei.setAttribute("disabled","")}),ti}function lr(ii,ti){oe(ii,function(ei){var ni=ae(ei);ni.requestCount=(ni.requestCount||0)-1,ni.requestCount===0&&ei.classList.remove.call(ei.classList,Q.config.requestClass)}),oe(ti,function(ei){var ni=ae(ei);ni.requestCount=(ni.requestCount||0)-1,ni.requestCount===0&&ei.removeAttribute("disabled")})}function ur(ii,ti){for(var ei=0;ei=0}function wr(ii,ti){var ei=ti||ne(ii,"hx-swap"),ni={swapStyle:ae(ii).boosted?"innerHTML":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ae(ii).boosted&&!br(ii)&&(ni.show="top"),ei){var ri=D(ei);if(ri.length>0)for(var si=0;si0?di.join(":"):null;ni.scroll=yi,ni.scrollTarget=pi}else if(ai.indexOf("show:")===0){var vi=ai.substr(5),di=vi.split(":"),Ei=di.pop(),pi=di.length>0?di.join(":"):null;ni.show=Ei,ni.showTarget=pi}else if(ai.indexOf("focus-scroll:")===0){var Si=ai.substr("focus-scroll:".length);ni.focusScroll=Si=="true"}else si==0?ni.swapStyle=ai:b("Unknown modifier in hx-swap: "+ai)}}return ni}function Sr(ii){return ne(ii,"hx-encoding")==="multipart/form-data"||h(ii,"form")&&ee(ii,"enctype")==="multipart/form-data"}function Er(ii,ti,ei){var ni=null;return R(ti,function(ri){ni==null&&(ni=ri.encodeParameters(ii,ei,ti))}),ni!=null?ni:Sr(ti)?mr(ei):pr(ei)}function T(ii){return{tasks:[],elts:[ii]}}function Cr(ii,ti){var ei=ii[0],ni=ii[ii.length-1];if(ti.scroll){var ri=null;ti.scrollTarget&&(ri=ue(ei,ti.scrollTarget)),ti.scroll==="top"&&(ei||ri)&&(ri=ri||ei,ri.scrollTop=0),ti.scroll==="bottom"&&(ni||ri)&&(ri=ri||ni,ri.scrollTop=ri.scrollHeight)}if(ti.show){var ri=null;if(ti.showTarget){var si=ti.showTarget;ti.showTarget==="window"&&(si="body"),ri=ue(ei,si)}ti.show==="top"&&(ei||ri)&&(ri=ri||ei,ri.scrollIntoView({block:"start",behavior:Q.config.scrollBehavior})),ti.show==="bottom"&&(ni||ri)&&(ri=ri||ni,ri.scrollIntoView({block:"end",behavior:Q.config.scrollBehavior}))}}function Rr(ii,ti,ei,ni){if(ni==null&&(ni={}),ii==null)return ni;var ri=te(ii,ti);if(ri){var si=ri.trim(),ai=ei;if(si==="unset")return null;si.indexOf("javascript:")===0?(si=si.substr(11),ai=!0):si.indexOf("js:")===0&&(si=si.substr(3),ai=!0),si.indexOf("{")!==0&&(si="{"+si+"}");var li;ai?li=Tr(ii,function(){return Function("return ("+si+")")()},{}):li=E(si);for(var di in li)li.hasOwnProperty(di)&&ni[di]==null&&(ni[di]=li[di])}return Rr(u(ii),ti,ei,ni)}function Tr(ii,ti,ei){return Q.config.allowEval?ti():(fe(ii,"htmx:evalDisallowedError"),ei)}function Or(ii,ti){return Rr(ii,"hx-vars",!0,ti)}function qr(ii,ti){return Rr(ii,"hx-vals",!1,ti)}function Hr(ii){return le(Or(ii),qr(ii))}function Lr(ii,ti,ei){if(ei!==null)try{ii.setRequestHeader(ti,ei)}catch(ni){ii.setRequestHeader(ti,encodeURIComponent(ei)),ii.setRequestHeader(ti+"-URI-AutoEncoded","true")}}function Ar(ii){if(ii.responseURL&&typeof URL!="undefined")try{var ti=new URL(ii.responseURL);return ti.pathname+ti.search}catch(ei){fe(re().body,"htmx:badResponseUrl",{url:ii.responseURL})}}function O(ii,ti){return ti.test(ii.getAllResponseHeaders())}function Nr(ii,ti,ei){return ii=ii.toLowerCase(),ei?ei instanceof Element||I(ei,"String")?he(ii,ti,null,null,{targetOverride:p(ei),returnPromise:!0}):he(ii,ti,p(ei.source),ei.event,{handler:ei.handler,headers:ei.headers,values:ei.values,targetOverride:p(ei.target),swapOverride:ei.swap,select:ei.select,returnPromise:!0}):he(ii,ti,null,null,{returnPromise:!0})}function Ir(ii){for(var ti=[];ii;)ti.push(ii),ii=ii.parentElement;return ti}function kr(ii,ti,ei){var ni,ri;if(typeof URL=="function"){ri=new URL(ti,document.location.href);var si=document.location.origin;ni=si===ri.origin}else ri=ti,ni=g(ti,document.location.origin);return Q.config.selfRequestsOnly&&!ni?!1:ce(ii,"htmx:validateUrl",le({url:ri,sameHost:ni},ei))}function he(ii,ti,ei,ni,ri,si){var ai=null,li=null;if(ri=ri!=null?ri:{},ri.returnPromise&&typeof Promise!="undefined")var di=new Promise(function(Wn,_n){ai=Wn,li=_n});ei==null&&(ei=re().body);var yi=ri.handler||Mr,pi=ri.select||null;if(!se(ei))return ie(ai),di;var vi=ri.targetOverride||ye(ei);if(vi==null||vi==pe)return fe(ei,"htmx:targetError",{target:te(ei,"hx-target")}),ie(li),di;var Ei=ae(ei),Si=Ei.lastButtonClicked;if(Si){var Li=ee(Si,"formaction");Li!=null&&(ti=Li);var Ai=ee(Si,"formmethod");Ai!=null&&Ai.toLowerCase()!=="dialog"&&(ii=Ai)}var Fi=ne(ei,"hx-confirm");if(si===void 0){var en=function(Wn){return he(ii,ti,ei,ni,ri,!!Wn)},rn={target:vi,elt:ei,path:ti,verb:ii,triggeringEvent:ni,etc:ri,issueRequest:en,question:Fi};if(ce(ei,"htmx:confirm",rn)===!1)return ie(ai),di}var ln=ei,Yi=ne(ei,"hx-sync"),sn=null,on=!1;if(Yi){var En=Yi.split(":"),pn=En[0].trim();if(pn==="this"?ln=xe(ei,"hx-sync"):ln=ue(ei,pn),Yi=(En[1]||"drop").trim(),Ei=ae(ln),Yi==="drop"&&Ei.xhr&&Ei.abortable!==!0)return ie(ai),di;if(Yi==="abort"){if(Ei.xhr)return ie(ai),di;on=!0}else if(Yi==="replace")ce(ln,"htmx:abort");else if(Yi.indexOf("queue")===0){var mn=Yi.split(" ");sn=(mn[1]||"last").trim()}}if(Ei.xhr)if(Ei.abortable)ce(ln,"htmx:abort");else{if(sn==null){if(ni){var vn=ae(ni);vn&&vn.triggerSpec&&vn.triggerSpec.queue&&(sn=vn.triggerSpec.queue)}sn==null&&(sn="last")}return Ei.queuedRequests==null&&(Ei.queuedRequests=[]),sn==="first"&&Ei.queuedRequests.length===0?Ei.queuedRequests.push(function(){he(ii,ti,ei,ni,ri)}):sn==="all"?Ei.queuedRequests.push(function(){he(ii,ti,ei,ni,ri)}):sn==="last"&&(Ei.queuedRequests=[],Ei.queuedRequests.push(function(){he(ii,ti,ei,ni,ri)})),ie(ai),di}var un=new XMLHttpRequest;Ei.xhr=un,Ei.abortable=on;var yn=function(){if(Ei.xhr=null,Ei.abortable=!1,Ei.queuedRequests!=null&&Ei.queuedRequests.length>0){var Wn=Ei.queuedRequests.shift();Wn()}},Cn=ne(ei,"hx-prompt");if(Cn){var Ni=prompt(Cn);if(Ni===null||!ce(ei,"htmx:prompt",{prompt:Ni,target:vi}))return ie(ai),yn(),di}if(Fi&&!si&&!confirm(Fi))return ie(ai),yn(),di;var Hi=xr(ei,vi,Ni);ii!=="get"&&!Sr(ei)&&(Hi["Content-Type"]="application/x-www-form-urlencoded"),ri.headers&&(Hi=le(Hi,ri.headers));var Pi=dr(ei,ii),$i=Pi.errors,gn=Pi.values;ri.values&&(gn=le(gn,ri.values));var tn=Hr(ei),Bi=le(gn,tn),Mi=yr(Bi,ei);Q.config.getCacheBusterParam&&ii==="get"&&(Mi["org.htmx.cache-buster"]=ee(vi,"id")||"true"),(ti==null||ti==="")&&(ti=re().location.href);var zi=Rr(ei,"hx-request"),Ji=ae(ei).boosted,Vi=Q.config.methodsThatUseUrlParams.indexOf(ii)>=0,Ii={boosted:Ji,useUrlParams:Vi,parameters:Mi,unfilteredParameters:Bi,headers:Hi,target:vi,verb:ii,errors:$i,withCredentials:ri.credentials||zi.credentials||Q.config.withCredentials,timeout:ri.timeout||zi.timeout||Q.config.timeout,path:ti,triggeringEvent:ni};if(!ce(ei,"htmx:configRequest",Ii))return ie(ai),yn(),di;if(ti=Ii.path,ii=Ii.verb,Hi=Ii.headers,Mi=Ii.parameters,$i=Ii.errors,Vi=Ii.useUrlParams,$i&&$i.length>0)return ce(ei,"htmx:validation:halted",Ii),ie(ai),yn(),di;var Sn=ti.split("#"),Yn=Sn[0],$n=Sn[1],Bn=ti;if(Vi){Bn=Yn;var Kn=Object.keys(Mi).length!==0;Kn&&(Bn.indexOf("?")<0?Bn+="?":Bn+="&",Bn+=pr(Mi),$n&&(Bn+="#"+$n))}if(!kr(ei,Bn,Ii))return fe(ei,"htmx:invalidPath",Ii),ie(li),di;if(un.open(ii.toUpperCase(),Bn,!0),un.overrideMimeType("text/html"),un.withCredentials=Ii.withCredentials,un.timeout=Ii.timeout,!zi.noHeaders){for(var Qn in Hi)if(Hi.hasOwnProperty(Qn)){var Cs=Hi[Qn];Lr(un,Qn,Cs)}}var zn={xhr:un,target:vi,requestConfig:Ii,etc:ri,boosted:Ji,select:pi,pathInfo:{requestPath:ti,finalRequestPath:Bn,anchor:$n}};if(un.onload=function(){try{var Wn=Ir(ei);if(zn.pathInfo.responsePath=Ar(un),yi(ei,zn),lr(ps,ms),ce(ei,"htmx:afterRequest",zn),ce(ei,"htmx:afterOnLoad",zn),!se(ei)){for(var _n=null;Wn.length>0&&_n==null;){var Qr=Wn.shift();se(Qr)&&(_n=Qr)}_n&&(ce(_n,"htmx:afterRequest",zn),ce(_n,"htmx:afterOnLoad",zn))}ie(ai),yn()}catch(ls){throw fe(ei,"htmx:onLoadError",le({error:ls},zn)),ls}},un.onerror=function(){lr(ps,ms),fe(ei,"htmx:afterRequest",zn),fe(ei,"htmx:sendError",zn),ie(li),yn()},un.onabort=function(){lr(ps,ms),fe(ei,"htmx:afterRequest",zn),fe(ei,"htmx:sendAbort",zn),ie(li),yn()},un.ontimeout=function(){lr(ps,ms),fe(ei,"htmx:afterRequest",zn),fe(ei,"htmx:timeout",zn),ie(li),yn()},!ce(ei,"htmx:beforeRequest",zn))return ie(ai),yn(),di;var ps=or(ei),ms=sr(ei);oe(["loadstart","loadend","progress","abort"],function(Wn){oe([un,un.upload],function(_n){_n.addEventListener(Wn,function(Qr){ce(ei,"htmx:xhr:"+Wn,{lengthComputable:Qr.lengthComputable,loaded:Qr.loaded,total:Qr.total})})})}),ce(ei,"htmx:beforeSend",zn);var Qs=Vi?null:Er(un,ei,Mi);return un.send(Qs),di}function Pr(ii,ti){var ei=ti.xhr,ni=null,ri=null;if(O(ei,/HX-Push:/i)?(ni=ei.getResponseHeader("HX-Push"),ri="push"):O(ei,/HX-Push-Url:/i)?(ni=ei.getResponseHeader("HX-Push-Url"),ri="push"):O(ei,/HX-Replace-Url:/i)&&(ni=ei.getResponseHeader("HX-Replace-Url"),ri="replace"),ni)return ni==="false"?{}:{type:ri,path:ni};var si=ti.pathInfo.finalRequestPath,ai=ti.pathInfo.responsePath,li=ne(ii,"hx-push-url"),di=ne(ii,"hx-replace-url"),yi=ae(ii).boosted,pi=null,vi=null;return li?(pi="push",vi=li):di?(pi="replace",vi=di):yi&&(pi="push",vi=ai||si),vi?vi==="false"?{}:(vi==="true"&&(vi=ai||si),ti.pathInfo.anchor&&vi.indexOf("#")===-1&&(vi=vi+"#"+ti.pathInfo.anchor),{type:pi,path:vi}):{}}function Mr(ii,ti){var ei=ti.xhr,ni=ti.target,ri=ti.etc,si=ti.requestConfig,ai=ti.select;if(!!ce(ii,"htmx:beforeOnLoad",ti)){if(O(ei,/HX-Trigger:/i)&&_e(ei,"HX-Trigger",ii),O(ei,/HX-Location:/i)){er();var li=ei.getResponseHeader("HX-Location"),di;li.indexOf("{")===0&&(di=E(li),li=di.path,delete di.path),Nr("GET",li,di).then(function(){tr(li)});return}var yi=O(ei,/HX-Refresh:/i)&&ei.getResponseHeader("HX-Refresh")==="true";if(O(ei,/HX-Redirect:/i)){location.href=ei.getResponseHeader("HX-Redirect"),yi&&location.reload();return}if(yi){location.reload();return}O(ei,/HX-Retarget:/i)&&(ei.getResponseHeader("HX-Retarget")==="this"?ti.target=ii:ti.target=ue(ii,ei.getResponseHeader("HX-Retarget")));var pi=Pr(ii,ti),vi=ei.status>=200&&ei.status<400&&ei.status!==204,Ei=ei.response,Si=ei.status>=400,Li=Q.config.ignoreTitle,Ai=le({shouldSwap:vi,serverResponse:Ei,isError:Si,ignoreTitle:Li},ti);if(!!ce(ni,"htmx:beforeSwap",Ai)){if(ni=Ai.target,Ei=Ai.serverResponse,Si=Ai.isError,Li=Ai.ignoreTitle,ti.target=ni,ti.failed=Si,ti.successful=!Si,Ai.shouldSwap){ei.status===286&&at(ii),R(ii,function(pn){Ei=pn.transformResponse(Ei,ei,ii)}),pi.type&&er();var Fi=ri.swapOverride;O(ei,/HX-Reswap:/i)&&(Fi=ei.getResponseHeader("HX-Reswap"));var di=wr(ii,Fi);di.hasOwnProperty("ignoreTitle")&&(Li=di.ignoreTitle),ni.classList.add(Q.config.swappingClass);var en=null,rn=null,ln=function(){try{var pn=document.activeElement,mn={};try{mn={elt:pn,start:pn?pn.selectionStart:null,end:pn?pn.selectionEnd:null}}catch(Pi){}var vn;ai&&(vn=ai),O(ei,/HX-Reselect:/i)&&(vn=ei.getResponseHeader("HX-Reselect")),pi.type&&(ce(re().body,"htmx:beforeHistoryUpdate",le({history:pi},ti)),pi.type==="push"?(tr(pi.path),ce(re().body,"htmx:pushedIntoHistory",{path:pi.path})):(rr(pi.path),ce(re().body,"htmx:replacedInHistory",{path:pi.path})));var un=T(ni);if(je(di.swapStyle,ni,ii,Ei,un,vn),mn.elt&&!se(mn.elt)&&ee(mn.elt,"id")){var yn=document.getElementById(ee(mn.elt,"id")),Cn={preventScroll:di.focusScroll!==void 0?!di.focusScroll:!Q.config.defaultFocusScroll};if(yn){if(mn.start&&yn.setSelectionRange)try{yn.setSelectionRange(mn.start,mn.end)}catch(Pi){}yn.focus(Cn)}}if(ni.classList.remove(Q.config.swappingClass),oe(un.elts,function(Pi){Pi.classList&&Pi.classList.add(Q.config.settlingClass),ce(Pi,"htmx:afterSwap",ti)}),O(ei,/HX-Trigger-After-Swap:/i)){var Ni=ii;se(ii)||(Ni=re().body),_e(ei,"HX-Trigger-After-Swap",Ni)}var Hi=function(){if(oe(un.tasks,function(tn){tn.call()}),oe(un.elts,function(tn){tn.classList&&tn.classList.remove(Q.config.settlingClass),ce(tn,"htmx:afterSettle",ti)}),ti.pathInfo.anchor){var Pi=re().getElementById(ti.pathInfo.anchor);Pi&&Pi.scrollIntoView({block:"start",behavior:"auto"})}if(un.title&&!Li){var $i=C("title");$i?$i.innerHTML=un.title:window.document.title=un.title}if(Cr(un.elts,di),O(ei,/HX-Trigger-After-Settle:/i)){var gn=ii;se(ii)||(gn=re().body),_e(ei,"HX-Trigger-After-Settle",gn)}ie(en)};di.settleDelay>0?setTimeout(Hi,di.settleDelay):Hi()}catch(Pi){throw fe(ii,"htmx:swapError",ti),ie(rn),Pi}},Yi=Q.config.globalViewTransitions;if(di.hasOwnProperty("transition")&&(Yi=di.transition),Yi&&ce(ii,"htmx:beforeTransition",ti)&&typeof Promise!="undefined"&&document.startViewTransition){var sn=new Promise(function(pn,mn){en=pn,rn=mn}),on=ln;ln=function(){document.startViewTransition(function(){return on(),sn})}}di.swapDelay>0?setTimeout(ln,di.swapDelay):ln()}Si&&fe(ii,"htmx:responseError",le({error:"Response Status Error Code "+ei.status+" from "+ti.pathInfo.requestPath},ti))}}}var Xr={};function Dr(){return{init:function(ii){return null},onEvent:function(ii,ti){return!0},transformResponse:function(ii,ti,ei){return ii},isInlineSwap:function(ii){return!1},handleSwap:function(ii,ti,ei,ni){return!1},encodeParameters:function(ii,ti,ei){return null}}}function Ur(ii,ti){ti.init&&ti.init(r),Xr[ii]=le(Dr(),ti)}function Br(ii){delete Xr[ii]}function Fr(ii,ti,ei){if(ii==null)return ti;ti==null&&(ti=[]),ei==null&&(ei=[]);var ni=te(ii,"hx-ext");return ni&&oe(ni.split(","),function(ri){if(ri=ri.replace(/ /g,""),ri.slice(0,7)=="ignore:"){ei.push(ri.slice(7));return}if(ei.indexOf(ri)<0){var si=Xr[ri];si&&ti.indexOf(si)<0&&ti.push(si)}}),Fr(u(ii),ti,ei)}var Vr=!1;re().addEventListener("DOMContentLoaded",function(){Vr=!0});function jr(ii){Vr||re().readyState==="complete"?ii():re().addEventListener("DOMContentLoaded",ii)}function _r(){Q.config.includeIndicatorStyles!==!1&&re().head.insertAdjacentHTML("beforeend","")}function zr(){var ii=re().querySelector('meta[name="htmx-config"]');return ii?E(ii.content):null}function $r(){var ii=zr();ii&&(Q.config=le(Q.config,ii))}return jr(function(){$r(),_r();var ii=re().body;zt(ii);var ti=re().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");ii.addEventListener("htmx:abort",function(ni){var ri=ni.target,si=ae(ri);si&&si.xhr&&si.xhr.abort()});let ei=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(ni){ni.state&&ni.state.htmx?(ar(),oe(ti,function(ri){ce(ri,"htmx:restored",{document:re(),triggerEvent:ce})})):ei&&ei(ni)},setTimeout(function(){ce(ii,"htmx:load",{}),ii=null},0)}),Q}()})});var _l=Ga((Rc,Pc)=>{(function(ii,ti){typeof Rc=="object"&&typeof Pc!="undefined"?Pc.exports=ti():typeof define=="function"&&define.amd?define(ti):(ii=typeof globalThis!="undefined"?globalThis:ii||self,ii.TomSelect=ti())})(Rc,function(){"use strict";function ii(fi,oi){fi.split(/\s+/).forEach(ci=>{oi(ci)})}class ti{constructor(){this._events=void 0,this._events={}}on(oi,ci){ii(oi,ui=>{let mi=this._events[ui]||[];mi.push(ci),this._events[ui]=mi})}off(oi,ci){var ui=arguments.length;if(ui===0){this._events={};return}ii(oi,mi=>{if(ui===1){delete this._events[mi];return}let bi=this._events[mi];bi!==void 0&&(bi.splice(bi.indexOf(ci),1),this._events[mi]=bi)})}trigger(oi,...ci){var ui=this;ii(oi,mi=>{let bi=ui._events[mi];bi!==void 0&&bi.forEach(_i=>{_i.apply(ui,ci)})})}}function ei(fi){return fi.plugins={},class extends fi{constructor(...oi){super(...oi);this.plugins={names:[],settings:{},requested:{},loaded:{}}}static define(oi,ci){fi.plugins[oi]={name:oi,fn:ci}}initializePlugins(oi){var ci,ui;let mi=this,bi=[];if(Array.isArray(oi))oi.forEach(_i=>{typeof _i=="string"?bi.push(_i):(mi.plugins.settings[_i.name]=_i.options,bi.push(_i.name))});else if(oi)for(ci in oi)oi.hasOwnProperty(ci)&&(mi.plugins.settings[ci]=oi[ci],bi.push(ci));for(;ui=bi.shift();)mi.require(ui)}loadPlugin(oi){var ci=this,ui=ci.plugins,mi=fi.plugins[oi];if(!fi.plugins.hasOwnProperty(oi))throw new Error('Unable to find "'+oi+'" plugin');ui.requested[oi]=!0,ui.loaded[oi]=mi.fn.apply(ci,[ci.plugins.settings[oi]||{}]),ui.names.push(oi)}require(oi){var ci=this,ui=ci.plugins;if(!ci.plugins.loaded.hasOwnProperty(oi)){if(ui.requested[oi])throw new Error('Plugin has circular dependency ("'+oi+'")');ci.loadPlugin(oi)}return ui.loaded[oi]}}}let ni=fi=>(fi=fi.filter(Boolean),fi.length<2?fi[0]||"":di(fi)==1?"["+fi.join("")+"]":"(?:"+fi.join("|")+")"),ri=fi=>{if(!ai(fi))return fi.join("");let oi="",ci=0,ui=()=>{ci>1&&(oi+="{"+ci+"}")};return fi.forEach((mi,bi)=>{if(mi===fi[bi-1]){ci++;return}ui(),oi+=mi,ci=1}),ui(),oi},si=fi=>{let oi=pi(fi);return ni(oi)},ai=fi=>new Set(fi).size!==fi.length,li=fi=>(fi+"").replace(/([\$\(\)\*\+\.\?\[\]\^\{\|\}\\])/gu,"\\$1"),di=fi=>fi.reduce((oi,ci)=>Math.max(oi,yi(ci)),0),yi=fi=>pi(fi).length,pi=fi=>Array.from(fi);let vi=fi=>{if(fi.length===1)return[[fi]];let oi=[],ci=fi.substring(1);return vi(ci).forEach(function(mi){let bi=mi.slice(0);bi[0]=fi.charAt(0)+bi[0],oi.push(bi),bi=mi.slice(0),bi.unshift(fi.charAt(0)),oi.push(bi)}),oi};let Ei=[[0,65535]],Si="[\u0300-\u036F\xB7\u02BE\u02BC]",Li,Ai,Fi=3,en={},rn={"/":"\u2044\u2215","0":"\u07C0",a:"\u2C65\u0250\u0251",aa:"\uA733",ae:"\xE6\u01FD\u01E3",ao:"\uA735",au:"\uA737",av:"\uA739\uA73B",ay:"\uA73D",b:"\u0180\u0253\u0183",c:"\uA73F\u0188\u023C\u2184",d:"\u0111\u0257\u0256\u1D05\u018C\uABB7\u0501\u0266",e:"\u025B\u01DD\u1D07\u0247",f:"\uA77C\u0192",g:"\u01E5\u0260\uA7A1\u1D79\uA77F\u0262",h:"\u0127\u2C68\u2C76\u0265",i:"\u0268\u0131",j:"\u0249\u0237",k:"\u0199\u2C6A\uA741\uA743\uA745\uA7A3",l:"\u0142\u019A\u026B\u2C61\uA749\uA747\uA781\u026D",m:"\u0271\u026F\u03FB",n:"\uA7A5\u019E\u0272\uA791\u1D0E\u043B\u0509",o:"\xF8\u01FF\u0254\u0275\uA74B\uA74D\u1D11",oe:"\u0153",oi:"\u01A3",oo:"\uA74F",ou:"\u0223",p:"\u01A5\u1D7D\uA751\uA753\uA755\u03C1",q:"\uA757\uA759\u024B",r:"\u024D\u027D\uA75B\uA7A7\uA783",s:"\xDF\u023F\uA7A9\uA785\u0282",t:"\u0167\u01AD\u0288\u2C66\uA787",th:"\xFE",tz:"\uA729",u:"\u0289",v:"\u028B\uA75F\u028C",vy:"\uA761",w:"\u2C73",y:"\u01B4\u024F\u1EFF",z:"\u01B6\u0225\u0240\u2C6C\uA763",hv:"\u0195"};for(let fi in rn){let oi=rn[fi]||"";for(let ci=0;ci{Li===void 0&&(Li=vn(fi||Ei))},sn=(fi,oi="NFKD")=>fi.normalize(oi),on=fi=>pi(fi).reduce((oi,ci)=>oi+En(ci),""),En=fi=>(fi=sn(fi).toLowerCase().replace(ln,oi=>en[oi]||""),sn(fi,"NFC"));function*pn(fi){for(let[oi,ci]of fi)for(let ui=oi;ui<=ci;ui++){let mi=String.fromCharCode(ui),bi=on(mi);bi!=mi.toLowerCase()&&(bi.length>Fi||bi.length!=0&&(yield{folded:bi,composed:mi,code_point:ui}))}}let mn=fi=>{let oi={},ci=(ui,mi)=>{let bi=oi[ui]||new Set,_i=new RegExp("^"+si(bi)+"$","iu");mi.match(_i)||(bi.add(li(mi)),oi[ui]=bi)};for(let ui of pn(fi))ci(ui.folded,ui.folded),ci(ui.folded,ui.composed);return oi},vn=fi=>{let oi=mn(fi),ci={},ui=[];for(let bi in oi){let _i=oi[bi];_i&&(ci[bi]=si(_i)),bi.length>1&&ui.push(li(bi))}ui.sort((bi,_i)=>_i.length-bi.length);let mi=ni(ui);return Ai=new RegExp("^"+mi,"u"),ci},un=(fi,oi=1)=>{let ci=0;return fi=fi.map(ui=>(Li[ui]&&(ci+=ui.length),Li[ui]||ui)),ci>=oi?ri(fi):""},yn=(fi,oi=1)=>(oi=Math.max(oi,fi.length-1),ni(vi(fi).map(ci=>un(ci,oi)))),Cn=(fi,oi=!0)=>{let ci=fi.length>1?1:0;return ni(fi.map(ui=>{let mi=[],bi=oi?ui.length():ui.length()-1;for(let _i=0;_i{for(let ci of oi){if(ci.start!=fi.start||ci.end!=fi.end||ci.substrs.join("")!==fi.substrs.join(""))continue;let ui=fi.parts,mi=_i=>{for(let Ci of ui){if(Ci.start===_i.start&&Ci.substr===_i.substr)return!1;if(!(_i.length==1||Ci.length==1)&&(_i.startCi.start||Ci.start<_i.start&&Ci.end>_i.start))return!0}return!1};if(!(ci.parts.filter(mi).length>0))return!0}return!1};class Hi{constructor(){this.parts=[],this.substrs=[],this.start=0,this.end=0}add(oi){oi&&(this.parts.push(oi),this.substrs.push(oi.substr),this.start=Math.min(oi.start,this.start),this.end=Math.max(oi.end,this.end))}last(){return this.parts[this.parts.length-1]}length(){return this.parts.length}clone(oi,ci){let ui=new Hi,mi=JSON.parse(JSON.stringify(this.parts)),bi=mi.pop();for(let Di of mi)ui.add(Di);let _i=ci.substr.substring(0,oi-bi.start),Ci=_i.length;return ui.add({start:bi.start,end:bi.start+Ci,length:Ci,substr:_i}),ui}}let Pi=fi=>{Yi(),fi=on(fi);let oi="",ci=[new Hi];for(let ui=0;ui0){Di=Di.sort((Wi,ji)=>Wi.length()-ji.length());for(let Wi of Di)Ni(Wi,ci)||ci.push(Wi);continue}if(ui>0&&Oi.size==1&&!Oi.has("3")){oi+=Cn(ci,!1);let Wi=new Hi,ji=ci[0];ji&&Wi.add(ji.last()),ci=[Wi]}}return oi+=Cn(ci,!0),oi};let $i=(fi,oi)=>{if(!!fi)return fi[oi]},gn=(fi,oi)=>{if(!!fi){for(var ci,ui=oi.split(".");(ci=ui.shift())&&(fi=fi[ci]););return fi}},tn=(fi,oi,ci)=>{var ui,mi;return!fi||(fi=fi+"",oi.regex==null)||(mi=fi.search(oi.regex),mi===-1)?0:(ui=oi.string.length/fi.length,mi===0&&(ui+=.5),ui*ci)},Bi=(fi,oi)=>{var ci=fi[oi];if(typeof ci=="function")return ci;ci&&!Array.isArray(ci)&&(fi[oi]=[ci])},Mi=(fi,oi)=>{if(Array.isArray(fi))fi.forEach(oi);else for(var ci in fi)fi.hasOwnProperty(ci)&&oi(fi[ci],ci)},zi=(fi,oi)=>typeof fi=="number"&&typeof oi=="number"?fi>oi?1:fioi?1:oi>fi?-1:0);class Ji{constructor(oi,ci){this.items=void 0,this.settings=void 0,this.items=oi,this.settings=ci||{diacritics:!0}}tokenize(oi,ci,ui){if(!oi||!oi.length)return[];let mi=[],bi=oi.split(/\s+/);var _i;return ui&&(_i=new RegExp("^("+Object.keys(ui).map(li).join("|")+"):(.*)$")),bi.forEach(Ci=>{let Di,Oi=null,Wi=null;_i&&(Di=Ci.match(_i))&&(Oi=Di[1],Ci=Di[2]),Ci.length>0&&(this.settings.diacritics?Wi=Pi(Ci)||null:Wi=li(Ci),Wi&&ci&&(Wi="\\b"+Wi)),mi.push({string:Ci,regex:Wi?new RegExp(Wi,"iu"):null,field:Oi})}),mi}getScoreFunction(oi,ci){var ui=this.prepareSearch(oi,ci);return this._getScoreFunction(ui)}_getScoreFunction(oi){let ci=oi.tokens,ui=ci.length;if(!ui)return function(){return 0};let mi=oi.options.fields,bi=oi.weights,_i=mi.length,Ci=oi.getAttrFn;if(!_i)return function(){return 1};let Di=function(){return _i===1?function(Oi,Wi){let ji=mi[0].field;return tn(Ci(Wi,ji),Oi,bi[ji]||1)}:function(Oi,Wi){var ji=0;if(Oi.field){let Zi=Ci(Wi,Oi.field);!Oi.regex&&Zi?ji+=1/_i:ji+=tn(Zi,Oi,1)}else Mi(bi,(Zi,Rn)=>{ji+=tn(Ci(Wi,Rn),Oi,Zi)});return ji/_i}}();return ui===1?function(Oi){return Di(ci[0],Oi)}:oi.options.conjunction==="and"?function(Oi){var Wi,ji=0;for(let Zi of ci){if(Wi=Di(Zi,Oi),Wi<=0)return 0;ji+=Wi}return ji/ui}:function(Oi){var Wi=0;return Mi(ci,ji=>{Wi+=Di(ji,Oi)}),Wi/ui}}getSortFunction(oi,ci){var ui=this.prepareSearch(oi,ci);return this._getSortFunction(ui)}_getSortFunction(oi){var ci,ui=[];let mi=this,bi=oi.options,_i=!oi.query&&bi.sort_empty?bi.sort_empty:bi.sort;if(typeof _i=="function")return _i.bind(this);let Ci=function(Wi,ji){return Wi==="$score"?ji.score:oi.getAttrFn(mi.items[ji.id],Wi)};if(_i)for(let Oi of _i)(oi.query||Oi.field!=="$score")&&ui.push(Oi);if(oi.query){ci=!0;for(let Oi of ui)if(Oi.field==="$score"){ci=!1;break}ci&&ui.unshift({field:"$score",direction:"desc"})}else ui=ui.filter(Oi=>Oi.field!=="$score");return ui.length?function(Oi,Wi){var ji,Zi;for(let Rn of ui)if(Zi=Rn.field,ji=(Rn.direction==="desc"?-1:1)*zi(Ci(Zi,Oi),Ci(Zi,Wi)),ji)return ji;return 0}:null}prepareSearch(oi,ci){let ui={};var mi=Object.assign({},ci);if(Bi(mi,"sort"),Bi(mi,"sort_empty"),mi.fields){Bi(mi,"fields");let bi=[];mi.fields.forEach(_i=>{typeof _i=="string"&&(_i={field:_i,weight:1}),bi.push(_i),ui[_i.field]="weight"in _i?_i.weight:1}),mi.fields=bi}return{options:mi,query:oi.toLowerCase().trim(),tokens:this.tokenize(oi,mi.respect_word_boundaries,ui),total:0,items:[],weights:ui,getAttrFn:mi.nesting?gn:$i}}search(oi,ci){var ui=this,mi,bi;bi=this.prepareSearch(oi,ci),ci=bi.options,oi=bi.query;let _i=ci.score||ui._getScoreFunction(bi);oi.length?Mi(ui.items,(Di,Oi)=>{mi=_i(Di),(ci.filter===!1||mi>0)&&bi.items.push({score:mi,id:Oi})}):Mi(ui.items,(Di,Oi)=>{bi.items.push({score:1,id:Oi})});let Ci=ui._getSortFunction(bi);return Ci&&bi.items.sort(Ci),bi.total=bi.items.length,typeof ci.limit=="number"&&(bi.items=bi.items.slice(0,ci.limit)),bi}}let Vi=(fi,oi)=>{if(Array.isArray(fi))fi.forEach(oi);else for(var ci in fi)fi.hasOwnProperty(ci)&&oi(fi[ci],ci)},Ii=fi=>{if(fi.jquery)return fi[0];if(fi instanceof HTMLElement)return fi;if(Sn(fi)){var oi=document.createElement("template");return oi.innerHTML=fi.trim(),oi.content.firstChild}return document.querySelector(fi)},Sn=fi=>typeof fi=="string"&&fi.indexOf("<")>-1,Yn=fi=>fi.replace(/['"\\]/g,"\\$&"),$n=(fi,oi)=>{var ci=document.createEvent("HTMLEvents");ci.initEvent(oi,!0,!1),fi.dispatchEvent(ci)},Bn=(fi,oi)=>{Object.assign(fi.style,oi)},Kn=(fi,...oi)=>{var ci=Cs(oi);fi=zn(fi),fi.map(ui=>{ci.map(mi=>{ui.classList.add(mi)})})},Qn=(fi,...oi)=>{var ci=Cs(oi);fi=zn(fi),fi.map(ui=>{ci.map(mi=>{ui.classList.remove(mi)})})},Cs=fi=>{var oi=[];return Vi(fi,ci=>{typeof ci=="string"&&(ci=ci.trim().split(/[\11\12\14\15\40]/)),Array.isArray(ci)&&(oi=oi.concat(ci))}),oi.filter(Boolean)},zn=fi=>(Array.isArray(fi)||(fi=[fi]),fi),ps=(fi,oi,ci)=>{if(!(ci&&!ci.contains(fi)))for(;fi&&fi.matches;){if(fi.matches(oi))return fi;fi=fi.parentNode}},ms=(fi,oi=0)=>oi>0?fi[fi.length-1]:fi[0],Qs=fi=>Object.keys(fi).length===0,Wn=(fi,oi)=>{if(!fi)return-1;oi=oi||fi.nodeName;for(var ci=0;fi=fi.previousElementSibling;)fi.matches(oi)&&ci++;return ci},_n=(fi,oi)=>{Vi(oi,(ci,ui)=>{ci==null?fi.removeAttribute(ui):fi.setAttribute(ui,""+ci)})},Qr=(fi,oi)=>{fi.parentNode&&fi.parentNode.replaceChild(oi,fi)},ls=(fi,oi)=>{if(oi===null)return;if(typeof oi=="string"){if(!oi.length)return;oi=new RegExp(oi,"i")}let ci=bi=>{var _i=bi.data.match(oi);if(_i&&bi.data.length>0){var Ci=document.createElement("span");Ci.className="highlight";var Di=bi.splitText(_i.index);Di.splitText(_i[0].length);var Oi=Di.cloneNode(!0);return Ci.appendChild(Oi),Qr(Di,Ci),1}return 0},ui=bi=>{bi.nodeType===1&&bi.childNodes&&!/(script|style)/i.test(bi.tagName)&&(bi.className!=="highlight"||bi.tagName!=="SPAN")&&Array.from(bi.childNodes).forEach(_i=>{mi(_i)})},mi=bi=>bi.nodeType===3?ci(bi):(ui(bi),0);mi(fi)},Xs=fi=>{var oi=fi.querySelectorAll("span.highlight");Array.prototype.forEach.call(oi,function(ci){var ui=ci.parentNode;ui.replaceChild(ci.firstChild,ci),ui.normalize()})},mo=65,Js=13,Fs=27,Ss=37,Po=38,Zs=39,Ho=40,ga=8,$l=46,va=9,Fo=(typeof navigator=="undefined"?!1:/Mac/.test(navigator.userAgent))?"metaKey":"ctrlKey";var Wa={options:[],optgroups:[],plugins:[],delimiter:",",splitOn:null,persist:!0,diacritics:!0,create:null,createOnBlur:!1,createFilter:null,highlight:!0,openOnFocus:!0,shouldOpen:null,maxOptions:50,maxItems:null,hideSelected:null,duplicates:!1,addPrecedence:!1,selectOnTab:!1,preload:null,allowEmptyOption:!1,refreshThrottle:300,loadThrottle:300,loadingClass:"loading",dataAttr:null,optgroupField:"optgroup",valueField:"value",labelField:"text",disabledField:"disabled",optgroupLabelField:"label",optgroupValueField:"value",lockOptgroupOrder:!1,sortField:"$order",searchField:["text"],searchConjunction:"and",mode:null,wrapperClass:"ts-wrapper",controlClass:"ts-control",dropdownClass:"ts-dropdown",dropdownContentClass:"ts-dropdown-content",itemClass:"item",optionClass:"option",dropdownParent:null,controlInput:'',copyClassesToDropdown:!1,placeholder:null,hidePlaceholder:null,shouldLoad:function(fi){return fi.length>0},render:{}};let xn=fi=>typeof fi=="undefined"||fi===null?null:eo(fi),eo=fi=>typeof fi=="boolean"?fi?"1":"0":fi+"",to=fi=>(fi+"").replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),Bl=(fi,oi)=>oi>0?setTimeout(fi,oi):(fi.call(null),null),$o=(fi,oi)=>{var ci;return function(ui,mi){var bi=this;ci&&(bi.loading=Math.max(bi.loading-1,0),clearTimeout(ci)),ci=setTimeout(function(){ci=null,bi.loadedSearches[ui]=!0,fi.call(bi,ui,mi)},oi)}},jo=(fi,oi,ci)=>{var ui,mi=fi.trigger,bi={};fi.trigger=function(){var _i=arguments[0];if(oi.indexOf(_i)!==-1)bi[_i]=arguments;else return mi.apply(fi,arguments)},ci.apply(fi,[]),fi.trigger=mi;for(ui of oi)ui in bi&&mi.apply(fi,bi[ui])},As=fi=>({start:fi.selectionStart||0,length:(fi.selectionEnd||0)-(fi.selectionStart||0)}),Dn=(fi,oi=!1)=>{fi&&(fi.preventDefault(),oi&&fi.stopPropagation())},Ln=(fi,oi,ci,ui)=>{fi.addEventListener(oi,ci,ui)},hi=(fi,oi)=>{if(!oi||!oi[fi])return!1;var ci=(oi.altKey?1:0)+(oi.ctrlKey?1:0)+(oi.shiftKey?1:0)+(oi.metaKey?1:0);return ci===1},gi=(fi,oi)=>{let ci=fi.getAttribute("id");return ci||(fi.setAttribute("id",oi),oi)},wi=fi=>fi.replace(/[\\"']/g,"\\$&"),Ti=(fi,oi)=>{oi&&fi.append(oi)};function Ri(fi,oi){var ci=Object.assign({},Wa,oi),ui=ci.dataAttr,mi=ci.labelField,bi=ci.valueField,_i=ci.disabledField,Ci=ci.optgroupField,Di=ci.optgroupLabelField,Oi=ci.optgroupValueField,Wi=fi.tagName.toLowerCase(),ji=fi.getAttribute("placeholder")||fi.getAttribute("data-placeholder");if(!ji&&!ci.allowEmptyOption){let An=fi.querySelector('option[value=""]');An&&(ji=An.textContent)}var Zi={placeholder:ji,options:[],optgroups:[],items:[],maxItems:null},Rn=()=>{var An,Hn=Zi.options,Nn={},dn=1;let Vn=0;var ks=Tn=>{var Mn=Object.assign({},Tn.dataset),wn=ui&&Mn[ui];return typeof wn=="string"&&wn.length&&(Mn=Object.assign(Mn,JSON.parse(wn))),Mn},Ua=(Tn,Mn)=>{var wn=xn(Tn.value);if(wn!=null&&!(!wn&&!ci.allowEmptyOption)){if(Nn.hasOwnProperty(wn)){if(Mn){var es=Nn[wn][Ci];es?Array.isArray(es)?es.push(Mn):Nn[wn][Ci]=[es,Mn]:Nn[wn][Ci]=Mn}}else{var In=ks(Tn);In[mi]=In[mi]||Tn.textContent,In[bi]=In[bi]||wn,In[_i]=In[_i]||Tn.disabled,In[Ci]=In[Ci]||Mn,In.$option=Tn,In.$order=In.$order||++Vn,Nn[wn]=In,Hn.push(In)}Tn.selected&&Zi.items.push(wn)}},Bo=Tn=>{var Mn,wn;wn=ks(Tn),wn[Di]=wn[Di]||Tn.getAttribute("label")||"",wn[Oi]=wn[Oi]||dn++,wn[_i]=wn[_i]||Tn.disabled,wn.$order=wn.$order||++Vn,Zi.optgroups.push(wn),Mn=wn[Oi],Vi(Tn.children,es=>{Ua(es,Mn)})};Zi.maxItems=fi.hasAttribute("multiple")?null:1,Vi(fi.children,Tn=>{An=Tn.tagName.toLowerCase(),An==="optgroup"?Bo(Tn):An==="option"&&Ua(Tn)})},Qi=()=>{let An=fi.getAttribute(ui);if(An)Zi.options=JSON.parse(An),Vi(Zi.options,Nn=>{Zi.items.push(Nn[bi])});else{var Hn=fi.value.trim()||"";if(!ci.allowEmptyOption&&!Hn.length)return;let Nn=Hn.split(ci.delimiter);Vi(Nn,dn=>{let Vn={};Vn[mi]=dn,Vn[bi]=dn,Zi.options.push(Vn)}),Zi.items=Nn}};return Wi==="select"?Rn():Qi(),Object.assign({},Wa,Zi,oi)}var qi=0;class nn extends ei(ti){constructor(oi,ci){super();this.control_input=void 0,this.wrapper=void 0,this.dropdown=void 0,this.control=void 0,this.dropdown_content=void 0,this.focus_node=void 0,this.order=0,this.settings=void 0,this.input=void 0,this.tabIndex=void 0,this.is_select_tag=void 0,this.rtl=void 0,this.inputId=void 0,this._destroy=void 0,this.sifter=void 0,this.isOpen=!1,this.isDisabled=!1,this.isReadOnly=!1,this.isRequired=void 0,this.isInvalid=!1,this.isValid=!0,this.isLocked=!1,this.isFocused=!1,this.isInputHidden=!1,this.isSetup=!1,this.ignoreFocus=!1,this.ignoreHover=!1,this.hasOptions=!1,this.currentResults=void 0,this.lastValue="",this.caretPos=0,this.loading=0,this.loadedSearches={},this.activeOption=null,this.activeItems=[],this.optgroups={},this.options={},this.userOptions={},this.items=[],this.refreshTimeout=null,qi++;var ui,mi=Ii(oi);if(mi.tomselect)throw new Error("Tom Select already initialized on this element");mi.tomselect=this;var bi=window.getComputedStyle&&window.getComputedStyle(mi,null);ui=bi.getPropertyValue("direction");let _i=Ri(mi,ci);this.settings=_i,this.input=mi,this.tabIndex=mi.tabIndex||0,this.is_select_tag=mi.tagName.toLowerCase()==="select",this.rtl=/rtl/i.test(ui),this.inputId=gi(mi,"tomselect-"+qi),this.isRequired=mi.required,this.sifter=new Ji(this.options,{diacritics:_i.diacritics}),_i.mode=_i.mode||(_i.maxItems===1?"single":"multi"),typeof _i.hideSelected!="boolean"&&(_i.hideSelected=_i.mode==="multi"),typeof _i.hidePlaceholder!="boolean"&&(_i.hidePlaceholder=_i.mode!=="multi");var Ci=_i.createFilter;typeof Ci!="function"&&(typeof Ci=="string"&&(Ci=new RegExp(Ci)),Ci instanceof RegExp?_i.createFilter=Hn=>Ci.test(Hn):_i.createFilter=Hn=>this.settings.duplicates||!this.options[Hn]),this.initializePlugins(_i.plugins),this.setupCallbacks(),this.setupTemplates();let Di=Ii("
"),Oi=Ii("
"),Wi=this._render("dropdown"),ji=Ii('
'),Zi=this.input.getAttribute("class")||"",Rn=_i.mode;var Qi;if(Kn(Di,_i.wrapperClass,Zi,Rn),Kn(Oi,_i.controlClass),Ti(Di,Oi),Kn(Wi,_i.dropdownClass,Rn),_i.copyClassesToDropdown&&Kn(Wi,Zi),Kn(ji,_i.dropdownContentClass),Ti(Wi,ji),Ii(_i.dropdownParent||Di).appendChild(Wi),Sn(_i.controlInput)){Qi=Ii(_i.controlInput);var An=["autocorrect","autocapitalize","autocomplete","spellcheck"];Mi(An,Hn=>{mi.getAttribute(Hn)&&_n(Qi,{[Hn]:mi.getAttribute(Hn)})}),Qi.tabIndex=-1,Oi.appendChild(Qi),this.focus_node=Qi}else _i.controlInput?(Qi=Ii(_i.controlInput),this.focus_node=Qi):(Qi=Ii(""),this.focus_node=Oi);this.wrapper=Di,this.dropdown=Wi,this.dropdown_content=ji,this.control=Oi,this.control_input=Qi,this.setup()}setup(){let oi=this,ci=oi.settings,ui=oi.control_input,mi=oi.dropdown,bi=oi.dropdown_content,_i=oi.wrapper,Ci=oi.control,Di=oi.input,Oi=oi.focus_node,Wi={passive:!0},ji=oi.inputId+"-ts-dropdown";_n(bi,{id:ji}),_n(Oi,{role:"combobox","aria-haspopup":"listbox","aria-expanded":"false","aria-controls":ji});let Zi=gi(Oi,oi.inputId+"-ts-control"),Rn="label[for='"+Yn(oi.inputId)+"']",Qi=document.querySelector(Rn),An=oi.focus.bind(oi);if(Qi){Ln(Qi,"click",An),_n(Qi,{for:Zi});let dn=gi(Qi,oi.inputId+"-ts-label");_n(Oi,{"aria-labelledby":dn}),_n(bi,{"aria-labelledby":dn})}if(_i.style.width=Di.style.width,oi.plugins.names.length){let dn="plugin-"+oi.plugins.names.join(" plugin-");Kn([_i,mi],dn)}(ci.maxItems===null||ci.maxItems>1)&&oi.is_select_tag&&_n(Di,{multiple:"multiple"}),ci.placeholder&&_n(ui,{placeholder:ci.placeholder}),!ci.splitOn&&ci.delimiter&&(ci.splitOn=new RegExp("\\s*"+li(ci.delimiter)+"+\\s*")),ci.load&&ci.loadThrottle&&(ci.load=$o(ci.load,ci.loadThrottle)),Ln(mi,"mousemove",()=>{oi.ignoreHover=!1}),Ln(mi,"mouseenter",dn=>{var Vn=ps(dn.target,"[data-selectable]",mi);Vn&&oi.onOptionHover(dn,Vn)},{capture:!0}),Ln(mi,"click",dn=>{let Vn=ps(dn.target,"[data-selectable]");Vn&&(oi.onOptionSelect(dn,Vn),Dn(dn,!0))}),Ln(Ci,"click",dn=>{var Vn=ps(dn.target,"[data-ts-item]",Ci);if(Vn&&oi.onItemSelect(dn,Vn)){Dn(dn,!0);return}ui.value==""&&(oi.onClick(),Dn(dn,!0))}),Ln(Oi,"keydown",dn=>oi.onKeyDown(dn)),Ln(ui,"keypress",dn=>oi.onKeyPress(dn)),Ln(ui,"input",dn=>oi.onInput(dn)),Ln(Oi,"blur",dn=>oi.onBlur(dn)),Ln(Oi,"focus",dn=>oi.onFocus(dn)),Ln(ui,"paste",dn=>oi.onPaste(dn));let Hn=dn=>{let Vn=dn.composedPath()[0];if(!_i.contains(Vn)&&!mi.contains(Vn)){oi.isFocused&&oi.blur(),oi.inputState();return}Vn==ui&&oi.isOpen?dn.stopPropagation():Dn(dn,!0)},Nn=()=>{oi.isOpen&&oi.positionDropdown()};Ln(document,"mousedown",Hn),Ln(window,"scroll",Nn,Wi),Ln(window,"resize",Nn,Wi),this._destroy=()=>{document.removeEventListener("mousedown",Hn),window.removeEventListener("scroll",Nn),window.removeEventListener("resize",Nn),Qi&&Qi.removeEventListener("click",An)},this.revertSettings={innerHTML:Di.innerHTML,tabIndex:Di.tabIndex},Di.tabIndex=-1,Di.insertAdjacentElement("afterend",oi.wrapper),oi.sync(!1),ci.items=[],delete ci.optgroups,delete ci.options,Ln(Di,"invalid",()=>{oi.isValid&&(oi.isValid=!1,oi.isInvalid=!0,oi.refreshState())}),oi.updateOriginalInput(),oi.refreshItems(),oi.close(!1),oi.inputState(),oi.isSetup=!0,Di.disabled?oi.disable():Di.readOnly?oi.setReadOnly(!0):oi.enable(),oi.on("change",this.onChange),Kn(Di,"tomselected","ts-hidden-accessible"),oi.trigger("initialize"),ci.preload===!0&&oi.preload()}setupOptions(oi=[],ci=[]){this.addOptions(oi),Mi(ci,ui=>{this.registerOptionGroup(ui)})}setupTemplates(){var oi=this,ci=oi.settings.labelField,ui=oi.settings.optgroupLabelField,mi={optgroup:bi=>{let _i=document.createElement("div");return _i.className="optgroup",_i.appendChild(bi.options),_i},optgroup_header:(bi,_i)=>'
'+_i(bi[ui])+"
",option:(bi,_i)=>"
"+_i(bi[ci])+"
",item:(bi,_i)=>"
"+_i(bi[ci])+"
",option_create:(bi,_i)=>'
Add '+_i(bi.input)+"
",no_results:()=>'
No results found
',loading:()=>'
',not_loading:()=>{},dropdown:()=>"
"};oi.settings.render=Object.assign({},mi,oi.settings.render)}setupCallbacks(){var oi,ci,ui={initialize:"onInitialize",change:"onChange",item_add:"onItemAdd",item_remove:"onItemRemove",item_select:"onItemSelect",clear:"onClear",option_add:"onOptionAdd",option_remove:"onOptionRemove",option_clear:"onOptionClear",optgroup_add:"onOptionGroupAdd",optgroup_remove:"onOptionGroupRemove",optgroup_clear:"onOptionGroupClear",dropdown_open:"onDropdownOpen",dropdown_close:"onDropdownClose",type:"onType",load:"onLoad",focus:"onFocus",blur:"onBlur"};for(oi in ui)ci=this.settings[ui[oi]],ci&&this.on(oi,ci)}sync(oi=!0){let ci=this,ui=oi?Ri(ci.input,{delimiter:ci.settings.delimiter}):ci.settings;ci.setupOptions(ui.options,ui.optgroups),ci.setValue(ui.items||[],!0),ci.lastQuery=null}onClick(){var oi=this;if(oi.activeItems.length>0){oi.clearActiveItems(),oi.focus();return}oi.isFocused&&oi.isOpen?oi.blur():oi.focus()}onMouseDown(){}onChange(){$n(this.input,"input"),$n(this.input,"change")}onPaste(oi){var ci=this;if(ci.isInputHidden||ci.isLocked){Dn(oi);return}!ci.settings.splitOn||setTimeout(()=>{var ui=ci.inputValue();if(!!ui.match(ci.settings.splitOn)){var mi=ui.trim().split(ci.settings.splitOn);Mi(mi,bi=>{xn(bi)&&(this.options[bi]?ci.addItem(bi):ci.createItem(bi))})}},0)}onKeyPress(oi){var ci=this;if(ci.isLocked){Dn(oi);return}var ui=String.fromCharCode(oi.keyCode||oi.which);if(ci.settings.create&&ci.settings.mode==="multi"&&ui===ci.settings.delimiter){ci.createItem(),Dn(oi);return}}onKeyDown(oi){var ci=this;if(ci.ignoreHover=!0,ci.isLocked){oi.keyCode!==va&&Dn(oi);return}switch(oi.keyCode){case mo:if(hi(Fo,oi)&&ci.control_input.value==""){Dn(oi),ci.selectAll();return}break;case Fs:ci.isOpen&&(Dn(oi,!0),ci.close()),ci.clearActiveItems();return;case Ho:if(!ci.isOpen&&ci.hasOptions)ci.open();else if(ci.activeOption){let ui=ci.getAdjacent(ci.activeOption,1);ui&&ci.setActiveOption(ui)}Dn(oi);return;case Po:if(ci.activeOption){let ui=ci.getAdjacent(ci.activeOption,-1);ui&&ci.setActiveOption(ui)}Dn(oi);return;case Js:ci.canSelect(ci.activeOption)?(ci.onOptionSelect(oi,ci.activeOption),Dn(oi)):(ci.settings.create&&ci.createItem()||document.activeElement==ci.control_input&&ci.isOpen)&&Dn(oi);return;case Ss:ci.advanceSelection(-1,oi);return;case Zs:ci.advanceSelection(1,oi);return;case va:ci.settings.selectOnTab&&(ci.canSelect(ci.activeOption)&&(ci.onOptionSelect(oi,ci.activeOption),Dn(oi)),ci.settings.create&&ci.createItem()&&Dn(oi));return;case ga:case $l:ci.deleteSelection(oi);return}ci.isInputHidden&&!hi(Fo,oi)&&Dn(oi)}onInput(oi){if(this.isLocked)return;let ci=this.inputValue();if(this.lastValue!==ci){if(this.lastValue=ci,ci==""){this._onInput();return}this.refreshTimeout&&clearTimeout(this.refreshTimeout),this.refreshTimeout=Bl(()=>{this.refreshTimeout=null,this._onInput()},this.settings.refreshThrottle)}}_onInput(){let oi=this.lastValue;this.settings.shouldLoad.call(this,oi)&&this.load(oi),this.refreshOptions(),this.trigger("type",oi)}onOptionHover(oi,ci){this.ignoreHover||this.setActiveOption(ci,!1)}onFocus(oi){var ci=this,ui=ci.isFocused;if(ci.isDisabled||ci.isReadOnly){ci.blur(),Dn(oi);return}ci.ignoreFocus||(ci.isFocused=!0,ci.settings.preload==="focus"&&ci.preload(),ui||ci.trigger("focus"),ci.activeItems.length||(ci.inputState(),ci.refreshOptions(!!ci.settings.openOnFocus)),ci.refreshState())}onBlur(oi){if(document.hasFocus()!==!1){var ci=this;if(!!ci.isFocused){ci.isFocused=!1,ci.ignoreFocus=!1;var ui=()=>{ci.close(),ci.setActiveItem(),ci.setCaret(ci.items.length),ci.trigger("blur")};ci.settings.create&&ci.settings.createOnBlur?ci.createItem(null,ui):ui()}}}onOptionSelect(oi,ci){var ui,mi=this;ci.parentElement&&ci.parentElement.matches("[data-disabled]")||(ci.classList.contains("create")?mi.createItem(null,()=>{mi.settings.closeAfterSelect&&mi.close()}):(ui=ci.dataset.value,typeof ui!="undefined"&&(mi.lastQuery=null,mi.addItem(ui),mi.settings.closeAfterSelect&&mi.close(),!mi.settings.hideSelected&&oi.type&&/click/.test(oi.type)&&mi.setActiveOption(ci))))}canSelect(oi){return!!(this.isOpen&&oi&&this.dropdown_content.contains(oi))}onItemSelect(oi,ci){var ui=this;return!ui.isLocked&&ui.settings.mode==="multi"?(Dn(oi),ui.setActiveItem(ci,oi),!0):!1}canLoad(oi){return!(!this.settings.load||this.loadedSearches.hasOwnProperty(oi))}load(oi){let ci=this;if(!ci.canLoad(oi))return;Kn(ci.wrapper,ci.settings.loadingClass),ci.loading++;let ui=ci.loadCallback.bind(ci);ci.settings.load.call(ci,oi,ui)}loadCallback(oi,ci){let ui=this;ui.loading=Math.max(ui.loading-1,0),ui.lastQuery=null,ui.clearActiveOption(),ui.setupOptions(oi,ci),ui.refreshOptions(ui.isFocused&&!ui.isInputHidden),ui.loading||Qn(ui.wrapper,ui.settings.loadingClass),ui.trigger("load",oi,ci)}preload(){var oi=this.wrapper.classList;oi.contains("preloaded")||(oi.add("preloaded"),this.load(""))}setTextboxValue(oi=""){var ci=this.control_input,ui=ci.value!==oi;ui&&(ci.value=oi,$n(ci,"update"),this.lastValue=oi)}getValue(){return this.is_select_tag&&this.input.hasAttribute("multiple")?this.items:this.items.join(this.settings.delimiter)}setValue(oi,ci){var ui=ci?[]:["change"];jo(this,ui,()=>{this.clear(ci),this.addItems(oi,ci)})}setMaxItems(oi){oi===0&&(oi=null),this.settings.maxItems=oi,this.refreshState()}setActiveItem(oi,ci){var ui=this,mi,bi,_i,Ci,Di,Oi;if(ui.settings.mode!=="single"){if(!oi){ui.clearActiveItems(),ui.isFocused&&ui.inputState();return}if(mi=ci&&ci.type.toLowerCase(),mi==="click"&&hi("shiftKey",ci)&&ui.activeItems.length){for(Oi=ui.getLastActive(),_i=Array.prototype.indexOf.call(ui.control.children,Oi),Ci=Array.prototype.indexOf.call(ui.control.children,oi),_i>Ci&&(Di=_i,_i=Ci,Ci=Di),bi=_i;bi<=Ci;bi++)oi=ui.control.children[bi],ui.activeItems.indexOf(oi)===-1&&ui.setActiveItemClass(oi);Dn(ci)}else mi==="click"&&hi(Fo,ci)||mi==="keydown"&&hi("shiftKey",ci)?oi.classList.contains("active")?ui.removeActiveItem(oi):ui.setActiveItemClass(oi):(ui.clearActiveItems(),ui.setActiveItemClass(oi));ui.inputState(),ui.isFocused||ui.focus()}}setActiveItemClass(oi){let ci=this,ui=ci.control.querySelector(".last-active");ui&&Qn(ui,"last-active"),Kn(oi,"active last-active"),ci.trigger("item_select",oi),ci.activeItems.indexOf(oi)==-1&&ci.activeItems.push(oi)}removeActiveItem(oi){var ci=this.activeItems.indexOf(oi);this.activeItems.splice(ci,1),Qn(oi,"active")}clearActiveItems(){Qn(this.activeItems,"active"),this.activeItems=[]}setActiveOption(oi,ci=!0){oi!==this.activeOption&&(this.clearActiveOption(),!!oi&&(this.activeOption=oi,_n(this.focus_node,{"aria-activedescendant":oi.getAttribute("id")}),_n(oi,{"aria-selected":"true"}),Kn(oi,"active"),ci&&this.scrollToOption(oi)))}scrollToOption(oi,ci){if(!oi)return;let ui=this.dropdown_content,mi=ui.clientHeight,bi=ui.scrollTop||0,_i=oi.offsetHeight,Ci=oi.getBoundingClientRect().top-ui.getBoundingClientRect().top+bi;Ci+_i>mi+bi?this.scroll(Ci-mi+_i,ci):Ci{oi.setActiveItemClass(ui)}))}inputState(){var oi=this;!oi.control.contains(oi.control_input)||(_n(oi.control_input,{placeholder:oi.settings.placeholder}),oi.activeItems.length>0||!oi.isFocused&&oi.settings.hidePlaceholder&&oi.items.length>0?(oi.setTextboxValue(),oi.isInputHidden=!0):(oi.settings.hidePlaceholder&&oi.items.length>0&&_n(oi.control_input,{placeholder:""}),oi.isInputHidden=!1),oi.wrapper.classList.toggle("input-hidden",oi.isInputHidden))}inputValue(){return this.control_input.value.trim()}focus(){var oi=this;oi.isDisabled||oi.isReadOnly||(oi.ignoreFocus=!0,oi.control_input.offsetWidth?oi.control_input.focus():oi.focus_node.focus(),setTimeout(()=>{oi.ignoreFocus=!1,oi.onFocus()},0))}blur(){this.focus_node.blur(),this.onBlur()}getScoreFunction(oi){return this.sifter.getScoreFunction(oi,this.getSearchOptions())}getSearchOptions(){var oi=this.settings,ci=oi.sortField;return typeof oi.sortField=="string"&&(ci=[{field:oi.sortField}]),{fields:oi.searchField,conjunction:oi.searchConjunction,sort:ci,nesting:oi.nesting}}search(oi){var ci,ui,mi=this,bi=this.getSearchOptions();if(mi.settings.score&&(ui=mi.settings.score.call(mi,oi),typeof ui!="function"))throw new Error('Tom Select "score" setting must be a function that returns a function');return oi!==mi.lastQuery?(mi.lastQuery=oi,ci=mi.sifter.search(oi,Object.assign(bi,{score:ui})),mi.currentResults=ci):ci=Object.assign({},mi.currentResults),mi.settings.hideSelected&&(ci.items=ci.items.filter(_i=>{let Ci=xn(_i.id);return!(Ci&&mi.items.indexOf(Ci)!==-1)})),ci}refreshOptions(oi=!0){var ci,ui,mi,bi,_i,Ci,Di,Oi,Wi,ji;let Zi={},Rn=[];var Qi=this,An=Qi.inputValue();let Hn=An===Qi.lastQuery||An==""&&Qi.lastQuery==null;var Nn=Qi.search(An),dn=null,Vn=Qi.settings.shouldOpen||!1,ks=Qi.dropdown_content;Hn&&(dn=Qi.activeOption,dn&&(Wi=dn.closest("[data-group]"))),bi=Nn.items.length,typeof Qi.settings.maxOptions=="number"&&(bi=Math.min(bi,Qi.settings.maxOptions)),bi>0&&(Vn=!0);let Ua=(Tn,Mn)=>{let wn=Zi[Tn];if(wn!==void 0){let In=Rn[wn];if(In!==void 0)return[wn,In.fragment]}let es=document.createDocumentFragment();return wn=Rn.length,Rn.push({fragment:es,order:Mn,optgroup:Tn}),[wn,es]};for(ci=0;ci0&&(In=In.cloneNode(!0),_n(In,{id:wn.$id+"-clone-"+ui,"aria-selected":null}),In.classList.add("ts-cloned"),Qn(In,"active"),Qi.activeOption&&Qi.activeOption.dataset.value==Mn&&Wi&&Wi.dataset.group===_i.toString()&&(dn=In)),ah.appendChild(In),_i!=""&&(Zi[_i]=oh)}}Qi.settings.lockOptgroupOrder&&Rn.sort((Tn,Mn)=>Tn.order-Mn.order),Di=document.createDocumentFragment(),Mi(Rn,Tn=>{let Mn=Tn.fragment,wn=Tn.optgroup;if(!Mn||!Mn.children.length)return;let es=Qi.optgroups[wn];if(es!==void 0){let In=document.createDocumentFragment(),Ya=Qi.render("optgroup_header",es);Ti(In,Ya),Ti(In,Mn);let Ka=Qi.render("optgroup",{group:es,options:In});Ti(Di,Ka)}else Ti(Di,Mn)}),ks.innerHTML="",Ti(ks,Di),Qi.settings.highlight&&(Xs(ks),Nn.query.length&&Nn.tokens.length&&Mi(Nn.tokens,Tn=>{ls(ks,Tn.regex)}));var Bo=Tn=>{let Mn=Qi.render(Tn,{input:An});return Mn&&(Vn=!0,ks.insertBefore(Mn,ks.firstChild)),Mn};if(Qi.loading?Bo("loading"):Qi.settings.shouldLoad.call(Qi,An)?Nn.items.length===0&&Bo("no_results"):Bo("not_loading"),Oi=Qi.canCreate(An),Oi&&(ji=Bo("option_create")),Qi.hasOptions=Nn.items.length>0||Oi,Vn){if(Nn.items.length>0){if(!dn&&Qi.settings.mode==="single"&&Qi.items[0]!=null&&(dn=Qi.getOption(Qi.items[0])),!ks.contains(dn)){let Tn=0;ji&&!Qi.settings.addPrecedence&&(Tn=1),dn=Qi.selectable()[Tn]}}else ji&&(dn=ji);oi&&!Qi.isOpen&&(Qi.open(),Qi.scrollToOption(dn,"auto")),Qi.setActiveOption(dn)}else Qi.clearActiveOption(),oi&&Qi.isOpen&&Qi.close(!1)}selectable(){return this.dropdown_content.querySelectorAll("[data-selectable]")}addOption(oi,ci=!1){let ui=this;if(Array.isArray(oi))return ui.addOptions(oi,ci),!1;let mi=xn(oi[ui.settings.valueField]);return mi===null||ui.options.hasOwnProperty(mi)?!1:(oi.$order=oi.$order||++ui.order,oi.$id=ui.inputId+"-opt-"+oi.$order,ui.options[mi]=oi,ui.lastQuery=null,ci&&(ui.userOptions[mi]=ci,ui.trigger("option_add",mi,oi)),mi)}addOptions(oi,ci=!1){Mi(oi,ui=>{this.addOption(ui,ci)})}registerOption(oi){return this.addOption(oi)}registerOptionGroup(oi){var ci=xn(oi[this.settings.optgroupValueField]);return ci===null?!1:(oi.$order=oi.$order||++this.order,this.optgroups[ci]=oi,ci)}addOptionGroup(oi,ci){var ui;ci[this.settings.optgroupValueField]=oi,(ui=this.registerOptionGroup(ci))&&this.trigger("optgroup_add",ui,ci)}removeOptionGroup(oi){this.optgroups.hasOwnProperty(oi)&&(delete this.optgroups[oi],this.clearCache(),this.trigger("optgroup_remove",oi))}clearOptionGroups(){this.optgroups={},this.clearCache(),this.trigger("optgroup_clear")}updateOption(oi,ci){let ui=this;var mi,bi;let _i=xn(oi),Ci=xn(ci[ui.settings.valueField]);if(_i===null)return;let Di=ui.options[_i];if(Di==null)return;if(typeof Ci!="string")throw new Error("Value must be set in option data");let Oi=ui.getOption(_i),Wi=ui.getItem(_i);if(ci.$order=ci.$order||Di.$order,delete ui.options[_i],ui.uncacheValue(Ci),ui.options[Ci]=ci,Oi){if(ui.dropdown_content.contains(Oi)){let ji=ui._render("option",ci);Qr(Oi,ji),ui.activeOption===Oi&&ui.setActiveOption(ji)}Oi.remove()}Wi&&(bi=ui.items.indexOf(_i),bi!==-1&&ui.items.splice(bi,1,Ci),mi=ui._render("item",ci),Wi.classList.contains("active")&&Kn(mi,"active"),Qr(Wi,mi)),ui.lastQuery=null}removeOption(oi,ci){let ui=this;oi=eo(oi),ui.uncacheValue(oi),delete ui.userOptions[oi],delete ui.options[oi],ui.lastQuery=null,ui.trigger("option_remove",oi),ui.removeItem(oi,ci)}clearOptions(oi){let ci=(oi||this.clearFilter).bind(this);this.loadedSearches={},this.userOptions={},this.clearCache();let ui={};Mi(this.options,(mi,bi)=>{ci(mi,bi)&&(ui[bi]=mi)}),this.options=this.sifter.items=ui,this.lastQuery=null,this.trigger("option_clear")}clearFilter(oi,ci){return this.items.indexOf(ci)>=0}getOption(oi,ci=!1){let ui=xn(oi);if(ui===null)return null;let mi=this.options[ui];if(mi!=null){if(mi.$div)return mi.$div;if(ci)return this._render("option",mi)}return null}getAdjacent(oi,ci,ui="option"){var mi=this,bi;if(!oi)return null;ui=="item"?bi=mi.controlChildren():bi=mi.dropdown_content.querySelectorAll("[data-selectable]");for(let _i=0;_i0?bi[_i+1]:bi[_i-1];return null}getItem(oi){if(typeof oi=="object")return oi;var ci=xn(oi);return ci!==null?this.control.querySelector(`[data-value="${wi(ci)}"]`):null}addItems(oi,ci){var ui=this,mi=Array.isArray(oi)?oi:[oi];mi=mi.filter(_i=>ui.items.indexOf(_i)===-1);let bi=mi[mi.length-1];mi.forEach(_i=>{ui.isPending=_i!==bi,ui.addItem(_i,ci)})}addItem(oi,ci){var ui=ci?[]:["change","dropdown_close"];jo(this,ui,()=>{var mi,bi;let _i=this,Ci=_i.settings.mode,Di=xn(oi);if(!(Di&&_i.items.indexOf(Di)!==-1&&(Ci==="single"&&_i.close(),Ci==="single"||!_i.settings.duplicates))&&!(Di===null||!_i.options.hasOwnProperty(Di))&&(Ci==="single"&&_i.clear(ci),!(Ci==="multi"&&_i.isFull()))){if(mi=_i._render("item",_i.options[Di]),_i.control.contains(mi)&&(mi=mi.cloneNode(!0)),bi=_i.isFull(),_i.items.splice(_i.caretPos,0,Di),_i.insertAtCaret(mi),_i.isSetup){if(!_i.isPending&&_i.settings.hideSelected){let Oi=_i.getOption(Di),Wi=_i.getAdjacent(Oi,1);Wi&&_i.setActiveOption(Wi)}!_i.isPending&&!_i.settings.closeAfterSelect&&_i.refreshOptions(_i.isFocused&&Ci!=="single"),_i.settings.closeAfterSelect!=!1&&_i.isFull()?_i.close():_i.isPending||_i.positionDropdown(),_i.trigger("item_add",Di,mi),_i.isPending||_i.updateOriginalInput({silent:ci})}(!_i.isPending||!bi&&_i.isFull())&&(_i.inputState(),_i.refreshState())}})}removeItem(oi=null,ci){let ui=this;if(oi=ui.getItem(oi),!oi)return;var mi,bi;let _i=oi.dataset.value;mi=Wn(oi),oi.remove(),oi.classList.contains("active")&&(bi=ui.activeItems.indexOf(oi),ui.activeItems.splice(bi,1),Qn(oi,"active")),ui.items.splice(mi,1),ui.lastQuery=null,!ui.settings.persist&&ui.userOptions.hasOwnProperty(_i)&&ui.removeOption(_i,ci),mi{}){arguments.length===3&&(ci=arguments[2]),typeof ci!="function"&&(ci=()=>{});var ui=this,mi=ui.caretPos,bi;if(oi=oi||ui.inputValue(),!ui.canCreate(oi))return ci(),!1;ui.lock();var _i=!1,Ci=Di=>{if(ui.unlock(),!Di||typeof Di!="object")return ci();var Oi=xn(Di[ui.settings.valueField]);if(typeof Oi!="string")return ci();ui.setTextboxValue(),ui.addOption(Di,!0),ui.setCaret(mi),ui.addItem(Oi),ci(Di),_i=!0};return typeof ui.settings.create=="function"?bi=ui.settings.create.call(this,oi,Ci):bi={[ui.settings.labelField]:oi,[ui.settings.valueField]:oi},_i||Ci(bi),!0}refreshItems(){var oi=this;oi.lastQuery=null,oi.isSetup&&oi.addItems(oi.items),oi.updateOriginalInput(),oi.refreshState()}refreshState(){let oi=this;oi.refreshValidityState();let ci=oi.isFull(),ui=oi.isLocked;oi.wrapper.classList.toggle("rtl",oi.rtl);let mi=oi.wrapper.classList;mi.toggle("focus",oi.isFocused),mi.toggle("disabled",oi.isDisabled),mi.toggle("readonly",oi.isReadOnly),mi.toggle("required",oi.isRequired),mi.toggle("invalid",!oi.isValid),mi.toggle("locked",ui),mi.toggle("full",ci),mi.toggle("input-active",oi.isFocused&&!oi.isInputHidden),mi.toggle("dropdown-active",oi.isOpen),mi.toggle("has-options",Qs(oi.options)),mi.toggle("has-items",oi.items.length>0)}refreshValidityState(){var oi=this;!oi.input.validity||(oi.isValid=oi.input.validity.valid,oi.isInvalid=!oi.isValid)}isFull(){return this.settings.maxItems!==null&&this.items.length>=this.settings.maxItems}updateOriginalInput(oi={}){let ci=this;var ui,mi;let bi=ci.input.querySelector('option[value=""]');if(ci.is_select_tag){let Di=function(Oi,Wi,ji){return Oi||(Oi=Ii('")),Oi!=bi&&ci.input.append(Oi),_i.push(Oi),(Oi!=bi||Ci>0)&&(Oi.selected=!0),Oi},_i=[],Ci=ci.input.querySelectorAll("option:checked").length;ci.input.querySelectorAll("option:checked").forEach(Oi=>{Oi.selected=!1}),ci.items.length==0&&ci.settings.mode=="single"?Di(bi,"",""):ci.items.forEach(Oi=>{if(ui=ci.options[Oi],mi=ui[ci.settings.labelField]||"",_i.includes(ui.$option)){let Wi=ci.input.querySelector(`option[value="${wi(Oi)}"]:not(:checked)`);Di(Wi,Oi,mi)}else ui.$option=Di(ui.$option,Oi,mi)})}else ci.input.value=ci.getValue();ci.isSetup&&(oi.silent||ci.trigger("change",ci.getValue()))}open(){var oi=this;oi.isLocked||oi.isOpen||oi.settings.mode==="multi"&&oi.isFull()||(oi.isOpen=!0,_n(oi.focus_node,{"aria-expanded":"true"}),oi.refreshState(),Bn(oi.dropdown,{visibility:"hidden",display:"block"}),oi.positionDropdown(),Bn(oi.dropdown,{visibility:"visible",display:"block"}),oi.focus(),oi.trigger("dropdown_open",oi.dropdown))}close(oi=!0){var ci=this,ui=ci.isOpen;oi&&(ci.setTextboxValue(),ci.settings.mode==="single"&&ci.items.length&&ci.inputState()),ci.isOpen=!1,_n(ci.focus_node,{"aria-expanded":"false"}),Bn(ci.dropdown,{display:"none"}),ci.settings.hideSelected&&ci.clearActiveOption(),ci.refreshState(),ui&&ci.trigger("dropdown_close",ci.dropdown)}positionDropdown(){if(this.settings.dropdownParent==="body"){var oi=this.control,ci=oi.getBoundingClientRect(),ui=oi.offsetHeight+ci.top+window.scrollY,mi=ci.left+window.scrollX;Bn(this.dropdown,{width:ci.width+"px",top:ui+"px",left:mi+"px"})}}clear(oi){var ci=this;if(!!ci.items.length){var ui=ci.controlChildren();Mi(ui,mi=>{ci.removeItem(mi,!0)}),ci.inputState(),oi||ci.updateOriginalInput(),ci.trigger("clear")}}insertAtCaret(oi){let ci=this,ui=ci.caretPos,mi=ci.control;mi.insertBefore(oi,mi.children[ui]||null),ci.setCaret(ui+1)}deleteSelection(oi){var ci,ui,mi,bi,_i=this;ci=oi&&oi.keyCode===ga?-1:1,ui=As(_i.control_input);let Ci=[];if(_i.activeItems.length)bi=ms(_i.activeItems,ci),mi=Wn(bi),ci>0&&mi++,Mi(_i.activeItems,Di=>Ci.push(Di));else if((_i.isFocused||_i.settings.mode==="single")&&_i.items.length){let Di=_i.controlChildren(),Oi;ci<0&&ui.start===0&&ui.length===0?Oi=Di[_i.caretPos-1]:ci>0&&ui.start===_i.inputValue().length&&(Oi=Di[_i.caretPos]),Oi!==void 0&&Ci.push(Oi)}if(!_i.shouldDelete(Ci,oi))return!1;for(Dn(oi,!0),typeof mi!="undefined"&&_i.setCaret(mi);Ci.length;)_i.removeItem(Ci.pop());return _i.inputState(),_i.positionDropdown(),_i.refreshOptions(!1),!0}shouldDelete(oi,ci){let ui=oi.map(mi=>mi.dataset.value);return!(!ui.length||typeof this.settings.onDelete=="function"&&this.settings.onDelete(ui,ci)===!1)}advanceSelection(oi,ci){var ui,mi,bi=this;bi.rtl&&(oi*=-1),!bi.inputValue().length&&(hi(Fo,ci)||hi("shiftKey",ci)?(ui=bi.getLastActive(oi),ui?ui.classList.contains("active")?mi=bi.getAdjacent(ui,oi,"item"):mi=ui:oi>0?mi=bi.control_input.nextElementSibling:mi=bi.control_input.previousElementSibling,mi&&(mi.classList.contains("active")&&bi.removeActiveItem(ui),bi.setActiveItemClass(mi))):bi.moveCaret(oi))}moveCaret(oi){}getLastActive(oi){let ci=this.control.querySelector(".last-active");if(ci)return ci;var ui=this.control.querySelectorAll(".active");if(ui)return ms(ui,oi)}setCaret(oi){this.caretPos=this.items.length}controlChildren(){return Array.from(this.control.querySelectorAll("[data-ts-item]"))}lock(){this.setLocked(!0)}unlock(){this.setLocked(!1)}setLocked(oi=this.isReadOnly||this.isDisabled){this.isLocked=oi,this.refreshState()}disable(){this.setDisabled(!0),this.close()}enable(){this.setDisabled(!1)}setDisabled(oi){this.focus_node.tabIndex=oi?-1:this.tabIndex,this.isDisabled=oi,this.input.disabled=oi,this.control_input.disabled=oi,this.setLocked()}setReadOnly(oi){this.isReadOnly=oi,this.input.readOnly=oi,this.control_input.readOnly=oi,this.setLocked()}destroy(){var oi=this,ci=oi.revertSettings;oi.trigger("destroy"),oi.off(),oi.wrapper.remove(),oi.dropdown.remove(),oi.input.innerHTML=ci.innerHTML,oi.input.tabIndex=ci.tabIndex,Qn(oi.input,"tomselected","ts-hidden-accessible"),oi._destroy(),delete oi.input.tomselect}render(oi,ci){var ui,mi;let bi=this;if(typeof this.settings.render[oi]!="function"||(mi=bi.settings.render[oi].call(this,ci,to),!mi))return null;if(mi=Ii(mi),oi==="option"||oi==="option_create"?ci[bi.settings.disabledField]?_n(mi,{"aria-disabled":"true"}):_n(mi,{"data-selectable":""}):oi==="optgroup"&&(ui=ci.group[bi.settings.optgroupValueField],_n(mi,{"data-group":ui}),ci.group[bi.settings.disabledField]&&_n(mi,{"data-disabled":""})),oi==="option"||oi==="item"){let _i=eo(ci[bi.settings.valueField]);_n(mi,{"data-value":_i}),oi==="item"?(Kn(mi,bi.settings.itemClass),_n(mi,{"data-ts-item":""})):(Kn(mi,bi.settings.optionClass),_n(mi,{role:"option",id:ci.$id}),ci.$div=mi,bi.options[_i]=ci)}return mi}_render(oi,ci){let ui=this.render(oi,ci);if(ui==null)throw"HTMLElement expected";return ui}clearCache(){Mi(this.options,oi=>{oi.$div&&(oi.$div.remove(),delete oi.$div)})}uncacheValue(oi){let ci=this.getOption(oi);ci&&ci.remove()}canCreate(oi){return this.settings.create&&oi.length>0&&this.settings.createFilter.call(this,oi)}hook(oi,ci,ui){var mi=this,bi=mi[ci];mi[ci]=function(){var _i,Ci;return oi==="after"&&(_i=bi.apply(mi,arguments)),Ci=ui.apply(mi,arguments),oi==="instead"?Ci:(oi==="before"&&(_i=bi.apply(mi,arguments)),_i)}}}function Xi(){Ln(this.input,"change",()=>{this.sync()})}function bn(fi){var oi=this,ci=oi.onOptionSelect;oi.settings.hideSelected=!1;let ui=Object.assign({className:"tomselect-checkbox",checkedClassNames:void 0,uncheckedClassNames:void 0},fi);var mi=function(Ci,Di){Di?(Ci.checked=!0,ui.uncheckedClassNames&&Ci.classList.remove(...ui.uncheckedClassNames),ui.checkedClassNames&&Ci.classList.add(...ui.checkedClassNames)):(Ci.checked=!1,ui.checkedClassNames&&Ci.classList.remove(...ui.checkedClassNames),ui.uncheckedClassNames&&Ci.classList.add(...ui.uncheckedClassNames))},bi=function(Ci){setTimeout(()=>{var Di=Ci.querySelector("input."+ui.className);Di instanceof HTMLInputElement&&mi(Di,Ci.classList.contains("selected"))},1)};oi.hook("after","setupTemplates",()=>{var _i=oi.settings.render.option;oi.settings.render.option=(Ci,Di)=>{var Oi=Ii(_i.call(oi,Ci,Di)),Wi=document.createElement("input");ui.className&&Wi.classList.add(ui.className),Wi.addEventListener("click",function(Zi){Dn(Zi)}),Wi.type="checkbox";let ji=xn(Ci[oi.settings.valueField]);return mi(Wi,!!(ji&&oi.items.indexOf(ji)>-1)),Oi.prepend(Wi),Oi}}),oi.on("item_remove",_i=>{var Ci=oi.getOption(_i);Ci&&(Ci.classList.remove("selected"),bi(Ci))}),oi.on("item_add",_i=>{var Ci=oi.getOption(_i);Ci&&bi(Ci)}),oi.hook("instead","onOptionSelect",(_i,Ci)=>{if(Ci.classList.contains("selected")){Ci.classList.remove("selected"),oi.removeItem(Ci.dataset.value),oi.refreshOptions(),Dn(_i,!0);return}ci.call(oi,_i,Ci),bi(Ci)})}function Gi(fi){let oi=this,ci=Object.assign({className:"clear-button",title:"Clear All",html:ui=>`
`},fi);oi.on("initialize",()=>{var ui=Ii(ci.html(ci));ui.addEventListener("click",mi=>{oi.isLocked||(oi.clear(),oi.settings.mode==="single"&&oi.settings.allowEmptyOption&&oi.addItem(""),mi.preventDefault(),mi.stopPropagation())}),oi.control.appendChild(ui)})}let fn=(fi,oi)=>{var ci;(ci=fi.parentNode)==null||ci.insertBefore(oi,fi.nextSibling)},kn=(fi,oi)=>{var ci;(ci=fi.parentNode)==null||ci.insertBefore(oi,fi)},gs=(fi,oi)=>{do{var ci;if(oi=(ci=oi)==null?void 0:ci.previousElementSibling,fi==oi)return!0}while(oi&&oi.previousElementSibling);return!1};function rs(){var fi=this;if(fi.settings.mode!=="multi")return;var oi=fi.lock,ci=fi.unlock;let ui=!0,mi;fi.hook("after","setupTemplates",()=>{var bi=fi.settings.render.item;fi.settings.render.item=(_i,Ci)=>{let Di=Ii(bi.call(fi,_i,Ci));_n(Di,{draggable:"true"});let Oi=An=>{ui||Dn(An),An.stopPropagation()},Wi=An=>{mi=Di,setTimeout(()=>{Di.classList.add("ts-dragging")},0)},ji=An=>{An.preventDefault(),Di.classList.add("ts-drag-over"),Rn(Di,mi)},Zi=()=>{Di.classList.remove("ts-drag-over")},Rn=(An,Hn)=>{Hn!==void 0&&(gs(Hn,Di)?fn(An,Hn):kn(An,Hn))},Qi=()=>{var An;document.querySelectorAll(".ts-drag-over").forEach(Nn=>Nn.classList.remove("ts-drag-over")),(An=mi)==null||An.classList.remove("ts-dragging"),mi=void 0;var Hn=[];fi.control.querySelectorAll("[data-value]").forEach(Nn=>{if(Nn.dataset.value){let dn=Nn.dataset.value;dn&&Hn.push(dn)}}),fi.setValue(Hn)};return Ln(Di,"mousedown",Oi),Ln(Di,"dragstart",Wi),Ln(Di,"dragenter",ji),Ln(Di,"dragover",ji),Ln(Di,"dragleave",Zi),Ln(Di,"dragend",Qi),Di}}),fi.hook("instead","lock",()=>(ui=!1,oi.call(fi))),fi.hook("instead","unlock",()=>(ui=!0,ci.call(fi)))}function go(fi){let oi=this,ci=Object.assign({title:"Untitled",headerClass:"dropdown-header",titleRowClass:"dropdown-header-title",labelClass:"dropdown-header-label",closeClass:"dropdown-header-close",html:ui=>'
'+ui.title+'×
'},fi);oi.on("initialize",()=>{var ui=Ii(ci.html(ci)),mi=ui.querySelector("."+ci.closeClass);mi&&mi.addEventListener("click",bi=>{Dn(bi,!0),oi.close()}),oi.dropdown.insertBefore(ui,oi.dropdown.firstChild)})}function io(){var fi=this;fi.hook("instead","setCaret",oi=>{fi.settings.mode==="single"||!fi.control.contains(fi.control_input)?oi=fi.items.length:(oi=Math.max(0,Math.min(fi.items.length,oi)),oi!=fi.caretPos&&!fi.isPending&&fi.controlChildren().forEach((ci,ui)=>{ui{if(!fi.isFocused)return;let ci=fi.getLastActive(oi);if(ci){let ui=Wn(ci);fi.setCaret(oi>0?ui+1:ui),fi.setActiveItem(),Qn(ci,"last-active")}else fi.setCaret(fi.caretPos+oi)})}function zl(){let fi=this;fi.settings.shouldOpen=!0,fi.hook("before","setup",()=>{fi.focus_node=fi.control,Kn(fi.control_input,"dropdown-input");let oi=Ii('