text/plain; charset=utf-8",
+ "maxLength": 50
+ },
+ "file_name": {
+ "type": "string",
+ "description": "Filename to give to the rendered export file",
+ "maxLength": 200
+ },
+ "file_extension": {
+ "type": "string",
+ "description": "Extension to append to the rendered filename",
+ "maxLength": 15
+ },
+ "as_attachment": {
+ "type": "boolean",
+ "description": "Download file as attachment"
+ },
+ "data_source": {
+ "$ref": "#/components/schemas/BriefDataSource"
+ },
+ "data_path": {
+ "type": "string",
+ "readOnly": true,
+ "description": "Path to remote file (relative to data source root)"
+ },
+ "data_file": {
+ "$ref": "#/components/schemas/BriefDataFile"
+ },
+ "data_synced": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true,
+ "title": "Date synced"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "data_path",
+ "data_synced",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "template_code",
+ "url"
+ ]
+ },
+ "ConfigTemplateRequest": {
+ "type": "object",
+ "description": "Introduces support for Tag assignment. Adds `tags` serialization, and handles tag assignment\non create() and update().",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "environment_params": {
+ "nullable": true,
+ "title": "Environment parameters",
+ "description": "Any additional parameters to pass when constructing the Jinja environment"
+ },
+ "template_code": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Jinja template code."
+ },
+ "mime_type": {
+ "type": "string",
+ "description": "Defaults to text/plain; charset=utf-8",
+ "maxLength": 50
+ },
+ "file_name": {
+ "type": "string",
+ "description": "Filename to give to the rendered export file",
+ "maxLength": 200
+ },
+ "file_extension": {
+ "type": "string",
+ "description": "Extension to append to the rendered filename",
+ "maxLength": 15
+ },
+ "as_attachment": {
+ "type": "boolean",
+ "description": "Download file as attachment"
+ },
+ "data_source": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDataSourceRequest"
+ }
+ ]
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ }
+ },
+ "required": [
+ "name",
+ "template_code"
+ ]
+ },
+ "ConsolePort": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device": {
+ "$ref": "#/components/schemas/BriefDevice"
+ },
+ "module": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModule"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ ""
+ ],
+ "type": "string",
+ "description": "* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "c5f7197b7211818a"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "DE-9",
+ "DB-25",
+ "RJ-11",
+ "RJ-12",
+ "RJ-45",
+ "Mini-DIN 8",
+ "USB Type A",
+ "USB Type B",
+ "USB Type C",
+ "USB Mini A",
+ "USB Mini B",
+ "USB Micro A",
+ "USB Micro B",
+ "USB Micro AB",
+ "Other"
+ ]
+ }
+ }
+ },
+ "speed": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ 1200,
+ 2400,
+ 4800,
+ 9600,
+ 19200,
+ 38400,
+ 57600,
+ 115200,
+ null
+ ],
+ "type": "integer",
+ "description": "* `1200` - 1200 bps\n* `2400` - 2400 bps\n* `4800` - 4800 bps\n* `9600` - 9600 bps\n* `19200` - 19.2 kbps\n* `38400` - 38.4 kbps\n* `57600` - 57.6 kbps\n* `115200` - 115.2 kbps",
+ "x-spec-enum-id": "ab6d9635c131a378"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "1200 bps",
+ "2400 bps",
+ "4800 bps",
+ "9600 bps",
+ "19.2 kbps",
+ "38.4 kbps",
+ "57.6 kbps",
+ "115.2 kbps"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "cable": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefCable"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "cable_end": {
+ "type": "string",
+ "readOnly": true
+ },
+ "link_peers": {
+ "type": "array",
+ "items": {},
+ "readOnly": true
+ },
+ "link_peers_type": {
+ "type": "string",
+ "description": "Return the type of the peer link terminations, or None.",
+ "readOnly": true,
+ "nullable": true
+ },
+ "connected_endpoints": {
+ "type": "array",
+ "items": {},
+ "nullable": true,
+ "readOnly": true
+ },
+ "connected_endpoints_type": {
+ "type": "string",
+ "readOnly": true,
+ "nullable": true
+ },
+ "connected_endpoints_reachable": {
+ "type": "boolean",
+ "readOnly": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "_occupied": {
+ "type": "boolean",
+ "readOnly": true,
+ "title": " occupied"
+ }
+ },
+ "required": [
+ "_occupied",
+ "cable",
+ "cable_end",
+ "connected_endpoints",
+ "connected_endpoints_reachable",
+ "connected_endpoints_type",
+ "created",
+ "device",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "link_peers",
+ "link_peers_type",
+ "name",
+ "url"
+ ]
+ },
+ "ConsolePortRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ ""
+ ],
+ "type": "string",
+ "description": "* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "c5f7197b7211818a"
+ },
+ "speed": {
+ "enum": [
+ 1200,
+ 2400,
+ 4800,
+ 9600,
+ 19200,
+ 38400,
+ 57600,
+ 115200,
+ null
+ ],
+ "type": "integer",
+ "description": "* `1200` - 1200 bps\n* `2400` - 2400 bps\n* `4800` - 4800 bps\n* `9600` - 9600 bps\n* `19200` - 19.2 kbps\n* `38400` - 38.4 kbps\n* `57600` - 57.6 kbps\n* `115200` - 115.2 kbps",
+ "x-spec-enum-id": "ab6d9635c131a378",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name"
+ ]
+ },
+ "ConsolePortTemplate": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceType"
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleType"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ ""
+ ],
+ "type": "string",
+ "description": "* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "c5f7197b7211818a"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "DE-9",
+ "DB-25",
+ "RJ-11",
+ "RJ-12",
+ "RJ-45",
+ "Mini-DIN 8",
+ "USB Type A",
+ "USB Type B",
+ "USB Type C",
+ "USB Mini A",
+ "USB Mini B",
+ "USB Micro A",
+ "USB Micro B",
+ "USB Micro AB",
+ "Other"
+ ]
+ }
+ }
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "ConsolePortTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ ""
+ ],
+ "type": "string",
+ "description": "* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "c5f7197b7211818a"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "ConsoleServerPort": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device": {
+ "$ref": "#/components/schemas/BriefDevice"
+ },
+ "module": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModule"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ ""
+ ],
+ "type": "string",
+ "description": "* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "c5f7197b7211818a"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "DE-9",
+ "DB-25",
+ "RJ-11",
+ "RJ-12",
+ "RJ-45",
+ "Mini-DIN 8",
+ "USB Type A",
+ "USB Type B",
+ "USB Type C",
+ "USB Mini A",
+ "USB Mini B",
+ "USB Micro A",
+ "USB Micro B",
+ "USB Micro AB",
+ "Other"
+ ]
+ }
+ }
+ },
+ "speed": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ 1200,
+ 2400,
+ 4800,
+ 9600,
+ 19200,
+ 38400,
+ 57600,
+ 115200,
+ null
+ ],
+ "type": "integer",
+ "description": "* `1200` - 1200 bps\n* `2400` - 2400 bps\n* `4800` - 4800 bps\n* `9600` - 9600 bps\n* `19200` - 19.2 kbps\n* `38400` - 38.4 kbps\n* `57600` - 57.6 kbps\n* `115200` - 115.2 kbps",
+ "x-spec-enum-id": "ab6d9635c131a378"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "1200 bps",
+ "2400 bps",
+ "4800 bps",
+ "9600 bps",
+ "19.2 kbps",
+ "38.4 kbps",
+ "57.6 kbps",
+ "115.2 kbps"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "cable": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefCable"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "cable_end": {
+ "type": "string",
+ "readOnly": true
+ },
+ "link_peers": {
+ "type": "array",
+ "items": {},
+ "readOnly": true
+ },
+ "link_peers_type": {
+ "type": "string",
+ "description": "Return the type of the peer link terminations, or None.",
+ "readOnly": true,
+ "nullable": true
+ },
+ "connected_endpoints": {
+ "type": "array",
+ "items": {},
+ "nullable": true,
+ "readOnly": true
+ },
+ "connected_endpoints_type": {
+ "type": "string",
+ "readOnly": true,
+ "nullable": true
+ },
+ "connected_endpoints_reachable": {
+ "type": "boolean",
+ "readOnly": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "_occupied": {
+ "type": "boolean",
+ "readOnly": true,
+ "title": " occupied"
+ }
+ },
+ "required": [
+ "_occupied",
+ "cable",
+ "cable_end",
+ "connected_endpoints",
+ "connected_endpoints_reachable",
+ "connected_endpoints_type",
+ "created",
+ "device",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "link_peers",
+ "link_peers_type",
+ "name",
+ "url"
+ ]
+ },
+ "ConsoleServerPortRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ ""
+ ],
+ "type": "string",
+ "description": "* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "c5f7197b7211818a"
+ },
+ "speed": {
+ "enum": [
+ 1200,
+ 2400,
+ 4800,
+ 9600,
+ 19200,
+ 38400,
+ 57600,
+ 115200,
+ null
+ ],
+ "type": "integer",
+ "description": "* `1200` - 1200 bps\n* `2400` - 2400 bps\n* `4800` - 4800 bps\n* `9600` - 9600 bps\n* `19200` - 19.2 kbps\n* `38400` - 38.4 kbps\n* `57600` - 57.6 kbps\n* `115200` - 115.2 kbps",
+ "x-spec-enum-id": "ab6d9635c131a378",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name"
+ ]
+ },
+ "ConsoleServerPortTemplate": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceType"
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleType"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ ""
+ ],
+ "type": "string",
+ "description": "* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "c5f7197b7211818a"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "DE-9",
+ "DB-25",
+ "RJ-11",
+ "RJ-12",
+ "RJ-45",
+ "Mini-DIN 8",
+ "USB Type A",
+ "USB Type B",
+ "USB Type C",
+ "USB Mini A",
+ "USB Mini B",
+ "USB Micro A",
+ "USB Micro B",
+ "USB Micro AB",
+ "Other"
+ ]
+ }
+ }
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "ConsoleServerPortTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ ""
+ ],
+ "type": "string",
+ "description": "* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "c5f7197b7211818a"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "Contact": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "groups": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ContactGroup"
+ }
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "phone": {
+ "type": "string",
+ "maxLength": 50
+ },
+ "email": {
+ "type": "string",
+ "format": "email",
+ "maxLength": 254
+ },
+ "address": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "link": {
+ "type": "string",
+ "format": "uri",
+ "maxLength": 200
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "ContactAssignment": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "object": {
+ "type": "object",
+ "additionalProperties": {},
+ "readOnly": true
+ },
+ "contact": {
+ "$ref": "#/components/schemas/BriefContact"
+ },
+ "role": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefContactRole"
+ }
+ ],
+ "nullable": true
+ },
+ "priority": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "primary",
+ "secondary",
+ "tertiary",
+ "inactive",
+ ""
+ ],
+ "type": "string",
+ "description": "* `primary` - Primary\n* `secondary` - Secondary\n* `tertiary` - Tertiary\n* `inactive` - Inactive",
+ "x-spec-enum-id": "ef3a31644cec7524"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Primary",
+ "Secondary",
+ "Tertiary",
+ "Inactive"
+ ]
+ }
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "contact",
+ "created",
+ "display",
+ "id",
+ "last_updated",
+ "object",
+ "object_id",
+ "object_type",
+ "url"
+ ]
+ },
+ "ContactAssignmentRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "contact": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefContactRequest"
+ }
+ ]
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefContactRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "priority": {
+ "enum": [
+ "primary",
+ "secondary",
+ "tertiary",
+ "inactive",
+ ""
+ ],
+ "type": "string",
+ "description": "* `primary` - Primary\n* `secondary` - Secondary\n* `tertiary` - Tertiary\n* `inactive` - Inactive",
+ "x-spec-enum-id": "ef3a31644cec7524"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "contact",
+ "object_id",
+ "object_type"
+ ]
+ },
+ "ContactGroup": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedContactGroup"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "contact_count": {
+ "type": "integer",
+ "readOnly": true,
+ "default": 0
+ },
+ "comments": {
+ "type": "string"
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "contact_count",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "slug",
+ "url"
+ ]
+ },
+ "ContactGroupRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedContactGroupRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "ContactRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "groups": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "phone": {
+ "type": "string",
+ "maxLength": 50
+ },
+ "email": {
+ "type": "string",
+ "format": "email",
+ "maxLength": 254
+ },
+ "address": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "link": {
+ "type": "string",
+ "format": "uri",
+ "maxLength": 200
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "ContactRole": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "slug",
+ "url"
+ ]
+ },
+ "ContactRoleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "CustomField": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "text",
+ "longtext",
+ "integer",
+ "decimal",
+ "boolean",
+ "date",
+ "datetime",
+ "url",
+ "json",
+ "select",
+ "multiselect",
+ "object",
+ "multiobject"
+ ],
+ "type": "string",
+ "description": "* `text` - Text\n* `longtext` - Text (long)\n* `integer` - Integer\n* `decimal` - Decimal\n* `boolean` - Boolean (true/false)\n* `date` - Date\n* `datetime` - Date & time\n* `url` - URL\n* `json` - JSON\n* `select` - Selection\n* `multiselect` - Multiple selection\n* `object` - Object\n* `multiobject` - Multiple objects",
+ "x-spec-enum-id": "22e3a64138d10046"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Text",
+ "Text (long)",
+ "Integer",
+ "Decimal",
+ "Boolean (true/false)",
+ "Date",
+ "Date & time",
+ "URL",
+ "JSON",
+ "Selection",
+ "Multiple selection",
+ "Object",
+ "Multiple objects"
+ ]
+ }
+ }
+ },
+ "related_object_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "data_type": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "description": "Internal field name",
+ "pattern": "^[a-z0-9_]+$",
+ "maxLength": 50
+ },
+ "label": {
+ "type": "string",
+ "description": "Name of the field as displayed to users (if not provided, 'the field's name will be used)",
+ "maxLength": 50
+ },
+ "group_name": {
+ "type": "string",
+ "description": "Custom fields within the same group will be displayed together",
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "required": {
+ "type": "boolean",
+ "description": "This field is required when creating new objects or editing an existing object."
+ },
+ "unique": {
+ "type": "boolean",
+ "title": "Must be unique",
+ "description": "The value of this field must be unique for the assigned object"
+ },
+ "search_weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "description": "Weighting for search. Lower values are considered more important. Fields with a search weight of zero will be ignored."
+ },
+ "filter_logic": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "disabled",
+ "loose",
+ "exact"
+ ],
+ "type": "string",
+ "description": "* `disabled` - Disabled\n* `loose` - Loose\n* `exact` - Exact",
+ "x-spec-enum-id": "a958350ae21c10ee"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Disabled",
+ "Loose",
+ "Exact"
+ ]
+ }
+ }
+ },
+ "ui_visible": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "always",
+ "if-set",
+ "hidden"
+ ],
+ "type": "string",
+ "description": "* `always` - Always\n* `if-set` - If set\n* `hidden` - Hidden",
+ "x-spec-enum-id": "cd2cf94af56de747"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Always",
+ "If set",
+ "Hidden"
+ ]
+ }
+ }
+ },
+ "ui_editable": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "yes",
+ "no",
+ "hidden"
+ ],
+ "type": "string",
+ "description": "* `yes` - Yes\n* `no` - No\n* `hidden` - Hidden",
+ "x-spec-enum-id": "1065673147e26bb5"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Yes",
+ "No",
+ "Hidden"
+ ]
+ }
+ }
+ },
+ "is_cloneable": {
+ "type": "boolean",
+ "description": "Replicate this value when cloning objects"
+ },
+ "default": {
+ "nullable": true,
+ "description": "Default value for the field (must be a JSON value). Encapsulate strings with double quotes (e.g. \"Foo\")."
+ },
+ "related_object_filter": {
+ "nullable": true,
+ "description": "Filter the object selection choices using a query_params dict (must be a JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")."
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "title": "Display weight",
+ "description": "Fields with higher weights appear lower in a form."
+ },
+ "validation_minimum": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": -9223372036854775808,
+ "format": "int64",
+ "nullable": true,
+ "title": "Minimum value",
+ "description": "Minimum allowed value (for numeric fields)"
+ },
+ "validation_maximum": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": -9223372036854775808,
+ "format": "int64",
+ "nullable": true,
+ "title": "Maximum value",
+ "description": "Maximum allowed value (for numeric fields)"
+ },
+ "validation_regex": {
+ "type": "string",
+ "description": "Regular expression to enforce on text field values. Use ^ and $ to force matching of entire string. For example, ^[A-Z]{3}$ will limit values to exactly three uppercase letters.",
+ "maxLength": 500
+ },
+ "choice_set": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefCustomFieldChoiceSet"
+ }
+ ],
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "data_type",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "object_types",
+ "type",
+ "url"
+ ]
+ },
+ "CustomFieldChoiceSet": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "base_choices": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "IATA",
+ "ISO_3166",
+ "UN_LOCODE"
+ ],
+ "type": "string",
+ "description": "* `IATA` - IATA (Airport codes)\n* `ISO_3166` - ISO 3166 (Country codes)\n* `UN_LOCODE` - UN/LOCODE (Location codes)",
+ "x-spec-enum-id": "cf0efb5195f85007"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "IATA (Airport codes)",
+ "ISO 3166 (Country codes)",
+ "UN/LOCODE (Location codes)"
+ ]
+ }
+ }
+ },
+ "extra_choices": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {},
+ "maxItems": 2,
+ "minItems": 2
+ }
+ },
+ "order_alphabetically": {
+ "type": "boolean",
+ "description": "Choices are automatically ordered alphabetically"
+ },
+ "choices_count": {
+ "type": "string",
+ "readOnly": true
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "choices_count",
+ "created",
+ "display",
+ "display_url",
+ "extra_choices",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "CustomFieldChoiceSetRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "base_choices": {
+ "enum": [
+ "IATA",
+ "ISO_3166",
+ "UN_LOCODE"
+ ],
+ "type": "string",
+ "description": "* `IATA` - IATA (Airport codes)\n* `ISO_3166` - ISO 3166 (Country codes)\n* `UN_LOCODE` - UN/LOCODE (Location codes)",
+ "x-spec-enum-id": "cf0efb5195f85007"
+ },
+ "extra_choices": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {},
+ "maxItems": 2,
+ "minItems": 2
+ }
+ },
+ "order_alphabetically": {
+ "type": "boolean",
+ "description": "Choices are automatically ordered alphabetically"
+ }
+ },
+ "required": [
+ "extra_choices",
+ "name"
+ ]
+ },
+ "CustomFieldRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "type": {
+ "enum": [
+ "text",
+ "longtext",
+ "integer",
+ "decimal",
+ "boolean",
+ "date",
+ "datetime",
+ "url",
+ "json",
+ "select",
+ "multiselect",
+ "object",
+ "multiobject"
+ ],
+ "type": "string",
+ "description": "* `text` - Text\n* `longtext` - Text (long)\n* `integer` - Integer\n* `decimal` - Decimal\n* `boolean` - Boolean (true/false)\n* `date` - Date\n* `datetime` - Date & time\n* `url` - URL\n* `json` - JSON\n* `select` - Selection\n* `multiselect` - Multiple selection\n* `object` - Object\n* `multiobject` - Multiple objects",
+ "x-spec-enum-id": "22e3a64138d10046"
+ },
+ "related_object_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Internal field name",
+ "pattern": "^[a-z0-9_]+$",
+ "maxLength": 50
+ },
+ "label": {
+ "type": "string",
+ "description": "Name of the field as displayed to users (if not provided, 'the field's name will be used)",
+ "maxLength": 50
+ },
+ "group_name": {
+ "type": "string",
+ "description": "Custom fields within the same group will be displayed together",
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "required": {
+ "type": "boolean",
+ "description": "This field is required when creating new objects or editing an existing object."
+ },
+ "unique": {
+ "type": "boolean",
+ "title": "Must be unique",
+ "description": "The value of this field must be unique for the assigned object"
+ },
+ "search_weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "description": "Weighting for search. Lower values are considered more important. Fields with a search weight of zero will be ignored."
+ },
+ "filter_logic": {
+ "enum": [
+ "disabled",
+ "loose",
+ "exact"
+ ],
+ "type": "string",
+ "description": "* `disabled` - Disabled\n* `loose` - Loose\n* `exact` - Exact",
+ "x-spec-enum-id": "a958350ae21c10ee"
+ },
+ "ui_visible": {
+ "enum": [
+ "always",
+ "if-set",
+ "hidden"
+ ],
+ "type": "string",
+ "description": "* `always` - Always\n* `if-set` - If set\n* `hidden` - Hidden",
+ "x-spec-enum-id": "cd2cf94af56de747"
+ },
+ "ui_editable": {
+ "enum": [
+ "yes",
+ "no",
+ "hidden"
+ ],
+ "type": "string",
+ "description": "* `yes` - Yes\n* `no` - No\n* `hidden` - Hidden",
+ "x-spec-enum-id": "1065673147e26bb5"
+ },
+ "is_cloneable": {
+ "type": "boolean",
+ "description": "Replicate this value when cloning objects"
+ },
+ "default": {
+ "nullable": true,
+ "description": "Default value for the field (must be a JSON value). Encapsulate strings with double quotes (e.g. \"Foo\")."
+ },
+ "related_object_filter": {
+ "nullable": true,
+ "description": "Filter the object selection choices using a query_params dict (must be a JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")."
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "title": "Display weight",
+ "description": "Fields with higher weights appear lower in a form."
+ },
+ "validation_minimum": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": -9223372036854775808,
+ "format": "int64",
+ "nullable": true,
+ "title": "Minimum value",
+ "description": "Minimum allowed value (for numeric fields)"
+ },
+ "validation_maximum": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": -9223372036854775808,
+ "format": "int64",
+ "nullable": true,
+ "title": "Maximum value",
+ "description": "Maximum allowed value (for numeric fields)"
+ },
+ "validation_regex": {
+ "type": "string",
+ "description": "Regular expression to enforce on text field values. Use ^ and $ to force matching of entire string. For example, ^[A-Z]{3}$ will limit values to exactly three uppercase letters.",
+ "maxLength": 500
+ },
+ "choice_set": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefCustomFieldChoiceSetRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "object_types",
+ "type"
+ ]
+ },
+ "CustomLink": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "link_text": {
+ "type": "string",
+ "description": "Jinja2 template code for link text"
+ },
+ "link_url": {
+ "type": "string",
+ "description": "Jinja2 template code for link URL"
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "group_name": {
+ "type": "string",
+ "description": "Links with the same group will appear as a dropdown menu",
+ "maxLength": 50
+ },
+ "button_class": {
+ "enum": [
+ "default",
+ "blue",
+ "indigo",
+ "purple",
+ "pink",
+ "red",
+ "orange",
+ "yellow",
+ "green",
+ "teal",
+ "cyan",
+ "gray",
+ "black",
+ "white",
+ "ghost-dark"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "ee8e5bb1ccdcdb19",
+ "description": "The class of the first link in a group will be used for the dropdown button\n\n* `default` - Default\n* `blue` - Blue\n* `indigo` - Indigo\n* `purple` - Purple\n* `pink` - Pink\n* `red` - Red\n* `orange` - Orange\n* `yellow` - Yellow\n* `green` - Green\n* `teal` - Teal\n* `cyan` - Cyan\n* `gray` - Gray\n* `black` - Black\n* `white` - White\n* `ghost-dark` - Link"
+ },
+ "new_window": {
+ "type": "boolean",
+ "description": "Force link to open in a new window"
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "link_text",
+ "link_url",
+ "name",
+ "object_types",
+ "url"
+ ]
+ },
+ "CustomLinkRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "link_text": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Jinja2 template code for link text"
+ },
+ "link_url": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Jinja2 template code for link URL"
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "group_name": {
+ "type": "string",
+ "description": "Links with the same group will appear as a dropdown menu",
+ "maxLength": 50
+ },
+ "button_class": {
+ "enum": [
+ "default",
+ "blue",
+ "indigo",
+ "purple",
+ "pink",
+ "red",
+ "orange",
+ "yellow",
+ "green",
+ "teal",
+ "cyan",
+ "gray",
+ "black",
+ "white",
+ "ghost-dark"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "ee8e5bb1ccdcdb19",
+ "description": "The class of the first link in a group will be used for the dropdown button\n\n* `default` - Default\n* `blue` - Blue\n* `indigo` - Indigo\n* `purple` - Purple\n* `pink` - Pink\n* `red` - Red\n* `orange` - Orange\n* `yellow` - Yellow\n* `green` - Green\n* `teal` - Teal\n* `cyan` - Cyan\n* `gray` - Gray\n* `black` - Black\n* `white` - White\n* `ghost-dark` - Link"
+ },
+ "new_window": {
+ "type": "boolean",
+ "description": "Force link to open in a new window"
+ }
+ },
+ "required": [
+ "link_text",
+ "link_url",
+ "name",
+ "object_types"
+ ]
+ },
+ "Dashboard": {
+ "type": "object",
+ "properties": {
+ "layout": {},
+ "config": {}
+ }
+ },
+ "DashboardRequest": {
+ "type": "object",
+ "properties": {
+ "layout": {},
+ "config": {}
+ }
+ },
+ "DataFile": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "source": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDataSource"
+ }
+ ],
+ "readOnly": true
+ },
+ "path": {
+ "type": "string",
+ "readOnly": true,
+ "description": "File path relative to the data source's root"
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true
+ },
+ "size": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "hash": {
+ "type": "string",
+ "readOnly": true,
+ "description": "SHA256 hash of the file data"
+ }
+ },
+ "required": [
+ "display",
+ "display_url",
+ "hash",
+ "id",
+ "last_updated",
+ "path",
+ "size",
+ "source",
+ "url"
+ ]
+ },
+ "DataSource": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ null,
+ "local",
+ "git",
+ "amazon-s3"
+ ],
+ "description": "* `None` - ---------\n* `local` - Local\n* `git` - Git\n* `amazon-s3` - Amazon S3",
+ "x-spec-enum-id": "570db3f2d4e98ccf"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "---------",
+ "Local",
+ "Git",
+ "Amazon S3"
+ ]
+ }
+ }
+ },
+ "source_url": {
+ "type": "string",
+ "title": "URL",
+ "maxLength": 200
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "new",
+ "queued",
+ "syncing",
+ "completed",
+ "failed"
+ ],
+ "type": "string",
+ "description": "* `new` - New\n* `queued` - Queued\n* `syncing` - Syncing\n* `completed` - Completed\n* `failed` - Failed",
+ "x-spec-enum-id": "6dfb2220617590c8"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "New",
+ "Queued",
+ "Syncing",
+ "Completed",
+ "Failed"
+ ]
+ }
+ },
+ "readOnly": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "sync_interval": {
+ "enum": [
+ 1,
+ 60,
+ 720,
+ 1440,
+ 10080,
+ 43200,
+ null
+ ],
+ "type": "integer",
+ "description": "* `1` - Minutely\n* `60` - Hourly\n* `720` - 12 hours\n* `1440` - Daily\n* `10080` - Weekly\n* `43200` - 30 days",
+ "x-spec-enum-id": "2e9f2567ecd93fbe",
+ "nullable": true,
+ "minimum": 0,
+ "maximum": 32767
+ },
+ "parameters": {
+ "nullable": true
+ },
+ "ignore_rules": {
+ "type": "string",
+ "description": "Patterns (one per line) matching files to ignore when syncing"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_synced": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "file_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "file_count",
+ "id",
+ "last_synced",
+ "last_updated",
+ "name",
+ "source_url",
+ "status",
+ "type",
+ "url"
+ ]
+ },
+ "DataSourceRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "type": {
+ "enum": [
+ null,
+ "local",
+ "git",
+ "amazon-s3"
+ ],
+ "description": "* `None` - ---------\n* `local` - Local\n* `git` - Git\n* `amazon-s3` - Amazon S3",
+ "x-spec-enum-id": "570db3f2d4e98ccf"
+ },
+ "source_url": {
+ "type": "string",
+ "minLength": 1,
+ "title": "URL",
+ "maxLength": 200
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "sync_interval": {
+ "enum": [
+ 1,
+ 60,
+ 720,
+ 1440,
+ 10080,
+ 43200,
+ null
+ ],
+ "type": "integer",
+ "description": "* `1` - Minutely\n* `60` - Hourly\n* `720` - 12 hours\n* `1440` - Daily\n* `10080` - Weekly\n* `43200` - 30 days",
+ "x-spec-enum-id": "2e9f2567ecd93fbe",
+ "nullable": true,
+ "minimum": 0,
+ "maximum": 32767
+ },
+ "parameters": {
+ "nullable": true
+ },
+ "ignore_rules": {
+ "type": "string",
+ "description": "Patterns (one per line) matching files to ignore when syncing"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "source_url",
+ "type"
+ ]
+ },
+ "Device": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "maxLength": 64
+ },
+ "device_type": {
+ "$ref": "#/components/schemas/BriefDeviceType"
+ },
+ "role": {
+ "$ref": "#/components/schemas/BriefDeviceRole"
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "platform": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPlatform"
+ }
+ ],
+ "nullable": true
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "description": "Chassis serial number, assigned by the manufacturer",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this device",
+ "maxLength": 50
+ },
+ "site": {
+ "$ref": "#/components/schemas/BriefSite"
+ },
+ "location": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefLocation"
+ }
+ ],
+ "nullable": true
+ },
+ "rack": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRack"
+ }
+ ],
+ "nullable": true
+ },
+ "position": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": 0.5,
+ "exclusiveMaximum": true,
+ "nullable": true,
+ "title": "Position (U)"
+ },
+ "face": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "front",
+ "rear",
+ ""
+ ],
+ "type": "string",
+ "description": "* `front` - Front\n* `rear` - Rear",
+ "x-spec-enum-id": "d2fb9b3f75158b83"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Front",
+ "Rear"
+ ]
+ }
+ }
+ },
+ "latitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 100,
+ "minimum": -100,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "longitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": -1000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "parent_device": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedDevice"
+ }
+ ],
+ "nullable": true,
+ "readOnly": true
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "inventory",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `inventory` - Inventory\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "8d8971779f16ee18"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Offline",
+ "Active",
+ "Planned",
+ "Staged",
+ "Failed",
+ "Inventory",
+ "Decommissioning"
+ ]
+ }
+ }
+ },
+ "airflow": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ "left-to-right",
+ "right-to-left",
+ "side-to-rear",
+ "rear-to-side",
+ "bottom-to-top",
+ "top-to-bottom",
+ "passive",
+ "mixed",
+ ""
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front\n* `left-to-right` - Left to right\n* `right-to-left` - Right to left\n* `side-to-rear` - Side to rear\n* `rear-to-side` - Rear to side\n* `bottom-to-top` - Bottom to top\n* `top-to-bottom` - Top to bottom\n* `passive` - Passive\n* `mixed` - Mixed",
+ "x-spec-enum-id": "943288113dad6782"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Front to rear",
+ "Rear to front",
+ "Left to right",
+ "Right to left",
+ "Side to rear",
+ "Rear to side",
+ "Bottom to top",
+ "Top to bottom",
+ "Passive",
+ "Mixed"
+ ]
+ }
+ }
+ },
+ "primary_ip": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "primary_ip4": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip6": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ }
+ ],
+ "nullable": true
+ },
+ "oob_ip": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ }
+ ],
+ "nullable": true
+ },
+ "cluster": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefCluster"
+ }
+ ],
+ "nullable": true
+ },
+ "virtual_chassis": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVirtualChassis"
+ }
+ ],
+ "nullable": true
+ },
+ "vc_position": {
+ "type": "integer",
+ "maximum": 255,
+ "minimum": 0,
+ "nullable": true
+ },
+ "vc_priority": {
+ "type": "integer",
+ "maximum": 255,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Virtual chassis master election priority"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "config_template": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplate"
+ }
+ ],
+ "nullable": true
+ },
+ "local_context_data": {
+ "nullable": true,
+ "description": "Local config context data takes precedence over source contexts in the final rendered config context"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "console_port_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "console_server_port_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "power_port_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "power_outlet_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "interface_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "front_port_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "rear_port_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "device_bay_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "module_bay_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "inventory_item_count": {
+ "type": "integer",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "console_port_count",
+ "console_server_port_count",
+ "created",
+ "device_bay_count",
+ "device_type",
+ "display",
+ "display_url",
+ "front_port_count",
+ "id",
+ "interface_count",
+ "inventory_item_count",
+ "last_updated",
+ "module_bay_count",
+ "parent_device",
+ "power_outlet_count",
+ "power_port_count",
+ "primary_ip",
+ "rear_port_count",
+ "role",
+ "site",
+ "url"
+ ]
+ },
+ "DeviceBay": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device": {
+ "$ref": "#/components/schemas/BriefDevice"
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "installed_device": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDevice"
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "device",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "DeviceBayRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "installed_device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name"
+ ]
+ },
+ "DeviceBayTemplate": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device_type": {
+ "$ref": "#/components/schemas/BriefDeviceType"
+ },
+ "name": {
+ "type": "string",
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "device_type",
+ "display",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "DeviceBayTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "device_type",
+ "name"
+ ]
+ },
+ "DeviceRole": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "vm_role": {
+ "type": "boolean",
+ "description": "Virtual machines may be assigned to this role"
+ },
+ "config_template": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplate"
+ }
+ ],
+ "nullable": true
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedDeviceRole"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "device_count": {
+ "type": "integer",
+ "readOnly": true,
+ "default": 0
+ },
+ "virtualmachine_count": {
+ "type": "integer",
+ "readOnly": true,
+ "default": 0
+ },
+ "comments": {
+ "type": "string"
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "created",
+ "device_count",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "slug",
+ "url",
+ "virtualmachine_count"
+ ]
+ },
+ "DeviceRoleRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "color": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "vm_role": {
+ "type": "boolean",
+ "description": "Virtual machines may be assigned to this role"
+ },
+ "config_template": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplateRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedDeviceRoleRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "DeviceType": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "manufacturer": {
+ "$ref": "#/components/schemas/BriefManufacturer"
+ },
+ "default_platform": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPlatform"
+ }
+ ],
+ "nullable": true
+ },
+ "model": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "part_number": {
+ "type": "string",
+ "description": "Discrete part number (optional)",
+ "maxLength": 50
+ },
+ "u_height": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": 0.0,
+ "exclusiveMaximum": true,
+ "default": 1.0,
+ "title": "Position (U)"
+ },
+ "exclude_from_utilization": {
+ "type": "boolean",
+ "description": "Devices of this type are excluded when calculating rack utilization."
+ },
+ "is_full_depth": {
+ "type": "boolean",
+ "description": "Device consumes both front and rear rack faces."
+ },
+ "subdevice_role": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "parent",
+ "child",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `parent` - Parent\n* `child` - Child",
+ "x-spec-enum-id": "d10d91f690a856c2"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Parent",
+ "Child"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "airflow": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ "left-to-right",
+ "right-to-left",
+ "side-to-rear",
+ "rear-to-side",
+ "bottom-to-top",
+ "top-to-bottom",
+ "passive",
+ "mixed",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front\n* `left-to-right` - Left to right\n* `right-to-left` - Right to left\n* `side-to-rear` - Side to rear\n* `rear-to-side` - Rear to side\n* `bottom-to-top` - Bottom to top\n* `top-to-bottom` - Top to bottom\n* `passive` - Passive\n* `mixed` - Mixed",
+ "x-spec-enum-id": "943288113dad6782"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Front to rear",
+ "Rear to front",
+ "Left to right",
+ "Right to left",
+ "Side to rear",
+ "Rear to side",
+ "Bottom to top",
+ "Top to bottom",
+ "Passive",
+ "Mixed"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "weight_unit": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Kilograms",
+ "Grams",
+ "Pounds",
+ "Ounces"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "front_image": {
+ "type": "string",
+ "format": "uri",
+ "nullable": true
+ },
+ "rear_image": {
+ "type": "string",
+ "format": "uri",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "device_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "console_port_template_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "console_server_port_template_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "power_port_template_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "power_outlet_template_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "interface_template_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "front_port_template_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "rear_port_template_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "device_bay_template_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "module_bay_template_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "inventory_item_template_count": {
+ "type": "integer",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "console_port_template_count",
+ "console_server_port_template_count",
+ "created",
+ "device_bay_template_count",
+ "device_count",
+ "display",
+ "display_url",
+ "front_port_template_count",
+ "id",
+ "interface_template_count",
+ "inventory_item_template_count",
+ "last_updated",
+ "manufacturer",
+ "model",
+ "module_bay_template_count",
+ "power_outlet_template_count",
+ "power_port_template_count",
+ "rear_port_template_count",
+ "slug",
+ "url"
+ ]
+ },
+ "DeviceTypeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ]
+ },
+ "default_platform": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPlatformRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "model": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "part_number": {
+ "type": "string",
+ "description": "Discrete part number (optional)",
+ "maxLength": 50
+ },
+ "u_height": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": 0.0,
+ "exclusiveMaximum": true,
+ "default": 1.0,
+ "title": "Position (U)"
+ },
+ "exclude_from_utilization": {
+ "type": "boolean",
+ "description": "Devices of this type are excluded when calculating rack utilization."
+ },
+ "is_full_depth": {
+ "type": "boolean",
+ "description": "Device consumes both front and rear rack faces."
+ },
+ "subdevice_role": {
+ "enum": [
+ "parent",
+ "child",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `parent` - Parent\n* `child` - Child",
+ "x-spec-enum-id": "d10d91f690a856c2",
+ "nullable": true
+ },
+ "airflow": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ "left-to-right",
+ "right-to-left",
+ "side-to-rear",
+ "rear-to-side",
+ "bottom-to-top",
+ "top-to-bottom",
+ "passive",
+ "mixed",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front\n* `left-to-right` - Left to right\n* `right-to-left` - Right to left\n* `side-to-rear` - Side to rear\n* `rear-to-side` - Rear to side\n* `bottom-to-top` - Bottom to top\n* `top-to-bottom` - Top to bottom\n* `passive` - Passive\n* `mixed` - Mixed",
+ "x-spec-enum-id": "943288113dad6782",
+ "nullable": true
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "weight_unit": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884",
+ "nullable": true
+ },
+ "front_image": {
+ "type": "string",
+ "format": "binary",
+ "nullable": true
+ },
+ "rear_image": {
+ "type": "string",
+ "format": "binary",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "manufacturer",
+ "model",
+ "slug"
+ ]
+ },
+ "DeviceWithConfigContext": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "maxLength": 64
+ },
+ "device_type": {
+ "$ref": "#/components/schemas/BriefDeviceType"
+ },
+ "role": {
+ "$ref": "#/components/schemas/BriefDeviceRole"
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "platform": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPlatform"
+ }
+ ],
+ "nullable": true
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "description": "Chassis serial number, assigned by the manufacturer",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this device",
+ "maxLength": 50
+ },
+ "site": {
+ "$ref": "#/components/schemas/BriefSite"
+ },
+ "location": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefLocation"
+ }
+ ],
+ "nullable": true
+ },
+ "rack": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRack"
+ }
+ ],
+ "nullable": true
+ },
+ "position": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": 0.5,
+ "exclusiveMaximum": true,
+ "nullable": true,
+ "title": "Position (U)"
+ },
+ "face": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "front",
+ "rear",
+ ""
+ ],
+ "type": "string",
+ "description": "* `front` - Front\n* `rear` - Rear",
+ "x-spec-enum-id": "d2fb9b3f75158b83"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Front",
+ "Rear"
+ ]
+ }
+ }
+ },
+ "latitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 100,
+ "minimum": -100,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "longitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": -1000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "parent_device": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedDevice"
+ }
+ ],
+ "nullable": true,
+ "readOnly": true
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "inventory",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `inventory` - Inventory\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "8d8971779f16ee18"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Offline",
+ "Active",
+ "Planned",
+ "Staged",
+ "Failed",
+ "Inventory",
+ "Decommissioning"
+ ]
+ }
+ }
+ },
+ "airflow": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ "left-to-right",
+ "right-to-left",
+ "side-to-rear",
+ "rear-to-side",
+ "bottom-to-top",
+ "top-to-bottom",
+ "passive",
+ "mixed",
+ ""
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front\n* `left-to-right` - Left to right\n* `right-to-left` - Right to left\n* `side-to-rear` - Side to rear\n* `rear-to-side` - Rear to side\n* `bottom-to-top` - Bottom to top\n* `top-to-bottom` - Top to bottom\n* `passive` - Passive\n* `mixed` - Mixed",
+ "x-spec-enum-id": "943288113dad6782"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Front to rear",
+ "Rear to front",
+ "Left to right",
+ "Right to left",
+ "Side to rear",
+ "Rear to side",
+ "Bottom to top",
+ "Top to bottom",
+ "Passive",
+ "Mixed"
+ ]
+ }
+ }
+ },
+ "primary_ip": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "primary_ip4": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip6": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ }
+ ],
+ "nullable": true
+ },
+ "oob_ip": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ }
+ ],
+ "nullable": true
+ },
+ "cluster": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefCluster"
+ }
+ ],
+ "nullable": true
+ },
+ "virtual_chassis": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVirtualChassis"
+ }
+ ],
+ "nullable": true
+ },
+ "vc_position": {
+ "type": "integer",
+ "maximum": 255,
+ "minimum": 0,
+ "nullable": true
+ },
+ "vc_priority": {
+ "type": "integer",
+ "maximum": 255,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Virtual chassis master election priority"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "config_template": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplate"
+ }
+ ],
+ "nullable": true
+ },
+ "config_context": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "local_context_data": {
+ "nullable": true,
+ "description": "Local config context data takes precedence over source contexts in the final rendered config context"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "console_port_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "console_server_port_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "power_port_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "power_outlet_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "interface_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "front_port_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "rear_port_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "device_bay_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "module_bay_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "inventory_item_count": {
+ "type": "integer",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "config_context",
+ "console_port_count",
+ "console_server_port_count",
+ "created",
+ "device_bay_count",
+ "device_type",
+ "display",
+ "display_url",
+ "front_port_count",
+ "id",
+ "interface_count",
+ "inventory_item_count",
+ "last_updated",
+ "module_bay_count",
+ "parent_device",
+ "power_outlet_count",
+ "power_port_count",
+ "primary_ip",
+ "rear_port_count",
+ "role",
+ "site",
+ "url"
+ ]
+ },
+ "DeviceWithConfigContextRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "maxLength": 64
+ },
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ]
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRoleRequest"
+ }
+ ]
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "platform": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPlatformRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "description": "Chassis serial number, assigned by the manufacturer",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this device",
+ "maxLength": 50
+ },
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ]
+ },
+ "location": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefLocationRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "rack": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRackRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "position": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": 0.5,
+ "exclusiveMaximum": true,
+ "nullable": true,
+ "title": "Position (U)"
+ },
+ "face": {
+ "enum": [
+ "front",
+ "rear",
+ ""
+ ],
+ "type": "string",
+ "description": "* `front` - Front\n* `rear` - Rear",
+ "x-spec-enum-id": "d2fb9b3f75158b83"
+ },
+ "latitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 100,
+ "minimum": -100,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "longitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": -1000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "status": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "inventory",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `inventory` - Inventory\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "8d8971779f16ee18"
+ },
+ "airflow": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ "left-to-right",
+ "right-to-left",
+ "side-to-rear",
+ "rear-to-side",
+ "bottom-to-top",
+ "top-to-bottom",
+ "passive",
+ "mixed",
+ ""
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front\n* `left-to-right` - Left to right\n* `right-to-left` - Right to left\n* `side-to-rear` - Side to rear\n* `rear-to-side` - Rear to side\n* `bottom-to-top` - Bottom to top\n* `top-to-bottom` - Top to bottom\n* `passive` - Passive\n* `mixed` - Mixed",
+ "x-spec-enum-id": "943288113dad6782"
+ },
+ "primary_ip4": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip6": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "oob_ip": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "cluster": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefClusterRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "virtual_chassis": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVirtualChassisRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vc_position": {
+ "type": "integer",
+ "maximum": 255,
+ "minimum": 0,
+ "nullable": true
+ },
+ "vc_priority": {
+ "type": "integer",
+ "maximum": 255,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Virtual chassis master election priority"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "config_template": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplateRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "local_context_data": {
+ "nullable": true,
+ "description": "Local config context data takes precedence over source contexts in the final rendered config context"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device_type",
+ "role",
+ "site"
+ ]
+ },
+ "EventRule": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 150
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "event_types": {
+ "type": "array",
+ "items": {
+ "enum": [
+ "object_created",
+ "object_updated",
+ "object_deleted",
+ "job_started",
+ "job_completed",
+ "job_failed",
+ "job_errored"
+ ],
+ "type": "string",
+ "description": "* `object_created` - Object created\n* `object_updated` - Object updated\n* `object_deleted` - Object deleted\n* `job_started` - Job started\n* `job_completed` - Job completed\n* `job_failed` - Job failed\n* `job_errored` - Job errored",
+ "x-spec-enum-id": "80d172232f4af424"
+ },
+ "description": "The types of event which will trigger this rule."
+ },
+ "conditions": {
+ "nullable": true,
+ "description": "A set of conditions which determine whether the event will be generated."
+ },
+ "action_type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "webhook",
+ "script",
+ "notification"
+ ],
+ "type": "string",
+ "description": "* `webhook` - Webhook\n* `script` - Script\n* `notification` - Notification",
+ "x-spec-enum-id": "d07193c73ebc03c6"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Webhook",
+ "Script",
+ "Notification"
+ ]
+ }
+ }
+ },
+ "action_object_type": {
+ "type": "string"
+ },
+ "action_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "action_object": {
+ "type": "object",
+ "additionalProperties": {},
+ "readOnly": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "action_object",
+ "action_object_type",
+ "action_type",
+ "created",
+ "display",
+ "display_url",
+ "event_types",
+ "id",
+ "last_updated",
+ "name",
+ "object_types",
+ "url"
+ ]
+ },
+ "EventRuleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 150
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "event_types": {
+ "type": "array",
+ "items": {
+ "enum": [
+ "object_created",
+ "object_updated",
+ "object_deleted",
+ "job_started",
+ "job_completed",
+ "job_failed",
+ "job_errored"
+ ],
+ "type": "string",
+ "description": "* `object_created` - Object created\n* `object_updated` - Object updated\n* `object_deleted` - Object deleted\n* `job_started` - Job started\n* `job_completed` - Job completed\n* `job_failed` - Job failed\n* `job_errored` - Job errored",
+ "x-spec-enum-id": "80d172232f4af424"
+ },
+ "description": "The types of event which will trigger this rule."
+ },
+ "conditions": {
+ "nullable": true,
+ "description": "A set of conditions which determine whether the event will be generated."
+ },
+ "action_type": {
+ "enum": [
+ "webhook",
+ "script",
+ "notification"
+ ],
+ "type": "string",
+ "description": "* `webhook` - Webhook\n* `script` - Script\n* `notification` - Notification",
+ "x-spec-enum-id": "d07193c73ebc03c6"
+ },
+ "action_object_type": {
+ "type": "string"
+ },
+ "action_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ }
+ },
+ "required": [
+ "action_object_type",
+ "action_type",
+ "event_types",
+ "name",
+ "object_types"
+ ]
+ },
+ "ExportTemplate": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "environment_params": {
+ "nullable": true,
+ "title": "Environment parameters",
+ "description": "Any additional parameters to pass when constructing the Jinja environment"
+ },
+ "template_code": {
+ "type": "string",
+ "description": "Jinja template code."
+ },
+ "mime_type": {
+ "type": "string",
+ "description": "Defaults to text/plain; charset=utf-8",
+ "maxLength": 50
+ },
+ "file_name": {
+ "type": "string",
+ "description": "Filename to give to the rendered export file",
+ "maxLength": 200
+ },
+ "file_extension": {
+ "type": "string",
+ "description": "Extension to append to the rendered filename",
+ "maxLength": 15
+ },
+ "as_attachment": {
+ "type": "boolean",
+ "description": "Download file as attachment"
+ },
+ "data_source": {
+ "$ref": "#/components/schemas/BriefDataSource"
+ },
+ "data_path": {
+ "type": "string",
+ "readOnly": true,
+ "description": "Path to remote file (relative to data source root)"
+ },
+ "data_file": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDataFile"
+ }
+ ],
+ "readOnly": true
+ },
+ "data_synced": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true,
+ "title": "Date synced"
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "data_file",
+ "data_path",
+ "data_synced",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "object_types",
+ "template_code",
+ "url"
+ ]
+ },
+ "ExportTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "environment_params": {
+ "nullable": true,
+ "title": "Environment parameters",
+ "description": "Any additional parameters to pass when constructing the Jinja environment"
+ },
+ "template_code": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Jinja template code."
+ },
+ "mime_type": {
+ "type": "string",
+ "description": "Defaults to text/plain; charset=utf-8",
+ "maxLength": 50
+ },
+ "file_name": {
+ "type": "string",
+ "description": "Filename to give to the rendered export file",
+ "maxLength": 200
+ },
+ "file_extension": {
+ "type": "string",
+ "description": "Extension to append to the rendered filename",
+ "maxLength": 15
+ },
+ "as_attachment": {
+ "type": "boolean",
+ "description": "Download file as attachment"
+ },
+ "data_source": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDataSourceRequest"
+ }
+ ]
+ }
+ },
+ "required": [
+ "name",
+ "object_types",
+ "template_code"
+ ]
+ },
+ "FHRPGroup": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "protocol": {
+ "enum": [
+ "vrrp2",
+ "vrrp3",
+ "carp",
+ "clusterxl",
+ "hsrp",
+ "glbp",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `vrrp2` - VRRPv2\n* `vrrp3` - VRRPv3\n* `carp` - CARP\n* `clusterxl` - ClusterXL\n* `hsrp` - HSRP\n* `glbp` - GLBP\n* `other` - Other",
+ "x-spec-enum-id": "40dc831c689b4b78"
+ },
+ "group_id": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "auth_type": {
+ "enum": [
+ "plaintext",
+ "md5",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `plaintext` - Plaintext\n* `md5` - MD5",
+ "x-spec-enum-id": "12b9faea3a45bf37",
+ "nullable": true,
+ "title": "Authentication type"
+ },
+ "auth_key": {
+ "type": "string",
+ "title": "Authentication key",
+ "maxLength": 255
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "ip_addresses": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ },
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "group_id",
+ "id",
+ "ip_addresses",
+ "last_updated",
+ "protocol",
+ "url"
+ ]
+ },
+ "FHRPGroupAssignment": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "group": {
+ "$ref": "#/components/schemas/BriefFHRPGroup"
+ },
+ "interface_type": {
+ "type": "string"
+ },
+ "interface_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "interface": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "priority": {
+ "type": "integer",
+ "maximum": 255,
+ "minimum": 0
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "group",
+ "id",
+ "interface",
+ "interface_id",
+ "interface_type",
+ "last_updated",
+ "priority",
+ "url"
+ ]
+ },
+ "FHRPGroupAssignmentRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefFHRPGroupRequest"
+ }
+ ]
+ },
+ "interface_type": {
+ "type": "string"
+ },
+ "interface_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "priority": {
+ "type": "integer",
+ "maximum": 255,
+ "minimum": 0
+ }
+ },
+ "required": [
+ "group",
+ "interface_id",
+ "interface_type",
+ "priority"
+ ]
+ },
+ "FHRPGroupRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "protocol": {
+ "enum": [
+ "vrrp2",
+ "vrrp3",
+ "carp",
+ "clusterxl",
+ "hsrp",
+ "glbp",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `vrrp2` - VRRPv2\n* `vrrp3` - VRRPv3\n* `carp` - CARP\n* `clusterxl` - ClusterXL\n* `hsrp` - HSRP\n* `glbp` - GLBP\n* `other` - Other",
+ "x-spec-enum-id": "40dc831c689b4b78"
+ },
+ "group_id": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "auth_type": {
+ "enum": [
+ "plaintext",
+ "md5",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `plaintext` - Plaintext\n* `md5` - MD5",
+ "x-spec-enum-id": "12b9faea3a45bf37",
+ "nullable": true,
+ "title": "Authentication type"
+ },
+ "auth_key": {
+ "type": "string",
+ "title": "Authentication key",
+ "maxLength": 255
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "group_id",
+ "protocol"
+ ]
+ },
+ "FrontPort": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device": {
+ "$ref": "#/components/schemas/BriefDevice"
+ },
+ "module": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModule"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "8P8C",
+ "8P6C",
+ "8P4C",
+ "8P2C",
+ "6P6C",
+ "6P4C",
+ "6P2C",
+ "4P4C",
+ "4P2C",
+ "GG45",
+ "TERA 4P",
+ "TERA 2P",
+ "TERA 1P",
+ "110 Punch",
+ "BNC",
+ "F Connector",
+ "N Connector",
+ "MRJ21",
+ "FC",
+ "FC/PC",
+ "FC/UPC",
+ "FC/APC",
+ "LC",
+ "LC/PC",
+ "LC/UPC",
+ "LC/APC",
+ "LSH",
+ "LSH/PC",
+ "LSH/UPC",
+ "LSH/APC",
+ "LX.5",
+ "LX.5/PC",
+ "LX.5/UPC",
+ "LX.5/APC",
+ "MPO",
+ "MTRJ",
+ "SC",
+ "SC/PC",
+ "SC/UPC",
+ "SC/APC",
+ "ST",
+ "CS",
+ "SN",
+ "SMA 905",
+ "SMA 906",
+ "URM-P2",
+ "URM-P4",
+ "URM-P8",
+ "Splice",
+ "USB Type A",
+ "USB Type B",
+ "USB Type C",
+ "USB Mini A",
+ "USB Mini B",
+ "USB Micro A",
+ "USB Micro B",
+ "USB Micro AB",
+ "Other"
+ ]
+ }
+ }
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "rear_port": {
+ "$ref": "#/components/schemas/FrontPortRearPort"
+ },
+ "rear_port_position": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1,
+ "description": "Mapped position on corresponding rear port"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "cable": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefCable"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "cable_end": {
+ "type": "string",
+ "readOnly": true
+ },
+ "link_peers": {
+ "type": "array",
+ "items": {},
+ "readOnly": true
+ },
+ "link_peers_type": {
+ "type": "string",
+ "description": "Return the type of the peer link terminations, or None.",
+ "readOnly": true,
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "_occupied": {
+ "type": "boolean",
+ "readOnly": true,
+ "title": " occupied"
+ }
+ },
+ "required": [
+ "_occupied",
+ "cable",
+ "cable_end",
+ "created",
+ "device",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "link_peers",
+ "link_peers_type",
+ "name",
+ "rear_port",
+ "type",
+ "url"
+ ]
+ },
+ "FrontPortRearPort": {
+ "type": "object",
+ "description": "NestedRearPortSerializer but with parent device omitted (since front and rear ports must belong to same device)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "url"
+ ]
+ },
+ "FrontPortRearPortRequest": {
+ "type": "object",
+ "description": "NestedRearPortSerializer but with parent device omitted (since front and rear ports must belong to same device)",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "FrontPortRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "rear_port": {
+ "$ref": "#/components/schemas/FrontPortRearPortRequest"
+ },
+ "rear_port_position": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1,
+ "description": "Mapped position on corresponding rear port"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name",
+ "rear_port",
+ "type"
+ ]
+ },
+ "FrontPortTemplate": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceType"
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleType"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "8P8C",
+ "8P6C",
+ "8P4C",
+ "8P2C",
+ "6P6C",
+ "6P4C",
+ "6P2C",
+ "4P4C",
+ "4P2C",
+ "GG45",
+ "TERA 4P",
+ "TERA 2P",
+ "TERA 1P",
+ "110 Punch",
+ "BNC",
+ "F Connector",
+ "N Connector",
+ "MRJ21",
+ "FC",
+ "FC/PC",
+ "FC/UPC",
+ "FC/APC",
+ "LC",
+ "LC/PC",
+ "LC/UPC",
+ "LC/APC",
+ "LSH",
+ "LSH/PC",
+ "LSH/UPC",
+ "LSH/APC",
+ "LX.5",
+ "LX.5/PC",
+ "LX.5/UPC",
+ "LX.5/APC",
+ "MPO",
+ "MTRJ",
+ "SC",
+ "SC/PC",
+ "SC/UPC",
+ "SC/APC",
+ "ST",
+ "CS",
+ "SN",
+ "SMA 905",
+ "SMA 906",
+ "URM-P2",
+ "URM-P4",
+ "URM-P8",
+ "Splice",
+ "USB Type A",
+ "USB Type B",
+ "USB Type C",
+ "USB Mini A",
+ "USB Mini B",
+ "USB Micro A",
+ "USB Micro B",
+ "USB Micro AB",
+ "Other"
+ ]
+ }
+ }
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "rear_port": {
+ "$ref": "#/components/schemas/BriefRearPortTemplate"
+ },
+ "rear_port_position": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "id",
+ "last_updated",
+ "name",
+ "rear_port",
+ "type",
+ "url"
+ ]
+ },
+ "FrontPortTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "rear_port": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefRearPortTemplateRequest"
+ }
+ ]
+ },
+ "rear_port_position": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name",
+ "rear_port",
+ "type"
+ ]
+ },
+ "GenericObject": {
+ "type": "object",
+ "description": "Minimal representation of some generic object identified by ContentType and PK.",
+ "properties": {
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer"
+ },
+ "object": {
+ "nullable": true,
+ "readOnly": true
+ }
+ },
+ "required": [
+ "object",
+ "object_id",
+ "object_type"
+ ]
+ },
+ "GenericObjectRequest": {
+ "type": "object",
+ "description": "Minimal representation of some generic object identified by ContentType and PK.",
+ "properties": {
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer"
+ }
+ },
+ "required": [
+ "object_id",
+ "object_type"
+ ]
+ },
+ "Group": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 150
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "permissions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ObjectPermission"
+ }
+ },
+ "user_count": {
+ "type": "integer",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "url",
+ "user_count"
+ ]
+ },
+ "GroupRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 150
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "permissions": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "IKEPolicy": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "version": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ 1,
+ 2
+ ],
+ "type": "integer",
+ "description": "* `1` - IKEv1\n* `2` - IKEv2",
+ "x-spec-enum-id": "00872b77916a1fde"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "IKEv1",
+ "IKEv2"
+ ]
+ }
+ }
+ },
+ "mode": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "aggressive",
+ "main"
+ ],
+ "type": "string",
+ "description": "* `aggressive` - Aggressive\n* `main` - Main",
+ "x-spec-enum-id": "64c1be7bdb2548ca"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Aggressive",
+ "Main"
+ ]
+ }
+ }
+ },
+ "proposals": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/IKEProposal"
+ }
+ },
+ "preshared_key": {
+ "type": "string",
+ "title": "Pre-shared key"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "url",
+ "version"
+ ]
+ },
+ "IKEPolicyRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "version": {
+ "enum": [
+ 1,
+ 2
+ ],
+ "type": "integer",
+ "description": "* `1` - IKEv1\n* `2` - IKEv2",
+ "x-spec-enum-id": "00872b77916a1fde"
+ },
+ "mode": {
+ "enum": [
+ "aggressive",
+ "main"
+ ],
+ "type": "string",
+ "description": "* `aggressive` - Aggressive\n* `main` - Main",
+ "x-spec-enum-id": "64c1be7bdb2548ca"
+ },
+ "proposals": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "preshared_key": {
+ "type": "string",
+ "title": "Pre-shared key"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "version"
+ ]
+ },
+ "IKEProposal": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "authentication_method": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "preshared-keys",
+ "certificates",
+ "rsa-signatures",
+ "dsa-signatures"
+ ],
+ "type": "string",
+ "description": "* `preshared-keys` - Pre-shared keys\n* `certificates` - Certificates\n* `rsa-signatures` - RSA signatures\n* `dsa-signatures` - DSA signatures",
+ "x-spec-enum-id": "92bb2f1103b3a262"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Pre-shared keys",
+ "Certificates",
+ "RSA signatures",
+ "DSA signatures"
+ ]
+ }
+ }
+ },
+ "encryption_algorithm": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "aes-128-cbc",
+ "aes-128-gcm",
+ "aes-192-cbc",
+ "aes-192-gcm",
+ "aes-256-cbc",
+ "aes-256-gcm",
+ "3des-cbc",
+ "des-cbc"
+ ],
+ "type": "string",
+ "description": "* `aes-128-cbc` - 128-bit AES (CBC)\n* `aes-128-gcm` - 128-bit AES (GCM)\n* `aes-192-cbc` - 192-bit AES (CBC)\n* `aes-192-gcm` - 192-bit AES (GCM)\n* `aes-256-cbc` - 256-bit AES (CBC)\n* `aes-256-gcm` - 256-bit AES (GCM)\n* `3des-cbc` - 3DES\n* `des-cbc` - DES",
+ "x-spec-enum-id": "b022535cfdee79fe"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "128-bit AES (CBC)",
+ "128-bit AES (GCM)",
+ "192-bit AES (CBC)",
+ "192-bit AES (GCM)",
+ "256-bit AES (CBC)",
+ "256-bit AES (GCM)",
+ "3DES",
+ "DES"
+ ]
+ }
+ }
+ },
+ "authentication_algorithm": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "hmac-sha1",
+ "hmac-sha256",
+ "hmac-sha384",
+ "hmac-sha512",
+ "hmac-md5"
+ ],
+ "type": "string",
+ "description": "* `hmac-sha1` - SHA-1 HMAC\n* `hmac-sha256` - SHA-256 HMAC\n* `hmac-sha384` - SHA-384 HMAC\n* `hmac-sha512` - SHA-512 HMAC\n* `hmac-md5` - MD5 HMAC",
+ "x-spec-enum-id": "0830e8839f5dea4f"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "SHA-1 HMAC",
+ "SHA-256 HMAC",
+ "SHA-384 HMAC",
+ "SHA-512 HMAC",
+ "MD5 HMAC"
+ ]
+ }
+ }
+ },
+ "group": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ 1,
+ 2,
+ 5,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34
+ ],
+ "type": "integer",
+ "description": "* `1` - Group 1\n* `2` - Group 2\n* `5` - Group 5\n* `14` - Group 14\n* `15` - Group 15\n* `16` - Group 16\n* `17` - Group 17\n* `18` - Group 18\n* `19` - Group 19\n* `20` - Group 20\n* `21` - Group 21\n* `22` - Group 22\n* `23` - Group 23\n* `24` - Group 24\n* `25` - Group 25\n* `26` - Group 26\n* `27` - Group 27\n* `28` - Group 28\n* `29` - Group 29\n* `30` - Group 30\n* `31` - Group 31\n* `32` - Group 32\n* `33` - Group 33\n* `34` - Group 34",
+ "x-spec-enum-id": "dbef43be795462a8"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Group 1",
+ "Group 2",
+ "Group 5",
+ "Group 14",
+ "Group 15",
+ "Group 16",
+ "Group 17",
+ "Group 18",
+ "Group 19",
+ "Group 20",
+ "Group 21",
+ "Group 22",
+ "Group 23",
+ "Group 24",
+ "Group 25",
+ "Group 26",
+ "Group 27",
+ "Group 28",
+ "Group 29",
+ "Group 30",
+ "Group 31",
+ "Group 32",
+ "Group 33",
+ "Group 34"
+ ]
+ }
+ }
+ },
+ "sa_lifetime": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Security association lifetime (in seconds)"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "authentication_method",
+ "created",
+ "display",
+ "display_url",
+ "encryption_algorithm",
+ "group",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "IKEProposalRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "authentication_method": {
+ "enum": [
+ "preshared-keys",
+ "certificates",
+ "rsa-signatures",
+ "dsa-signatures"
+ ],
+ "type": "string",
+ "description": "* `preshared-keys` - Pre-shared keys\n* `certificates` - Certificates\n* `rsa-signatures` - RSA signatures\n* `dsa-signatures` - DSA signatures",
+ "x-spec-enum-id": "92bb2f1103b3a262"
+ },
+ "encryption_algorithm": {
+ "enum": [
+ "aes-128-cbc",
+ "aes-128-gcm",
+ "aes-192-cbc",
+ "aes-192-gcm",
+ "aes-256-cbc",
+ "aes-256-gcm",
+ "3des-cbc",
+ "des-cbc"
+ ],
+ "type": "string",
+ "description": "* `aes-128-cbc` - 128-bit AES (CBC)\n* `aes-128-gcm` - 128-bit AES (GCM)\n* `aes-192-cbc` - 192-bit AES (CBC)\n* `aes-192-gcm` - 192-bit AES (GCM)\n* `aes-256-cbc` - 256-bit AES (CBC)\n* `aes-256-gcm` - 256-bit AES (GCM)\n* `3des-cbc` - 3DES\n* `des-cbc` - DES",
+ "x-spec-enum-id": "b022535cfdee79fe"
+ },
+ "authentication_algorithm": {
+ "enum": [
+ "hmac-sha1",
+ "hmac-sha256",
+ "hmac-sha384",
+ "hmac-sha512",
+ "hmac-md5"
+ ],
+ "type": "string",
+ "description": "* `hmac-sha1` - SHA-1 HMAC\n* `hmac-sha256` - SHA-256 HMAC\n* `hmac-sha384` - SHA-384 HMAC\n* `hmac-sha512` - SHA-512 HMAC\n* `hmac-md5` - MD5 HMAC",
+ "x-spec-enum-id": "0830e8839f5dea4f"
+ },
+ "group": {
+ "enum": [
+ 1,
+ 2,
+ 5,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34
+ ],
+ "type": "integer",
+ "description": "* `1` - Group 1\n* `2` - Group 2\n* `5` - Group 5\n* `14` - Group 14\n* `15` - Group 15\n* `16` - Group 16\n* `17` - Group 17\n* `18` - Group 18\n* `19` - Group 19\n* `20` - Group 20\n* `21` - Group 21\n* `22` - Group 22\n* `23` - Group 23\n* `24` - Group 24\n* `25` - Group 25\n* `26` - Group 26\n* `27` - Group 27\n* `28` - Group 28\n* `29` - Group 29\n* `30` - Group 30\n* `31` - Group 31\n* `32` - Group 32\n* `33` - Group 33\n* `34` - Group 34",
+ "x-spec-enum-id": "dbef43be795462a8"
+ },
+ "sa_lifetime": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Security association lifetime (in seconds)"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "authentication_method",
+ "encryption_algorithm",
+ "group",
+ "name"
+ ]
+ },
+ "IPAddress": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "family": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ 4,
+ 6
+ ],
+ "type": "integer",
+ "description": "* `4` - IPv4\n* `6` - IPv6",
+ "x-spec-enum-id": "d72003fd1af3603d"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "IPv4",
+ "IPv6"
+ ]
+ }
+ },
+ "readOnly": true
+ },
+ "address": {
+ "type": "string"
+ },
+ "vrf": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRF"
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "active",
+ "reserved",
+ "deprecated",
+ "dhcp",
+ "slaac"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated\n* `dhcp` - DHCP\n* `slaac` - SLAAC",
+ "x-spec-enum-id": "24935cfee15bd268"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Active",
+ "Reserved",
+ "Deprecated",
+ "DHCP",
+ "SLAAC"
+ ]
+ }
+ }
+ },
+ "role": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "loopback",
+ "secondary",
+ "anycast",
+ "vip",
+ "vrrp",
+ "hsrp",
+ "glbp",
+ "carp",
+ ""
+ ],
+ "type": "string",
+ "description": "* `loopback` - Loopback\n* `secondary` - Secondary\n* `anycast` - Anycast\n* `vip` - VIP\n* `vrrp` - VRRP\n* `hsrp` - HSRP\n* `glbp` - GLBP\n* `carp` - CARP",
+ "x-spec-enum-id": "10fbcb4930889b0f"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Loopback",
+ "Secondary",
+ "Anycast",
+ "VIP",
+ "VRRP",
+ "HSRP",
+ "GLBP",
+ "CARP"
+ ]
+ }
+ }
+ },
+ "assigned_object_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "assigned_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "assigned_object": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "nat_inside": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedIPAddress"
+ }
+ ],
+ "nullable": true
+ },
+ "nat_outside": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedIPAddress"
+ },
+ "readOnly": true
+ },
+ "dns_name": {
+ "type": "string",
+ "description": "Hostname or FQDN (not case-sensitive)",
+ "pattern": "^([0-9A-Za-z_-]+|\\*)(\\.[0-9A-Za-z_-]+)*\\.?$",
+ "maxLength": 255
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "address",
+ "assigned_object",
+ "created",
+ "display",
+ "display_url",
+ "family",
+ "id",
+ "last_updated",
+ "nat_outside",
+ "url"
+ ]
+ },
+ "IPAddressRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "address": {
+ "type": "string",
+ "minLength": 1
+ },
+ "vrf": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRFRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "active",
+ "reserved",
+ "deprecated",
+ "dhcp",
+ "slaac"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated\n* `dhcp` - DHCP\n* `slaac` - SLAAC",
+ "x-spec-enum-id": "24935cfee15bd268"
+ },
+ "role": {
+ "enum": [
+ "loopback",
+ "secondary",
+ "anycast",
+ "vip",
+ "vrrp",
+ "hsrp",
+ "glbp",
+ "carp",
+ ""
+ ],
+ "type": "string",
+ "description": "* `loopback` - Loopback\n* `secondary` - Secondary\n* `anycast` - Anycast\n* `vip` - VIP\n* `vrrp` - VRRP\n* `hsrp` - HSRP\n* `glbp` - GLBP\n* `carp` - CARP",
+ "x-spec-enum-id": "10fbcb4930889b0f"
+ },
+ "assigned_object_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "assigned_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "nat_inside": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "dns_name": {
+ "type": "string",
+ "description": "Hostname or FQDN (not case-sensitive)",
+ "pattern": "^([0-9A-Za-z_-]+|\\*)(\\.[0-9A-Za-z_-]+)*\\.?$",
+ "maxLength": 255
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "address"
+ ]
+ },
+ "IPRange": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "family": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ 4,
+ 6
+ ],
+ "type": "integer",
+ "description": "* `4` - IPv4\n* `6` - IPv6",
+ "x-spec-enum-id": "d72003fd1af3603d"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "IPv4",
+ "IPv6"
+ ]
+ }
+ },
+ "readOnly": true
+ },
+ "start_address": {
+ "type": "string"
+ },
+ "end_address": {
+ "type": "string"
+ },
+ "size": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "vrf": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRF"
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "active",
+ "reserved",
+ "deprecated"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated",
+ "x-spec-enum-id": "6388dfb94ca1cc15"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Active",
+ "Reserved",
+ "Deprecated"
+ ]
+ }
+ }
+ },
+ "role": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRole"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "mark_populated": {
+ "type": "boolean",
+ "description": "Prevent the creation of IP addresses within this range"
+ },
+ "mark_utilized": {
+ "type": "boolean",
+ "description": "Report space as 100% utilized"
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "end_address",
+ "family",
+ "id",
+ "last_updated",
+ "size",
+ "start_address",
+ "url"
+ ]
+ },
+ "IPRangeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "start_address": {
+ "type": "string",
+ "minLength": 1
+ },
+ "end_address": {
+ "type": "string",
+ "minLength": 1
+ },
+ "vrf": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRFRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "active",
+ "reserved",
+ "deprecated"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated",
+ "x-spec-enum-id": "6388dfb94ca1cc15"
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "mark_populated": {
+ "type": "boolean",
+ "description": "Prevent the creation of IP addresses within this range"
+ },
+ "mark_utilized": {
+ "type": "boolean",
+ "description": "Report space as 100% utilized"
+ }
+ },
+ "required": [
+ "end_address",
+ "start_address"
+ ]
+ },
+ "IPSecPolicy": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "proposals": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/IPSecProposal"
+ }
+ },
+ "pfs_group": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ 1,
+ 2,
+ 5,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34
+ ],
+ "type": "integer",
+ "description": "* `1` - Group 1\n* `2` - Group 2\n* `5` - Group 5\n* `14` - Group 14\n* `15` - Group 15\n* `16` - Group 16\n* `17` - Group 17\n* `18` - Group 18\n* `19` - Group 19\n* `20` - Group 20\n* `21` - Group 21\n* `22` - Group 22\n* `23` - Group 23\n* `24` - Group 24\n* `25` - Group 25\n* `26` - Group 26\n* `27` - Group 27\n* `28` - Group 28\n* `29` - Group 29\n* `30` - Group 30\n* `31` - Group 31\n* `32` - Group 32\n* `33` - Group 33\n* `34` - Group 34",
+ "x-spec-enum-id": "dbef43be795462a8"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Group 1",
+ "Group 2",
+ "Group 5",
+ "Group 14",
+ "Group 15",
+ "Group 16",
+ "Group 17",
+ "Group 18",
+ "Group 19",
+ "Group 20",
+ "Group 21",
+ "Group 22",
+ "Group 23",
+ "Group 24",
+ "Group 25",
+ "Group 26",
+ "Group 27",
+ "Group 28",
+ "Group 29",
+ "Group 30",
+ "Group 31",
+ "Group 32",
+ "Group 33",
+ "Group 34"
+ ]
+ }
+ }
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "IPSecPolicyRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "proposals": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "pfs_group": {
+ "enum": [
+ 1,
+ 2,
+ 5,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34
+ ],
+ "type": "integer",
+ "description": "* `1` - Group 1\n* `2` - Group 2\n* `5` - Group 5\n* `14` - Group 14\n* `15` - Group 15\n* `16` - Group 16\n* `17` - Group 17\n* `18` - Group 18\n* `19` - Group 19\n* `20` - Group 20\n* `21` - Group 21\n* `22` - Group 22\n* `23` - Group 23\n* `24` - Group 24\n* `25` - Group 25\n* `26` - Group 26\n* `27` - Group 27\n* `28` - Group 28\n* `29` - Group 29\n* `30` - Group 30\n* `31` - Group 31\n* `32` - Group 32\n* `33` - Group 33\n* `34` - Group 34",
+ "x-spec-enum-id": "dbef43be795462a8"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "IPSecProfile": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mode": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "esp",
+ "ah"
+ ],
+ "type": "string",
+ "description": "* `esp` - ESP\n* `ah` - AH",
+ "x-spec-enum-id": "1136c2cdfee84436"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "ESP",
+ "AH"
+ ]
+ }
+ }
+ },
+ "ike_policy": {
+ "$ref": "#/components/schemas/BriefIKEPolicy"
+ },
+ "ipsec_policy": {
+ "$ref": "#/components/schemas/BriefIPSecPolicy"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "ike_policy",
+ "ipsec_policy",
+ "last_updated",
+ "mode",
+ "name",
+ "url"
+ ]
+ },
+ "IPSecProfileRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mode": {
+ "enum": [
+ "esp",
+ "ah"
+ ],
+ "type": "string",
+ "description": "* `esp` - ESP\n* `ah` - AH",
+ "x-spec-enum-id": "1136c2cdfee84436"
+ },
+ "ike_policy": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefIKEPolicyRequest"
+ }
+ ]
+ },
+ "ipsec_policy": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefIPSecPolicyRequest"
+ }
+ ]
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "ike_policy",
+ "ipsec_policy",
+ "mode",
+ "name"
+ ]
+ },
+ "IPSecProposal": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "encryption_algorithm": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "aes-128-cbc",
+ "aes-128-gcm",
+ "aes-192-cbc",
+ "aes-192-gcm",
+ "aes-256-cbc",
+ "aes-256-gcm",
+ "3des-cbc",
+ "des-cbc"
+ ],
+ "type": "string",
+ "description": "* `aes-128-cbc` - 128-bit AES (CBC)\n* `aes-128-gcm` - 128-bit AES (GCM)\n* `aes-192-cbc` - 192-bit AES (CBC)\n* `aes-192-gcm` - 192-bit AES (GCM)\n* `aes-256-cbc` - 256-bit AES (CBC)\n* `aes-256-gcm` - 256-bit AES (GCM)\n* `3des-cbc` - 3DES\n* `des-cbc` - DES",
+ "x-spec-enum-id": "b022535cfdee79fe"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "128-bit AES (CBC)",
+ "128-bit AES (GCM)",
+ "192-bit AES (CBC)",
+ "192-bit AES (GCM)",
+ "256-bit AES (CBC)",
+ "256-bit AES (GCM)",
+ "3DES",
+ "DES"
+ ]
+ }
+ }
+ },
+ "authentication_algorithm": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "hmac-sha1",
+ "hmac-sha256",
+ "hmac-sha384",
+ "hmac-sha512",
+ "hmac-md5"
+ ],
+ "type": "string",
+ "description": "* `hmac-sha1` - SHA-1 HMAC\n* `hmac-sha256` - SHA-256 HMAC\n* `hmac-sha384` - SHA-384 HMAC\n* `hmac-sha512` - SHA-512 HMAC\n* `hmac-md5` - MD5 HMAC",
+ "x-spec-enum-id": "0830e8839f5dea4f"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "SHA-1 HMAC",
+ "SHA-256 HMAC",
+ "SHA-384 HMAC",
+ "SHA-512 HMAC",
+ "MD5 HMAC"
+ ]
+ }
+ }
+ },
+ "sa_lifetime_seconds": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "SA lifetime (seconds)",
+ "description": "Security association lifetime (seconds)"
+ },
+ "sa_lifetime_data": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "SA lifetime (KB)",
+ "description": "Security association lifetime (in kilobytes)"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "IPSecProposalRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "encryption_algorithm": {
+ "enum": [
+ "aes-128-cbc",
+ "aes-128-gcm",
+ "aes-192-cbc",
+ "aes-192-gcm",
+ "aes-256-cbc",
+ "aes-256-gcm",
+ "3des-cbc",
+ "des-cbc"
+ ],
+ "type": "string",
+ "description": "* `aes-128-cbc` - 128-bit AES (CBC)\n* `aes-128-gcm` - 128-bit AES (GCM)\n* `aes-192-cbc` - 192-bit AES (CBC)\n* `aes-192-gcm` - 192-bit AES (GCM)\n* `aes-256-cbc` - 256-bit AES (CBC)\n* `aes-256-gcm` - 256-bit AES (GCM)\n* `3des-cbc` - 3DES\n* `des-cbc` - DES",
+ "x-spec-enum-id": "b022535cfdee79fe"
+ },
+ "authentication_algorithm": {
+ "enum": [
+ "hmac-sha1",
+ "hmac-sha256",
+ "hmac-sha384",
+ "hmac-sha512",
+ "hmac-md5"
+ ],
+ "type": "string",
+ "description": "* `hmac-sha1` - SHA-1 HMAC\n* `hmac-sha256` - SHA-256 HMAC\n* `hmac-sha384` - SHA-384 HMAC\n* `hmac-sha512` - SHA-512 HMAC\n* `hmac-md5` - MD5 HMAC",
+ "x-spec-enum-id": "0830e8839f5dea4f"
+ },
+ "sa_lifetime_seconds": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "SA lifetime (seconds)",
+ "description": "Security association lifetime (seconds)"
+ },
+ "sa_lifetime_data": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "SA lifetime (KB)",
+ "description": "Security association lifetime (in kilobytes)"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "ImageAttachment": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "parent": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 50
+ },
+ "image": {
+ "type": "string",
+ "format": "uri"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "image_height": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "image_width": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "id",
+ "image",
+ "image_height",
+ "image_width",
+ "last_updated",
+ "object_id",
+ "object_type",
+ "parent",
+ "url"
+ ]
+ },
+ "ImageAttachmentRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 50
+ },
+ "image": {
+ "type": "string",
+ "format": "binary"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "image",
+ "object_id",
+ "object_type"
+ ]
+ },
+ "IntegerRange": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ },
+ "minItems": 2,
+ "maxItems": 2
+ }
+ },
+ "IntegerRangeRequest": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ },
+ "minItems": 2,
+ "maxItems": 2
+ }
+ },
+ "Interface": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device": {
+ "$ref": "#/components/schemas/BriefDevice"
+ },
+ "vdcs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VirtualDeviceContext"
+ }
+ },
+ "module": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModule"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "virtual",
+ "bridge",
+ "lag",
+ "100base-fx",
+ "100base-lfx",
+ "100base-tx",
+ "100base-t1",
+ "1000base-t",
+ "1000base-sx",
+ "1000base-lx",
+ "1000base-tx",
+ "2.5gbase-t",
+ "5gbase-t",
+ "10gbase-t",
+ "10gbase-cx4",
+ "100base-x-sfp",
+ "1000base-x-gbic",
+ "1000base-x-sfp",
+ "10gbase-x-sfpp",
+ "10gbase-x-xfp",
+ "10gbase-x-xenpak",
+ "10gbase-x-x2",
+ "25gbase-x-sfp28",
+ "50gbase-x-sfp56",
+ "40gbase-x-qsfpp",
+ "50gbase-x-sfp28",
+ "100gbase-x-cfp",
+ "100gbase-x-cfp2",
+ "200gbase-x-cfp2",
+ "400gbase-x-cfp2",
+ "100gbase-x-cfp4",
+ "100gbase-x-cxp",
+ "100gbase-x-cpak",
+ "100gbase-x-dsfp",
+ "100gbase-x-sfpdd",
+ "100gbase-x-qsfp28",
+ "100gbase-x-qsfpdd",
+ "200gbase-x-qsfp56",
+ "200gbase-x-qsfpdd",
+ "400gbase-x-qsfp112",
+ "400gbase-x-qsfpdd",
+ "400gbase-x-osfp",
+ "400gbase-x-osfp-rhs",
+ "400gbase-x-cdfp",
+ "400gbase-x-cfp8",
+ "800gbase-x-qsfpdd",
+ "800gbase-x-osfp",
+ "1000base-kx",
+ "2.5gbase-kx",
+ "5gbase-kr",
+ "10gbase-kr",
+ "10gbase-kx4",
+ "25gbase-kr",
+ "40gbase-kr4",
+ "50gbase-kr",
+ "100gbase-kp4",
+ "100gbase-kr2",
+ "100gbase-kr4",
+ "ieee802.11a",
+ "ieee802.11g",
+ "ieee802.11n",
+ "ieee802.11ac",
+ "ieee802.11ad",
+ "ieee802.11ax",
+ "ieee802.11ay",
+ "ieee802.11be",
+ "ieee802.15.1",
+ "ieee802.15.4",
+ "other-wireless",
+ "gsm",
+ "cdma",
+ "lte",
+ "4g",
+ "5g",
+ "sonet-oc3",
+ "sonet-oc12",
+ "sonet-oc48",
+ "sonet-oc192",
+ "sonet-oc768",
+ "sonet-oc1920",
+ "sonet-oc3840",
+ "1gfc-sfp",
+ "2gfc-sfp",
+ "4gfc-sfp",
+ "8gfc-sfpp",
+ "16gfc-sfpp",
+ "32gfc-sfp28",
+ "32gfc-sfpp",
+ "64gfc-qsfpp",
+ "64gfc-sfpdd",
+ "64gfc-sfpp",
+ "128gfc-qsfp28",
+ "infiniband-sdr",
+ "infiniband-ddr",
+ "infiniband-qdr",
+ "infiniband-fdr10",
+ "infiniband-fdr",
+ "infiniband-edr",
+ "infiniband-hdr",
+ "infiniband-ndr",
+ "infiniband-xdr",
+ "t1",
+ "e1",
+ "t3",
+ "e3",
+ "xdsl",
+ "docsis",
+ "moca",
+ "bpon",
+ "epon",
+ "10g-epon",
+ "gpon",
+ "xg-pon",
+ "xgs-pon",
+ "ng-pon2",
+ "25g-pon",
+ "50g-pon",
+ "cisco-stackwise",
+ "cisco-stackwise-plus",
+ "cisco-flexstack",
+ "cisco-flexstack-plus",
+ "cisco-stackwise-80",
+ "cisco-stackwise-160",
+ "cisco-stackwise-320",
+ "cisco-stackwise-480",
+ "cisco-stackwise-1t",
+ "juniper-vcp",
+ "extreme-summitstack",
+ "extreme-summitstack-128",
+ "extreme-summitstack-256",
+ "extreme-summitstack-512",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `virtual` - Virtual\n* `bridge` - Bridge\n* `lag` - Link Aggregation Group (LAG)\n* `100base-fx` - 100BASE-FX (10/100ME FIBER)\n* `100base-lfx` - 100BASE-LFX (10/100ME FIBER)\n* `100base-tx` - 100BASE-TX (10/100ME)\n* `100base-t1` - 100BASE-T1 (10/100ME Single Pair)\n* `1000base-t` - 1000BASE-T (1GE)\n* `1000base-sx` - 1000BASE-SX (1GE)\n* `1000base-lx` - 1000BASE-LX (1GE)\n* `1000base-tx` - 1000BASE-TX (1GE)\n* `2.5gbase-t` - 2.5GBASE-T (2.5GE)\n* `5gbase-t` - 5GBASE-T (5GE)\n* `10gbase-t` - 10GBASE-T (10GE)\n* `10gbase-cx4` - 10GBASE-CX4 (10GE)\n* `100base-x-sfp` - SFP (100ME)\n* `1000base-x-gbic` - GBIC (1GE)\n* `1000base-x-sfp` - SFP (1GE)\n* `10gbase-x-sfpp` - SFP+ (10GE)\n* `10gbase-x-xfp` - XFP (10GE)\n* `10gbase-x-xenpak` - XENPAK (10GE)\n* `10gbase-x-x2` - X2 (10GE)\n* `25gbase-x-sfp28` - SFP28 (25GE)\n* `50gbase-x-sfp56` - SFP56 (50GE)\n* `40gbase-x-qsfpp` - QSFP+ (40GE)\n* `50gbase-x-sfp28` - QSFP28 (50GE)\n* `100gbase-x-cfp` - CFP (100GE)\n* `100gbase-x-cfp2` - CFP2 (100GE)\n* `200gbase-x-cfp2` - CFP2 (200GE)\n* `400gbase-x-cfp2` - CFP2 (400GE)\n* `100gbase-x-cfp4` - CFP4 (100GE)\n* `100gbase-x-cxp` - CXP (100GE)\n* `100gbase-x-cpak` - Cisco CPAK (100GE)\n* `100gbase-x-dsfp` - DSFP (100GE)\n* `100gbase-x-sfpdd` - SFP-DD (100GE)\n* `100gbase-x-qsfp28` - QSFP28 (100GE)\n* `100gbase-x-qsfpdd` - QSFP-DD (100GE)\n* `200gbase-x-qsfp56` - QSFP56 (200GE)\n* `200gbase-x-qsfpdd` - QSFP-DD (200GE)\n* `400gbase-x-qsfp112` - QSFP112 (400GE)\n* `400gbase-x-qsfpdd` - QSFP-DD (400GE)\n* `400gbase-x-osfp` - OSFP (400GE)\n* `400gbase-x-osfp-rhs` - OSFP-RHS (400GE)\n* `400gbase-x-cdfp` - CDFP (400GE)\n* `400gbase-x-cfp8` - CPF8 (400GE)\n* `800gbase-x-qsfpdd` - QSFP-DD (800GE)\n* `800gbase-x-osfp` - OSFP (800GE)\n* `1000base-kx` - 1000BASE-KX (1GE)\n* `2.5gbase-kx` - 2.5GBASE-KX (2.5GE)\n* `5gbase-kr` - 5GBASE-KR (5GE)\n* `10gbase-kr` - 10GBASE-KR (10GE)\n* `10gbase-kx4` - 10GBASE-KX4 (10GE)\n* `25gbase-kr` - 25GBASE-KR (25GE)\n* `40gbase-kr4` - 40GBASE-KR4 (40GE)\n* `50gbase-kr` - 50GBASE-KR (50GE)\n* `100gbase-kp4` - 100GBASE-KP4 (100GE)\n* `100gbase-kr2` - 100GBASE-KR2 (100GE)\n* `100gbase-kr4` - 100GBASE-KR4 (100GE)\n* `ieee802.11a` - IEEE 802.11a\n* `ieee802.11g` - IEEE 802.11b/g\n* `ieee802.11n` - IEEE 802.11n\n* `ieee802.11ac` - IEEE 802.11ac\n* `ieee802.11ad` - IEEE 802.11ad\n* `ieee802.11ax` - IEEE 802.11ax\n* `ieee802.11ay` - IEEE 802.11ay\n* `ieee802.11be` - IEEE 802.11be\n* `ieee802.15.1` - IEEE 802.15.1 (Bluetooth)\n* `ieee802.15.4` - IEEE 802.15.4 (LR-WPAN)\n* `other-wireless` - Other (Wireless)\n* `gsm` - GSM\n* `cdma` - CDMA\n* `lte` - LTE\n* `4g` - 4G\n* `5g` - 5G\n* `sonet-oc3` - OC-3/STM-1\n* `sonet-oc12` - OC-12/STM-4\n* `sonet-oc48` - OC-48/STM-16\n* `sonet-oc192` - OC-192/STM-64\n* `sonet-oc768` - OC-768/STM-256\n* `sonet-oc1920` - OC-1920/STM-640\n* `sonet-oc3840` - OC-3840/STM-1234\n* `1gfc-sfp` - SFP (1GFC)\n* `2gfc-sfp` - SFP (2GFC)\n* `4gfc-sfp` - SFP (4GFC)\n* `8gfc-sfpp` - SFP+ (8GFC)\n* `16gfc-sfpp` - SFP+ (16GFC)\n* `32gfc-sfp28` - SFP28 (32GFC)\n* `32gfc-sfpp` - SFP+ (32GFC)\n* `64gfc-qsfpp` - QSFP+ (64GFC)\n* `64gfc-sfpdd` - SFP-DD (64GFC)\n* `64gfc-sfpp` - SFP+ (64GFC)\n* `128gfc-qsfp28` - QSFP28 (128GFC)\n* `infiniband-sdr` - SDR (2 Gbps)\n* `infiniband-ddr` - DDR (4 Gbps)\n* `infiniband-qdr` - QDR (8 Gbps)\n* `infiniband-fdr10` - FDR10 (10 Gbps)\n* `infiniband-fdr` - FDR (13.5 Gbps)\n* `infiniband-edr` - EDR (25 Gbps)\n* `infiniband-hdr` - HDR (50 Gbps)\n* `infiniband-ndr` - NDR (100 Gbps)\n* `infiniband-xdr` - XDR (250 Gbps)\n* `t1` - T1 (1.544 Mbps)\n* `e1` - E1 (2.048 Mbps)\n* `t3` - T3 (45 Mbps)\n* `e3` - E3 (34 Mbps)\n* `xdsl` - xDSL\n* `docsis` - DOCSIS\n* `moca` - MoCA\n* `bpon` - BPON (622 Mbps / 155 Mbps)\n* `epon` - EPON (1 Gbps)\n* `10g-epon` - 10G-EPON (10 Gbps)\n* `gpon` - GPON (2.5 Gbps / 1.25 Gbps)\n* `xg-pon` - XG-PON (10 Gbps / 2.5 Gbps)\n* `xgs-pon` - XGS-PON (10 Gbps)\n* `ng-pon2` - NG-PON2 (TWDM-PON) (4x10 Gbps)\n* `25g-pon` - 25G-PON (25 Gbps)\n* `50g-pon` - 50G-PON (50 Gbps)\n* `cisco-stackwise` - Cisco StackWise\n* `cisco-stackwise-plus` - Cisco StackWise Plus\n* `cisco-flexstack` - Cisco FlexStack\n* `cisco-flexstack-plus` - Cisco FlexStack Plus\n* `cisco-stackwise-80` - Cisco StackWise-80\n* `cisco-stackwise-160` - Cisco StackWise-160\n* `cisco-stackwise-320` - Cisco StackWise-320\n* `cisco-stackwise-480` - Cisco StackWise-480\n* `cisco-stackwise-1t` - Cisco StackWise-1T\n* `juniper-vcp` - Juniper VCP\n* `extreme-summitstack` - Extreme SummitStack\n* `extreme-summitstack-128` - Extreme SummitStack-128\n* `extreme-summitstack-256` - Extreme SummitStack-256\n* `extreme-summitstack-512` - Extreme SummitStack-512\n* `other` - Other",
+ "x-spec-enum-id": "8c4c5e112f77a383"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Virtual",
+ "Bridge",
+ "Link Aggregation Group (LAG)",
+ "100BASE-FX (10/100ME FIBER)",
+ "100BASE-LFX (10/100ME FIBER)",
+ "100BASE-TX (10/100ME)",
+ "100BASE-T1 (10/100ME Single Pair)",
+ "1000BASE-T (1GE)",
+ "1000BASE-SX (1GE)",
+ "1000BASE-LX (1GE)",
+ "1000BASE-TX (1GE)",
+ "2.5GBASE-T (2.5GE)",
+ "5GBASE-T (5GE)",
+ "10GBASE-T (10GE)",
+ "10GBASE-CX4 (10GE)",
+ "SFP (100ME)",
+ "GBIC (1GE)",
+ "SFP (1GE)",
+ "SFP+ (10GE)",
+ "XFP (10GE)",
+ "XENPAK (10GE)",
+ "X2 (10GE)",
+ "SFP28 (25GE)",
+ "SFP56 (50GE)",
+ "QSFP+ (40GE)",
+ "QSFP28 (50GE)",
+ "CFP (100GE)",
+ "CFP2 (100GE)",
+ "CFP2 (200GE)",
+ "CFP2 (400GE)",
+ "CFP4 (100GE)",
+ "CXP (100GE)",
+ "Cisco CPAK (100GE)",
+ "DSFP (100GE)",
+ "SFP-DD (100GE)",
+ "QSFP28 (100GE)",
+ "QSFP-DD (100GE)",
+ "QSFP56 (200GE)",
+ "QSFP-DD (200GE)",
+ "QSFP112 (400GE)",
+ "QSFP-DD (400GE)",
+ "OSFP (400GE)",
+ "OSFP-RHS (400GE)",
+ "CDFP (400GE)",
+ "CPF8 (400GE)",
+ "QSFP-DD (800GE)",
+ "OSFP (800GE)",
+ "1000BASE-KX (1GE)",
+ "2.5GBASE-KX (2.5GE)",
+ "5GBASE-KR (5GE)",
+ "10GBASE-KR (10GE)",
+ "10GBASE-KX4 (10GE)",
+ "25GBASE-KR (25GE)",
+ "40GBASE-KR4 (40GE)",
+ "50GBASE-KR (50GE)",
+ "100GBASE-KP4 (100GE)",
+ "100GBASE-KR2 (100GE)",
+ "100GBASE-KR4 (100GE)",
+ "IEEE 802.11a",
+ "IEEE 802.11b/g",
+ "IEEE 802.11n",
+ "IEEE 802.11ac",
+ "IEEE 802.11ad",
+ "IEEE 802.11ax",
+ "IEEE 802.11ay",
+ "IEEE 802.11be",
+ "IEEE 802.15.1 (Bluetooth)",
+ "IEEE 802.15.4 (LR-WPAN)",
+ "Other (Wireless)",
+ "GSM",
+ "CDMA",
+ "LTE",
+ "4G",
+ "5G",
+ "OC-3/STM-1",
+ "OC-12/STM-4",
+ "OC-48/STM-16",
+ "OC-192/STM-64",
+ "OC-768/STM-256",
+ "OC-1920/STM-640",
+ "OC-3840/STM-1234",
+ "SFP (1GFC)",
+ "SFP (2GFC)",
+ "SFP (4GFC)",
+ "SFP+ (8GFC)",
+ "SFP+ (16GFC)",
+ "SFP28 (32GFC)",
+ "SFP+ (32GFC)",
+ "QSFP+ (64GFC)",
+ "SFP-DD (64GFC)",
+ "SFP+ (64GFC)",
+ "QSFP28 (128GFC)",
+ "SDR (2 Gbps)",
+ "DDR (4 Gbps)",
+ "QDR (8 Gbps)",
+ "FDR10 (10 Gbps)",
+ "FDR (13.5 Gbps)",
+ "EDR (25 Gbps)",
+ "HDR (50 Gbps)",
+ "NDR (100 Gbps)",
+ "XDR (250 Gbps)",
+ "T1 (1.544 Mbps)",
+ "E1 (2.048 Mbps)",
+ "T3 (45 Mbps)",
+ "E3 (34 Mbps)",
+ "xDSL",
+ "DOCSIS",
+ "MoCA",
+ "BPON (622 Mbps / 155 Mbps)",
+ "EPON (1 Gbps)",
+ "10G-EPON (10 Gbps)",
+ "GPON (2.5 Gbps / 1.25 Gbps)",
+ "XG-PON (10 Gbps / 2.5 Gbps)",
+ "XGS-PON (10 Gbps)",
+ "NG-PON2 (TWDM-PON) (4x10 Gbps)",
+ "25G-PON (25 Gbps)",
+ "50G-PON (50 Gbps)",
+ "Cisco StackWise",
+ "Cisco StackWise Plus",
+ "Cisco FlexStack",
+ "Cisco FlexStack Plus",
+ "Cisco StackWise-80",
+ "Cisco StackWise-160",
+ "Cisco StackWise-320",
+ "Cisco StackWise-480",
+ "Cisco StackWise-1T",
+ "Juniper VCP",
+ "Extreme SummitStack",
+ "Extreme SummitStack-128",
+ "Extreme SummitStack-256",
+ "Extreme SummitStack-512",
+ "Other"
+ ]
+ }
+ }
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedInterface"
+ }
+ ],
+ "nullable": true
+ },
+ "bridge": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedInterface"
+ }
+ ],
+ "nullable": true
+ },
+ "lag": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedInterface"
+ }
+ ],
+ "nullable": true
+ },
+ "mtu": {
+ "type": "integer",
+ "maximum": 65536,
+ "minimum": 1,
+ "nullable": true
+ },
+ "mac_address": {
+ "type": "string",
+ "readOnly": true,
+ "nullable": true
+ },
+ "primary_mac_address": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefMACAddress"
+ }
+ ],
+ "nullable": true
+ },
+ "mac_addresses": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/BriefMACAddress"
+ },
+ "readOnly": true,
+ "nullable": true
+ },
+ "speed": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Speed (Kbps)"
+ },
+ "duplex": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "half",
+ "full",
+ "auto",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `half` - Half\n* `full` - Full\n* `auto` - Auto",
+ "x-spec-enum-id": "47eab9b1a65a1e21"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Half",
+ "Full",
+ "Auto"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "wwn": {
+ "type": "string",
+ "nullable": true
+ },
+ "mgmt_only": {
+ "type": "boolean",
+ "title": "Management only",
+ "description": "This interface is used only for out-of-band management"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mode": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "access",
+ "tagged",
+ "tagged-all",
+ "q-in-q",
+ ""
+ ],
+ "type": "string",
+ "description": "* `access` - Access\n* `tagged` - Tagged\n* `tagged-all` - Tagged (All)\n* `q-in-q` - Q-in-Q (802.1ad)",
+ "x-spec-enum-id": "b6fe48fe21dbf01d"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Access",
+ "Tagged",
+ "Tagged (All)",
+ "Q-in-Q (802.1ad)"
+ ]
+ }
+ }
+ },
+ "rf_role": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "ap",
+ "station",
+ ""
+ ],
+ "type": "string",
+ "description": "* `ap` - Access point\n* `station` - Station",
+ "x-spec-enum-id": "d2772dbea88b0fb1"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Access point",
+ "Station"
+ ]
+ }
+ }
+ },
+ "rf_channel": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "2.4g-1-2412-22",
+ "2.4g-2-2417-22",
+ "2.4g-3-2422-22",
+ "2.4g-4-2427-22",
+ "2.4g-5-2432-22",
+ "2.4g-6-2437-22",
+ "2.4g-7-2442-22",
+ "2.4g-8-2447-22",
+ "2.4g-9-2452-22",
+ "2.4g-10-2457-22",
+ "2.4g-11-2462-22",
+ "2.4g-12-2467-22",
+ "2.4g-13-2472-22",
+ "5g-32-5160-20",
+ "5g-34-5170-40",
+ "5g-36-5180-20",
+ "5g-38-5190-40",
+ "5g-40-5200-20",
+ "5g-42-5210-80",
+ "5g-44-5220-20",
+ "5g-46-5230-40",
+ "5g-48-5240-20",
+ "5g-50-5250-160",
+ "5g-52-5260-20",
+ "5g-54-5270-40",
+ "5g-56-5280-20",
+ "5g-58-5290-80",
+ "5g-60-5300-20",
+ "5g-62-5310-40",
+ "5g-64-5320-20",
+ "5g-100-5500-20",
+ "5g-102-5510-40",
+ "5g-104-5520-20",
+ "5g-106-5530-80",
+ "5g-108-5540-20",
+ "5g-110-5550-40",
+ "5g-112-5560-20",
+ "5g-114-5570-160",
+ "5g-116-5580-20",
+ "5g-118-5590-40",
+ "5g-120-5600-20",
+ "5g-122-5610-80",
+ "5g-124-5620-20",
+ "5g-126-5630-40",
+ "5g-128-5640-20",
+ "5g-132-5660-20",
+ "5g-134-5670-40",
+ "5g-136-5680-20",
+ "5g-138-5690-80",
+ "5g-140-5700-20",
+ "5g-142-5710-40",
+ "5g-144-5720-20",
+ "5g-149-5745-20",
+ "5g-151-5755-40",
+ "5g-153-5765-20",
+ "5g-155-5775-80",
+ "5g-157-5785-20",
+ "5g-159-5795-40",
+ "5g-161-5805-20",
+ "5g-163-5815-160",
+ "5g-165-5825-20",
+ "5g-167-5835-40",
+ "5g-169-5845-20",
+ "5g-171-5855-80",
+ "5g-173-5865-20",
+ "5g-175-5875-40",
+ "5g-177-5885-20",
+ "6g-1-5955-20",
+ "6g-3-5965-40",
+ "6g-5-5975-20",
+ "6g-7-5985-80",
+ "6g-9-5995-20",
+ "6g-11-6005-40",
+ "6g-13-6015-20",
+ "6g-15-6025-160",
+ "6g-17-6035-20",
+ "6g-19-6045-40",
+ "6g-21-6055-20",
+ "6g-23-6065-80",
+ "6g-25-6075-20",
+ "6g-27-6085-40",
+ "6g-29-6095-20",
+ "6g-31-6105-320",
+ "6g-33-6115-20",
+ "6g-35-6125-40",
+ "6g-37-6135-20",
+ "6g-39-6145-80",
+ "6g-41-6155-20",
+ "6g-43-6165-40",
+ "6g-45-6175-20",
+ "6g-47-6185-160",
+ "6g-49-6195-20",
+ "6g-51-6205-40",
+ "6g-53-6215-20",
+ "6g-55-6225-80",
+ "6g-57-6235-20",
+ "6g-59-6245-40",
+ "6g-61-6255-20",
+ "6g-65-6275-20",
+ "6g-67-6285-40",
+ "6g-69-6295-20",
+ "6g-71-6305-80",
+ "6g-73-6315-20",
+ "6g-75-6325-40",
+ "6g-77-6335-20",
+ "6g-79-6345-160",
+ "6g-81-6355-20",
+ "6g-83-6365-40",
+ "6g-85-6375-20",
+ "6g-87-6385-80",
+ "6g-89-6395-20",
+ "6g-91-6405-40",
+ "6g-93-6415-20",
+ "6g-95-6425-320",
+ "6g-97-6435-20",
+ "6g-99-6445-40",
+ "6g-101-6455-20",
+ "6g-103-6465-80",
+ "6g-105-6475-20",
+ "6g-107-6485-40",
+ "6g-109-6495-20",
+ "6g-111-6505-160",
+ "6g-113-6515-20",
+ "6g-115-6525-40",
+ "6g-117-6535-20",
+ "6g-119-6545-80",
+ "6g-121-6555-20",
+ "6g-123-6565-40",
+ "6g-125-6575-20",
+ "6g-129-6595-20",
+ "6g-131-6605-40",
+ "6g-133-6615-20",
+ "6g-135-6625-80",
+ "6g-137-6635-20",
+ "6g-139-6645-40",
+ "6g-141-6655-20",
+ "6g-143-6665-160",
+ "6g-145-6675-20",
+ "6g-147-6685-40",
+ "6g-149-6695-20",
+ "6g-151-6705-80",
+ "6g-153-6715-20",
+ "6g-155-6725-40",
+ "6g-157-6735-20",
+ "6g-159-6745-320",
+ "6g-161-6755-20",
+ "6g-163-6765-40",
+ "6g-165-6775-20",
+ "6g-167-6785-80",
+ "6g-169-6795-20",
+ "6g-171-6805-40",
+ "6g-173-6815-20",
+ "6g-175-6825-160",
+ "6g-177-6835-20",
+ "6g-179-6845-40",
+ "6g-181-6855-20",
+ "6g-183-6865-80",
+ "6g-185-6875-20",
+ "6g-187-6885-40",
+ "6g-189-6895-20",
+ "6g-193-6915-20",
+ "6g-195-6925-40",
+ "6g-197-6935-20",
+ "6g-199-6945-80",
+ "6g-201-6955-20",
+ "6g-203-6965-40",
+ "6g-205-6975-20",
+ "6g-207-6985-160",
+ "6g-209-6995-20",
+ "6g-211-7005-40",
+ "6g-213-7015-20",
+ "6g-215-7025-80",
+ "6g-217-7035-20",
+ "6g-219-7045-40",
+ "6g-221-7055-20",
+ "6g-225-7075-20",
+ "6g-227-7085-40",
+ "6g-229-7095-20",
+ "6g-233-7115-20",
+ "60g-1-58320-2160",
+ "60g-2-60480-2160",
+ "60g-3-62640-2160",
+ "60g-4-64800-2160",
+ "60g-5-66960-2160",
+ "60g-6-69120-2160",
+ "60g-9-59400-4320",
+ "60g-10-61560-4320",
+ "60g-11-63720-4320",
+ "60g-12-65880-4320",
+ "60g-13-68040-4320",
+ "60g-17-60480-6480",
+ "60g-18-62640-6480",
+ "60g-19-64800-6480",
+ "60g-20-66960-6480",
+ "60g-25-61560-6480",
+ "60g-26-63720-6480",
+ "60g-27-65880-6480",
+ ""
+ ],
+ "type": "string",
+ "description": "* `2.4g-1-2412-22` - 1 (2412 MHz)\n* `2.4g-2-2417-22` - 2 (2417 MHz)\n* `2.4g-3-2422-22` - 3 (2422 MHz)\n* `2.4g-4-2427-22` - 4 (2427 MHz)\n* `2.4g-5-2432-22` - 5 (2432 MHz)\n* `2.4g-6-2437-22` - 6 (2437 MHz)\n* `2.4g-7-2442-22` - 7 (2442 MHz)\n* `2.4g-8-2447-22` - 8 (2447 MHz)\n* `2.4g-9-2452-22` - 9 (2452 MHz)\n* `2.4g-10-2457-22` - 10 (2457 MHz)\n* `2.4g-11-2462-22` - 11 (2462 MHz)\n* `2.4g-12-2467-22` - 12 (2467 MHz)\n* `2.4g-13-2472-22` - 13 (2472 MHz)\n* `5g-32-5160-20` - 32 (5160/20 MHz)\n* `5g-34-5170-40` - 34 (5170/40 MHz)\n* `5g-36-5180-20` - 36 (5180/20 MHz)\n* `5g-38-5190-40` - 38 (5190/40 MHz)\n* `5g-40-5200-20` - 40 (5200/20 MHz)\n* `5g-42-5210-80` - 42 (5210/80 MHz)\n* `5g-44-5220-20` - 44 (5220/20 MHz)\n* `5g-46-5230-40` - 46 (5230/40 MHz)\n* `5g-48-5240-20` - 48 (5240/20 MHz)\n* `5g-50-5250-160` - 50 (5250/160 MHz)\n* `5g-52-5260-20` - 52 (5260/20 MHz)\n* `5g-54-5270-40` - 54 (5270/40 MHz)\n* `5g-56-5280-20` - 56 (5280/20 MHz)\n* `5g-58-5290-80` - 58 (5290/80 MHz)\n* `5g-60-5300-20` - 60 (5300/20 MHz)\n* `5g-62-5310-40` - 62 (5310/40 MHz)\n* `5g-64-5320-20` - 64 (5320/20 MHz)\n* `5g-100-5500-20` - 100 (5500/20 MHz)\n* `5g-102-5510-40` - 102 (5510/40 MHz)\n* `5g-104-5520-20` - 104 (5520/20 MHz)\n* `5g-106-5530-80` - 106 (5530/80 MHz)\n* `5g-108-5540-20` - 108 (5540/20 MHz)\n* `5g-110-5550-40` - 110 (5550/40 MHz)\n* `5g-112-5560-20` - 112 (5560/20 MHz)\n* `5g-114-5570-160` - 114 (5570/160 MHz)\n* `5g-116-5580-20` - 116 (5580/20 MHz)\n* `5g-118-5590-40` - 118 (5590/40 MHz)\n* `5g-120-5600-20` - 120 (5600/20 MHz)\n* `5g-122-5610-80` - 122 (5610/80 MHz)\n* `5g-124-5620-20` - 124 (5620/20 MHz)\n* `5g-126-5630-40` - 126 (5630/40 MHz)\n* `5g-128-5640-20` - 128 (5640/20 MHz)\n* `5g-132-5660-20` - 132 (5660/20 MHz)\n* `5g-134-5670-40` - 134 (5670/40 MHz)\n* `5g-136-5680-20` - 136 (5680/20 MHz)\n* `5g-138-5690-80` - 138 (5690/80 MHz)\n* `5g-140-5700-20` - 140 (5700/20 MHz)\n* `5g-142-5710-40` - 142 (5710/40 MHz)\n* `5g-144-5720-20` - 144 (5720/20 MHz)\n* `5g-149-5745-20` - 149 (5745/20 MHz)\n* `5g-151-5755-40` - 151 (5755/40 MHz)\n* `5g-153-5765-20` - 153 (5765/20 MHz)\n* `5g-155-5775-80` - 155 (5775/80 MHz)\n* `5g-157-5785-20` - 157 (5785/20 MHz)\n* `5g-159-5795-40` - 159 (5795/40 MHz)\n* `5g-161-5805-20` - 161 (5805/20 MHz)\n* `5g-163-5815-160` - 163 (5815/160 MHz)\n* `5g-165-5825-20` - 165 (5825/20 MHz)\n* `5g-167-5835-40` - 167 (5835/40 MHz)\n* `5g-169-5845-20` - 169 (5845/20 MHz)\n* `5g-171-5855-80` - 171 (5855/80 MHz)\n* `5g-173-5865-20` - 173 (5865/20 MHz)\n* `5g-175-5875-40` - 175 (5875/40 MHz)\n* `5g-177-5885-20` - 177 (5885/20 MHz)\n* `6g-1-5955-20` - 1 (5955/20 MHz)\n* `6g-3-5965-40` - 3 (5965/40 MHz)\n* `6g-5-5975-20` - 5 (5975/20 MHz)\n* `6g-7-5985-80` - 7 (5985/80 MHz)\n* `6g-9-5995-20` - 9 (5995/20 MHz)\n* `6g-11-6005-40` - 11 (6005/40 MHz)\n* `6g-13-6015-20` - 13 (6015/20 MHz)\n* `6g-15-6025-160` - 15 (6025/160 MHz)\n* `6g-17-6035-20` - 17 (6035/20 MHz)\n* `6g-19-6045-40` - 19 (6045/40 MHz)\n* `6g-21-6055-20` - 21 (6055/20 MHz)\n* `6g-23-6065-80` - 23 (6065/80 MHz)\n* `6g-25-6075-20` - 25 (6075/20 MHz)\n* `6g-27-6085-40` - 27 (6085/40 MHz)\n* `6g-29-6095-20` - 29 (6095/20 MHz)\n* `6g-31-6105-320` - 31 (6105/320 MHz)\n* `6g-33-6115-20` - 33 (6115/20 MHz)\n* `6g-35-6125-40` - 35 (6125/40 MHz)\n* `6g-37-6135-20` - 37 (6135/20 MHz)\n* `6g-39-6145-80` - 39 (6145/80 MHz)\n* `6g-41-6155-20` - 41 (6155/20 MHz)\n* `6g-43-6165-40` - 43 (6165/40 MHz)\n* `6g-45-6175-20` - 45 (6175/20 MHz)\n* `6g-47-6185-160` - 47 (6185/160 MHz)\n* `6g-49-6195-20` - 49 (6195/20 MHz)\n* `6g-51-6205-40` - 51 (6205/40 MHz)\n* `6g-53-6215-20` - 53 (6215/20 MHz)\n* `6g-55-6225-80` - 55 (6225/80 MHz)\n* `6g-57-6235-20` - 57 (6235/20 MHz)\n* `6g-59-6245-40` - 59 (6245/40 MHz)\n* `6g-61-6255-20` - 61 (6255/20 MHz)\n* `6g-65-6275-20` - 65 (6275/20 MHz)\n* `6g-67-6285-40` - 67 (6285/40 MHz)\n* `6g-69-6295-20` - 69 (6295/20 MHz)\n* `6g-71-6305-80` - 71 (6305/80 MHz)\n* `6g-73-6315-20` - 73 (6315/20 MHz)\n* `6g-75-6325-40` - 75 (6325/40 MHz)\n* `6g-77-6335-20` - 77 (6335/20 MHz)\n* `6g-79-6345-160` - 79 (6345/160 MHz)\n* `6g-81-6355-20` - 81 (6355/20 MHz)\n* `6g-83-6365-40` - 83 (6365/40 MHz)\n* `6g-85-6375-20` - 85 (6375/20 MHz)\n* `6g-87-6385-80` - 87 (6385/80 MHz)\n* `6g-89-6395-20` - 89 (6395/20 MHz)\n* `6g-91-6405-40` - 91 (6405/40 MHz)\n* `6g-93-6415-20` - 93 (6415/20 MHz)\n* `6g-95-6425-320` - 95 (6425/320 MHz)\n* `6g-97-6435-20` - 97 (6435/20 MHz)\n* `6g-99-6445-40` - 99 (6445/40 MHz)\n* `6g-101-6455-20` - 101 (6455/20 MHz)\n* `6g-103-6465-80` - 103 (6465/80 MHz)\n* `6g-105-6475-20` - 105 (6475/20 MHz)\n* `6g-107-6485-40` - 107 (6485/40 MHz)\n* `6g-109-6495-20` - 109 (6495/20 MHz)\n* `6g-111-6505-160` - 111 (6505/160 MHz)\n* `6g-113-6515-20` - 113 (6515/20 MHz)\n* `6g-115-6525-40` - 115 (6525/40 MHz)\n* `6g-117-6535-20` - 117 (6535/20 MHz)\n* `6g-119-6545-80` - 119 (6545/80 MHz)\n* `6g-121-6555-20` - 121 (6555/20 MHz)\n* `6g-123-6565-40` - 123 (6565/40 MHz)\n* `6g-125-6575-20` - 125 (6575/20 MHz)\n* `6g-129-6595-20` - 129 (6595/20 MHz)\n* `6g-131-6605-40` - 131 (6605/40 MHz)\n* `6g-133-6615-20` - 133 (6615/20 MHz)\n* `6g-135-6625-80` - 135 (6625/80 MHz)\n* `6g-137-6635-20` - 137 (6635/20 MHz)\n* `6g-139-6645-40` - 139 (6645/40 MHz)\n* `6g-141-6655-20` - 141 (6655/20 MHz)\n* `6g-143-6665-160` - 143 (6665/160 MHz)\n* `6g-145-6675-20` - 145 (6675/20 MHz)\n* `6g-147-6685-40` - 147 (6685/40 MHz)\n* `6g-149-6695-20` - 149 (6695/20 MHz)\n* `6g-151-6705-80` - 151 (6705/80 MHz)\n* `6g-153-6715-20` - 153 (6715/20 MHz)\n* `6g-155-6725-40` - 155 (6725/40 MHz)\n* `6g-157-6735-20` - 157 (6735/20 MHz)\n* `6g-159-6745-320` - 159 (6745/320 MHz)\n* `6g-161-6755-20` - 161 (6755/20 MHz)\n* `6g-163-6765-40` - 163 (6765/40 MHz)\n* `6g-165-6775-20` - 165 (6775/20 MHz)\n* `6g-167-6785-80` - 167 (6785/80 MHz)\n* `6g-169-6795-20` - 169 (6795/20 MHz)\n* `6g-171-6805-40` - 171 (6805/40 MHz)\n* `6g-173-6815-20` - 173 (6815/20 MHz)\n* `6g-175-6825-160` - 175 (6825/160 MHz)\n* `6g-177-6835-20` - 177 (6835/20 MHz)\n* `6g-179-6845-40` - 179 (6845/40 MHz)\n* `6g-181-6855-20` - 181 (6855/20 MHz)\n* `6g-183-6865-80` - 183 (6865/80 MHz)\n* `6g-185-6875-20` - 185 (6875/20 MHz)\n* `6g-187-6885-40` - 187 (6885/40 MHz)\n* `6g-189-6895-20` - 189 (6895/20 MHz)\n* `6g-193-6915-20` - 193 (6915/20 MHz)\n* `6g-195-6925-40` - 195 (6925/40 MHz)\n* `6g-197-6935-20` - 197 (6935/20 MHz)\n* `6g-199-6945-80` - 199 (6945/80 MHz)\n* `6g-201-6955-20` - 201 (6955/20 MHz)\n* `6g-203-6965-40` - 203 (6965/40 MHz)\n* `6g-205-6975-20` - 205 (6975/20 MHz)\n* `6g-207-6985-160` - 207 (6985/160 MHz)\n* `6g-209-6995-20` - 209 (6995/20 MHz)\n* `6g-211-7005-40` - 211 (7005/40 MHz)\n* `6g-213-7015-20` - 213 (7015/20 MHz)\n* `6g-215-7025-80` - 215 (7025/80 MHz)\n* `6g-217-7035-20` - 217 (7035/20 MHz)\n* `6g-219-7045-40` - 219 (7045/40 MHz)\n* `6g-221-7055-20` - 221 (7055/20 MHz)\n* `6g-225-7075-20` - 225 (7075/20 MHz)\n* `6g-227-7085-40` - 227 (7085/40 MHz)\n* `6g-229-7095-20` - 229 (7095/20 MHz)\n* `6g-233-7115-20` - 233 (7115/20 MHz)\n* `60g-1-58320-2160` - 1 (58.32/2.16 GHz)\n* `60g-2-60480-2160` - 2 (60.48/2.16 GHz)\n* `60g-3-62640-2160` - 3 (62.64/2.16 GHz)\n* `60g-4-64800-2160` - 4 (64.80/2.16 GHz)\n* `60g-5-66960-2160` - 5 (66.96/2.16 GHz)\n* `60g-6-69120-2160` - 6 (69.12/2.16 GHz)\n* `60g-9-59400-4320` - 9 (59.40/4.32 GHz)\n* `60g-10-61560-4320` - 10 (61.56/4.32 GHz)\n* `60g-11-63720-4320` - 11 (63.72/4.32 GHz)\n* `60g-12-65880-4320` - 12 (65.88/4.32 GHz)\n* `60g-13-68040-4320` - 13 (68.04/4.32 GHz)\n* `60g-17-60480-6480` - 17 (60.48/6.48 GHz)\n* `60g-18-62640-6480` - 18 (62.64/6.48 GHz)\n* `60g-19-64800-6480` - 19 (64.80/6.48 GHz)\n* `60g-20-66960-6480` - 20 (66.96/6.48 GHz)\n* `60g-25-61560-6480` - 25 (61.56/8.64 GHz)\n* `60g-26-63720-6480` - 26 (63.72/8.64 GHz)\n* `60g-27-65880-6480` - 27 (65.88/8.64 GHz)",
+ "x-spec-enum-id": "aac33cc237adc8f9"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "1 (2412 MHz)",
+ "2 (2417 MHz)",
+ "3 (2422 MHz)",
+ "4 (2427 MHz)",
+ "5 (2432 MHz)",
+ "6 (2437 MHz)",
+ "7 (2442 MHz)",
+ "8 (2447 MHz)",
+ "9 (2452 MHz)",
+ "10 (2457 MHz)",
+ "11 (2462 MHz)",
+ "12 (2467 MHz)",
+ "13 (2472 MHz)",
+ "32 (5160/20 MHz)",
+ "34 (5170/40 MHz)",
+ "36 (5180/20 MHz)",
+ "38 (5190/40 MHz)",
+ "40 (5200/20 MHz)",
+ "42 (5210/80 MHz)",
+ "44 (5220/20 MHz)",
+ "46 (5230/40 MHz)",
+ "48 (5240/20 MHz)",
+ "50 (5250/160 MHz)",
+ "52 (5260/20 MHz)",
+ "54 (5270/40 MHz)",
+ "56 (5280/20 MHz)",
+ "58 (5290/80 MHz)",
+ "60 (5300/20 MHz)",
+ "62 (5310/40 MHz)",
+ "64 (5320/20 MHz)",
+ "100 (5500/20 MHz)",
+ "102 (5510/40 MHz)",
+ "104 (5520/20 MHz)",
+ "106 (5530/80 MHz)",
+ "108 (5540/20 MHz)",
+ "110 (5550/40 MHz)",
+ "112 (5560/20 MHz)",
+ "114 (5570/160 MHz)",
+ "116 (5580/20 MHz)",
+ "118 (5590/40 MHz)",
+ "120 (5600/20 MHz)",
+ "122 (5610/80 MHz)",
+ "124 (5620/20 MHz)",
+ "126 (5630/40 MHz)",
+ "128 (5640/20 MHz)",
+ "132 (5660/20 MHz)",
+ "134 (5670/40 MHz)",
+ "136 (5680/20 MHz)",
+ "138 (5690/80 MHz)",
+ "140 (5700/20 MHz)",
+ "142 (5710/40 MHz)",
+ "144 (5720/20 MHz)",
+ "149 (5745/20 MHz)",
+ "151 (5755/40 MHz)",
+ "153 (5765/20 MHz)",
+ "155 (5775/80 MHz)",
+ "157 (5785/20 MHz)",
+ "159 (5795/40 MHz)",
+ "161 (5805/20 MHz)",
+ "163 (5815/160 MHz)",
+ "165 (5825/20 MHz)",
+ "167 (5835/40 MHz)",
+ "169 (5845/20 MHz)",
+ "171 (5855/80 MHz)",
+ "173 (5865/20 MHz)",
+ "175 (5875/40 MHz)",
+ "177 (5885/20 MHz)",
+ "1 (5955/20 MHz)",
+ "3 (5965/40 MHz)",
+ "5 (5975/20 MHz)",
+ "7 (5985/80 MHz)",
+ "9 (5995/20 MHz)",
+ "11 (6005/40 MHz)",
+ "13 (6015/20 MHz)",
+ "15 (6025/160 MHz)",
+ "17 (6035/20 MHz)",
+ "19 (6045/40 MHz)",
+ "21 (6055/20 MHz)",
+ "23 (6065/80 MHz)",
+ "25 (6075/20 MHz)",
+ "27 (6085/40 MHz)",
+ "29 (6095/20 MHz)",
+ "31 (6105/320 MHz)",
+ "33 (6115/20 MHz)",
+ "35 (6125/40 MHz)",
+ "37 (6135/20 MHz)",
+ "39 (6145/80 MHz)",
+ "41 (6155/20 MHz)",
+ "43 (6165/40 MHz)",
+ "45 (6175/20 MHz)",
+ "47 (6185/160 MHz)",
+ "49 (6195/20 MHz)",
+ "51 (6205/40 MHz)",
+ "53 (6215/20 MHz)",
+ "55 (6225/80 MHz)",
+ "57 (6235/20 MHz)",
+ "59 (6245/40 MHz)",
+ "61 (6255/20 MHz)",
+ "65 (6275/20 MHz)",
+ "67 (6285/40 MHz)",
+ "69 (6295/20 MHz)",
+ "71 (6305/80 MHz)",
+ "73 (6315/20 MHz)",
+ "75 (6325/40 MHz)",
+ "77 (6335/20 MHz)",
+ "79 (6345/160 MHz)",
+ "81 (6355/20 MHz)",
+ "83 (6365/40 MHz)",
+ "85 (6375/20 MHz)",
+ "87 (6385/80 MHz)",
+ "89 (6395/20 MHz)",
+ "91 (6405/40 MHz)",
+ "93 (6415/20 MHz)",
+ "95 (6425/320 MHz)",
+ "97 (6435/20 MHz)",
+ "99 (6445/40 MHz)",
+ "101 (6455/20 MHz)",
+ "103 (6465/80 MHz)",
+ "105 (6475/20 MHz)",
+ "107 (6485/40 MHz)",
+ "109 (6495/20 MHz)",
+ "111 (6505/160 MHz)",
+ "113 (6515/20 MHz)",
+ "115 (6525/40 MHz)",
+ "117 (6535/20 MHz)",
+ "119 (6545/80 MHz)",
+ "121 (6555/20 MHz)",
+ "123 (6565/40 MHz)",
+ "125 (6575/20 MHz)",
+ "129 (6595/20 MHz)",
+ "131 (6605/40 MHz)",
+ "133 (6615/20 MHz)",
+ "135 (6625/80 MHz)",
+ "137 (6635/20 MHz)",
+ "139 (6645/40 MHz)",
+ "141 (6655/20 MHz)",
+ "143 (6665/160 MHz)",
+ "145 (6675/20 MHz)",
+ "147 (6685/40 MHz)",
+ "149 (6695/20 MHz)",
+ "151 (6705/80 MHz)",
+ "153 (6715/20 MHz)",
+ "155 (6725/40 MHz)",
+ "157 (6735/20 MHz)",
+ "159 (6745/320 MHz)",
+ "161 (6755/20 MHz)",
+ "163 (6765/40 MHz)",
+ "165 (6775/20 MHz)",
+ "167 (6785/80 MHz)",
+ "169 (6795/20 MHz)",
+ "171 (6805/40 MHz)",
+ "173 (6815/20 MHz)",
+ "175 (6825/160 MHz)",
+ "177 (6835/20 MHz)",
+ "179 (6845/40 MHz)",
+ "181 (6855/20 MHz)",
+ "183 (6865/80 MHz)",
+ "185 (6875/20 MHz)",
+ "187 (6885/40 MHz)",
+ "189 (6895/20 MHz)",
+ "193 (6915/20 MHz)",
+ "195 (6925/40 MHz)",
+ "197 (6935/20 MHz)",
+ "199 (6945/80 MHz)",
+ "201 (6955/20 MHz)",
+ "203 (6965/40 MHz)",
+ "205 (6975/20 MHz)",
+ "207 (6985/160 MHz)",
+ "209 (6995/20 MHz)",
+ "211 (7005/40 MHz)",
+ "213 (7015/20 MHz)",
+ "215 (7025/80 MHz)",
+ "217 (7035/20 MHz)",
+ "219 (7045/40 MHz)",
+ "221 (7055/20 MHz)",
+ "225 (7075/20 MHz)",
+ "227 (7085/40 MHz)",
+ "229 (7095/20 MHz)",
+ "233 (7115/20 MHz)",
+ "1 (58.32/2.16 GHz)",
+ "2 (60.48/2.16 GHz)",
+ "3 (62.64/2.16 GHz)",
+ "4 (64.80/2.16 GHz)",
+ "5 (66.96/2.16 GHz)",
+ "6 (69.12/2.16 GHz)",
+ "9 (59.40/4.32 GHz)",
+ "10 (61.56/4.32 GHz)",
+ "11 (63.72/4.32 GHz)",
+ "12 (65.88/4.32 GHz)",
+ "13 (68.04/4.32 GHz)",
+ "17 (60.48/6.48 GHz)",
+ "18 (62.64/6.48 GHz)",
+ "19 (64.80/6.48 GHz)",
+ "20 (66.96/6.48 GHz)",
+ "25 (61.56/8.64 GHz)",
+ "26 (63.72/8.64 GHz)",
+ "27 (65.88/8.64 GHz)"
+ ]
+ }
+ }
+ },
+ "poe_mode": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "pd",
+ "pse",
+ ""
+ ],
+ "type": "string",
+ "description": "* `pd` - PD\n* `pse` - PSE",
+ "x-spec-enum-id": "2f2fe6dcdc7772bd"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "PD",
+ "PSE"
+ ]
+ }
+ }
+ },
+ "poe_type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "type1-ieee802.3af",
+ "type2-ieee802.3at",
+ "type3-ieee802.3bt",
+ "type4-ieee802.3bt",
+ "passive-24v-2pair",
+ "passive-24v-4pair",
+ "passive-48v-2pair",
+ "passive-48v-4pair",
+ ""
+ ],
+ "type": "string",
+ "description": "* `type1-ieee802.3af` - 802.3af (Type 1)\n* `type2-ieee802.3at` - 802.3at (Type 2)\n* `type3-ieee802.3bt` - 802.3bt (Type 3)\n* `type4-ieee802.3bt` - 802.3bt (Type 4)\n* `passive-24v-2pair` - Passive 24V (2-pair)\n* `passive-24v-4pair` - Passive 24V (4-pair)\n* `passive-48v-2pair` - Passive 48V (2-pair)\n* `passive-48v-4pair` - Passive 48V (4-pair)",
+ "x-spec-enum-id": "74bd3be4012f6da9"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "802.3af (Type 1)",
+ "802.3at (Type 2)",
+ "802.3bt (Type 3)",
+ "802.3bt (Type 4)",
+ "Passive 24V (2-pair)",
+ "Passive 24V (4-pair)",
+ "Passive 48V (2-pair)",
+ "Passive 48V (4-pair)"
+ ]
+ }
+ }
+ },
+ "rf_channel_frequency": {
+ "type": "number",
+ "format": "double",
+ "maximum": 100000,
+ "minimum": -100000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "title": "Channel frequency (MHz)",
+ "description": "Populated by selected channel (if set)"
+ },
+ "rf_channel_width": {
+ "type": "number",
+ "format": "double",
+ "maximum": 10000,
+ "minimum": -10000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "title": "Channel width (MHz)",
+ "description": "Populated by selected channel (if set)"
+ },
+ "tx_power": {
+ "type": "integer",
+ "maximum": 127,
+ "minimum": -40,
+ "nullable": true,
+ "title": "Transmit power (dBm)"
+ },
+ "untagged_vlan": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLAN"
+ }
+ ],
+ "nullable": true
+ },
+ "tagged_vlans": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VLAN"
+ }
+ },
+ "qinq_svlan": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLAN"
+ }
+ ],
+ "nullable": true
+ },
+ "vlan_translation_policy": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANTranslationPolicy"
+ }
+ ],
+ "nullable": true
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "cable": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefCable"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "cable_end": {
+ "type": "string",
+ "readOnly": true
+ },
+ "wireless_link": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedWirelessLink"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "link_peers": {
+ "type": "array",
+ "items": {},
+ "readOnly": true
+ },
+ "link_peers_type": {
+ "type": "string",
+ "description": "Return the type of the peer link terminations, or None.",
+ "readOnly": true,
+ "nullable": true
+ },
+ "wireless_lans": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/WirelessLAN"
+ }
+ },
+ "vrf": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRF"
+ }
+ ],
+ "nullable": true
+ },
+ "l2vpn_termination": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefL2VPNTermination"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "connected_endpoints": {
+ "type": "array",
+ "items": {},
+ "nullable": true,
+ "readOnly": true
+ },
+ "connected_endpoints_type": {
+ "type": "string",
+ "readOnly": true,
+ "nullable": true
+ },
+ "connected_endpoints_reachable": {
+ "type": "boolean",
+ "readOnly": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "count_ipaddresses": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "count_fhrp_groups": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "_occupied": {
+ "type": "boolean",
+ "readOnly": true,
+ "title": " occupied"
+ }
+ },
+ "required": [
+ "_occupied",
+ "cable",
+ "cable_end",
+ "connected_endpoints",
+ "connected_endpoints_reachable",
+ "connected_endpoints_type",
+ "count_fhrp_groups",
+ "count_ipaddresses",
+ "created",
+ "device",
+ "display",
+ "display_url",
+ "id",
+ "l2vpn_termination",
+ "last_updated",
+ "link_peers",
+ "link_peers_type",
+ "mac_address",
+ "mac_addresses",
+ "name",
+ "type",
+ "url",
+ "wireless_link"
+ ]
+ },
+ "InterfaceRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "vdcs": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "virtual",
+ "bridge",
+ "lag",
+ "100base-fx",
+ "100base-lfx",
+ "100base-tx",
+ "100base-t1",
+ "1000base-t",
+ "1000base-sx",
+ "1000base-lx",
+ "1000base-tx",
+ "2.5gbase-t",
+ "5gbase-t",
+ "10gbase-t",
+ "10gbase-cx4",
+ "100base-x-sfp",
+ "1000base-x-gbic",
+ "1000base-x-sfp",
+ "10gbase-x-sfpp",
+ "10gbase-x-xfp",
+ "10gbase-x-xenpak",
+ "10gbase-x-x2",
+ "25gbase-x-sfp28",
+ "50gbase-x-sfp56",
+ "40gbase-x-qsfpp",
+ "50gbase-x-sfp28",
+ "100gbase-x-cfp",
+ "100gbase-x-cfp2",
+ "200gbase-x-cfp2",
+ "400gbase-x-cfp2",
+ "100gbase-x-cfp4",
+ "100gbase-x-cxp",
+ "100gbase-x-cpak",
+ "100gbase-x-dsfp",
+ "100gbase-x-sfpdd",
+ "100gbase-x-qsfp28",
+ "100gbase-x-qsfpdd",
+ "200gbase-x-qsfp56",
+ "200gbase-x-qsfpdd",
+ "400gbase-x-qsfp112",
+ "400gbase-x-qsfpdd",
+ "400gbase-x-osfp",
+ "400gbase-x-osfp-rhs",
+ "400gbase-x-cdfp",
+ "400gbase-x-cfp8",
+ "800gbase-x-qsfpdd",
+ "800gbase-x-osfp",
+ "1000base-kx",
+ "2.5gbase-kx",
+ "5gbase-kr",
+ "10gbase-kr",
+ "10gbase-kx4",
+ "25gbase-kr",
+ "40gbase-kr4",
+ "50gbase-kr",
+ "100gbase-kp4",
+ "100gbase-kr2",
+ "100gbase-kr4",
+ "ieee802.11a",
+ "ieee802.11g",
+ "ieee802.11n",
+ "ieee802.11ac",
+ "ieee802.11ad",
+ "ieee802.11ax",
+ "ieee802.11ay",
+ "ieee802.11be",
+ "ieee802.15.1",
+ "ieee802.15.4",
+ "other-wireless",
+ "gsm",
+ "cdma",
+ "lte",
+ "4g",
+ "5g",
+ "sonet-oc3",
+ "sonet-oc12",
+ "sonet-oc48",
+ "sonet-oc192",
+ "sonet-oc768",
+ "sonet-oc1920",
+ "sonet-oc3840",
+ "1gfc-sfp",
+ "2gfc-sfp",
+ "4gfc-sfp",
+ "8gfc-sfpp",
+ "16gfc-sfpp",
+ "32gfc-sfp28",
+ "32gfc-sfpp",
+ "64gfc-qsfpp",
+ "64gfc-sfpdd",
+ "64gfc-sfpp",
+ "128gfc-qsfp28",
+ "infiniband-sdr",
+ "infiniband-ddr",
+ "infiniband-qdr",
+ "infiniband-fdr10",
+ "infiniband-fdr",
+ "infiniband-edr",
+ "infiniband-hdr",
+ "infiniband-ndr",
+ "infiniband-xdr",
+ "t1",
+ "e1",
+ "t3",
+ "e3",
+ "xdsl",
+ "docsis",
+ "moca",
+ "bpon",
+ "epon",
+ "10g-epon",
+ "gpon",
+ "xg-pon",
+ "xgs-pon",
+ "ng-pon2",
+ "25g-pon",
+ "50g-pon",
+ "cisco-stackwise",
+ "cisco-stackwise-plus",
+ "cisco-flexstack",
+ "cisco-flexstack-plus",
+ "cisco-stackwise-80",
+ "cisco-stackwise-160",
+ "cisco-stackwise-320",
+ "cisco-stackwise-480",
+ "cisco-stackwise-1t",
+ "juniper-vcp",
+ "extreme-summitstack",
+ "extreme-summitstack-128",
+ "extreme-summitstack-256",
+ "extreme-summitstack-512",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `virtual` - Virtual\n* `bridge` - Bridge\n* `lag` - Link Aggregation Group (LAG)\n* `100base-fx` - 100BASE-FX (10/100ME FIBER)\n* `100base-lfx` - 100BASE-LFX (10/100ME FIBER)\n* `100base-tx` - 100BASE-TX (10/100ME)\n* `100base-t1` - 100BASE-T1 (10/100ME Single Pair)\n* `1000base-t` - 1000BASE-T (1GE)\n* `1000base-sx` - 1000BASE-SX (1GE)\n* `1000base-lx` - 1000BASE-LX (1GE)\n* `1000base-tx` - 1000BASE-TX (1GE)\n* `2.5gbase-t` - 2.5GBASE-T (2.5GE)\n* `5gbase-t` - 5GBASE-T (5GE)\n* `10gbase-t` - 10GBASE-T (10GE)\n* `10gbase-cx4` - 10GBASE-CX4 (10GE)\n* `100base-x-sfp` - SFP (100ME)\n* `1000base-x-gbic` - GBIC (1GE)\n* `1000base-x-sfp` - SFP (1GE)\n* `10gbase-x-sfpp` - SFP+ (10GE)\n* `10gbase-x-xfp` - XFP (10GE)\n* `10gbase-x-xenpak` - XENPAK (10GE)\n* `10gbase-x-x2` - X2 (10GE)\n* `25gbase-x-sfp28` - SFP28 (25GE)\n* `50gbase-x-sfp56` - SFP56 (50GE)\n* `40gbase-x-qsfpp` - QSFP+ (40GE)\n* `50gbase-x-sfp28` - QSFP28 (50GE)\n* `100gbase-x-cfp` - CFP (100GE)\n* `100gbase-x-cfp2` - CFP2 (100GE)\n* `200gbase-x-cfp2` - CFP2 (200GE)\n* `400gbase-x-cfp2` - CFP2 (400GE)\n* `100gbase-x-cfp4` - CFP4 (100GE)\n* `100gbase-x-cxp` - CXP (100GE)\n* `100gbase-x-cpak` - Cisco CPAK (100GE)\n* `100gbase-x-dsfp` - DSFP (100GE)\n* `100gbase-x-sfpdd` - SFP-DD (100GE)\n* `100gbase-x-qsfp28` - QSFP28 (100GE)\n* `100gbase-x-qsfpdd` - QSFP-DD (100GE)\n* `200gbase-x-qsfp56` - QSFP56 (200GE)\n* `200gbase-x-qsfpdd` - QSFP-DD (200GE)\n* `400gbase-x-qsfp112` - QSFP112 (400GE)\n* `400gbase-x-qsfpdd` - QSFP-DD (400GE)\n* `400gbase-x-osfp` - OSFP (400GE)\n* `400gbase-x-osfp-rhs` - OSFP-RHS (400GE)\n* `400gbase-x-cdfp` - CDFP (400GE)\n* `400gbase-x-cfp8` - CPF8 (400GE)\n* `800gbase-x-qsfpdd` - QSFP-DD (800GE)\n* `800gbase-x-osfp` - OSFP (800GE)\n* `1000base-kx` - 1000BASE-KX (1GE)\n* `2.5gbase-kx` - 2.5GBASE-KX (2.5GE)\n* `5gbase-kr` - 5GBASE-KR (5GE)\n* `10gbase-kr` - 10GBASE-KR (10GE)\n* `10gbase-kx4` - 10GBASE-KX4 (10GE)\n* `25gbase-kr` - 25GBASE-KR (25GE)\n* `40gbase-kr4` - 40GBASE-KR4 (40GE)\n* `50gbase-kr` - 50GBASE-KR (50GE)\n* `100gbase-kp4` - 100GBASE-KP4 (100GE)\n* `100gbase-kr2` - 100GBASE-KR2 (100GE)\n* `100gbase-kr4` - 100GBASE-KR4 (100GE)\n* `ieee802.11a` - IEEE 802.11a\n* `ieee802.11g` - IEEE 802.11b/g\n* `ieee802.11n` - IEEE 802.11n\n* `ieee802.11ac` - IEEE 802.11ac\n* `ieee802.11ad` - IEEE 802.11ad\n* `ieee802.11ax` - IEEE 802.11ax\n* `ieee802.11ay` - IEEE 802.11ay\n* `ieee802.11be` - IEEE 802.11be\n* `ieee802.15.1` - IEEE 802.15.1 (Bluetooth)\n* `ieee802.15.4` - IEEE 802.15.4 (LR-WPAN)\n* `other-wireless` - Other (Wireless)\n* `gsm` - GSM\n* `cdma` - CDMA\n* `lte` - LTE\n* `4g` - 4G\n* `5g` - 5G\n* `sonet-oc3` - OC-3/STM-1\n* `sonet-oc12` - OC-12/STM-4\n* `sonet-oc48` - OC-48/STM-16\n* `sonet-oc192` - OC-192/STM-64\n* `sonet-oc768` - OC-768/STM-256\n* `sonet-oc1920` - OC-1920/STM-640\n* `sonet-oc3840` - OC-3840/STM-1234\n* `1gfc-sfp` - SFP (1GFC)\n* `2gfc-sfp` - SFP (2GFC)\n* `4gfc-sfp` - SFP (4GFC)\n* `8gfc-sfpp` - SFP+ (8GFC)\n* `16gfc-sfpp` - SFP+ (16GFC)\n* `32gfc-sfp28` - SFP28 (32GFC)\n* `32gfc-sfpp` - SFP+ (32GFC)\n* `64gfc-qsfpp` - QSFP+ (64GFC)\n* `64gfc-sfpdd` - SFP-DD (64GFC)\n* `64gfc-sfpp` - SFP+ (64GFC)\n* `128gfc-qsfp28` - QSFP28 (128GFC)\n* `infiniband-sdr` - SDR (2 Gbps)\n* `infiniband-ddr` - DDR (4 Gbps)\n* `infiniband-qdr` - QDR (8 Gbps)\n* `infiniband-fdr10` - FDR10 (10 Gbps)\n* `infiniband-fdr` - FDR (13.5 Gbps)\n* `infiniband-edr` - EDR (25 Gbps)\n* `infiniband-hdr` - HDR (50 Gbps)\n* `infiniband-ndr` - NDR (100 Gbps)\n* `infiniband-xdr` - XDR (250 Gbps)\n* `t1` - T1 (1.544 Mbps)\n* `e1` - E1 (2.048 Mbps)\n* `t3` - T3 (45 Mbps)\n* `e3` - E3 (34 Mbps)\n* `xdsl` - xDSL\n* `docsis` - DOCSIS\n* `moca` - MoCA\n* `bpon` - BPON (622 Mbps / 155 Mbps)\n* `epon` - EPON (1 Gbps)\n* `10g-epon` - 10G-EPON (10 Gbps)\n* `gpon` - GPON (2.5 Gbps / 1.25 Gbps)\n* `xg-pon` - XG-PON (10 Gbps / 2.5 Gbps)\n* `xgs-pon` - XGS-PON (10 Gbps)\n* `ng-pon2` - NG-PON2 (TWDM-PON) (4x10 Gbps)\n* `25g-pon` - 25G-PON (25 Gbps)\n* `50g-pon` - 50G-PON (50 Gbps)\n* `cisco-stackwise` - Cisco StackWise\n* `cisco-stackwise-plus` - Cisco StackWise Plus\n* `cisco-flexstack` - Cisco FlexStack\n* `cisco-flexstack-plus` - Cisco FlexStack Plus\n* `cisco-stackwise-80` - Cisco StackWise-80\n* `cisco-stackwise-160` - Cisco StackWise-160\n* `cisco-stackwise-320` - Cisco StackWise-320\n* `cisco-stackwise-480` - Cisco StackWise-480\n* `cisco-stackwise-1t` - Cisco StackWise-1T\n* `juniper-vcp` - Juniper VCP\n* `extreme-summitstack` - Extreme SummitStack\n* `extreme-summitstack-128` - Extreme SummitStack-128\n* `extreme-summitstack-256` - Extreme SummitStack-256\n* `extreme-summitstack-512` - Extreme SummitStack-512\n* `other` - Other",
+ "x-spec-enum-id": "8c4c5e112f77a383"
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedInterfaceRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "bridge": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedInterfaceRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "lag": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedInterfaceRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "mtu": {
+ "type": "integer",
+ "maximum": 65536,
+ "minimum": 1,
+ "nullable": true
+ },
+ "primary_mac_address": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefMACAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "speed": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Speed (Kbps)"
+ },
+ "duplex": {
+ "enum": [
+ "half",
+ "full",
+ "auto",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `half` - Half\n* `full` - Full\n* `auto` - Auto",
+ "x-spec-enum-id": "47eab9b1a65a1e21",
+ "nullable": true
+ },
+ "wwn": {
+ "type": "string",
+ "nullable": true
+ },
+ "mgmt_only": {
+ "type": "boolean",
+ "title": "Management only",
+ "description": "This interface is used only for out-of-band management"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mode": {
+ "enum": [
+ "access",
+ "tagged",
+ "tagged-all",
+ "q-in-q",
+ ""
+ ],
+ "type": "string",
+ "description": "* `access` - Access\n* `tagged` - Tagged\n* `tagged-all` - Tagged (All)\n* `q-in-q` - Q-in-Q (802.1ad)",
+ "x-spec-enum-id": "b6fe48fe21dbf01d"
+ },
+ "rf_role": {
+ "enum": [
+ "ap",
+ "station",
+ ""
+ ],
+ "type": "string",
+ "description": "* `ap` - Access point\n* `station` - Station",
+ "x-spec-enum-id": "d2772dbea88b0fb1"
+ },
+ "rf_channel": {
+ "enum": [
+ "2.4g-1-2412-22",
+ "2.4g-2-2417-22",
+ "2.4g-3-2422-22",
+ "2.4g-4-2427-22",
+ "2.4g-5-2432-22",
+ "2.4g-6-2437-22",
+ "2.4g-7-2442-22",
+ "2.4g-8-2447-22",
+ "2.4g-9-2452-22",
+ "2.4g-10-2457-22",
+ "2.4g-11-2462-22",
+ "2.4g-12-2467-22",
+ "2.4g-13-2472-22",
+ "5g-32-5160-20",
+ "5g-34-5170-40",
+ "5g-36-5180-20",
+ "5g-38-5190-40",
+ "5g-40-5200-20",
+ "5g-42-5210-80",
+ "5g-44-5220-20",
+ "5g-46-5230-40",
+ "5g-48-5240-20",
+ "5g-50-5250-160",
+ "5g-52-5260-20",
+ "5g-54-5270-40",
+ "5g-56-5280-20",
+ "5g-58-5290-80",
+ "5g-60-5300-20",
+ "5g-62-5310-40",
+ "5g-64-5320-20",
+ "5g-100-5500-20",
+ "5g-102-5510-40",
+ "5g-104-5520-20",
+ "5g-106-5530-80",
+ "5g-108-5540-20",
+ "5g-110-5550-40",
+ "5g-112-5560-20",
+ "5g-114-5570-160",
+ "5g-116-5580-20",
+ "5g-118-5590-40",
+ "5g-120-5600-20",
+ "5g-122-5610-80",
+ "5g-124-5620-20",
+ "5g-126-5630-40",
+ "5g-128-5640-20",
+ "5g-132-5660-20",
+ "5g-134-5670-40",
+ "5g-136-5680-20",
+ "5g-138-5690-80",
+ "5g-140-5700-20",
+ "5g-142-5710-40",
+ "5g-144-5720-20",
+ "5g-149-5745-20",
+ "5g-151-5755-40",
+ "5g-153-5765-20",
+ "5g-155-5775-80",
+ "5g-157-5785-20",
+ "5g-159-5795-40",
+ "5g-161-5805-20",
+ "5g-163-5815-160",
+ "5g-165-5825-20",
+ "5g-167-5835-40",
+ "5g-169-5845-20",
+ "5g-171-5855-80",
+ "5g-173-5865-20",
+ "5g-175-5875-40",
+ "5g-177-5885-20",
+ "6g-1-5955-20",
+ "6g-3-5965-40",
+ "6g-5-5975-20",
+ "6g-7-5985-80",
+ "6g-9-5995-20",
+ "6g-11-6005-40",
+ "6g-13-6015-20",
+ "6g-15-6025-160",
+ "6g-17-6035-20",
+ "6g-19-6045-40",
+ "6g-21-6055-20",
+ "6g-23-6065-80",
+ "6g-25-6075-20",
+ "6g-27-6085-40",
+ "6g-29-6095-20",
+ "6g-31-6105-320",
+ "6g-33-6115-20",
+ "6g-35-6125-40",
+ "6g-37-6135-20",
+ "6g-39-6145-80",
+ "6g-41-6155-20",
+ "6g-43-6165-40",
+ "6g-45-6175-20",
+ "6g-47-6185-160",
+ "6g-49-6195-20",
+ "6g-51-6205-40",
+ "6g-53-6215-20",
+ "6g-55-6225-80",
+ "6g-57-6235-20",
+ "6g-59-6245-40",
+ "6g-61-6255-20",
+ "6g-65-6275-20",
+ "6g-67-6285-40",
+ "6g-69-6295-20",
+ "6g-71-6305-80",
+ "6g-73-6315-20",
+ "6g-75-6325-40",
+ "6g-77-6335-20",
+ "6g-79-6345-160",
+ "6g-81-6355-20",
+ "6g-83-6365-40",
+ "6g-85-6375-20",
+ "6g-87-6385-80",
+ "6g-89-6395-20",
+ "6g-91-6405-40",
+ "6g-93-6415-20",
+ "6g-95-6425-320",
+ "6g-97-6435-20",
+ "6g-99-6445-40",
+ "6g-101-6455-20",
+ "6g-103-6465-80",
+ "6g-105-6475-20",
+ "6g-107-6485-40",
+ "6g-109-6495-20",
+ "6g-111-6505-160",
+ "6g-113-6515-20",
+ "6g-115-6525-40",
+ "6g-117-6535-20",
+ "6g-119-6545-80",
+ "6g-121-6555-20",
+ "6g-123-6565-40",
+ "6g-125-6575-20",
+ "6g-129-6595-20",
+ "6g-131-6605-40",
+ "6g-133-6615-20",
+ "6g-135-6625-80",
+ "6g-137-6635-20",
+ "6g-139-6645-40",
+ "6g-141-6655-20",
+ "6g-143-6665-160",
+ "6g-145-6675-20",
+ "6g-147-6685-40",
+ "6g-149-6695-20",
+ "6g-151-6705-80",
+ "6g-153-6715-20",
+ "6g-155-6725-40",
+ "6g-157-6735-20",
+ "6g-159-6745-320",
+ "6g-161-6755-20",
+ "6g-163-6765-40",
+ "6g-165-6775-20",
+ "6g-167-6785-80",
+ "6g-169-6795-20",
+ "6g-171-6805-40",
+ "6g-173-6815-20",
+ "6g-175-6825-160",
+ "6g-177-6835-20",
+ "6g-179-6845-40",
+ "6g-181-6855-20",
+ "6g-183-6865-80",
+ "6g-185-6875-20",
+ "6g-187-6885-40",
+ "6g-189-6895-20",
+ "6g-193-6915-20",
+ "6g-195-6925-40",
+ "6g-197-6935-20",
+ "6g-199-6945-80",
+ "6g-201-6955-20",
+ "6g-203-6965-40",
+ "6g-205-6975-20",
+ "6g-207-6985-160",
+ "6g-209-6995-20",
+ "6g-211-7005-40",
+ "6g-213-7015-20",
+ "6g-215-7025-80",
+ "6g-217-7035-20",
+ "6g-219-7045-40",
+ "6g-221-7055-20",
+ "6g-225-7075-20",
+ "6g-227-7085-40",
+ "6g-229-7095-20",
+ "6g-233-7115-20",
+ "60g-1-58320-2160",
+ "60g-2-60480-2160",
+ "60g-3-62640-2160",
+ "60g-4-64800-2160",
+ "60g-5-66960-2160",
+ "60g-6-69120-2160",
+ "60g-9-59400-4320",
+ "60g-10-61560-4320",
+ "60g-11-63720-4320",
+ "60g-12-65880-4320",
+ "60g-13-68040-4320",
+ "60g-17-60480-6480",
+ "60g-18-62640-6480",
+ "60g-19-64800-6480",
+ "60g-20-66960-6480",
+ "60g-25-61560-6480",
+ "60g-26-63720-6480",
+ "60g-27-65880-6480",
+ ""
+ ],
+ "type": "string",
+ "description": "* `2.4g-1-2412-22` - 1 (2412 MHz)\n* `2.4g-2-2417-22` - 2 (2417 MHz)\n* `2.4g-3-2422-22` - 3 (2422 MHz)\n* `2.4g-4-2427-22` - 4 (2427 MHz)\n* `2.4g-5-2432-22` - 5 (2432 MHz)\n* `2.4g-6-2437-22` - 6 (2437 MHz)\n* `2.4g-7-2442-22` - 7 (2442 MHz)\n* `2.4g-8-2447-22` - 8 (2447 MHz)\n* `2.4g-9-2452-22` - 9 (2452 MHz)\n* `2.4g-10-2457-22` - 10 (2457 MHz)\n* `2.4g-11-2462-22` - 11 (2462 MHz)\n* `2.4g-12-2467-22` - 12 (2467 MHz)\n* `2.4g-13-2472-22` - 13 (2472 MHz)\n* `5g-32-5160-20` - 32 (5160/20 MHz)\n* `5g-34-5170-40` - 34 (5170/40 MHz)\n* `5g-36-5180-20` - 36 (5180/20 MHz)\n* `5g-38-5190-40` - 38 (5190/40 MHz)\n* `5g-40-5200-20` - 40 (5200/20 MHz)\n* `5g-42-5210-80` - 42 (5210/80 MHz)\n* `5g-44-5220-20` - 44 (5220/20 MHz)\n* `5g-46-5230-40` - 46 (5230/40 MHz)\n* `5g-48-5240-20` - 48 (5240/20 MHz)\n* `5g-50-5250-160` - 50 (5250/160 MHz)\n* `5g-52-5260-20` - 52 (5260/20 MHz)\n* `5g-54-5270-40` - 54 (5270/40 MHz)\n* `5g-56-5280-20` - 56 (5280/20 MHz)\n* `5g-58-5290-80` - 58 (5290/80 MHz)\n* `5g-60-5300-20` - 60 (5300/20 MHz)\n* `5g-62-5310-40` - 62 (5310/40 MHz)\n* `5g-64-5320-20` - 64 (5320/20 MHz)\n* `5g-100-5500-20` - 100 (5500/20 MHz)\n* `5g-102-5510-40` - 102 (5510/40 MHz)\n* `5g-104-5520-20` - 104 (5520/20 MHz)\n* `5g-106-5530-80` - 106 (5530/80 MHz)\n* `5g-108-5540-20` - 108 (5540/20 MHz)\n* `5g-110-5550-40` - 110 (5550/40 MHz)\n* `5g-112-5560-20` - 112 (5560/20 MHz)\n* `5g-114-5570-160` - 114 (5570/160 MHz)\n* `5g-116-5580-20` - 116 (5580/20 MHz)\n* `5g-118-5590-40` - 118 (5590/40 MHz)\n* `5g-120-5600-20` - 120 (5600/20 MHz)\n* `5g-122-5610-80` - 122 (5610/80 MHz)\n* `5g-124-5620-20` - 124 (5620/20 MHz)\n* `5g-126-5630-40` - 126 (5630/40 MHz)\n* `5g-128-5640-20` - 128 (5640/20 MHz)\n* `5g-132-5660-20` - 132 (5660/20 MHz)\n* `5g-134-5670-40` - 134 (5670/40 MHz)\n* `5g-136-5680-20` - 136 (5680/20 MHz)\n* `5g-138-5690-80` - 138 (5690/80 MHz)\n* `5g-140-5700-20` - 140 (5700/20 MHz)\n* `5g-142-5710-40` - 142 (5710/40 MHz)\n* `5g-144-5720-20` - 144 (5720/20 MHz)\n* `5g-149-5745-20` - 149 (5745/20 MHz)\n* `5g-151-5755-40` - 151 (5755/40 MHz)\n* `5g-153-5765-20` - 153 (5765/20 MHz)\n* `5g-155-5775-80` - 155 (5775/80 MHz)\n* `5g-157-5785-20` - 157 (5785/20 MHz)\n* `5g-159-5795-40` - 159 (5795/40 MHz)\n* `5g-161-5805-20` - 161 (5805/20 MHz)\n* `5g-163-5815-160` - 163 (5815/160 MHz)\n* `5g-165-5825-20` - 165 (5825/20 MHz)\n* `5g-167-5835-40` - 167 (5835/40 MHz)\n* `5g-169-5845-20` - 169 (5845/20 MHz)\n* `5g-171-5855-80` - 171 (5855/80 MHz)\n* `5g-173-5865-20` - 173 (5865/20 MHz)\n* `5g-175-5875-40` - 175 (5875/40 MHz)\n* `5g-177-5885-20` - 177 (5885/20 MHz)\n* `6g-1-5955-20` - 1 (5955/20 MHz)\n* `6g-3-5965-40` - 3 (5965/40 MHz)\n* `6g-5-5975-20` - 5 (5975/20 MHz)\n* `6g-7-5985-80` - 7 (5985/80 MHz)\n* `6g-9-5995-20` - 9 (5995/20 MHz)\n* `6g-11-6005-40` - 11 (6005/40 MHz)\n* `6g-13-6015-20` - 13 (6015/20 MHz)\n* `6g-15-6025-160` - 15 (6025/160 MHz)\n* `6g-17-6035-20` - 17 (6035/20 MHz)\n* `6g-19-6045-40` - 19 (6045/40 MHz)\n* `6g-21-6055-20` - 21 (6055/20 MHz)\n* `6g-23-6065-80` - 23 (6065/80 MHz)\n* `6g-25-6075-20` - 25 (6075/20 MHz)\n* `6g-27-6085-40` - 27 (6085/40 MHz)\n* `6g-29-6095-20` - 29 (6095/20 MHz)\n* `6g-31-6105-320` - 31 (6105/320 MHz)\n* `6g-33-6115-20` - 33 (6115/20 MHz)\n* `6g-35-6125-40` - 35 (6125/40 MHz)\n* `6g-37-6135-20` - 37 (6135/20 MHz)\n* `6g-39-6145-80` - 39 (6145/80 MHz)\n* `6g-41-6155-20` - 41 (6155/20 MHz)\n* `6g-43-6165-40` - 43 (6165/40 MHz)\n* `6g-45-6175-20` - 45 (6175/20 MHz)\n* `6g-47-6185-160` - 47 (6185/160 MHz)\n* `6g-49-6195-20` - 49 (6195/20 MHz)\n* `6g-51-6205-40` - 51 (6205/40 MHz)\n* `6g-53-6215-20` - 53 (6215/20 MHz)\n* `6g-55-6225-80` - 55 (6225/80 MHz)\n* `6g-57-6235-20` - 57 (6235/20 MHz)\n* `6g-59-6245-40` - 59 (6245/40 MHz)\n* `6g-61-6255-20` - 61 (6255/20 MHz)\n* `6g-65-6275-20` - 65 (6275/20 MHz)\n* `6g-67-6285-40` - 67 (6285/40 MHz)\n* `6g-69-6295-20` - 69 (6295/20 MHz)\n* `6g-71-6305-80` - 71 (6305/80 MHz)\n* `6g-73-6315-20` - 73 (6315/20 MHz)\n* `6g-75-6325-40` - 75 (6325/40 MHz)\n* `6g-77-6335-20` - 77 (6335/20 MHz)\n* `6g-79-6345-160` - 79 (6345/160 MHz)\n* `6g-81-6355-20` - 81 (6355/20 MHz)\n* `6g-83-6365-40` - 83 (6365/40 MHz)\n* `6g-85-6375-20` - 85 (6375/20 MHz)\n* `6g-87-6385-80` - 87 (6385/80 MHz)\n* `6g-89-6395-20` - 89 (6395/20 MHz)\n* `6g-91-6405-40` - 91 (6405/40 MHz)\n* `6g-93-6415-20` - 93 (6415/20 MHz)\n* `6g-95-6425-320` - 95 (6425/320 MHz)\n* `6g-97-6435-20` - 97 (6435/20 MHz)\n* `6g-99-6445-40` - 99 (6445/40 MHz)\n* `6g-101-6455-20` - 101 (6455/20 MHz)\n* `6g-103-6465-80` - 103 (6465/80 MHz)\n* `6g-105-6475-20` - 105 (6475/20 MHz)\n* `6g-107-6485-40` - 107 (6485/40 MHz)\n* `6g-109-6495-20` - 109 (6495/20 MHz)\n* `6g-111-6505-160` - 111 (6505/160 MHz)\n* `6g-113-6515-20` - 113 (6515/20 MHz)\n* `6g-115-6525-40` - 115 (6525/40 MHz)\n* `6g-117-6535-20` - 117 (6535/20 MHz)\n* `6g-119-6545-80` - 119 (6545/80 MHz)\n* `6g-121-6555-20` - 121 (6555/20 MHz)\n* `6g-123-6565-40` - 123 (6565/40 MHz)\n* `6g-125-6575-20` - 125 (6575/20 MHz)\n* `6g-129-6595-20` - 129 (6595/20 MHz)\n* `6g-131-6605-40` - 131 (6605/40 MHz)\n* `6g-133-6615-20` - 133 (6615/20 MHz)\n* `6g-135-6625-80` - 135 (6625/80 MHz)\n* `6g-137-6635-20` - 137 (6635/20 MHz)\n* `6g-139-6645-40` - 139 (6645/40 MHz)\n* `6g-141-6655-20` - 141 (6655/20 MHz)\n* `6g-143-6665-160` - 143 (6665/160 MHz)\n* `6g-145-6675-20` - 145 (6675/20 MHz)\n* `6g-147-6685-40` - 147 (6685/40 MHz)\n* `6g-149-6695-20` - 149 (6695/20 MHz)\n* `6g-151-6705-80` - 151 (6705/80 MHz)\n* `6g-153-6715-20` - 153 (6715/20 MHz)\n* `6g-155-6725-40` - 155 (6725/40 MHz)\n* `6g-157-6735-20` - 157 (6735/20 MHz)\n* `6g-159-6745-320` - 159 (6745/320 MHz)\n* `6g-161-6755-20` - 161 (6755/20 MHz)\n* `6g-163-6765-40` - 163 (6765/40 MHz)\n* `6g-165-6775-20` - 165 (6775/20 MHz)\n* `6g-167-6785-80` - 167 (6785/80 MHz)\n* `6g-169-6795-20` - 169 (6795/20 MHz)\n* `6g-171-6805-40` - 171 (6805/40 MHz)\n* `6g-173-6815-20` - 173 (6815/20 MHz)\n* `6g-175-6825-160` - 175 (6825/160 MHz)\n* `6g-177-6835-20` - 177 (6835/20 MHz)\n* `6g-179-6845-40` - 179 (6845/40 MHz)\n* `6g-181-6855-20` - 181 (6855/20 MHz)\n* `6g-183-6865-80` - 183 (6865/80 MHz)\n* `6g-185-6875-20` - 185 (6875/20 MHz)\n* `6g-187-6885-40` - 187 (6885/40 MHz)\n* `6g-189-6895-20` - 189 (6895/20 MHz)\n* `6g-193-6915-20` - 193 (6915/20 MHz)\n* `6g-195-6925-40` - 195 (6925/40 MHz)\n* `6g-197-6935-20` - 197 (6935/20 MHz)\n* `6g-199-6945-80` - 199 (6945/80 MHz)\n* `6g-201-6955-20` - 201 (6955/20 MHz)\n* `6g-203-6965-40` - 203 (6965/40 MHz)\n* `6g-205-6975-20` - 205 (6975/20 MHz)\n* `6g-207-6985-160` - 207 (6985/160 MHz)\n* `6g-209-6995-20` - 209 (6995/20 MHz)\n* `6g-211-7005-40` - 211 (7005/40 MHz)\n* `6g-213-7015-20` - 213 (7015/20 MHz)\n* `6g-215-7025-80` - 215 (7025/80 MHz)\n* `6g-217-7035-20` - 217 (7035/20 MHz)\n* `6g-219-7045-40` - 219 (7045/40 MHz)\n* `6g-221-7055-20` - 221 (7055/20 MHz)\n* `6g-225-7075-20` - 225 (7075/20 MHz)\n* `6g-227-7085-40` - 227 (7085/40 MHz)\n* `6g-229-7095-20` - 229 (7095/20 MHz)\n* `6g-233-7115-20` - 233 (7115/20 MHz)\n* `60g-1-58320-2160` - 1 (58.32/2.16 GHz)\n* `60g-2-60480-2160` - 2 (60.48/2.16 GHz)\n* `60g-3-62640-2160` - 3 (62.64/2.16 GHz)\n* `60g-4-64800-2160` - 4 (64.80/2.16 GHz)\n* `60g-5-66960-2160` - 5 (66.96/2.16 GHz)\n* `60g-6-69120-2160` - 6 (69.12/2.16 GHz)\n* `60g-9-59400-4320` - 9 (59.40/4.32 GHz)\n* `60g-10-61560-4320` - 10 (61.56/4.32 GHz)\n* `60g-11-63720-4320` - 11 (63.72/4.32 GHz)\n* `60g-12-65880-4320` - 12 (65.88/4.32 GHz)\n* `60g-13-68040-4320` - 13 (68.04/4.32 GHz)\n* `60g-17-60480-6480` - 17 (60.48/6.48 GHz)\n* `60g-18-62640-6480` - 18 (62.64/6.48 GHz)\n* `60g-19-64800-6480` - 19 (64.80/6.48 GHz)\n* `60g-20-66960-6480` - 20 (66.96/6.48 GHz)\n* `60g-25-61560-6480` - 25 (61.56/8.64 GHz)\n* `60g-26-63720-6480` - 26 (63.72/8.64 GHz)\n* `60g-27-65880-6480` - 27 (65.88/8.64 GHz)",
+ "x-spec-enum-id": "aac33cc237adc8f9"
+ },
+ "poe_mode": {
+ "enum": [
+ "pd",
+ "pse",
+ ""
+ ],
+ "type": "string",
+ "description": "* `pd` - PD\n* `pse` - PSE",
+ "x-spec-enum-id": "2f2fe6dcdc7772bd"
+ },
+ "poe_type": {
+ "enum": [
+ "type1-ieee802.3af",
+ "type2-ieee802.3at",
+ "type3-ieee802.3bt",
+ "type4-ieee802.3bt",
+ "passive-24v-2pair",
+ "passive-24v-4pair",
+ "passive-48v-2pair",
+ "passive-48v-4pair",
+ ""
+ ],
+ "type": "string",
+ "description": "* `type1-ieee802.3af` - 802.3af (Type 1)\n* `type2-ieee802.3at` - 802.3at (Type 2)\n* `type3-ieee802.3bt` - 802.3bt (Type 3)\n* `type4-ieee802.3bt` - 802.3bt (Type 4)\n* `passive-24v-2pair` - Passive 24V (2-pair)\n* `passive-24v-4pair` - Passive 24V (4-pair)\n* `passive-48v-2pair` - Passive 48V (2-pair)\n* `passive-48v-4pair` - Passive 48V (4-pair)",
+ "x-spec-enum-id": "74bd3be4012f6da9"
+ },
+ "rf_channel_frequency": {
+ "type": "number",
+ "format": "double",
+ "maximum": 100000,
+ "minimum": -100000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "title": "Channel frequency (MHz)",
+ "description": "Populated by selected channel (if set)"
+ },
+ "rf_channel_width": {
+ "type": "number",
+ "format": "double",
+ "maximum": 10000,
+ "minimum": -10000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "title": "Channel width (MHz)",
+ "description": "Populated by selected channel (if set)"
+ },
+ "tx_power": {
+ "type": "integer",
+ "maximum": 127,
+ "minimum": -40,
+ "nullable": true,
+ "title": "Transmit power (dBm)"
+ },
+ "untagged_vlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tagged_vlans": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "qinq_svlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vlan_translation_policy": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANTranslationPolicyRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "wireless_lans": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "vrf": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRFRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name",
+ "type"
+ ]
+ },
+ "InterfaceTemplate": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceType"
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleType"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "virtual",
+ "bridge",
+ "lag",
+ "100base-fx",
+ "100base-lfx",
+ "100base-tx",
+ "100base-t1",
+ "1000base-t",
+ "1000base-sx",
+ "1000base-lx",
+ "1000base-tx",
+ "2.5gbase-t",
+ "5gbase-t",
+ "10gbase-t",
+ "10gbase-cx4",
+ "100base-x-sfp",
+ "1000base-x-gbic",
+ "1000base-x-sfp",
+ "10gbase-x-sfpp",
+ "10gbase-x-xfp",
+ "10gbase-x-xenpak",
+ "10gbase-x-x2",
+ "25gbase-x-sfp28",
+ "50gbase-x-sfp56",
+ "40gbase-x-qsfpp",
+ "50gbase-x-sfp28",
+ "100gbase-x-cfp",
+ "100gbase-x-cfp2",
+ "200gbase-x-cfp2",
+ "400gbase-x-cfp2",
+ "100gbase-x-cfp4",
+ "100gbase-x-cxp",
+ "100gbase-x-cpak",
+ "100gbase-x-dsfp",
+ "100gbase-x-sfpdd",
+ "100gbase-x-qsfp28",
+ "100gbase-x-qsfpdd",
+ "200gbase-x-qsfp56",
+ "200gbase-x-qsfpdd",
+ "400gbase-x-qsfp112",
+ "400gbase-x-qsfpdd",
+ "400gbase-x-osfp",
+ "400gbase-x-osfp-rhs",
+ "400gbase-x-cdfp",
+ "400gbase-x-cfp8",
+ "800gbase-x-qsfpdd",
+ "800gbase-x-osfp",
+ "1000base-kx",
+ "2.5gbase-kx",
+ "5gbase-kr",
+ "10gbase-kr",
+ "10gbase-kx4",
+ "25gbase-kr",
+ "40gbase-kr4",
+ "50gbase-kr",
+ "100gbase-kp4",
+ "100gbase-kr2",
+ "100gbase-kr4",
+ "ieee802.11a",
+ "ieee802.11g",
+ "ieee802.11n",
+ "ieee802.11ac",
+ "ieee802.11ad",
+ "ieee802.11ax",
+ "ieee802.11ay",
+ "ieee802.11be",
+ "ieee802.15.1",
+ "ieee802.15.4",
+ "other-wireless",
+ "gsm",
+ "cdma",
+ "lte",
+ "4g",
+ "5g",
+ "sonet-oc3",
+ "sonet-oc12",
+ "sonet-oc48",
+ "sonet-oc192",
+ "sonet-oc768",
+ "sonet-oc1920",
+ "sonet-oc3840",
+ "1gfc-sfp",
+ "2gfc-sfp",
+ "4gfc-sfp",
+ "8gfc-sfpp",
+ "16gfc-sfpp",
+ "32gfc-sfp28",
+ "32gfc-sfpp",
+ "64gfc-qsfpp",
+ "64gfc-sfpdd",
+ "64gfc-sfpp",
+ "128gfc-qsfp28",
+ "infiniband-sdr",
+ "infiniband-ddr",
+ "infiniband-qdr",
+ "infiniband-fdr10",
+ "infiniband-fdr",
+ "infiniband-edr",
+ "infiniband-hdr",
+ "infiniband-ndr",
+ "infiniband-xdr",
+ "t1",
+ "e1",
+ "t3",
+ "e3",
+ "xdsl",
+ "docsis",
+ "moca",
+ "bpon",
+ "epon",
+ "10g-epon",
+ "gpon",
+ "xg-pon",
+ "xgs-pon",
+ "ng-pon2",
+ "25g-pon",
+ "50g-pon",
+ "cisco-stackwise",
+ "cisco-stackwise-plus",
+ "cisco-flexstack",
+ "cisco-flexstack-plus",
+ "cisco-stackwise-80",
+ "cisco-stackwise-160",
+ "cisco-stackwise-320",
+ "cisco-stackwise-480",
+ "cisco-stackwise-1t",
+ "juniper-vcp",
+ "extreme-summitstack",
+ "extreme-summitstack-128",
+ "extreme-summitstack-256",
+ "extreme-summitstack-512",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `virtual` - Virtual\n* `bridge` - Bridge\n* `lag` - Link Aggregation Group (LAG)\n* `100base-fx` - 100BASE-FX (10/100ME FIBER)\n* `100base-lfx` - 100BASE-LFX (10/100ME FIBER)\n* `100base-tx` - 100BASE-TX (10/100ME)\n* `100base-t1` - 100BASE-T1 (10/100ME Single Pair)\n* `1000base-t` - 1000BASE-T (1GE)\n* `1000base-sx` - 1000BASE-SX (1GE)\n* `1000base-lx` - 1000BASE-LX (1GE)\n* `1000base-tx` - 1000BASE-TX (1GE)\n* `2.5gbase-t` - 2.5GBASE-T (2.5GE)\n* `5gbase-t` - 5GBASE-T (5GE)\n* `10gbase-t` - 10GBASE-T (10GE)\n* `10gbase-cx4` - 10GBASE-CX4 (10GE)\n* `100base-x-sfp` - SFP (100ME)\n* `1000base-x-gbic` - GBIC (1GE)\n* `1000base-x-sfp` - SFP (1GE)\n* `10gbase-x-sfpp` - SFP+ (10GE)\n* `10gbase-x-xfp` - XFP (10GE)\n* `10gbase-x-xenpak` - XENPAK (10GE)\n* `10gbase-x-x2` - X2 (10GE)\n* `25gbase-x-sfp28` - SFP28 (25GE)\n* `50gbase-x-sfp56` - SFP56 (50GE)\n* `40gbase-x-qsfpp` - QSFP+ (40GE)\n* `50gbase-x-sfp28` - QSFP28 (50GE)\n* `100gbase-x-cfp` - CFP (100GE)\n* `100gbase-x-cfp2` - CFP2 (100GE)\n* `200gbase-x-cfp2` - CFP2 (200GE)\n* `400gbase-x-cfp2` - CFP2 (400GE)\n* `100gbase-x-cfp4` - CFP4 (100GE)\n* `100gbase-x-cxp` - CXP (100GE)\n* `100gbase-x-cpak` - Cisco CPAK (100GE)\n* `100gbase-x-dsfp` - DSFP (100GE)\n* `100gbase-x-sfpdd` - SFP-DD (100GE)\n* `100gbase-x-qsfp28` - QSFP28 (100GE)\n* `100gbase-x-qsfpdd` - QSFP-DD (100GE)\n* `200gbase-x-qsfp56` - QSFP56 (200GE)\n* `200gbase-x-qsfpdd` - QSFP-DD (200GE)\n* `400gbase-x-qsfp112` - QSFP112 (400GE)\n* `400gbase-x-qsfpdd` - QSFP-DD (400GE)\n* `400gbase-x-osfp` - OSFP (400GE)\n* `400gbase-x-osfp-rhs` - OSFP-RHS (400GE)\n* `400gbase-x-cdfp` - CDFP (400GE)\n* `400gbase-x-cfp8` - CPF8 (400GE)\n* `800gbase-x-qsfpdd` - QSFP-DD (800GE)\n* `800gbase-x-osfp` - OSFP (800GE)\n* `1000base-kx` - 1000BASE-KX (1GE)\n* `2.5gbase-kx` - 2.5GBASE-KX (2.5GE)\n* `5gbase-kr` - 5GBASE-KR (5GE)\n* `10gbase-kr` - 10GBASE-KR (10GE)\n* `10gbase-kx4` - 10GBASE-KX4 (10GE)\n* `25gbase-kr` - 25GBASE-KR (25GE)\n* `40gbase-kr4` - 40GBASE-KR4 (40GE)\n* `50gbase-kr` - 50GBASE-KR (50GE)\n* `100gbase-kp4` - 100GBASE-KP4 (100GE)\n* `100gbase-kr2` - 100GBASE-KR2 (100GE)\n* `100gbase-kr4` - 100GBASE-KR4 (100GE)\n* `ieee802.11a` - IEEE 802.11a\n* `ieee802.11g` - IEEE 802.11b/g\n* `ieee802.11n` - IEEE 802.11n\n* `ieee802.11ac` - IEEE 802.11ac\n* `ieee802.11ad` - IEEE 802.11ad\n* `ieee802.11ax` - IEEE 802.11ax\n* `ieee802.11ay` - IEEE 802.11ay\n* `ieee802.11be` - IEEE 802.11be\n* `ieee802.15.1` - IEEE 802.15.1 (Bluetooth)\n* `ieee802.15.4` - IEEE 802.15.4 (LR-WPAN)\n* `other-wireless` - Other (Wireless)\n* `gsm` - GSM\n* `cdma` - CDMA\n* `lte` - LTE\n* `4g` - 4G\n* `5g` - 5G\n* `sonet-oc3` - OC-3/STM-1\n* `sonet-oc12` - OC-12/STM-4\n* `sonet-oc48` - OC-48/STM-16\n* `sonet-oc192` - OC-192/STM-64\n* `sonet-oc768` - OC-768/STM-256\n* `sonet-oc1920` - OC-1920/STM-640\n* `sonet-oc3840` - OC-3840/STM-1234\n* `1gfc-sfp` - SFP (1GFC)\n* `2gfc-sfp` - SFP (2GFC)\n* `4gfc-sfp` - SFP (4GFC)\n* `8gfc-sfpp` - SFP+ (8GFC)\n* `16gfc-sfpp` - SFP+ (16GFC)\n* `32gfc-sfp28` - SFP28 (32GFC)\n* `32gfc-sfpp` - SFP+ (32GFC)\n* `64gfc-qsfpp` - QSFP+ (64GFC)\n* `64gfc-sfpdd` - SFP-DD (64GFC)\n* `64gfc-sfpp` - SFP+ (64GFC)\n* `128gfc-qsfp28` - QSFP28 (128GFC)\n* `infiniband-sdr` - SDR (2 Gbps)\n* `infiniband-ddr` - DDR (4 Gbps)\n* `infiniband-qdr` - QDR (8 Gbps)\n* `infiniband-fdr10` - FDR10 (10 Gbps)\n* `infiniband-fdr` - FDR (13.5 Gbps)\n* `infiniband-edr` - EDR (25 Gbps)\n* `infiniband-hdr` - HDR (50 Gbps)\n* `infiniband-ndr` - NDR (100 Gbps)\n* `infiniband-xdr` - XDR (250 Gbps)\n* `t1` - T1 (1.544 Mbps)\n* `e1` - E1 (2.048 Mbps)\n* `t3` - T3 (45 Mbps)\n* `e3` - E3 (34 Mbps)\n* `xdsl` - xDSL\n* `docsis` - DOCSIS\n* `moca` - MoCA\n* `bpon` - BPON (622 Mbps / 155 Mbps)\n* `epon` - EPON (1 Gbps)\n* `10g-epon` - 10G-EPON (10 Gbps)\n* `gpon` - GPON (2.5 Gbps / 1.25 Gbps)\n* `xg-pon` - XG-PON (10 Gbps / 2.5 Gbps)\n* `xgs-pon` - XGS-PON (10 Gbps)\n* `ng-pon2` - NG-PON2 (TWDM-PON) (4x10 Gbps)\n* `25g-pon` - 25G-PON (25 Gbps)\n* `50g-pon` - 50G-PON (50 Gbps)\n* `cisco-stackwise` - Cisco StackWise\n* `cisco-stackwise-plus` - Cisco StackWise Plus\n* `cisco-flexstack` - Cisco FlexStack\n* `cisco-flexstack-plus` - Cisco FlexStack Plus\n* `cisco-stackwise-80` - Cisco StackWise-80\n* `cisco-stackwise-160` - Cisco StackWise-160\n* `cisco-stackwise-320` - Cisco StackWise-320\n* `cisco-stackwise-480` - Cisco StackWise-480\n* `cisco-stackwise-1t` - Cisco StackWise-1T\n* `juniper-vcp` - Juniper VCP\n* `extreme-summitstack` - Extreme SummitStack\n* `extreme-summitstack-128` - Extreme SummitStack-128\n* `extreme-summitstack-256` - Extreme SummitStack-256\n* `extreme-summitstack-512` - Extreme SummitStack-512\n* `other` - Other",
+ "x-spec-enum-id": "8c4c5e112f77a383"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Virtual",
+ "Bridge",
+ "Link Aggregation Group (LAG)",
+ "100BASE-FX (10/100ME FIBER)",
+ "100BASE-LFX (10/100ME FIBER)",
+ "100BASE-TX (10/100ME)",
+ "100BASE-T1 (10/100ME Single Pair)",
+ "1000BASE-T (1GE)",
+ "1000BASE-SX (1GE)",
+ "1000BASE-LX (1GE)",
+ "1000BASE-TX (1GE)",
+ "2.5GBASE-T (2.5GE)",
+ "5GBASE-T (5GE)",
+ "10GBASE-T (10GE)",
+ "10GBASE-CX4 (10GE)",
+ "SFP (100ME)",
+ "GBIC (1GE)",
+ "SFP (1GE)",
+ "SFP+ (10GE)",
+ "XFP (10GE)",
+ "XENPAK (10GE)",
+ "X2 (10GE)",
+ "SFP28 (25GE)",
+ "SFP56 (50GE)",
+ "QSFP+ (40GE)",
+ "QSFP28 (50GE)",
+ "CFP (100GE)",
+ "CFP2 (100GE)",
+ "CFP2 (200GE)",
+ "CFP2 (400GE)",
+ "CFP4 (100GE)",
+ "CXP (100GE)",
+ "Cisco CPAK (100GE)",
+ "DSFP (100GE)",
+ "SFP-DD (100GE)",
+ "QSFP28 (100GE)",
+ "QSFP-DD (100GE)",
+ "QSFP56 (200GE)",
+ "QSFP-DD (200GE)",
+ "QSFP112 (400GE)",
+ "QSFP-DD (400GE)",
+ "OSFP (400GE)",
+ "OSFP-RHS (400GE)",
+ "CDFP (400GE)",
+ "CPF8 (400GE)",
+ "QSFP-DD (800GE)",
+ "OSFP (800GE)",
+ "1000BASE-KX (1GE)",
+ "2.5GBASE-KX (2.5GE)",
+ "5GBASE-KR (5GE)",
+ "10GBASE-KR (10GE)",
+ "10GBASE-KX4 (10GE)",
+ "25GBASE-KR (25GE)",
+ "40GBASE-KR4 (40GE)",
+ "50GBASE-KR (50GE)",
+ "100GBASE-KP4 (100GE)",
+ "100GBASE-KR2 (100GE)",
+ "100GBASE-KR4 (100GE)",
+ "IEEE 802.11a",
+ "IEEE 802.11b/g",
+ "IEEE 802.11n",
+ "IEEE 802.11ac",
+ "IEEE 802.11ad",
+ "IEEE 802.11ax",
+ "IEEE 802.11ay",
+ "IEEE 802.11be",
+ "IEEE 802.15.1 (Bluetooth)",
+ "IEEE 802.15.4 (LR-WPAN)",
+ "Other (Wireless)",
+ "GSM",
+ "CDMA",
+ "LTE",
+ "4G",
+ "5G",
+ "OC-3/STM-1",
+ "OC-12/STM-4",
+ "OC-48/STM-16",
+ "OC-192/STM-64",
+ "OC-768/STM-256",
+ "OC-1920/STM-640",
+ "OC-3840/STM-1234",
+ "SFP (1GFC)",
+ "SFP (2GFC)",
+ "SFP (4GFC)",
+ "SFP+ (8GFC)",
+ "SFP+ (16GFC)",
+ "SFP28 (32GFC)",
+ "SFP+ (32GFC)",
+ "QSFP+ (64GFC)",
+ "SFP-DD (64GFC)",
+ "SFP+ (64GFC)",
+ "QSFP28 (128GFC)",
+ "SDR (2 Gbps)",
+ "DDR (4 Gbps)",
+ "QDR (8 Gbps)",
+ "FDR10 (10 Gbps)",
+ "FDR (13.5 Gbps)",
+ "EDR (25 Gbps)",
+ "HDR (50 Gbps)",
+ "NDR (100 Gbps)",
+ "XDR (250 Gbps)",
+ "T1 (1.544 Mbps)",
+ "E1 (2.048 Mbps)",
+ "T3 (45 Mbps)",
+ "E3 (34 Mbps)",
+ "xDSL",
+ "DOCSIS",
+ "MoCA",
+ "BPON (622 Mbps / 155 Mbps)",
+ "EPON (1 Gbps)",
+ "10G-EPON (10 Gbps)",
+ "GPON (2.5 Gbps / 1.25 Gbps)",
+ "XG-PON (10 Gbps / 2.5 Gbps)",
+ "XGS-PON (10 Gbps)",
+ "NG-PON2 (TWDM-PON) (4x10 Gbps)",
+ "25G-PON (25 Gbps)",
+ "50G-PON (50 Gbps)",
+ "Cisco StackWise",
+ "Cisco StackWise Plus",
+ "Cisco FlexStack",
+ "Cisco FlexStack Plus",
+ "Cisco StackWise-80",
+ "Cisco StackWise-160",
+ "Cisco StackWise-320",
+ "Cisco StackWise-480",
+ "Cisco StackWise-1T",
+ "Juniper VCP",
+ "Extreme SummitStack",
+ "Extreme SummitStack-128",
+ "Extreme SummitStack-256",
+ "Extreme SummitStack-512",
+ "Other"
+ ]
+ }
+ }
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "mgmt_only": {
+ "type": "boolean",
+ "title": "Management only"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "bridge": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedInterfaceTemplate"
+ }
+ ],
+ "nullable": true
+ },
+ "poe_mode": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "pd",
+ "pse",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `pd` - PD\n* `pse` - PSE",
+ "x-spec-enum-id": "2f2fe6dcdc7772bd"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "PD",
+ "PSE"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "poe_type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "type1-ieee802.3af",
+ "type2-ieee802.3at",
+ "type3-ieee802.3bt",
+ "type4-ieee802.3bt",
+ "passive-24v-2pair",
+ "passive-24v-4pair",
+ "passive-48v-2pair",
+ "passive-48v-4pair",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `type1-ieee802.3af` - 802.3af (Type 1)\n* `type2-ieee802.3at` - 802.3at (Type 2)\n* `type3-ieee802.3bt` - 802.3bt (Type 3)\n* `type4-ieee802.3bt` - 802.3bt (Type 4)\n* `passive-24v-2pair` - Passive 24V (2-pair)\n* `passive-24v-4pair` - Passive 24V (4-pair)\n* `passive-48v-2pair` - Passive 48V (2-pair)\n* `passive-48v-4pair` - Passive 48V (4-pair)",
+ "x-spec-enum-id": "74bd3be4012f6da9"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "802.3af (Type 1)",
+ "802.3at (Type 2)",
+ "802.3bt (Type 3)",
+ "802.3bt (Type 4)",
+ "Passive 24V (2-pair)",
+ "Passive 24V (4-pair)",
+ "Passive 48V (2-pair)",
+ "Passive 48V (4-pair)"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "rf_role": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "ap",
+ "station",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `ap` - Access point\n* `station` - Station",
+ "x-spec-enum-id": "d2772dbea88b0fb1"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Access point",
+ "Station"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "id",
+ "last_updated",
+ "name",
+ "type",
+ "url"
+ ]
+ },
+ "InterfaceTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "virtual",
+ "bridge",
+ "lag",
+ "100base-fx",
+ "100base-lfx",
+ "100base-tx",
+ "100base-t1",
+ "1000base-t",
+ "1000base-sx",
+ "1000base-lx",
+ "1000base-tx",
+ "2.5gbase-t",
+ "5gbase-t",
+ "10gbase-t",
+ "10gbase-cx4",
+ "100base-x-sfp",
+ "1000base-x-gbic",
+ "1000base-x-sfp",
+ "10gbase-x-sfpp",
+ "10gbase-x-xfp",
+ "10gbase-x-xenpak",
+ "10gbase-x-x2",
+ "25gbase-x-sfp28",
+ "50gbase-x-sfp56",
+ "40gbase-x-qsfpp",
+ "50gbase-x-sfp28",
+ "100gbase-x-cfp",
+ "100gbase-x-cfp2",
+ "200gbase-x-cfp2",
+ "400gbase-x-cfp2",
+ "100gbase-x-cfp4",
+ "100gbase-x-cxp",
+ "100gbase-x-cpak",
+ "100gbase-x-dsfp",
+ "100gbase-x-sfpdd",
+ "100gbase-x-qsfp28",
+ "100gbase-x-qsfpdd",
+ "200gbase-x-qsfp56",
+ "200gbase-x-qsfpdd",
+ "400gbase-x-qsfp112",
+ "400gbase-x-qsfpdd",
+ "400gbase-x-osfp",
+ "400gbase-x-osfp-rhs",
+ "400gbase-x-cdfp",
+ "400gbase-x-cfp8",
+ "800gbase-x-qsfpdd",
+ "800gbase-x-osfp",
+ "1000base-kx",
+ "2.5gbase-kx",
+ "5gbase-kr",
+ "10gbase-kr",
+ "10gbase-kx4",
+ "25gbase-kr",
+ "40gbase-kr4",
+ "50gbase-kr",
+ "100gbase-kp4",
+ "100gbase-kr2",
+ "100gbase-kr4",
+ "ieee802.11a",
+ "ieee802.11g",
+ "ieee802.11n",
+ "ieee802.11ac",
+ "ieee802.11ad",
+ "ieee802.11ax",
+ "ieee802.11ay",
+ "ieee802.11be",
+ "ieee802.15.1",
+ "ieee802.15.4",
+ "other-wireless",
+ "gsm",
+ "cdma",
+ "lte",
+ "4g",
+ "5g",
+ "sonet-oc3",
+ "sonet-oc12",
+ "sonet-oc48",
+ "sonet-oc192",
+ "sonet-oc768",
+ "sonet-oc1920",
+ "sonet-oc3840",
+ "1gfc-sfp",
+ "2gfc-sfp",
+ "4gfc-sfp",
+ "8gfc-sfpp",
+ "16gfc-sfpp",
+ "32gfc-sfp28",
+ "32gfc-sfpp",
+ "64gfc-qsfpp",
+ "64gfc-sfpdd",
+ "64gfc-sfpp",
+ "128gfc-qsfp28",
+ "infiniband-sdr",
+ "infiniband-ddr",
+ "infiniband-qdr",
+ "infiniband-fdr10",
+ "infiniband-fdr",
+ "infiniband-edr",
+ "infiniband-hdr",
+ "infiniband-ndr",
+ "infiniband-xdr",
+ "t1",
+ "e1",
+ "t3",
+ "e3",
+ "xdsl",
+ "docsis",
+ "moca",
+ "bpon",
+ "epon",
+ "10g-epon",
+ "gpon",
+ "xg-pon",
+ "xgs-pon",
+ "ng-pon2",
+ "25g-pon",
+ "50g-pon",
+ "cisco-stackwise",
+ "cisco-stackwise-plus",
+ "cisco-flexstack",
+ "cisco-flexstack-plus",
+ "cisco-stackwise-80",
+ "cisco-stackwise-160",
+ "cisco-stackwise-320",
+ "cisco-stackwise-480",
+ "cisco-stackwise-1t",
+ "juniper-vcp",
+ "extreme-summitstack",
+ "extreme-summitstack-128",
+ "extreme-summitstack-256",
+ "extreme-summitstack-512",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `virtual` - Virtual\n* `bridge` - Bridge\n* `lag` - Link Aggregation Group (LAG)\n* `100base-fx` - 100BASE-FX (10/100ME FIBER)\n* `100base-lfx` - 100BASE-LFX (10/100ME FIBER)\n* `100base-tx` - 100BASE-TX (10/100ME)\n* `100base-t1` - 100BASE-T1 (10/100ME Single Pair)\n* `1000base-t` - 1000BASE-T (1GE)\n* `1000base-sx` - 1000BASE-SX (1GE)\n* `1000base-lx` - 1000BASE-LX (1GE)\n* `1000base-tx` - 1000BASE-TX (1GE)\n* `2.5gbase-t` - 2.5GBASE-T (2.5GE)\n* `5gbase-t` - 5GBASE-T (5GE)\n* `10gbase-t` - 10GBASE-T (10GE)\n* `10gbase-cx4` - 10GBASE-CX4 (10GE)\n* `100base-x-sfp` - SFP (100ME)\n* `1000base-x-gbic` - GBIC (1GE)\n* `1000base-x-sfp` - SFP (1GE)\n* `10gbase-x-sfpp` - SFP+ (10GE)\n* `10gbase-x-xfp` - XFP (10GE)\n* `10gbase-x-xenpak` - XENPAK (10GE)\n* `10gbase-x-x2` - X2 (10GE)\n* `25gbase-x-sfp28` - SFP28 (25GE)\n* `50gbase-x-sfp56` - SFP56 (50GE)\n* `40gbase-x-qsfpp` - QSFP+ (40GE)\n* `50gbase-x-sfp28` - QSFP28 (50GE)\n* `100gbase-x-cfp` - CFP (100GE)\n* `100gbase-x-cfp2` - CFP2 (100GE)\n* `200gbase-x-cfp2` - CFP2 (200GE)\n* `400gbase-x-cfp2` - CFP2 (400GE)\n* `100gbase-x-cfp4` - CFP4 (100GE)\n* `100gbase-x-cxp` - CXP (100GE)\n* `100gbase-x-cpak` - Cisco CPAK (100GE)\n* `100gbase-x-dsfp` - DSFP (100GE)\n* `100gbase-x-sfpdd` - SFP-DD (100GE)\n* `100gbase-x-qsfp28` - QSFP28 (100GE)\n* `100gbase-x-qsfpdd` - QSFP-DD (100GE)\n* `200gbase-x-qsfp56` - QSFP56 (200GE)\n* `200gbase-x-qsfpdd` - QSFP-DD (200GE)\n* `400gbase-x-qsfp112` - QSFP112 (400GE)\n* `400gbase-x-qsfpdd` - QSFP-DD (400GE)\n* `400gbase-x-osfp` - OSFP (400GE)\n* `400gbase-x-osfp-rhs` - OSFP-RHS (400GE)\n* `400gbase-x-cdfp` - CDFP (400GE)\n* `400gbase-x-cfp8` - CPF8 (400GE)\n* `800gbase-x-qsfpdd` - QSFP-DD (800GE)\n* `800gbase-x-osfp` - OSFP (800GE)\n* `1000base-kx` - 1000BASE-KX (1GE)\n* `2.5gbase-kx` - 2.5GBASE-KX (2.5GE)\n* `5gbase-kr` - 5GBASE-KR (5GE)\n* `10gbase-kr` - 10GBASE-KR (10GE)\n* `10gbase-kx4` - 10GBASE-KX4 (10GE)\n* `25gbase-kr` - 25GBASE-KR (25GE)\n* `40gbase-kr4` - 40GBASE-KR4 (40GE)\n* `50gbase-kr` - 50GBASE-KR (50GE)\n* `100gbase-kp4` - 100GBASE-KP4 (100GE)\n* `100gbase-kr2` - 100GBASE-KR2 (100GE)\n* `100gbase-kr4` - 100GBASE-KR4 (100GE)\n* `ieee802.11a` - IEEE 802.11a\n* `ieee802.11g` - IEEE 802.11b/g\n* `ieee802.11n` - IEEE 802.11n\n* `ieee802.11ac` - IEEE 802.11ac\n* `ieee802.11ad` - IEEE 802.11ad\n* `ieee802.11ax` - IEEE 802.11ax\n* `ieee802.11ay` - IEEE 802.11ay\n* `ieee802.11be` - IEEE 802.11be\n* `ieee802.15.1` - IEEE 802.15.1 (Bluetooth)\n* `ieee802.15.4` - IEEE 802.15.4 (LR-WPAN)\n* `other-wireless` - Other (Wireless)\n* `gsm` - GSM\n* `cdma` - CDMA\n* `lte` - LTE\n* `4g` - 4G\n* `5g` - 5G\n* `sonet-oc3` - OC-3/STM-1\n* `sonet-oc12` - OC-12/STM-4\n* `sonet-oc48` - OC-48/STM-16\n* `sonet-oc192` - OC-192/STM-64\n* `sonet-oc768` - OC-768/STM-256\n* `sonet-oc1920` - OC-1920/STM-640\n* `sonet-oc3840` - OC-3840/STM-1234\n* `1gfc-sfp` - SFP (1GFC)\n* `2gfc-sfp` - SFP (2GFC)\n* `4gfc-sfp` - SFP (4GFC)\n* `8gfc-sfpp` - SFP+ (8GFC)\n* `16gfc-sfpp` - SFP+ (16GFC)\n* `32gfc-sfp28` - SFP28 (32GFC)\n* `32gfc-sfpp` - SFP+ (32GFC)\n* `64gfc-qsfpp` - QSFP+ (64GFC)\n* `64gfc-sfpdd` - SFP-DD (64GFC)\n* `64gfc-sfpp` - SFP+ (64GFC)\n* `128gfc-qsfp28` - QSFP28 (128GFC)\n* `infiniband-sdr` - SDR (2 Gbps)\n* `infiniband-ddr` - DDR (4 Gbps)\n* `infiniband-qdr` - QDR (8 Gbps)\n* `infiniband-fdr10` - FDR10 (10 Gbps)\n* `infiniband-fdr` - FDR (13.5 Gbps)\n* `infiniband-edr` - EDR (25 Gbps)\n* `infiniband-hdr` - HDR (50 Gbps)\n* `infiniband-ndr` - NDR (100 Gbps)\n* `infiniband-xdr` - XDR (250 Gbps)\n* `t1` - T1 (1.544 Mbps)\n* `e1` - E1 (2.048 Mbps)\n* `t3` - T3 (45 Mbps)\n* `e3` - E3 (34 Mbps)\n* `xdsl` - xDSL\n* `docsis` - DOCSIS\n* `moca` - MoCA\n* `bpon` - BPON (622 Mbps / 155 Mbps)\n* `epon` - EPON (1 Gbps)\n* `10g-epon` - 10G-EPON (10 Gbps)\n* `gpon` - GPON (2.5 Gbps / 1.25 Gbps)\n* `xg-pon` - XG-PON (10 Gbps / 2.5 Gbps)\n* `xgs-pon` - XGS-PON (10 Gbps)\n* `ng-pon2` - NG-PON2 (TWDM-PON) (4x10 Gbps)\n* `25g-pon` - 25G-PON (25 Gbps)\n* `50g-pon` - 50G-PON (50 Gbps)\n* `cisco-stackwise` - Cisco StackWise\n* `cisco-stackwise-plus` - Cisco StackWise Plus\n* `cisco-flexstack` - Cisco FlexStack\n* `cisco-flexstack-plus` - Cisco FlexStack Plus\n* `cisco-stackwise-80` - Cisco StackWise-80\n* `cisco-stackwise-160` - Cisco StackWise-160\n* `cisco-stackwise-320` - Cisco StackWise-320\n* `cisco-stackwise-480` - Cisco StackWise-480\n* `cisco-stackwise-1t` - Cisco StackWise-1T\n* `juniper-vcp` - Juniper VCP\n* `extreme-summitstack` - Extreme SummitStack\n* `extreme-summitstack-128` - Extreme SummitStack-128\n* `extreme-summitstack-256` - Extreme SummitStack-256\n* `extreme-summitstack-512` - Extreme SummitStack-512\n* `other` - Other",
+ "x-spec-enum-id": "8c4c5e112f77a383"
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "mgmt_only": {
+ "type": "boolean",
+ "title": "Management only"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "bridge": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedInterfaceTemplateRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "poe_mode": {
+ "enum": [
+ "pd",
+ "pse",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `pd` - PD\n* `pse` - PSE",
+ "x-spec-enum-id": "2f2fe6dcdc7772bd",
+ "nullable": true
+ },
+ "poe_type": {
+ "enum": [
+ "type1-ieee802.3af",
+ "type2-ieee802.3at",
+ "type3-ieee802.3bt",
+ "type4-ieee802.3bt",
+ "passive-24v-2pair",
+ "passive-24v-4pair",
+ "passive-48v-2pair",
+ "passive-48v-4pair",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `type1-ieee802.3af` - 802.3af (Type 1)\n* `type2-ieee802.3at` - 802.3at (Type 2)\n* `type3-ieee802.3bt` - 802.3bt (Type 3)\n* `type4-ieee802.3bt` - 802.3bt (Type 4)\n* `passive-24v-2pair` - Passive 24V (2-pair)\n* `passive-24v-4pair` - Passive 24V (4-pair)\n* `passive-48v-2pair` - Passive 48V (2-pair)\n* `passive-48v-4pair` - Passive 48V (4-pair)",
+ "x-spec-enum-id": "74bd3be4012f6da9",
+ "nullable": true
+ },
+ "rf_role": {
+ "enum": [
+ "ap",
+ "station",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `ap` - Access point\n* `station` - Station",
+ "x-spec-enum-id": "d2772dbea88b0fb1",
+ "nullable": true
+ }
+ },
+ "required": [
+ "name",
+ "type"
+ ]
+ },
+ "InventoryItem": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device": {
+ "$ref": "#/components/schemas/BriefDevice"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "2217e87d0c3efdda"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Offline",
+ "Active",
+ "Planned",
+ "Staged",
+ "Failed",
+ "Decommissioning"
+ ]
+ }
+ }
+ },
+ "role": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefInventoryItemRole"
+ }
+ ],
+ "nullable": true
+ },
+ "manufacturer": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefManufacturer"
+ }
+ ],
+ "nullable": true
+ },
+ "part_id": {
+ "type": "string",
+ "description": "Manufacturer-assigned part identifier",
+ "maxLength": 50
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this item",
+ "maxLength": 50
+ },
+ "discovered": {
+ "type": "boolean",
+ "description": "This item was automatically discovered"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "component_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "component_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "component": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "component",
+ "created",
+ "device",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "InventoryItemRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "status": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "2217e87d0c3efdda"
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefInventoryItemRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "part_id": {
+ "type": "string",
+ "description": "Manufacturer-assigned part identifier",
+ "maxLength": 50
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this item",
+ "maxLength": 50
+ },
+ "discovered": {
+ "type": "boolean",
+ "description": "This item was automatically discovered"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "component_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "component_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name"
+ ]
+ },
+ "InventoryItemRole": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "inventoryitem_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "inventoryitem_count",
+ "last_updated",
+ "name",
+ "slug",
+ "url"
+ ]
+ },
+ "InventoryItemRoleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "color": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "InventoryItemTemplate": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device_type": {
+ "$ref": "#/components/schemas/BriefDeviceType"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "role": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefInventoryItemRole"
+ }
+ ],
+ "nullable": true
+ },
+ "manufacturer": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefManufacturer"
+ }
+ ],
+ "nullable": true
+ },
+ "part_id": {
+ "type": "string",
+ "description": "Manufacturer-assigned part identifier",
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "component_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "component_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "component": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "component",
+ "created",
+ "device_type",
+ "display",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "InventoryItemTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ]
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefInventoryItemRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "part_id": {
+ "type": "string",
+ "description": "Manufacturer-assigned part identifier",
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "component_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "component_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ }
+ },
+ "required": [
+ "device_type",
+ "name"
+ ]
+ },
+ "Job": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "object_type": {
+ "type": "string",
+ "readOnly": true
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "pending",
+ "scheduled",
+ "running",
+ "completed",
+ "errored",
+ "failed"
+ ],
+ "type": "string",
+ "description": "* `pending` - Pending\n* `scheduled` - Scheduled\n* `running` - Running\n* `completed` - Completed\n* `errored` - Errored\n* `failed` - Failed",
+ "x-spec-enum-id": "e33887d83efcc138"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Pending",
+ "Scheduled",
+ "Running",
+ "Completed",
+ "Errored",
+ "Failed"
+ ]
+ }
+ },
+ "readOnly": true
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true
+ },
+ "scheduled": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "interval": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Recurrence interval (in minutes)"
+ },
+ "started": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "completed": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "user": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefUser"
+ }
+ ],
+ "readOnly": true
+ },
+ "data": {
+ "nullable": true
+ },
+ "error": {
+ "type": "string",
+ "readOnly": true
+ },
+ "job_id": {
+ "type": "string",
+ "format": "uuid"
+ },
+ "log_entries": {
+ "type": "array",
+ "items": {}
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "error",
+ "id",
+ "job_id",
+ "name",
+ "object_type",
+ "status",
+ "url",
+ "user"
+ ]
+ },
+ "JournalEntry": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "assigned_object_type": {
+ "type": "string"
+ },
+ "assigned_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "assigned_object": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "created_by": {
+ "type": "integer",
+ "nullable": true
+ },
+ "kind": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "info",
+ "success",
+ "warning",
+ "danger"
+ ],
+ "type": "string",
+ "description": "* `info` - Info\n* `success` - Success\n* `warning` - Warning\n* `danger` - Danger",
+ "x-spec-enum-id": "a21af280f632fa34"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Info",
+ "Success",
+ "Warning",
+ "Danger"
+ ]
+ }
+ }
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "assigned_object",
+ "assigned_object_id",
+ "assigned_object_type",
+ "comments",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "url"
+ ]
+ },
+ "JournalEntryRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "assigned_object_type": {
+ "type": "string"
+ },
+ "assigned_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "created_by": {
+ "type": "integer",
+ "nullable": true
+ },
+ "kind": {
+ "enum": [
+ "info",
+ "success",
+ "warning",
+ "danger"
+ ],
+ "type": "string",
+ "description": "* `info` - Info\n* `success` - Success\n* `warning` - Warning\n* `danger` - Danger",
+ "x-spec-enum-id": "a21af280f632fa34"
+ },
+ "comments": {
+ "type": "string",
+ "minLength": 1
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "assigned_object_id",
+ "assigned_object_type",
+ "comments"
+ ]
+ },
+ "L2VPN": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "identifier": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": -9223372036854775808,
+ "format": "int64",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "vpws",
+ "vpls",
+ "vxlan",
+ "vxlan-evpn",
+ "mpls-evpn",
+ "pbb-evpn",
+ "evpn-vpws",
+ "epl",
+ "evpl",
+ "ep-lan",
+ "evp-lan",
+ "ep-tree",
+ "evp-tree",
+ "spb"
+ ],
+ "type": "string",
+ "description": "* `vpws` - VPWS\n* `vpls` - VPLS\n* `vxlan` - VXLAN\n* `vxlan-evpn` - VXLAN-EVPN\n* `mpls-evpn` - MPLS EVPN\n* `pbb-evpn` - PBB EVPN\n* `evpn-vpws` - EVPN VPWS\n* `epl` - EPL\n* `evpl` - EVPL\n* `ep-lan` - Ethernet Private LAN\n* `evp-lan` - Ethernet Virtual Private LAN\n* `ep-tree` - Ethernet Private Tree\n* `evp-tree` - Ethernet Virtual Private Tree\n* `spb` - SPB",
+ "x-spec-enum-id": "730136816a2885f9"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "VPWS",
+ "VPLS",
+ "VXLAN",
+ "VXLAN-EVPN",
+ "MPLS EVPN",
+ "PBB EVPN",
+ "EVPN VPWS",
+ "EPL",
+ "EVPL",
+ "Ethernet Private LAN",
+ "Ethernet Virtual Private LAN",
+ "Ethernet Private Tree",
+ "Ethernet Virtual Private Tree",
+ "SPB"
+ ]
+ }
+ }
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "active",
+ "planned",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `planned` - Planned\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "937bacafb9d5d4bb"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Active",
+ "Planned",
+ "Decommissioning"
+ ]
+ }
+ }
+ },
+ "import_targets": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RouteTarget"
+ }
+ },
+ "export_targets": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RouteTarget"
+ }
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "slug",
+ "url"
+ ]
+ },
+ "L2VPNRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "identifier": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": -9223372036854775808,
+ "format": "int64",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "type": {
+ "enum": [
+ "vpws",
+ "vpls",
+ "vxlan",
+ "vxlan-evpn",
+ "mpls-evpn",
+ "pbb-evpn",
+ "evpn-vpws",
+ "epl",
+ "evpl",
+ "ep-lan",
+ "evp-lan",
+ "ep-tree",
+ "evp-tree",
+ "spb"
+ ],
+ "type": "string",
+ "description": "* `vpws` - VPWS\n* `vpls` - VPLS\n* `vxlan` - VXLAN\n* `vxlan-evpn` - VXLAN-EVPN\n* `mpls-evpn` - MPLS EVPN\n* `pbb-evpn` - PBB EVPN\n* `evpn-vpws` - EVPN VPWS\n* `epl` - EPL\n* `evpl` - EVPL\n* `ep-lan` - Ethernet Private LAN\n* `evp-lan` - Ethernet Virtual Private LAN\n* `ep-tree` - Ethernet Private Tree\n* `evp-tree` - Ethernet Virtual Private Tree\n* `spb` - SPB",
+ "x-spec-enum-id": "730136816a2885f9"
+ },
+ "status": {
+ "enum": [
+ "active",
+ "planned",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `planned` - Planned\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "937bacafb9d5d4bb"
+ },
+ "import_targets": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "export_targets": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "L2VPNTermination": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "l2vpn": {
+ "$ref": "#/components/schemas/BriefL2VPN"
+ },
+ "assigned_object_type": {
+ "type": "string"
+ },
+ "assigned_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "assigned_object": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "assigned_object",
+ "assigned_object_id",
+ "assigned_object_type",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "l2vpn",
+ "last_updated",
+ "url"
+ ]
+ },
+ "L2VPNTerminationRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "l2vpn": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefL2VPNRequest"
+ }
+ ]
+ },
+ "assigned_object_type": {
+ "type": "string"
+ },
+ "assigned_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "assigned_object_id",
+ "assigned_object_type",
+ "l2vpn"
+ ]
+ },
+ "Location": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "site": {
+ "$ref": "#/components/schemas/BriefSite"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedLocation"
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "planned",
+ "staging",
+ "active",
+ "decommissioning",
+ "retired"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `staging` - Staging\n* `active` - Active\n* `decommissioning` - Decommissioning\n* `retired` - Retired",
+ "x-spec-enum-id": "e363a8ddb138be50"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Planned",
+ "Staging",
+ "Active",
+ "Decommissioning",
+ "Retired"
+ ]
+ }
+ }
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "facility": {
+ "type": "string",
+ "description": "Local facility ID or description",
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "rack_count": {
+ "type": "integer",
+ "readOnly": true,
+ "default": 0
+ },
+ "device_count": {
+ "type": "integer",
+ "readOnly": true,
+ "default": 0
+ },
+ "prefix_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "created",
+ "device_count",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "prefix_count",
+ "rack_count",
+ "site",
+ "slug",
+ "url"
+ ]
+ },
+ "LocationRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ]
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedLocationRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "staging",
+ "active",
+ "decommissioning",
+ "retired"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `staging` - Staging\n* `active` - Active\n* `decommissioning` - Decommissioning\n* `retired` - Retired",
+ "x-spec-enum-id": "e363a8ddb138be50"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "facility": {
+ "type": "string",
+ "description": "Local facility ID or description",
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "site",
+ "slug"
+ ]
+ },
+ "MACAddress": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "mac_address": {
+ "type": "string"
+ },
+ "assigned_object_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "assigned_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "assigned_object": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "assigned_object",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "mac_address",
+ "url"
+ ]
+ },
+ "MACAddressRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "mac_address": {
+ "type": "string"
+ },
+ "assigned_object_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "assigned_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "mac_address"
+ ]
+ },
+ "Manufacturer": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "devicetype_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "inventoryitem_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "platform_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "devicetype_count",
+ "display",
+ "display_url",
+ "id",
+ "inventoryitem_count",
+ "last_updated",
+ "name",
+ "platform_count",
+ "slug",
+ "url"
+ ]
+ },
+ "ManufacturerRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "Module": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device": {
+ "$ref": "#/components/schemas/BriefDevice"
+ },
+ "module_bay": {
+ "$ref": "#/components/schemas/NestedModuleBay"
+ },
+ "module_type": {
+ "$ref": "#/components/schemas/BriefModuleType"
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "2217e87d0c3efdda"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Offline",
+ "Active",
+ "Planned",
+ "Staged",
+ "Failed",
+ "Decommissioning"
+ ]
+ }
+ }
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this device",
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "device",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "module_bay",
+ "module_type",
+ "url"
+ ]
+ },
+ "ModuleBay": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device": {
+ "$ref": "#/components/schemas/BriefDevice"
+ },
+ "module": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModule"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "installed_module": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModule"
+ }
+ ],
+ "nullable": true
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "position": {
+ "type": "string",
+ "description": "Identifier to reference when renaming installed components",
+ "maxLength": 30
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "device",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "ModuleBayRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "installed_module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "position": {
+ "type": "string",
+ "description": "Identifier to reference when renaming installed components",
+ "maxLength": 30
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name"
+ ]
+ },
+ "ModuleBayTemplate": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceType"
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleType"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "position": {
+ "type": "string",
+ "description": "Identifier to reference when renaming installed components",
+ "maxLength": 30
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "ModuleBayTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "position": {
+ "type": "string",
+ "description": "Identifier to reference when renaming installed components",
+ "maxLength": 30
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "ModuleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module_bay": {
+ "$ref": "#/components/schemas/NestedModuleBayRequest"
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ]
+ },
+ "status": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "2217e87d0c3efdda"
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this device",
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "module_bay",
+ "module_type"
+ ]
+ },
+ "ModuleType": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "profile": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeProfile"
+ }
+ ],
+ "nullable": true
+ },
+ "manufacturer": {
+ "$ref": "#/components/schemas/BriefManufacturer"
+ },
+ "model": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "part_number": {
+ "type": "string",
+ "description": "Discrete part number (optional)",
+ "maxLength": 50
+ },
+ "airflow": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ "left-to-right",
+ "right-to-left",
+ "side-to-rear",
+ "passive",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front\n* `left-to-right` - Left to right\n* `right-to-left` - Right to left\n* `side-to-rear` - Side to rear\n* `passive` - Passive",
+ "x-spec-enum-id": "f6e5562e0e98d69d"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Front to rear",
+ "Rear to front",
+ "Left to right",
+ "Right to left",
+ "Side to rear",
+ "Passive"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "weight_unit": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Kilograms",
+ "Grams",
+ "Pounds",
+ "Ounces"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "attributes": {
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "manufacturer",
+ "model",
+ "url"
+ ]
+ },
+ "ModuleTypeProfile": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "schema": {
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "ModuleTypeProfileRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "schema": {
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "ModuleTypeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "profile": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeProfileRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "part_number": {
+ "type": "string",
+ "description": "Discrete part number (optional)",
+ "maxLength": 50
+ },
+ "airflow": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ "left-to-right",
+ "right-to-left",
+ "side-to-rear",
+ "passive",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front\n* `left-to-right` - Left to right\n* `right-to-left` - Right to left\n* `side-to-rear` - Side to rear\n* `passive` - Passive",
+ "x-spec-enum-id": "f6e5562e0e98d69d",
+ "nullable": true
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "weight_unit": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "attributes": {
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "manufacturer",
+ "model"
+ ]
+ },
+ "NestedContactGroup": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "slug",
+ "url"
+ ]
+ },
+ "NestedContactGroupRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "NestedDevice": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "maxLength": 64
+ }
+ },
+ "required": [
+ "display",
+ "display_url",
+ "id",
+ "url"
+ ]
+ },
+ "NestedDeviceRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "maxLength": 64
+ }
+ }
+ },
+ "NestedDeviceRole": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ }
+ },
+ "required": [
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "url"
+ ]
+ },
+ "NestedDeviceRoleRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "NestedGroup": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 150
+ }
+ },
+ "required": [
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "url"
+ ]
+ },
+ "NestedIPAddress": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "family": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "address": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "address",
+ "display",
+ "display_url",
+ "family",
+ "id",
+ "url"
+ ]
+ },
+ "NestedIPAddressRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "address": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "address"
+ ]
+ },
+ "NestedInterface": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedDevice"
+ }
+ ],
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "cable": {
+ "type": "integer",
+ "nullable": true
+ },
+ "_occupied": {
+ "type": "boolean",
+ "readOnly": true,
+ "title": " occupied"
+ }
+ },
+ "required": [
+ "_occupied",
+ "device",
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "url"
+ ]
+ },
+ "NestedInterfaceRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "cable": {
+ "type": "integer",
+ "nullable": true
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "NestedInterfaceTemplate": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ }
+ },
+ "required": [
+ "display",
+ "id",
+ "name",
+ "url"
+ ]
+ },
+ "NestedInterfaceTemplateRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "NestedLocation": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "slug",
+ "url"
+ ]
+ },
+ "NestedLocationRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "NestedModuleBay": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ }
+ },
+ "required": [
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "url"
+ ]
+ },
+ "NestedModuleBayRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "NestedPlatform": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ }
+ },
+ "required": [
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "url"
+ ]
+ },
+ "NestedPlatformRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "NestedProviderAccount": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "account": {
+ "type": "string",
+ "title": "Account ID",
+ "maxLength": 100
+ }
+ },
+ "required": [
+ "account",
+ "display",
+ "display_url",
+ "id",
+ "url"
+ ]
+ },
+ "NestedRegion": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "slug",
+ "url"
+ ]
+ },
+ "NestedRegionRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "NestedSiteGroup": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "slug",
+ "url"
+ ]
+ },
+ "NestedSiteGroupRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "NestedTag": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "pattern": "^[-\\w]+$",
+ "maxLength": 100
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ }
+ },
+ "required": [
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "slug",
+ "url"
+ ]
+ },
+ "NestedTagRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[-\\w]+$",
+ "maxLength": 100
+ },
+ "color": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "NestedTenantGroup": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "slug",
+ "url"
+ ]
+ },
+ "NestedTenantGroupRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "NestedUser": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "username": {
+ "type": "string",
+ "description": "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
+ "pattern": "^[\\w.@+-]+$",
+ "maxLength": 150
+ }
+ },
+ "required": [
+ "display",
+ "display_url",
+ "id",
+ "url",
+ "username"
+ ]
+ },
+ "NestedVLAN": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "vid": {
+ "type": "integer",
+ "maximum": 4094,
+ "minimum": 1,
+ "title": "VLAN ID",
+ "description": "Numeric VLAN ID (1-4094)"
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "display",
+ "id",
+ "name",
+ "url",
+ "vid"
+ ]
+ },
+ "NestedVLANRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "vid": {
+ "type": "integer",
+ "maximum": 4094,
+ "minimum": 1,
+ "title": "VLAN ID",
+ "description": "Numeric VLAN ID (1-4094)"
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name",
+ "vid"
+ ]
+ },
+ "NestedVMInterface": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "virtual_machine": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedVirtualMachine"
+ }
+ ],
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ }
+ },
+ "required": [
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "url",
+ "virtual_machine"
+ ]
+ },
+ "NestedVMInterfaceRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "NestedVirtualMachine": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ }
+ },
+ "required": [
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "url"
+ ]
+ },
+ "NestedVirtualMachineRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "NestedWirelessLANGroup": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "slug",
+ "url"
+ ]
+ },
+ "NestedWirelessLANGroupRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "NestedWirelessLink": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "ssid": {
+ "type": "string",
+ "maxLength": 32
+ }
+ },
+ "required": [
+ "display",
+ "display_url",
+ "id",
+ "url"
+ ]
+ },
+ "NestedWirelessLinkRequest": {
+ "type": "object",
+ "description": "Represents an object related through a ForeignKey field. On write, it accepts a primary key (PK) value or a\ndictionary of attributes which can be used to uniquely identify the related object. This class should be\nsubclassed to return a full representation of the related object on read.",
+ "properties": {
+ "ssid": {
+ "type": "string",
+ "maxLength": 32
+ }
+ }
+ },
+ "Notification": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "object": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "user": {
+ "$ref": "#/components/schemas/BriefUser"
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true
+ },
+ "read": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "event_type": {
+ "enum": [
+ "object_created",
+ "object_updated",
+ "object_deleted",
+ "job_started",
+ "job_completed",
+ "job_failed",
+ "job_errored"
+ ],
+ "type": "string",
+ "description": "* `object_created` - Object created\n* `object_updated` - Object updated\n* `object_deleted` - Object deleted\n* `job_started` - Job started\n* `job_completed` - Job completed\n* `job_failed` - Job failed\n* `job_errored` - Job errored",
+ "x-spec-enum-id": "80d172232f4af424",
+ "title": "Event"
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "event_type",
+ "id",
+ "object",
+ "object_id",
+ "object_type",
+ "url",
+ "user"
+ ]
+ },
+ "NotificationGroup": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "groups": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Group"
+ }
+ },
+ "users": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/User"
+ }
+ }
+ },
+ "required": [
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "url"
+ ]
+ },
+ "NotificationGroupRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "groups": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "users": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "NotificationRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "user": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefUserRequest"
+ }
+ ]
+ },
+ "read": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "event_type": {
+ "enum": [
+ "object_created",
+ "object_updated",
+ "object_deleted",
+ "job_started",
+ "job_completed",
+ "job_failed",
+ "job_errored"
+ ],
+ "type": "string",
+ "description": "* `object_created` - Object created\n* `object_updated` - Object updated\n* `object_deleted` - Object deleted\n* `job_started` - Job started\n* `job_completed` - Job completed\n* `job_failed` - Job failed\n* `job_errored` - Job errored",
+ "x-spec-enum-id": "80d172232f4af424",
+ "title": "Event"
+ }
+ },
+ "required": [
+ "event_type",
+ "object_id",
+ "object_type",
+ "user"
+ ]
+ },
+ "ObjectChange": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "time": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true
+ },
+ "user": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefUser"
+ }
+ ],
+ "readOnly": true
+ },
+ "user_name": {
+ "type": "string",
+ "readOnly": true
+ },
+ "request_id": {
+ "type": "string",
+ "format": "uuid",
+ "readOnly": true
+ },
+ "action": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "create",
+ "update",
+ "delete"
+ ],
+ "type": "string",
+ "description": "* `create` - Created\n* `update` - Updated\n* `delete` - Deleted",
+ "x-spec-enum-id": "544f9b3b28b7ce6a"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Created",
+ "Updated",
+ "Deleted"
+ ]
+ }
+ },
+ "readOnly": true
+ },
+ "changed_object_type": {
+ "type": "string",
+ "readOnly": true
+ },
+ "changed_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "changed_object": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "message": {
+ "type": "string",
+ "readOnly": true
+ },
+ "prechange_data": {
+ "readOnly": true,
+ "nullable": true
+ },
+ "postchange_data": {
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "action",
+ "changed_object",
+ "changed_object_id",
+ "changed_object_type",
+ "display",
+ "display_url",
+ "id",
+ "message",
+ "postchange_data",
+ "prechange_data",
+ "request_id",
+ "time",
+ "url",
+ "user",
+ "user_name"
+ ]
+ },
+ "ObjectPermission": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "actions": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 30
+ },
+ "description": "The list of actions granted by this permission"
+ },
+ "constraints": {
+ "nullable": true,
+ "description": "Queryset filter matching the applicable objects of the selected type(s)"
+ },
+ "groups": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedGroup"
+ }
+ },
+ "users": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedUser"
+ }
+ }
+ },
+ "required": [
+ "actions",
+ "display",
+ "display_url",
+ "id",
+ "name",
+ "object_types",
+ "url"
+ ]
+ },
+ "ObjectPermissionRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "actions": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 30
+ },
+ "description": "The list of actions granted by this permission"
+ },
+ "constraints": {
+ "nullable": true,
+ "description": "Queryset filter matching the applicable objects of the selected type(s)"
+ },
+ "groups": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "users": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ },
+ "required": [
+ "actions",
+ "name",
+ "object_types"
+ ]
+ },
+ "ObjectType": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "app_label": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "app_name": {
+ "type": "string",
+ "readOnly": true
+ },
+ "model": {
+ "type": "string",
+ "title": "Python model class name",
+ "maxLength": 100
+ },
+ "model_name": {
+ "type": "string",
+ "readOnly": true
+ },
+ "model_name_plural": {
+ "type": "string",
+ "readOnly": true
+ },
+ "public": {
+ "type": "boolean",
+ "readOnly": true
+ },
+ "features": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 50
+ },
+ "readOnly": true
+ },
+ "is_plugin_model": {
+ "type": "boolean",
+ "readOnly": true
+ },
+ "rest_api_endpoint": {
+ "type": "string",
+ "readOnly": true
+ },
+ "description": {
+ "type": "string",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "app_label",
+ "app_name",
+ "description",
+ "display",
+ "features",
+ "id",
+ "is_plugin_model",
+ "model",
+ "model_name",
+ "model_name_plural",
+ "public",
+ "rest_api_endpoint",
+ "url"
+ ]
+ },
+ "PaginatedASNList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ASN"
+ }
+ }
+ }
+ },
+ "PaginatedASNRangeList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ASNRange"
+ }
+ }
+ }
+ },
+ "PaginatedAggregateList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Aggregate"
+ }
+ }
+ }
+ },
+ "PaginatedBookmarkList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Bookmark"
+ }
+ }
+ }
+ },
+ "PaginatedCableList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Cable"
+ }
+ }
+ }
+ },
+ "PaginatedCableTerminationList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CableTermination"
+ }
+ }
+ }
+ },
+ "PaginatedCircuitGroupAssignmentList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CircuitGroupAssignment"
+ }
+ }
+ }
+ },
+ "PaginatedCircuitGroupList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CircuitGroup"
+ }
+ }
+ }
+ },
+ "PaginatedCircuitList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Circuit"
+ }
+ }
+ }
+ },
+ "PaginatedCircuitTerminationList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CircuitTermination"
+ }
+ }
+ }
+ },
+ "PaginatedCircuitTypeList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CircuitType"
+ }
+ }
+ }
+ },
+ "PaginatedClusterGroupList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ClusterGroup"
+ }
+ }
+ }
+ },
+ "PaginatedClusterList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Cluster"
+ }
+ }
+ }
+ },
+ "PaginatedClusterTypeList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ClusterType"
+ }
+ }
+ }
+ },
+ "PaginatedConfigContextList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ConfigContext"
+ }
+ }
+ }
+ },
+ "PaginatedConfigContextProfileList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ConfigContextProfile"
+ }
+ }
+ }
+ },
+ "PaginatedConfigTemplateList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ConfigTemplate"
+ }
+ }
+ }
+ },
+ "PaginatedConsolePortList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ConsolePort"
+ }
+ }
+ }
+ },
+ "PaginatedConsolePortTemplateList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ConsolePortTemplate"
+ }
+ }
+ }
+ },
+ "PaginatedConsoleServerPortList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ConsoleServerPort"
+ }
+ }
+ }
+ },
+ "PaginatedConsoleServerPortTemplateList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ConsoleServerPortTemplate"
+ }
+ }
+ }
+ },
+ "PaginatedContactAssignmentList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ContactAssignment"
+ }
+ }
+ }
+ },
+ "PaginatedContactGroupList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ContactGroup"
+ }
+ }
+ }
+ },
+ "PaginatedContactList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Contact"
+ }
+ }
+ }
+ },
+ "PaginatedContactRoleList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ContactRole"
+ }
+ }
+ }
+ },
+ "PaginatedCustomFieldChoiceSetList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CustomFieldChoiceSet"
+ }
+ }
+ }
+ },
+ "PaginatedCustomFieldList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CustomField"
+ }
+ }
+ }
+ },
+ "PaginatedCustomLinkList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/CustomLink"
+ }
+ }
+ }
+ },
+ "PaginatedDataFileList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/DataFile"
+ }
+ }
+ }
+ },
+ "PaginatedDataSourceList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/DataSource"
+ }
+ }
+ }
+ },
+ "PaginatedDeviceBayList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/DeviceBay"
+ }
+ }
+ }
+ },
+ "PaginatedDeviceBayTemplateList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/DeviceBayTemplate"
+ }
+ }
+ }
+ },
+ "PaginatedDeviceRoleList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/DeviceRole"
+ }
+ }
+ }
+ },
+ "PaginatedDeviceTypeList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/DeviceType"
+ }
+ }
+ }
+ },
+ "PaginatedDeviceWithConfigContextList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/DeviceWithConfigContext"
+ }
+ }
+ }
+ },
+ "PaginatedEventRuleList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/EventRule"
+ }
+ }
+ }
+ },
+ "PaginatedExportTemplateList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ExportTemplate"
+ }
+ }
+ }
+ },
+ "PaginatedFHRPGroupAssignmentList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/FHRPGroupAssignment"
+ }
+ }
+ }
+ },
+ "PaginatedFHRPGroupList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/FHRPGroup"
+ }
+ }
+ }
+ },
+ "PaginatedFrontPortList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/FrontPort"
+ }
+ }
+ }
+ },
+ "PaginatedFrontPortTemplateList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/FrontPortTemplate"
+ }
+ }
+ }
+ },
+ "PaginatedGroupList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Group"
+ }
+ }
+ }
+ },
+ "PaginatedIKEPolicyList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/IKEPolicy"
+ }
+ }
+ }
+ },
+ "PaginatedIKEProposalList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/IKEProposal"
+ }
+ }
+ }
+ },
+ "PaginatedIPAddressList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/IPAddress"
+ }
+ }
+ }
+ },
+ "PaginatedIPRangeList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/IPRange"
+ }
+ }
+ }
+ },
+ "PaginatedIPSecPolicyList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/IPSecPolicy"
+ }
+ }
+ }
+ },
+ "PaginatedIPSecProfileList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/IPSecProfile"
+ }
+ }
+ }
+ },
+ "PaginatedIPSecProposalList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/IPSecProposal"
+ }
+ }
+ }
+ },
+ "PaginatedImageAttachmentList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ImageAttachment"
+ }
+ }
+ }
+ },
+ "PaginatedInterfaceList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Interface"
+ }
+ }
+ }
+ },
+ "PaginatedInterfaceTemplateList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/InterfaceTemplate"
+ }
+ }
+ }
+ },
+ "PaginatedInventoryItemList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/InventoryItem"
+ }
+ }
+ }
+ },
+ "PaginatedInventoryItemRoleList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/InventoryItemRole"
+ }
+ }
+ }
+ },
+ "PaginatedInventoryItemTemplateList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/InventoryItemTemplate"
+ }
+ }
+ }
+ },
+ "PaginatedJobList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Job"
+ }
+ }
+ }
+ },
+ "PaginatedJournalEntryList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/JournalEntry"
+ }
+ }
+ }
+ },
+ "PaginatedL2VPNList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/L2VPN"
+ }
+ }
+ }
+ },
+ "PaginatedL2VPNTerminationList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/L2VPNTermination"
+ }
+ }
+ }
+ },
+ "PaginatedLocationList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Location"
+ }
+ }
+ }
+ },
+ "PaginatedMACAddressList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/MACAddress"
+ }
+ }
+ }
+ },
+ "PaginatedManufacturerList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Manufacturer"
+ }
+ }
+ }
+ },
+ "PaginatedModuleBayList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ModuleBay"
+ }
+ }
+ }
+ },
+ "PaginatedModuleBayTemplateList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ModuleBayTemplate"
+ }
+ }
+ }
+ },
+ "PaginatedModuleList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Module"
+ }
+ }
+ }
+ },
+ "PaginatedModuleTypeList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ModuleType"
+ }
+ }
+ }
+ },
+ "PaginatedModuleTypeProfileList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ModuleTypeProfile"
+ }
+ }
+ }
+ },
+ "PaginatedNotificationGroupList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NotificationGroup"
+ }
+ }
+ }
+ },
+ "PaginatedNotificationList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Notification"
+ }
+ }
+ }
+ },
+ "PaginatedObjectChangeList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ObjectChange"
+ }
+ }
+ }
+ },
+ "PaginatedObjectPermissionList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ObjectPermission"
+ }
+ }
+ }
+ },
+ "PaginatedObjectTypeList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ObjectType"
+ }
+ }
+ }
+ },
+ "PaginatedPlatformList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Platform"
+ }
+ }
+ }
+ },
+ "PaginatedPowerFeedList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/PowerFeed"
+ }
+ }
+ }
+ },
+ "PaginatedPowerOutletList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/PowerOutlet"
+ }
+ }
+ }
+ },
+ "PaginatedPowerOutletTemplateList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/PowerOutletTemplate"
+ }
+ }
+ }
+ },
+ "PaginatedPowerPanelList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/PowerPanel"
+ }
+ }
+ }
+ },
+ "PaginatedPowerPortList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/PowerPort"
+ }
+ }
+ }
+ },
+ "PaginatedPowerPortTemplateList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/PowerPortTemplate"
+ }
+ }
+ }
+ },
+ "PaginatedPrefixList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Prefix"
+ }
+ }
+ }
+ },
+ "PaginatedProviderAccountList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ProviderAccount"
+ }
+ }
+ }
+ },
+ "PaginatedProviderList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Provider"
+ }
+ }
+ }
+ },
+ "PaginatedProviderNetworkList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ProviderNetwork"
+ }
+ }
+ }
+ },
+ "PaginatedRIRList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RIR"
+ }
+ }
+ }
+ },
+ "PaginatedRackList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Rack"
+ }
+ }
+ }
+ },
+ "PaginatedRackReservationList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RackReservation"
+ }
+ }
+ }
+ },
+ "PaginatedRackRoleList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RackRole"
+ }
+ }
+ }
+ },
+ "PaginatedRackTypeList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RackType"
+ }
+ }
+ }
+ },
+ "PaginatedRackUnitList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RackUnit"
+ }
+ }
+ }
+ },
+ "PaginatedRearPortList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RearPort"
+ }
+ }
+ }
+ },
+ "PaginatedRearPortTemplateList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RearPortTemplate"
+ }
+ }
+ }
+ },
+ "PaginatedRegionList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Region"
+ }
+ }
+ }
+ },
+ "PaginatedRoleList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Role"
+ }
+ }
+ }
+ },
+ "PaginatedRouteTargetList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RouteTarget"
+ }
+ }
+ }
+ },
+ "PaginatedSavedFilterList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SavedFilter"
+ }
+ }
+ }
+ },
+ "PaginatedScriptList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Script"
+ }
+ }
+ }
+ },
+ "PaginatedServiceList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Service"
+ }
+ }
+ }
+ },
+ "PaginatedServiceTemplateList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ServiceTemplate"
+ }
+ }
+ }
+ },
+ "PaginatedSiteGroupList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/SiteGroup"
+ }
+ }
+ }
+ },
+ "PaginatedSiteList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Site"
+ }
+ }
+ }
+ },
+ "PaginatedSubscriptionList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Subscription"
+ }
+ }
+ }
+ },
+ "PaginatedTableConfigList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TableConfig"
+ }
+ }
+ }
+ },
+ "PaginatedTagList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Tag"
+ }
+ }
+ }
+ },
+ "PaginatedTaggedItemList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TaggedItem"
+ }
+ }
+ }
+ },
+ "PaginatedTenantGroupList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TenantGroup"
+ }
+ }
+ }
+ },
+ "PaginatedTenantList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Tenant"
+ }
+ }
+ }
+ },
+ "PaginatedTokenList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Token"
+ }
+ }
+ }
+ },
+ "PaginatedTunnelGroupList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TunnelGroup"
+ }
+ }
+ }
+ },
+ "PaginatedTunnelList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Tunnel"
+ }
+ }
+ }
+ },
+ "PaginatedTunnelTerminationList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/TunnelTermination"
+ }
+ }
+ }
+ },
+ "PaginatedUserList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/User"
+ }
+ }
+ }
+ },
+ "PaginatedVLANGroupList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VLANGroup"
+ }
+ }
+ }
+ },
+ "PaginatedVLANList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VLAN"
+ }
+ }
+ }
+ },
+ "PaginatedVLANTranslationPolicyList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VLANTranslationPolicy"
+ }
+ }
+ }
+ },
+ "PaginatedVLANTranslationRuleList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VLANTranslationRule"
+ }
+ }
+ }
+ },
+ "PaginatedVMInterfaceList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VMInterface"
+ }
+ }
+ }
+ },
+ "PaginatedVRFList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VRF"
+ }
+ }
+ }
+ },
+ "PaginatedVirtualChassisList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VirtualChassis"
+ }
+ }
+ }
+ },
+ "PaginatedVirtualCircuitList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VirtualCircuit"
+ }
+ }
+ }
+ },
+ "PaginatedVirtualCircuitTerminationList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VirtualCircuitTermination"
+ }
+ }
+ }
+ },
+ "PaginatedVirtualCircuitTypeList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VirtualCircuitType"
+ }
+ }
+ }
+ },
+ "PaginatedVirtualDeviceContextList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VirtualDeviceContext"
+ }
+ }
+ }
+ },
+ "PaginatedVirtualDiskList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VirtualDisk"
+ }
+ }
+ }
+ },
+ "PaginatedVirtualMachineWithConfigContextList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VirtualMachineWithConfigContext"
+ }
+ }
+ }
+ },
+ "PaginatedWebhookList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Webhook"
+ }
+ }
+ }
+ },
+ "PaginatedWirelessLANGroupList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/WirelessLANGroup"
+ }
+ }
+ }
+ },
+ "PaginatedWirelessLANList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/WirelessLAN"
+ }
+ }
+ }
+ },
+ "PaginatedWirelessLinkList": {
+ "type": "object",
+ "required": [
+ "count",
+ "results"
+ ],
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 123
+ },
+ "next": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=400&limit=100"
+ },
+ "previous": {
+ "type": "string",
+ "nullable": true,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?offset=200&limit=100"
+ },
+ "results": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/WirelessLink"
+ }
+ }
+ }
+ },
+ "PatchedASNRangeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "rir": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefRIRRequest"
+ }
+ ]
+ },
+ "start": {
+ "type": "integer",
+ "maximum": 4294967295,
+ "minimum": 1,
+ "format": "int64"
+ },
+ "end": {
+ "type": "integer",
+ "maximum": 4294967295,
+ "minimum": 1,
+ "format": "int64"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedASNRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "asn": {
+ "type": "integer",
+ "maximum": 4294967295,
+ "minimum": 1,
+ "format": "int64",
+ "description": "16- or 32-bit autonomous system number"
+ },
+ "rir": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRIRRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedBookmarkRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "user": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefUserRequest"
+ }
+ ]
+ }
+ }
+ },
+ "PatchedCableTerminationRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "cable": {
+ "type": "integer"
+ },
+ "cable_end": {
+ "enum": [
+ "A",
+ "B"
+ ],
+ "type": "string",
+ "description": "* `A` - A\n* `B` - B",
+ "x-spec-enum-id": "1db84f9b93b261c8",
+ "title": "End"
+ },
+ "termination_type": {
+ "type": "string"
+ },
+ "termination_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ }
+ }
+ },
+ "PatchedCircuitGroupRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedCircuitTerminationRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "circuit": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefCircuitRequest"
+ }
+ ]
+ },
+ "term_side": {
+ "enum": [
+ "A",
+ "Z"
+ ],
+ "type": "string",
+ "description": "* `A` - A\n* `Z` - Z",
+ "x-spec-enum-id": "95b8fcc737f355d0",
+ "title": "Termination side"
+ },
+ "termination_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "termination_id": {
+ "type": "integer",
+ "nullable": true
+ },
+ "port_speed": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Port speed (Kbps)",
+ "description": "Physical circuit speed"
+ },
+ "upstream_speed": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Upstream speed (Kbps)",
+ "description": "Upstream speed, if different from port speed"
+ },
+ "xconnect_id": {
+ "type": "string",
+ "title": "Cross-connect ID",
+ "description": "ID of the local cross-connect",
+ "maxLength": 50
+ },
+ "pp_info": {
+ "type": "string",
+ "title": "Patch panel/port(s)",
+ "description": "Patch panel ID and port number(s)",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedCircuitTypeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedClusterGroupRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedClusterTypeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedConfigContextProfileRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "schema": {
+ "nullable": true,
+ "description": "A JSON schema specifying the structure of the context data for this profile"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "comments": {
+ "type": "string"
+ },
+ "data_source": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDataSourceRequest"
+ }
+ ]
+ }
+ }
+ },
+ "PatchedConfigContextRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "profile": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigContextProfileRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "is_active": {
+ "type": "boolean"
+ },
+ "regions": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "site_groups": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "sites": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "locations": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "device_types": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "roles": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "platforms": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "cluster_types": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "cluster_groups": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "clusters": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "tenant_groups": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "tenants": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "minLength": 1
+ }
+ },
+ "data_source": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDataSourceRequest"
+ }
+ ]
+ },
+ "data": {}
+ }
+ },
+ "PatchedConfigTemplateRequest": {
+ "type": "object",
+ "description": "Introduces support for Tag assignment. Adds `tags` serialization, and handles tag assignment\non create() and update().",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "environment_params": {
+ "nullable": true,
+ "title": "Environment parameters",
+ "description": "Any additional parameters to pass when constructing the Jinja environment"
+ },
+ "template_code": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Jinja template code."
+ },
+ "mime_type": {
+ "type": "string",
+ "description": "Defaults to text/plain; charset=utf-8",
+ "maxLength": 50
+ },
+ "file_name": {
+ "type": "string",
+ "description": "Filename to give to the rendered export file",
+ "maxLength": 200
+ },
+ "file_extension": {
+ "type": "string",
+ "description": "Extension to append to the rendered filename",
+ "maxLength": 15
+ },
+ "as_attachment": {
+ "type": "boolean",
+ "description": "Download file as attachment"
+ },
+ "data_source": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDataSourceRequest"
+ }
+ ]
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ }
+ }
+ },
+ "PatchedContactRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "groups": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "phone": {
+ "type": "string",
+ "maxLength": 50
+ },
+ "email": {
+ "type": "string",
+ "format": "email",
+ "maxLength": 254
+ },
+ "address": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "link": {
+ "type": "string",
+ "format": "uri",
+ "maxLength": 200
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedContactRoleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedCustomLinkRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "link_text": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Jinja2 template code for link text"
+ },
+ "link_url": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Jinja2 template code for link URL"
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "group_name": {
+ "type": "string",
+ "description": "Links with the same group will appear as a dropdown menu",
+ "maxLength": 50
+ },
+ "button_class": {
+ "enum": [
+ "default",
+ "blue",
+ "indigo",
+ "purple",
+ "pink",
+ "red",
+ "orange",
+ "yellow",
+ "green",
+ "teal",
+ "cyan",
+ "gray",
+ "black",
+ "white",
+ "ghost-dark"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "ee8e5bb1ccdcdb19",
+ "description": "The class of the first link in a group will be used for the dropdown button\n\n* `default` - Default\n* `blue` - Blue\n* `indigo` - Indigo\n* `purple` - Purple\n* `pink` - Pink\n* `red` - Red\n* `orange` - Orange\n* `yellow` - Yellow\n* `green` - Green\n* `teal` - Teal\n* `cyan` - Cyan\n* `gray` - Gray\n* `black` - Black\n* `white` - White\n* `ghost-dark` - Link"
+ },
+ "new_window": {
+ "type": "boolean",
+ "description": "Force link to open in a new window"
+ }
+ }
+ },
+ "PatchedDashboardRequest": {
+ "type": "object",
+ "properties": {
+ "layout": {},
+ "config": {}
+ }
+ },
+ "PatchedDeviceBayRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "installed_device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedDeviceBayTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ }
+ },
+ "PatchedExportTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "environment_params": {
+ "nullable": true,
+ "title": "Environment parameters",
+ "description": "Any additional parameters to pass when constructing the Jinja environment"
+ },
+ "template_code": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Jinja template code."
+ },
+ "mime_type": {
+ "type": "string",
+ "description": "Defaults to text/plain; charset=utf-8",
+ "maxLength": 50
+ },
+ "file_name": {
+ "type": "string",
+ "description": "Filename to give to the rendered export file",
+ "maxLength": 200
+ },
+ "file_extension": {
+ "type": "string",
+ "description": "Extension to append to the rendered filename",
+ "maxLength": 15
+ },
+ "as_attachment": {
+ "type": "boolean",
+ "description": "Download file as attachment"
+ },
+ "data_source": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDataSourceRequest"
+ }
+ ]
+ }
+ }
+ },
+ "PatchedFHRPGroupAssignmentRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefFHRPGroupRequest"
+ }
+ ]
+ },
+ "interface_type": {
+ "type": "string"
+ },
+ "interface_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "priority": {
+ "type": "integer",
+ "maximum": 255,
+ "minimum": 0
+ }
+ }
+ },
+ "PatchedFHRPGroupRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "protocol": {
+ "enum": [
+ "vrrp2",
+ "vrrp3",
+ "carp",
+ "clusterxl",
+ "hsrp",
+ "glbp",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `vrrp2` - VRRPv2\n* `vrrp3` - VRRPv3\n* `carp` - CARP\n* `clusterxl` - ClusterXL\n* `hsrp` - HSRP\n* `glbp` - GLBP\n* `other` - Other",
+ "x-spec-enum-id": "40dc831c689b4b78"
+ },
+ "group_id": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "auth_type": {
+ "enum": [
+ "plaintext",
+ "md5",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `plaintext` - Plaintext\n* `md5` - MD5",
+ "x-spec-enum-id": "12b9faea3a45bf37",
+ "nullable": true,
+ "title": "Authentication type"
+ },
+ "auth_key": {
+ "type": "string",
+ "title": "Authentication key",
+ "maxLength": 255
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedGroupRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 150
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "permissions": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ }
+ },
+ "PatchedImageAttachmentRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 50
+ },
+ "image": {
+ "type": "string",
+ "format": "binary"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ }
+ },
+ "PatchedInventoryItemRoleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "color": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedInventoryItemTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ]
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefInventoryItemRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "part_id": {
+ "type": "string",
+ "description": "Manufacturer-assigned part identifier",
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "component_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "component_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ }
+ }
+ },
+ "PatchedL2VPNTerminationRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "l2vpn": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefL2VPNRequest"
+ }
+ ]
+ },
+ "assigned_object_type": {
+ "type": "string"
+ },
+ "assigned_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedMACAddressRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "mac_address": {
+ "type": "string"
+ },
+ "assigned_object_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "assigned_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedManufacturerRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedModuleBayRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "installed_module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "position": {
+ "type": "string",
+ "description": "Identifier to reference when renaming installed components",
+ "maxLength": 30
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedModuleBayTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "position": {
+ "type": "string",
+ "description": "Identifier to reference when renaming installed components",
+ "maxLength": 30
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ }
+ },
+ "PatchedModuleTypeProfileRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "schema": {
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedNotificationGroupRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "groups": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "users": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ }
+ },
+ "PatchedNotificationRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "user": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefUserRequest"
+ }
+ ]
+ },
+ "read": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "event_type": {
+ "enum": [
+ "object_created",
+ "object_updated",
+ "object_deleted",
+ "job_started",
+ "job_completed",
+ "job_failed",
+ "job_errored"
+ ],
+ "type": "string",
+ "description": "* `object_created` - Object created\n* `object_updated` - Object updated\n* `object_deleted` - Object deleted\n* `job_started` - Job started\n* `job_completed` - Job completed\n* `job_failed` - Job failed\n* `job_errored` - Job errored",
+ "x-spec-enum-id": "80d172232f4af424",
+ "title": "Event"
+ }
+ }
+ },
+ "PatchedObjectPermissionRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "actions": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 30
+ },
+ "description": "The list of actions granted by this permission"
+ },
+ "constraints": {
+ "nullable": true,
+ "description": "Queryset filter matching the applicable objects of the selected type(s)"
+ },
+ "groups": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "users": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ }
+ },
+ "PatchedPowerPanelRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ]
+ },
+ "location": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefLocationRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedProviderAccountRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "provider": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefProviderRequest"
+ }
+ ]
+ },
+ "name": {
+ "type": "string",
+ "default": "",
+ "maxLength": 100
+ },
+ "account": {
+ "type": "string",
+ "minLength": 1,
+ "title": "Account ID",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedProviderNetworkRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "provider": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefProviderRequest"
+ }
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "service_id": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedProviderRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Full name of the provider",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "accounts": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "asns": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedRIRRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "is_private": {
+ "type": "boolean",
+ "title": "Private",
+ "description": "IP space managed by this RIR is considered private"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedRackRoleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "color": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedRoleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedRouteTargetRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Route target value (formatted in accordance with RFC 4360)",
+ "maxLength": 21
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedSavedFilterRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "user": {
+ "type": "integer",
+ "nullable": true
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "shared": {
+ "type": "boolean"
+ },
+ "parameters": {}
+ }
+ },
+ "PatchedScriptInputRequest": {
+ "type": "object",
+ "properties": {
+ "data": {},
+ "commit": {
+ "type": "boolean"
+ },
+ "schedule_at": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "interval": {
+ "type": "integer",
+ "nullable": true
+ }
+ }
+ },
+ "PatchedSubscriptionRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "user": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefUserRequest"
+ }
+ ]
+ }
+ }
+ },
+ "PatchedTableConfigRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_type": {
+ "type": "string"
+ },
+ "table": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "user": {
+ "type": "integer",
+ "nullable": true
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "shared": {
+ "type": "boolean"
+ },
+ "columns": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ }
+ },
+ "ordering": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "nullable": true
+ }
+ }
+ },
+ "PatchedTagRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[-\\w]+$",
+ "maxLength": 100
+ },
+ "color": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "PatchedTenantRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedTokenRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "user": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefUserRequest"
+ }
+ ]
+ },
+ "expires": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "last_used": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "key": {
+ "type": "string",
+ "writeOnly": true,
+ "maxLength": 40,
+ "minLength": 40
+ },
+ "write_enabled": {
+ "type": "boolean",
+ "description": "Permit create/update/delete operations using this key"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ }
+ },
+ "PatchedTunnelGroupRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedUserRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "username": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
+ "pattern": "^[\\w.@+-]+$",
+ "maxLength": 150
+ },
+ "password": {
+ "type": "string",
+ "writeOnly": true,
+ "minLength": 1,
+ "maxLength": 128
+ },
+ "first_name": {
+ "type": "string",
+ "maxLength": 150
+ },
+ "last_name": {
+ "type": "string",
+ "maxLength": 150
+ },
+ "email": {
+ "type": "string",
+ "format": "email",
+ "title": "Email address",
+ "maxLength": 254
+ },
+ "is_staff": {
+ "type": "boolean",
+ "title": "Staff status",
+ "description": "Designates whether the user can log into this admin site."
+ },
+ "is_active": {
+ "type": "boolean",
+ "title": "Active",
+ "description": "Designates whether this user should be treated as active. Unselect this instead of deleting accounts."
+ },
+ "date_joined": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "last_login": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "groups": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "permissions": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ }
+ },
+ "PatchedVLANGroupRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "scope_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "scope_id": {
+ "type": "integer",
+ "nullable": true
+ },
+ "vid_ranges": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/IntegerRangeRequest"
+ }
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedVLANTranslationPolicyRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ }
+ },
+ "PatchedVLANTranslationRuleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "policy": {
+ "type": "integer"
+ },
+ "local_vid": {
+ "type": "integer",
+ "maximum": 4094,
+ "minimum": 1,
+ "title": "Local VLAN ID",
+ "description": "Numeric VLAN ID (1-4094)"
+ },
+ "remote_vid": {
+ "type": "integer",
+ "maximum": 4094,
+ "minimum": 1,
+ "title": "Remote VLAN ID",
+ "description": "Numeric VLAN ID (1-4094)"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ }
+ },
+ "PatchedVRFRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "rd": {
+ "type": "string",
+ "nullable": true,
+ "title": "Route distinguisher",
+ "description": "Unique route distinguisher (as defined in RFC 4364)",
+ "maxLength": 21
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "enforce_unique": {
+ "type": "boolean",
+ "title": "Enforce unique space",
+ "description": "Prevent duplicate prefixes/IP addresses within this VRF"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "import_targets": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "export_targets": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedVirtualCircuitTypeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedVirtualDiskRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "virtual_machine": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefVirtualMachineRequest"
+ }
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "size": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "title": "Size (MB)"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWebhookRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 150
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "payload_url": {
+ "type": "string",
+ "minLength": 1,
+ "title": "URL",
+ "description": "This URL will be called using the HTTP method defined when the webhook is called. Jinja2 template processing is supported with the same context as the request body.",
+ "maxLength": 500
+ },
+ "http_method": {
+ "enum": [
+ "GET",
+ "POST",
+ "PUT",
+ "PATCH",
+ "DELETE"
+ ],
+ "type": "string",
+ "description": "* `GET` - GET\n* `POST` - POST\n* `PUT` - PUT\n* `PATCH` - PATCH\n* `DELETE` - DELETE",
+ "x-spec-enum-id": "a12018571a034921"
+ },
+ "http_content_type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The complete list of official content types is available here.",
+ "maxLength": 100
+ },
+ "additional_headers": {
+ "type": "string",
+ "description": "User-supplied HTTP headers to be sent with the request in addition to the HTTP content type. Headers should be defined in the format Name: Value. Jinja2 template processing is supported with the same context as the request body (below)."
+ },
+ "body_template": {
+ "type": "string",
+ "description": "Jinja2 template for a custom request body. If blank, a JSON object representing the change will be included. Available context data includes: event, model, timestamp, username, request_id, and data."
+ },
+ "secret": {
+ "type": "string",
+ "description": "When provided, the request will include a X-Hook-Signature header containing a HMAC hex digest of the payload body using the secret as the key. The secret is not transmitted in the request.",
+ "maxLength": 255
+ },
+ "ssl_verification": {
+ "type": "boolean",
+ "description": "Enable SSL certificate verification. Disable with caution!"
+ },
+ "ca_file_path": {
+ "type": "string",
+ "nullable": true,
+ "description": "The specific CA certificate file to use for SSL verification. Leave blank to use the system defaults.",
+ "maxLength": 4096
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ }
+ }
+ },
+ "PatchedWritableAggregateRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "prefix": {
+ "type": "string",
+ "minLength": 1
+ },
+ "rir": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefRIRRequest"
+ }
+ ]
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "date_added": {
+ "type": "string",
+ "format": "date",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableCableRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "type": {
+ "enum": [
+ "cat3",
+ "cat5",
+ "cat5e",
+ "cat6",
+ "cat6a",
+ "cat7",
+ "cat7a",
+ "cat8",
+ "dac-active",
+ "dac-passive",
+ "mrj21-trunk",
+ "coaxial",
+ "mmf",
+ "mmf-om1",
+ "mmf-om2",
+ "mmf-om3",
+ "mmf-om4",
+ "mmf-om5",
+ "smf",
+ "smf-os1",
+ "smf-os2",
+ "aoc",
+ "usb",
+ "power",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `cat3` - CAT3\n* `cat5` - CAT5\n* `cat5e` - CAT5e\n* `cat6` - CAT6\n* `cat6a` - CAT6a\n* `cat7` - CAT7\n* `cat7a` - CAT7a\n* `cat8` - CAT8\n* `dac-active` - Direct Attach Copper (Active)\n* `dac-passive` - Direct Attach Copper (Passive)\n* `mrj21-trunk` - MRJ21 Trunk\n* `coaxial` - Coaxial\n* `mmf` - Multimode Fiber\n* `mmf-om1` - Multimode Fiber (OM1)\n* `mmf-om2` - Multimode Fiber (OM2)\n* `mmf-om3` - Multimode Fiber (OM3)\n* `mmf-om4` - Multimode Fiber (OM4)\n* `mmf-om5` - Multimode Fiber (OM5)\n* `smf` - Singlemode Fiber\n* `smf-os1` - Singlemode Fiber (OS1)\n* `smf-os2` - Singlemode Fiber (OS2)\n* `aoc` - Active Optical Cabling (AOC)\n* `usb` - USB\n* `power` - Power",
+ "x-spec-enum-id": "7b11d524b2b1a7ef",
+ "nullable": true
+ },
+ "a_terminations": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/GenericObjectRequest"
+ }
+ },
+ "b_terminations": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/GenericObjectRequest"
+ }
+ },
+ "status": {
+ "enum": [
+ "connected",
+ "planned",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `connected` - Connected\n* `planned` - Planned\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "fbc2f302c08be50d"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "label": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "length": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "length_unit": {
+ "enum": [
+ "km",
+ "m",
+ "cm",
+ "mi",
+ "ft",
+ "in",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `km` - Kilometers\n* `m` - Meters\n* `cm` - Centimeters\n* `mi` - Miles\n* `ft` - Feet\n* `in` - Inches",
+ "x-spec-enum-id": "e64ce3a2c5997172",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableCircuitGroupAssignmentRequest": {
+ "type": "object",
+ "description": "Base serializer for group assignments under CircuitSerializer.",
+ "properties": {
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefCircuitGroupRequest"
+ }
+ ]
+ },
+ "member_type": {
+ "type": "string"
+ },
+ "member_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "priority": {
+ "enum": [
+ "primary",
+ "secondary",
+ "tertiary",
+ "inactive",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `primary` - Primary\n* `secondary` - Secondary\n* `tertiary` - Tertiary\n* `inactive` - Inactive",
+ "x-spec-enum-id": "ef3a31644cec7524",
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ }
+ }
+ },
+ "PatchedWritableCircuitRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "cid": {
+ "type": "string",
+ "minLength": 1,
+ "title": "Circuit ID",
+ "description": "Unique circuit ID",
+ "maxLength": 100
+ },
+ "provider": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefProviderRequest"
+ }
+ ]
+ },
+ "provider_account": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefProviderAccountRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefCircuitTypeRequest"
+ }
+ ]
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "provisioning",
+ "active",
+ "offline",
+ "deprovisioning",
+ "decommissioned"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `provisioning` - Provisioning\n* `active` - Active\n* `offline` - Offline\n* `deprovisioning` - Deprovisioning\n* `decommissioned` - Decommissioned",
+ "x-spec-enum-id": "63c838134a022200"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "install_date": {
+ "type": "string",
+ "format": "date",
+ "nullable": true,
+ "title": "Installed"
+ },
+ "termination_date": {
+ "type": "string",
+ "format": "date",
+ "nullable": true,
+ "title": "Terminates"
+ },
+ "commit_rate": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Commit rate (Kbps)",
+ "description": "Committed rate"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "distance": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "distance_unit": {
+ "enum": [
+ "km",
+ "m",
+ "mi",
+ "ft",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `km` - Kilometers\n* `m` - Meters\n* `mi` - Miles\n* `ft` - Feet",
+ "x-spec-enum-id": "53542e7902f946af",
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "assignments": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/BriefCircuitGroupAssignmentSerializer_Request"
+ }
+ }
+ }
+ },
+ "PatchedWritableClusterRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefClusterTypeRequest"
+ }
+ ]
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefClusterGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "staging",
+ "active",
+ "decommissioning",
+ "offline"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `staging` - Staging\n* `active` - Active\n* `decommissioning` - Decommissioning\n* `offline` - Offline",
+ "x-spec-enum-id": "79d20a734d0eecbb"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "scope_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "scope_id": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableConsolePortRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "c5f7197b7211818a",
+ "nullable": true,
+ "description": "Physical port type\n\n* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other"
+ },
+ "speed": {
+ "enum": [
+ 1200,
+ 2400,
+ 4800,
+ 9600,
+ 19200,
+ 38400,
+ 57600,
+ 115200,
+ null
+ ],
+ "type": "integer",
+ "x-spec-enum-id": "ab6d9635c131a378",
+ "nullable": true,
+ "description": "Port speed in bits per second\n\n* `1200` - 1200 bps\n* `2400` - 2400 bps\n* `4800` - 4800 bps\n* `9600` - 9600 bps\n* `19200` - 19.2 kbps\n* `38400` - 38.4 kbps\n* `57600` - 57.6 kbps\n* `115200` - 115.2 kbps",
+ "minimum": 0,
+ "maximum": 2147483647
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableConsolePortTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "c5f7197b7211818a",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ }
+ },
+ "PatchedWritableConsoleServerPortRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "c5f7197b7211818a",
+ "nullable": true,
+ "description": "Physical port type\n\n* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other"
+ },
+ "speed": {
+ "enum": [
+ 1200,
+ 2400,
+ 4800,
+ 9600,
+ 19200,
+ 38400,
+ 57600,
+ 115200,
+ null
+ ],
+ "type": "integer",
+ "x-spec-enum-id": "ab6d9635c131a378",
+ "nullable": true,
+ "description": "Port speed in bits per second\n\n* `1200` - 1200 bps\n* `2400` - 2400 bps\n* `4800` - 4800 bps\n* `9600` - 9600 bps\n* `19200` - 19.2 kbps\n* `38400` - 38.4 kbps\n* `57600` - 57.6 kbps\n* `115200` - 115.2 kbps",
+ "minimum": 0,
+ "maximum": 2147483647
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableConsoleServerPortTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "c5f7197b7211818a",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ }
+ },
+ "PatchedWritableContactAssignmentRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "contact": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefContactRequest"
+ }
+ ]
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefContactRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "priority": {
+ "enum": [
+ "primary",
+ "secondary",
+ "tertiary",
+ "inactive",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `primary` - Primary\n* `secondary` - Secondary\n* `tertiary` - Tertiary\n* `inactive` - Inactive",
+ "x-spec-enum-id": "ef3a31644cec7524",
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableContactGroupRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ }
+ },
+ "PatchedWritableCustomFieldChoiceSetRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "base_choices": {
+ "enum": [
+ "IATA",
+ "ISO_3166",
+ "UN_LOCODE",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "cf0efb5195f85007",
+ "nullable": true,
+ "description": "Base set of predefined choices (optional)\n\n* `IATA` - IATA (Airport codes)\n* `ISO_3166` - ISO 3166 (Country codes)\n* `UN_LOCODE` - UN/LOCODE (Location codes)"
+ },
+ "extra_choices": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {},
+ "maxItems": 2,
+ "minItems": 2
+ }
+ },
+ "order_alphabetically": {
+ "type": "boolean",
+ "description": "Choices are automatically ordered alphabetically"
+ }
+ }
+ },
+ "PatchedWritableCustomFieldRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "type": {
+ "enum": [
+ "text",
+ "longtext",
+ "integer",
+ "decimal",
+ "boolean",
+ "date",
+ "datetime",
+ "url",
+ "json",
+ "select",
+ "multiselect",
+ "object",
+ "multiobject"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "22e3a64138d10046",
+ "description": "The type of data this custom field holds\n\n* `text` - Text\n* `longtext` - Text (long)\n* `integer` - Integer\n* `decimal` - Decimal\n* `boolean` - Boolean (true/false)\n* `date` - Date\n* `datetime` - Date & time\n* `url` - URL\n* `json` - JSON\n* `select` - Selection\n* `multiselect` - Multiple selection\n* `object` - Object\n* `multiobject` - Multiple objects"
+ },
+ "related_object_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Internal field name",
+ "pattern": "^[a-z0-9_]+$",
+ "maxLength": 50
+ },
+ "label": {
+ "type": "string",
+ "description": "Name of the field as displayed to users (if not provided, 'the field's name will be used)",
+ "maxLength": 50
+ },
+ "group_name": {
+ "type": "string",
+ "description": "Custom fields within the same group will be displayed together",
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "required": {
+ "type": "boolean",
+ "description": "This field is required when creating new objects or editing an existing object."
+ },
+ "unique": {
+ "type": "boolean",
+ "title": "Must be unique",
+ "description": "The value of this field must be unique for the assigned object"
+ },
+ "search_weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "description": "Weighting for search. Lower values are considered more important. Fields with a search weight of zero will be ignored."
+ },
+ "filter_logic": {
+ "enum": [
+ "disabled",
+ "loose",
+ "exact"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "a958350ae21c10ee",
+ "description": "Loose matches any instance of a given string; exact matches the entire field.\n\n* `disabled` - Disabled\n* `loose` - Loose\n* `exact` - Exact"
+ },
+ "ui_visible": {
+ "enum": [
+ "always",
+ "if-set",
+ "hidden"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "cd2cf94af56de747",
+ "description": "Specifies whether the custom field is displayed in the UI\n\n* `always` - Always\n* `if-set` - If set\n* `hidden` - Hidden"
+ },
+ "ui_editable": {
+ "enum": [
+ "yes",
+ "no",
+ "hidden"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "1065673147e26bb5",
+ "description": "Specifies whether the custom field value can be edited in the UI\n\n* `yes` - Yes\n* `no` - No\n* `hidden` - Hidden"
+ },
+ "is_cloneable": {
+ "type": "boolean",
+ "description": "Replicate this value when cloning objects"
+ },
+ "default": {
+ "nullable": true,
+ "description": "Default value for the field (must be a JSON value). Encapsulate strings with double quotes (e.g. \"Foo\")."
+ },
+ "related_object_filter": {
+ "nullable": true,
+ "description": "Filter the object selection choices using a query_params dict (must be a JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")."
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "title": "Display weight",
+ "description": "Fields with higher weights appear lower in a form."
+ },
+ "validation_minimum": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": -9223372036854775808,
+ "format": "int64",
+ "nullable": true,
+ "title": "Minimum value",
+ "description": "Minimum allowed value (for numeric fields)"
+ },
+ "validation_maximum": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": -9223372036854775808,
+ "format": "int64",
+ "nullable": true,
+ "title": "Maximum value",
+ "description": "Maximum allowed value (for numeric fields)"
+ },
+ "validation_regex": {
+ "type": "string",
+ "description": "Regular expression to enforce on text field values. Use ^ and $ to force matching of entire string. For example, ^[A-Z]{3}$ will limit values to exactly three uppercase letters.",
+ "maxLength": 500
+ },
+ "choice_set": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefCustomFieldChoiceSetRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ }
+ }
+ },
+ "PatchedWritableDataSourceRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 50
+ },
+ "source_url": {
+ "type": "string",
+ "minLength": 1,
+ "title": "URL",
+ "maxLength": 200
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "sync_interval": {
+ "enum": [
+ 1,
+ 60,
+ 720,
+ 1440,
+ 10080,
+ 43200,
+ null
+ ],
+ "type": "integer",
+ "description": "* `1` - Minutely\n* `60` - Hourly\n* `720` - 12 hours\n* `1440` - Daily\n* `10080` - Weekly\n* `43200` - 30 days",
+ "x-spec-enum-id": "2e9f2567ecd93fbe",
+ "nullable": true,
+ "minimum": 0,
+ "maximum": 32767
+ },
+ "parameters": {
+ "nullable": true
+ },
+ "ignore_rules": {
+ "type": "string",
+ "description": "Patterns (one per line) matching files to ignore when syncing"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableDeviceRoleRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "color": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "vm_role": {
+ "type": "boolean",
+ "description": "Virtual machines may be assigned to this role"
+ },
+ "config_template": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplateRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ }
+ },
+ "PatchedWritableDeviceTypeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ]
+ },
+ "default_platform": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPlatformRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "model": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "part_number": {
+ "type": "string",
+ "description": "Discrete part number (optional)",
+ "maxLength": 50
+ },
+ "u_height": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": 0.0,
+ "exclusiveMaximum": true,
+ "default": 1.0,
+ "title": "Position (U)"
+ },
+ "exclude_from_utilization": {
+ "type": "boolean",
+ "description": "Devices of this type are excluded when calculating rack utilization."
+ },
+ "is_full_depth": {
+ "type": "boolean",
+ "description": "Device consumes both front and rear rack faces."
+ },
+ "subdevice_role": {
+ "enum": [
+ "parent",
+ "child",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "d10d91f690a856c2",
+ "nullable": true,
+ "title": "Parent/child status",
+ "description": "Parent devices house child devices in device bays. Leave blank if this device type is neither a parent nor a child.\n\n* `parent` - Parent\n* `child` - Child"
+ },
+ "airflow": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ "left-to-right",
+ "right-to-left",
+ "side-to-rear",
+ "rear-to-side",
+ "bottom-to-top",
+ "top-to-bottom",
+ "passive",
+ "mixed",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front\n* `left-to-right` - Left to right\n* `right-to-left` - Right to left\n* `side-to-rear` - Side to rear\n* `rear-to-side` - Rear to side\n* `bottom-to-top` - Bottom to top\n* `top-to-bottom` - Top to bottom\n* `passive` - Passive\n* `mixed` - Mixed",
+ "x-spec-enum-id": "943288113dad6782",
+ "nullable": true
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "weight_unit": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884",
+ "nullable": true
+ },
+ "front_image": {
+ "type": "string",
+ "format": "binary",
+ "nullable": true
+ },
+ "rear_image": {
+ "type": "string",
+ "format": "binary",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableDeviceWithConfigContextRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "maxLength": 64
+ },
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ]
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRoleRequest"
+ }
+ ]
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "platform": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPlatformRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "description": "Chassis serial number, assigned by the manufacturer",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this device",
+ "maxLength": 50
+ },
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ]
+ },
+ "location": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefLocationRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "rack": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRackRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "position": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": 0.5,
+ "exclusiveMaximum": true,
+ "nullable": true,
+ "title": "Position (U)"
+ },
+ "face": {
+ "enum": [
+ "front",
+ "rear",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `front` - Front\n* `rear` - Rear",
+ "x-spec-enum-id": "d2fb9b3f75158b83",
+ "nullable": true,
+ "title": "Rack face"
+ },
+ "latitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 100,
+ "minimum": -100,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "longitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": -1000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "status": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "inventory",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `inventory` - Inventory\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "8d8971779f16ee18"
+ },
+ "airflow": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ "left-to-right",
+ "right-to-left",
+ "side-to-rear",
+ "rear-to-side",
+ "bottom-to-top",
+ "top-to-bottom",
+ "passive",
+ "mixed",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front\n* `left-to-right` - Left to right\n* `right-to-left` - Right to left\n* `side-to-rear` - Side to rear\n* `rear-to-side` - Rear to side\n* `bottom-to-top` - Bottom to top\n* `top-to-bottom` - Top to bottom\n* `passive` - Passive\n* `mixed` - Mixed",
+ "x-spec-enum-id": "943288113dad6782",
+ "nullable": true
+ },
+ "primary_ip4": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip6": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "oob_ip": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "cluster": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefClusterRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "virtual_chassis": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVirtualChassisRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vc_position": {
+ "type": "integer",
+ "maximum": 255,
+ "minimum": 0,
+ "nullable": true
+ },
+ "vc_priority": {
+ "type": "integer",
+ "maximum": 255,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Virtual chassis master election priority"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "config_template": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplateRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "local_context_data": {
+ "nullable": true,
+ "description": "Local config context data takes precedence over source contexts in the final rendered config context"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableEventRuleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 150
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "event_types": {
+ "type": "array",
+ "items": {
+ "enum": [
+ "object_created",
+ "object_updated",
+ "object_deleted",
+ "job_started",
+ "job_completed",
+ "job_failed",
+ "job_errored"
+ ],
+ "type": "string",
+ "description": "* `object_created` - Object created\n* `object_updated` - Object updated\n* `object_deleted` - Object deleted\n* `job_started` - Job started\n* `job_completed` - Job completed\n* `job_failed` - Job failed\n* `job_errored` - Job errored",
+ "x-spec-enum-id": "80d172232f4af424"
+ },
+ "description": "The types of event which will trigger this rule."
+ },
+ "conditions": {
+ "nullable": true,
+ "description": "A set of conditions which determine whether the event will be generated."
+ },
+ "action_type": {
+ "enum": [
+ "webhook",
+ "script",
+ "notification"
+ ],
+ "type": "string",
+ "description": "* `webhook` - Webhook\n* `script` - Script\n* `notification` - Notification",
+ "x-spec-enum-id": "d07193c73ebc03c6"
+ },
+ "action_object_type": {
+ "type": "string"
+ },
+ "action_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ }
+ }
+ },
+ "PatchedWritableFrontPortRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "rear_port": {
+ "type": "integer"
+ },
+ "rear_port_position": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1,
+ "description": "Mapped position on corresponding rear port"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableFrontPortTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "rear_port": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefRearPortTemplateRequest"
+ }
+ ]
+ },
+ "rear_port_position": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ }
+ },
+ "PatchedWritableIKEPolicyRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "version": {
+ "enum": [
+ 1,
+ 2
+ ],
+ "type": "integer",
+ "description": "* `1` - IKEv1\n* `2` - IKEv2",
+ "x-spec-enum-id": "00872b77916a1fde",
+ "minimum": 0,
+ "maximum": 32767
+ },
+ "mode": {
+ "enum": [
+ "aggressive",
+ "main",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `aggressive` - Aggressive\n* `main` - Main",
+ "x-spec-enum-id": "64c1be7bdb2548ca",
+ "nullable": true
+ },
+ "proposals": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "preshared_key": {
+ "type": "string",
+ "title": "Pre-shared key"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableIKEProposalRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "authentication_method": {
+ "enum": [
+ "preshared-keys",
+ "certificates",
+ "rsa-signatures",
+ "dsa-signatures"
+ ],
+ "type": "string",
+ "description": "* `preshared-keys` - Pre-shared keys\n* `certificates` - Certificates\n* `rsa-signatures` - RSA signatures\n* `dsa-signatures` - DSA signatures",
+ "x-spec-enum-id": "92bb2f1103b3a262"
+ },
+ "encryption_algorithm": {
+ "enum": [
+ "aes-128-cbc",
+ "aes-128-gcm",
+ "aes-192-cbc",
+ "aes-192-gcm",
+ "aes-256-cbc",
+ "aes-256-gcm",
+ "3des-cbc",
+ "des-cbc"
+ ],
+ "type": "string",
+ "description": "* `aes-128-cbc` - 128-bit AES (CBC)\n* `aes-128-gcm` - 128-bit AES (GCM)\n* `aes-192-cbc` - 192-bit AES (CBC)\n* `aes-192-gcm` - 192-bit AES (GCM)\n* `aes-256-cbc` - 256-bit AES (CBC)\n* `aes-256-gcm` - 256-bit AES (GCM)\n* `3des-cbc` - 3DES\n* `des-cbc` - DES",
+ "x-spec-enum-id": "b022535cfdee79fe"
+ },
+ "authentication_algorithm": {
+ "enum": [
+ "hmac-sha1",
+ "hmac-sha256",
+ "hmac-sha384",
+ "hmac-sha512",
+ "hmac-md5",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `hmac-sha1` - SHA-1 HMAC\n* `hmac-sha256` - SHA-256 HMAC\n* `hmac-sha384` - SHA-384 HMAC\n* `hmac-sha512` - SHA-512 HMAC\n* `hmac-md5` - MD5 HMAC",
+ "x-spec-enum-id": "0830e8839f5dea4f",
+ "nullable": true
+ },
+ "group": {
+ "enum": [
+ 1,
+ 2,
+ 5,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34
+ ],
+ "type": "integer",
+ "x-spec-enum-id": "dbef43be795462a8",
+ "description": "Diffie-Hellman group ID\n\n* `1` - Group 1\n* `2` - Group 2\n* `5` - Group 5\n* `14` - Group 14\n* `15` - Group 15\n* `16` - Group 16\n* `17` - Group 17\n* `18` - Group 18\n* `19` - Group 19\n* `20` - Group 20\n* `21` - Group 21\n* `22` - Group 22\n* `23` - Group 23\n* `24` - Group 24\n* `25` - Group 25\n* `26` - Group 26\n* `27` - Group 27\n* `28` - Group 28\n* `29` - Group 29\n* `30` - Group 30\n* `31` - Group 31\n* `32` - Group 32\n* `33` - Group 33\n* `34` - Group 34",
+ "minimum": 0,
+ "maximum": 32767
+ },
+ "sa_lifetime": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Security association lifetime (in seconds)"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableIPAddressRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "address": {
+ "type": "string",
+ "minLength": 1
+ },
+ "vrf": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRFRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "active",
+ "reserved",
+ "deprecated",
+ "dhcp",
+ "slaac"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "24935cfee15bd268",
+ "description": "The operational status of this IP\n\n* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated\n* `dhcp` - DHCP\n* `slaac` - SLAAC"
+ },
+ "role": {
+ "enum": [
+ "loopback",
+ "secondary",
+ "anycast",
+ "vip",
+ "vrrp",
+ "hsrp",
+ "glbp",
+ "carp",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "10fbcb4930889b0f",
+ "nullable": true,
+ "description": "The functional role of this IP\n\n* `loopback` - Loopback\n* `secondary` - Secondary\n* `anycast` - Anycast\n* `vip` - VIP\n* `vrrp` - VRRP\n* `hsrp` - HSRP\n* `glbp` - GLBP\n* `carp` - CARP"
+ },
+ "assigned_object_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "assigned_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "nat_inside": {
+ "type": "integer",
+ "nullable": true,
+ "title": "NAT (inside)",
+ "description": "The IP for which this address is the \"outside\" IP"
+ },
+ "dns_name": {
+ "type": "string",
+ "description": "Hostname or FQDN (not case-sensitive)",
+ "pattern": "^([0-9A-Za-z_-]+|\\*)(\\.[0-9A-Za-z_-]+)*\\.?$",
+ "maxLength": 255
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableIPRangeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "start_address": {
+ "type": "string",
+ "minLength": 1
+ },
+ "end_address": {
+ "type": "string",
+ "minLength": 1
+ },
+ "vrf": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRFRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "active",
+ "reserved",
+ "deprecated"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "6388dfb94ca1cc15",
+ "description": "Operational status of this range\n\n* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated"
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "mark_populated": {
+ "type": "boolean",
+ "description": "Prevent the creation of IP addresses within this range"
+ },
+ "mark_utilized": {
+ "type": "boolean",
+ "description": "Report space as 100% utilized"
+ }
+ }
+ },
+ "PatchedWritableIPSecPolicyRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "proposals": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "pfs_group": {
+ "enum": [
+ 1,
+ 2,
+ 5,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ null
+ ],
+ "type": "integer",
+ "x-spec-enum-id": "dbef43be795462a8",
+ "nullable": true,
+ "description": "Diffie-Hellman group for Perfect Forward Secrecy\n\n* `1` - Group 1\n* `2` - Group 2\n* `5` - Group 5\n* `14` - Group 14\n* `15` - Group 15\n* `16` - Group 16\n* `17` - Group 17\n* `18` - Group 18\n* `19` - Group 19\n* `20` - Group 20\n* `21` - Group 21\n* `22` - Group 22\n* `23` - Group 23\n* `24` - Group 24\n* `25` - Group 25\n* `26` - Group 26\n* `27` - Group 27\n* `28` - Group 28\n* `29` - Group 29\n* `30` - Group 30\n* `31` - Group 31\n* `32` - Group 32\n* `33` - Group 33\n* `34` - Group 34",
+ "minimum": 0,
+ "maximum": 32767
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableIPSecProfileRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mode": {
+ "enum": [
+ "esp",
+ "ah"
+ ],
+ "type": "string",
+ "description": "* `esp` - ESP\n* `ah` - AH",
+ "x-spec-enum-id": "1136c2cdfee84436"
+ },
+ "ike_policy": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefIKEPolicyRequest"
+ }
+ ]
+ },
+ "ipsec_policy": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefIPSecPolicyRequest"
+ }
+ ]
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableIPSecProposalRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "encryption_algorithm": {
+ "enum": [
+ "aes-128-cbc",
+ "aes-128-gcm",
+ "aes-192-cbc",
+ "aes-192-gcm",
+ "aes-256-cbc",
+ "aes-256-gcm",
+ "3des-cbc",
+ "des-cbc",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `aes-128-cbc` - 128-bit AES (CBC)\n* `aes-128-gcm` - 128-bit AES (GCM)\n* `aes-192-cbc` - 192-bit AES (CBC)\n* `aes-192-gcm` - 192-bit AES (GCM)\n* `aes-256-cbc` - 256-bit AES (CBC)\n* `aes-256-gcm` - 256-bit AES (GCM)\n* `3des-cbc` - 3DES\n* `des-cbc` - DES",
+ "x-spec-enum-id": "b022535cfdee79fe",
+ "nullable": true,
+ "title": "Encryption"
+ },
+ "authentication_algorithm": {
+ "enum": [
+ "hmac-sha1",
+ "hmac-sha256",
+ "hmac-sha384",
+ "hmac-sha512",
+ "hmac-md5",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `hmac-sha1` - SHA-1 HMAC\n* `hmac-sha256` - SHA-256 HMAC\n* `hmac-sha384` - SHA-384 HMAC\n* `hmac-sha512` - SHA-512 HMAC\n* `hmac-md5` - MD5 HMAC",
+ "x-spec-enum-id": "0830e8839f5dea4f",
+ "nullable": true,
+ "title": "Authentication"
+ },
+ "sa_lifetime_seconds": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "SA lifetime (seconds)",
+ "description": "Security association lifetime (seconds)"
+ },
+ "sa_lifetime_data": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "SA lifetime (KB)",
+ "description": "Security association lifetime (in kilobytes)"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableInterfaceRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "vdcs": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "virtual",
+ "bridge",
+ "lag",
+ "100base-fx",
+ "100base-lfx",
+ "100base-tx",
+ "100base-t1",
+ "1000base-t",
+ "1000base-sx",
+ "1000base-lx",
+ "1000base-tx",
+ "2.5gbase-t",
+ "5gbase-t",
+ "10gbase-t",
+ "10gbase-cx4",
+ "100base-x-sfp",
+ "1000base-x-gbic",
+ "1000base-x-sfp",
+ "10gbase-x-sfpp",
+ "10gbase-x-xfp",
+ "10gbase-x-xenpak",
+ "10gbase-x-x2",
+ "25gbase-x-sfp28",
+ "50gbase-x-sfp56",
+ "40gbase-x-qsfpp",
+ "50gbase-x-sfp28",
+ "100gbase-x-cfp",
+ "100gbase-x-cfp2",
+ "200gbase-x-cfp2",
+ "400gbase-x-cfp2",
+ "100gbase-x-cfp4",
+ "100gbase-x-cxp",
+ "100gbase-x-cpak",
+ "100gbase-x-dsfp",
+ "100gbase-x-sfpdd",
+ "100gbase-x-qsfp28",
+ "100gbase-x-qsfpdd",
+ "200gbase-x-qsfp56",
+ "200gbase-x-qsfpdd",
+ "400gbase-x-qsfp112",
+ "400gbase-x-qsfpdd",
+ "400gbase-x-osfp",
+ "400gbase-x-osfp-rhs",
+ "400gbase-x-cdfp",
+ "400gbase-x-cfp8",
+ "800gbase-x-qsfpdd",
+ "800gbase-x-osfp",
+ "1000base-kx",
+ "2.5gbase-kx",
+ "5gbase-kr",
+ "10gbase-kr",
+ "10gbase-kx4",
+ "25gbase-kr",
+ "40gbase-kr4",
+ "50gbase-kr",
+ "100gbase-kp4",
+ "100gbase-kr2",
+ "100gbase-kr4",
+ "ieee802.11a",
+ "ieee802.11g",
+ "ieee802.11n",
+ "ieee802.11ac",
+ "ieee802.11ad",
+ "ieee802.11ax",
+ "ieee802.11ay",
+ "ieee802.11be",
+ "ieee802.15.1",
+ "ieee802.15.4",
+ "other-wireless",
+ "gsm",
+ "cdma",
+ "lte",
+ "4g",
+ "5g",
+ "sonet-oc3",
+ "sonet-oc12",
+ "sonet-oc48",
+ "sonet-oc192",
+ "sonet-oc768",
+ "sonet-oc1920",
+ "sonet-oc3840",
+ "1gfc-sfp",
+ "2gfc-sfp",
+ "4gfc-sfp",
+ "8gfc-sfpp",
+ "16gfc-sfpp",
+ "32gfc-sfp28",
+ "32gfc-sfpp",
+ "64gfc-qsfpp",
+ "64gfc-sfpdd",
+ "64gfc-sfpp",
+ "128gfc-qsfp28",
+ "infiniband-sdr",
+ "infiniband-ddr",
+ "infiniband-qdr",
+ "infiniband-fdr10",
+ "infiniband-fdr",
+ "infiniband-edr",
+ "infiniband-hdr",
+ "infiniband-ndr",
+ "infiniband-xdr",
+ "t1",
+ "e1",
+ "t3",
+ "e3",
+ "xdsl",
+ "docsis",
+ "moca",
+ "bpon",
+ "epon",
+ "10g-epon",
+ "gpon",
+ "xg-pon",
+ "xgs-pon",
+ "ng-pon2",
+ "25g-pon",
+ "50g-pon",
+ "cisco-stackwise",
+ "cisco-stackwise-plus",
+ "cisco-flexstack",
+ "cisco-flexstack-plus",
+ "cisco-stackwise-80",
+ "cisco-stackwise-160",
+ "cisco-stackwise-320",
+ "cisco-stackwise-480",
+ "cisco-stackwise-1t",
+ "juniper-vcp",
+ "extreme-summitstack",
+ "extreme-summitstack-128",
+ "extreme-summitstack-256",
+ "extreme-summitstack-512",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `virtual` - Virtual\n* `bridge` - Bridge\n* `lag` - Link Aggregation Group (LAG)\n* `100base-fx` - 100BASE-FX (10/100ME FIBER)\n* `100base-lfx` - 100BASE-LFX (10/100ME FIBER)\n* `100base-tx` - 100BASE-TX (10/100ME)\n* `100base-t1` - 100BASE-T1 (10/100ME Single Pair)\n* `1000base-t` - 1000BASE-T (1GE)\n* `1000base-sx` - 1000BASE-SX (1GE)\n* `1000base-lx` - 1000BASE-LX (1GE)\n* `1000base-tx` - 1000BASE-TX (1GE)\n* `2.5gbase-t` - 2.5GBASE-T (2.5GE)\n* `5gbase-t` - 5GBASE-T (5GE)\n* `10gbase-t` - 10GBASE-T (10GE)\n* `10gbase-cx4` - 10GBASE-CX4 (10GE)\n* `100base-x-sfp` - SFP (100ME)\n* `1000base-x-gbic` - GBIC (1GE)\n* `1000base-x-sfp` - SFP (1GE)\n* `10gbase-x-sfpp` - SFP+ (10GE)\n* `10gbase-x-xfp` - XFP (10GE)\n* `10gbase-x-xenpak` - XENPAK (10GE)\n* `10gbase-x-x2` - X2 (10GE)\n* `25gbase-x-sfp28` - SFP28 (25GE)\n* `50gbase-x-sfp56` - SFP56 (50GE)\n* `40gbase-x-qsfpp` - QSFP+ (40GE)\n* `50gbase-x-sfp28` - QSFP28 (50GE)\n* `100gbase-x-cfp` - CFP (100GE)\n* `100gbase-x-cfp2` - CFP2 (100GE)\n* `200gbase-x-cfp2` - CFP2 (200GE)\n* `400gbase-x-cfp2` - CFP2 (400GE)\n* `100gbase-x-cfp4` - CFP4 (100GE)\n* `100gbase-x-cxp` - CXP (100GE)\n* `100gbase-x-cpak` - Cisco CPAK (100GE)\n* `100gbase-x-dsfp` - DSFP (100GE)\n* `100gbase-x-sfpdd` - SFP-DD (100GE)\n* `100gbase-x-qsfp28` - QSFP28 (100GE)\n* `100gbase-x-qsfpdd` - QSFP-DD (100GE)\n* `200gbase-x-qsfp56` - QSFP56 (200GE)\n* `200gbase-x-qsfpdd` - QSFP-DD (200GE)\n* `400gbase-x-qsfp112` - QSFP112 (400GE)\n* `400gbase-x-qsfpdd` - QSFP-DD (400GE)\n* `400gbase-x-osfp` - OSFP (400GE)\n* `400gbase-x-osfp-rhs` - OSFP-RHS (400GE)\n* `400gbase-x-cdfp` - CDFP (400GE)\n* `400gbase-x-cfp8` - CPF8 (400GE)\n* `800gbase-x-qsfpdd` - QSFP-DD (800GE)\n* `800gbase-x-osfp` - OSFP (800GE)\n* `1000base-kx` - 1000BASE-KX (1GE)\n* `2.5gbase-kx` - 2.5GBASE-KX (2.5GE)\n* `5gbase-kr` - 5GBASE-KR (5GE)\n* `10gbase-kr` - 10GBASE-KR (10GE)\n* `10gbase-kx4` - 10GBASE-KX4 (10GE)\n* `25gbase-kr` - 25GBASE-KR (25GE)\n* `40gbase-kr4` - 40GBASE-KR4 (40GE)\n* `50gbase-kr` - 50GBASE-KR (50GE)\n* `100gbase-kp4` - 100GBASE-KP4 (100GE)\n* `100gbase-kr2` - 100GBASE-KR2 (100GE)\n* `100gbase-kr4` - 100GBASE-KR4 (100GE)\n* `ieee802.11a` - IEEE 802.11a\n* `ieee802.11g` - IEEE 802.11b/g\n* `ieee802.11n` - IEEE 802.11n\n* `ieee802.11ac` - IEEE 802.11ac\n* `ieee802.11ad` - IEEE 802.11ad\n* `ieee802.11ax` - IEEE 802.11ax\n* `ieee802.11ay` - IEEE 802.11ay\n* `ieee802.11be` - IEEE 802.11be\n* `ieee802.15.1` - IEEE 802.15.1 (Bluetooth)\n* `ieee802.15.4` - IEEE 802.15.4 (LR-WPAN)\n* `other-wireless` - Other (Wireless)\n* `gsm` - GSM\n* `cdma` - CDMA\n* `lte` - LTE\n* `4g` - 4G\n* `5g` - 5G\n* `sonet-oc3` - OC-3/STM-1\n* `sonet-oc12` - OC-12/STM-4\n* `sonet-oc48` - OC-48/STM-16\n* `sonet-oc192` - OC-192/STM-64\n* `sonet-oc768` - OC-768/STM-256\n* `sonet-oc1920` - OC-1920/STM-640\n* `sonet-oc3840` - OC-3840/STM-1234\n* `1gfc-sfp` - SFP (1GFC)\n* `2gfc-sfp` - SFP (2GFC)\n* `4gfc-sfp` - SFP (4GFC)\n* `8gfc-sfpp` - SFP+ (8GFC)\n* `16gfc-sfpp` - SFP+ (16GFC)\n* `32gfc-sfp28` - SFP28 (32GFC)\n* `32gfc-sfpp` - SFP+ (32GFC)\n* `64gfc-qsfpp` - QSFP+ (64GFC)\n* `64gfc-sfpdd` - SFP-DD (64GFC)\n* `64gfc-sfpp` - SFP+ (64GFC)\n* `128gfc-qsfp28` - QSFP28 (128GFC)\n* `infiniband-sdr` - SDR (2 Gbps)\n* `infiniband-ddr` - DDR (4 Gbps)\n* `infiniband-qdr` - QDR (8 Gbps)\n* `infiniband-fdr10` - FDR10 (10 Gbps)\n* `infiniband-fdr` - FDR (13.5 Gbps)\n* `infiniband-edr` - EDR (25 Gbps)\n* `infiniband-hdr` - HDR (50 Gbps)\n* `infiniband-ndr` - NDR (100 Gbps)\n* `infiniband-xdr` - XDR (250 Gbps)\n* `t1` - T1 (1.544 Mbps)\n* `e1` - E1 (2.048 Mbps)\n* `t3` - T3 (45 Mbps)\n* `e3` - E3 (34 Mbps)\n* `xdsl` - xDSL\n* `docsis` - DOCSIS\n* `moca` - MoCA\n* `bpon` - BPON (622 Mbps / 155 Mbps)\n* `epon` - EPON (1 Gbps)\n* `10g-epon` - 10G-EPON (10 Gbps)\n* `gpon` - GPON (2.5 Gbps / 1.25 Gbps)\n* `xg-pon` - XG-PON (10 Gbps / 2.5 Gbps)\n* `xgs-pon` - XGS-PON (10 Gbps)\n* `ng-pon2` - NG-PON2 (TWDM-PON) (4x10 Gbps)\n* `25g-pon` - 25G-PON (25 Gbps)\n* `50g-pon` - 50G-PON (50 Gbps)\n* `cisco-stackwise` - Cisco StackWise\n* `cisco-stackwise-plus` - Cisco StackWise Plus\n* `cisco-flexstack` - Cisco FlexStack\n* `cisco-flexstack-plus` - Cisco FlexStack Plus\n* `cisco-stackwise-80` - Cisco StackWise-80\n* `cisco-stackwise-160` - Cisco StackWise-160\n* `cisco-stackwise-320` - Cisco StackWise-320\n* `cisco-stackwise-480` - Cisco StackWise-480\n* `cisco-stackwise-1t` - Cisco StackWise-1T\n* `juniper-vcp` - Juniper VCP\n* `extreme-summitstack` - Extreme SummitStack\n* `extreme-summitstack-128` - Extreme SummitStack-128\n* `extreme-summitstack-256` - Extreme SummitStack-256\n* `extreme-summitstack-512` - Extreme SummitStack-512\n* `other` - Other",
+ "x-spec-enum-id": "8c4c5e112f77a383"
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true,
+ "title": "Parent interface"
+ },
+ "bridge": {
+ "type": "integer",
+ "nullable": true,
+ "title": "Bridge interface"
+ },
+ "lag": {
+ "type": "integer",
+ "nullable": true,
+ "title": "Parent LAG"
+ },
+ "mtu": {
+ "type": "integer",
+ "maximum": 65536,
+ "minimum": 1,
+ "nullable": true
+ },
+ "primary_mac_address": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefMACAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "speed": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Speed (Kbps)"
+ },
+ "duplex": {
+ "enum": [
+ "half",
+ "full",
+ "auto",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `half` - Half\n* `full` - Full\n* `auto` - Auto",
+ "x-spec-enum-id": "47eab9b1a65a1e21",
+ "nullable": true
+ },
+ "wwn": {
+ "type": "string",
+ "nullable": true
+ },
+ "mgmt_only": {
+ "type": "boolean",
+ "title": "Management only",
+ "description": "This interface is used only for out-of-band management"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mode": {
+ "enum": [
+ "access",
+ "tagged",
+ "tagged-all",
+ "q-in-q",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "b6fe48fe21dbf01d",
+ "nullable": true,
+ "description": "IEEE 802.1Q tagging strategy\n\n* `access` - Access\n* `tagged` - Tagged\n* `tagged-all` - Tagged (All)\n* `q-in-q` - Q-in-Q (802.1ad)"
+ },
+ "rf_role": {
+ "enum": [
+ "ap",
+ "station",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `ap` - Access point\n* `station` - Station",
+ "x-spec-enum-id": "d2772dbea88b0fb1",
+ "nullable": true,
+ "title": "Wireless role"
+ },
+ "rf_channel": {
+ "enum": [
+ "2.4g-1-2412-22",
+ "2.4g-2-2417-22",
+ "2.4g-3-2422-22",
+ "2.4g-4-2427-22",
+ "2.4g-5-2432-22",
+ "2.4g-6-2437-22",
+ "2.4g-7-2442-22",
+ "2.4g-8-2447-22",
+ "2.4g-9-2452-22",
+ "2.4g-10-2457-22",
+ "2.4g-11-2462-22",
+ "2.4g-12-2467-22",
+ "2.4g-13-2472-22",
+ "5g-32-5160-20",
+ "5g-34-5170-40",
+ "5g-36-5180-20",
+ "5g-38-5190-40",
+ "5g-40-5200-20",
+ "5g-42-5210-80",
+ "5g-44-5220-20",
+ "5g-46-5230-40",
+ "5g-48-5240-20",
+ "5g-50-5250-160",
+ "5g-52-5260-20",
+ "5g-54-5270-40",
+ "5g-56-5280-20",
+ "5g-58-5290-80",
+ "5g-60-5300-20",
+ "5g-62-5310-40",
+ "5g-64-5320-20",
+ "5g-100-5500-20",
+ "5g-102-5510-40",
+ "5g-104-5520-20",
+ "5g-106-5530-80",
+ "5g-108-5540-20",
+ "5g-110-5550-40",
+ "5g-112-5560-20",
+ "5g-114-5570-160",
+ "5g-116-5580-20",
+ "5g-118-5590-40",
+ "5g-120-5600-20",
+ "5g-122-5610-80",
+ "5g-124-5620-20",
+ "5g-126-5630-40",
+ "5g-128-5640-20",
+ "5g-132-5660-20",
+ "5g-134-5670-40",
+ "5g-136-5680-20",
+ "5g-138-5690-80",
+ "5g-140-5700-20",
+ "5g-142-5710-40",
+ "5g-144-5720-20",
+ "5g-149-5745-20",
+ "5g-151-5755-40",
+ "5g-153-5765-20",
+ "5g-155-5775-80",
+ "5g-157-5785-20",
+ "5g-159-5795-40",
+ "5g-161-5805-20",
+ "5g-163-5815-160",
+ "5g-165-5825-20",
+ "5g-167-5835-40",
+ "5g-169-5845-20",
+ "5g-171-5855-80",
+ "5g-173-5865-20",
+ "5g-175-5875-40",
+ "5g-177-5885-20",
+ "6g-1-5955-20",
+ "6g-3-5965-40",
+ "6g-5-5975-20",
+ "6g-7-5985-80",
+ "6g-9-5995-20",
+ "6g-11-6005-40",
+ "6g-13-6015-20",
+ "6g-15-6025-160",
+ "6g-17-6035-20",
+ "6g-19-6045-40",
+ "6g-21-6055-20",
+ "6g-23-6065-80",
+ "6g-25-6075-20",
+ "6g-27-6085-40",
+ "6g-29-6095-20",
+ "6g-31-6105-320",
+ "6g-33-6115-20",
+ "6g-35-6125-40",
+ "6g-37-6135-20",
+ "6g-39-6145-80",
+ "6g-41-6155-20",
+ "6g-43-6165-40",
+ "6g-45-6175-20",
+ "6g-47-6185-160",
+ "6g-49-6195-20",
+ "6g-51-6205-40",
+ "6g-53-6215-20",
+ "6g-55-6225-80",
+ "6g-57-6235-20",
+ "6g-59-6245-40",
+ "6g-61-6255-20",
+ "6g-65-6275-20",
+ "6g-67-6285-40",
+ "6g-69-6295-20",
+ "6g-71-6305-80",
+ "6g-73-6315-20",
+ "6g-75-6325-40",
+ "6g-77-6335-20",
+ "6g-79-6345-160",
+ "6g-81-6355-20",
+ "6g-83-6365-40",
+ "6g-85-6375-20",
+ "6g-87-6385-80",
+ "6g-89-6395-20",
+ "6g-91-6405-40",
+ "6g-93-6415-20",
+ "6g-95-6425-320",
+ "6g-97-6435-20",
+ "6g-99-6445-40",
+ "6g-101-6455-20",
+ "6g-103-6465-80",
+ "6g-105-6475-20",
+ "6g-107-6485-40",
+ "6g-109-6495-20",
+ "6g-111-6505-160",
+ "6g-113-6515-20",
+ "6g-115-6525-40",
+ "6g-117-6535-20",
+ "6g-119-6545-80",
+ "6g-121-6555-20",
+ "6g-123-6565-40",
+ "6g-125-6575-20",
+ "6g-129-6595-20",
+ "6g-131-6605-40",
+ "6g-133-6615-20",
+ "6g-135-6625-80",
+ "6g-137-6635-20",
+ "6g-139-6645-40",
+ "6g-141-6655-20",
+ "6g-143-6665-160",
+ "6g-145-6675-20",
+ "6g-147-6685-40",
+ "6g-149-6695-20",
+ "6g-151-6705-80",
+ "6g-153-6715-20",
+ "6g-155-6725-40",
+ "6g-157-6735-20",
+ "6g-159-6745-320",
+ "6g-161-6755-20",
+ "6g-163-6765-40",
+ "6g-165-6775-20",
+ "6g-167-6785-80",
+ "6g-169-6795-20",
+ "6g-171-6805-40",
+ "6g-173-6815-20",
+ "6g-175-6825-160",
+ "6g-177-6835-20",
+ "6g-179-6845-40",
+ "6g-181-6855-20",
+ "6g-183-6865-80",
+ "6g-185-6875-20",
+ "6g-187-6885-40",
+ "6g-189-6895-20",
+ "6g-193-6915-20",
+ "6g-195-6925-40",
+ "6g-197-6935-20",
+ "6g-199-6945-80",
+ "6g-201-6955-20",
+ "6g-203-6965-40",
+ "6g-205-6975-20",
+ "6g-207-6985-160",
+ "6g-209-6995-20",
+ "6g-211-7005-40",
+ "6g-213-7015-20",
+ "6g-215-7025-80",
+ "6g-217-7035-20",
+ "6g-219-7045-40",
+ "6g-221-7055-20",
+ "6g-225-7075-20",
+ "6g-227-7085-40",
+ "6g-229-7095-20",
+ "6g-233-7115-20",
+ "60g-1-58320-2160",
+ "60g-2-60480-2160",
+ "60g-3-62640-2160",
+ "60g-4-64800-2160",
+ "60g-5-66960-2160",
+ "60g-6-69120-2160",
+ "60g-9-59400-4320",
+ "60g-10-61560-4320",
+ "60g-11-63720-4320",
+ "60g-12-65880-4320",
+ "60g-13-68040-4320",
+ "60g-17-60480-6480",
+ "60g-18-62640-6480",
+ "60g-19-64800-6480",
+ "60g-20-66960-6480",
+ "60g-25-61560-6480",
+ "60g-26-63720-6480",
+ "60g-27-65880-6480",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `2.4g-1-2412-22` - 1 (2412 MHz)\n* `2.4g-2-2417-22` - 2 (2417 MHz)\n* `2.4g-3-2422-22` - 3 (2422 MHz)\n* `2.4g-4-2427-22` - 4 (2427 MHz)\n* `2.4g-5-2432-22` - 5 (2432 MHz)\n* `2.4g-6-2437-22` - 6 (2437 MHz)\n* `2.4g-7-2442-22` - 7 (2442 MHz)\n* `2.4g-8-2447-22` - 8 (2447 MHz)\n* `2.4g-9-2452-22` - 9 (2452 MHz)\n* `2.4g-10-2457-22` - 10 (2457 MHz)\n* `2.4g-11-2462-22` - 11 (2462 MHz)\n* `2.4g-12-2467-22` - 12 (2467 MHz)\n* `2.4g-13-2472-22` - 13 (2472 MHz)\n* `5g-32-5160-20` - 32 (5160/20 MHz)\n* `5g-34-5170-40` - 34 (5170/40 MHz)\n* `5g-36-5180-20` - 36 (5180/20 MHz)\n* `5g-38-5190-40` - 38 (5190/40 MHz)\n* `5g-40-5200-20` - 40 (5200/20 MHz)\n* `5g-42-5210-80` - 42 (5210/80 MHz)\n* `5g-44-5220-20` - 44 (5220/20 MHz)\n* `5g-46-5230-40` - 46 (5230/40 MHz)\n* `5g-48-5240-20` - 48 (5240/20 MHz)\n* `5g-50-5250-160` - 50 (5250/160 MHz)\n* `5g-52-5260-20` - 52 (5260/20 MHz)\n* `5g-54-5270-40` - 54 (5270/40 MHz)\n* `5g-56-5280-20` - 56 (5280/20 MHz)\n* `5g-58-5290-80` - 58 (5290/80 MHz)\n* `5g-60-5300-20` - 60 (5300/20 MHz)\n* `5g-62-5310-40` - 62 (5310/40 MHz)\n* `5g-64-5320-20` - 64 (5320/20 MHz)\n* `5g-100-5500-20` - 100 (5500/20 MHz)\n* `5g-102-5510-40` - 102 (5510/40 MHz)\n* `5g-104-5520-20` - 104 (5520/20 MHz)\n* `5g-106-5530-80` - 106 (5530/80 MHz)\n* `5g-108-5540-20` - 108 (5540/20 MHz)\n* `5g-110-5550-40` - 110 (5550/40 MHz)\n* `5g-112-5560-20` - 112 (5560/20 MHz)\n* `5g-114-5570-160` - 114 (5570/160 MHz)\n* `5g-116-5580-20` - 116 (5580/20 MHz)\n* `5g-118-5590-40` - 118 (5590/40 MHz)\n* `5g-120-5600-20` - 120 (5600/20 MHz)\n* `5g-122-5610-80` - 122 (5610/80 MHz)\n* `5g-124-5620-20` - 124 (5620/20 MHz)\n* `5g-126-5630-40` - 126 (5630/40 MHz)\n* `5g-128-5640-20` - 128 (5640/20 MHz)\n* `5g-132-5660-20` - 132 (5660/20 MHz)\n* `5g-134-5670-40` - 134 (5670/40 MHz)\n* `5g-136-5680-20` - 136 (5680/20 MHz)\n* `5g-138-5690-80` - 138 (5690/80 MHz)\n* `5g-140-5700-20` - 140 (5700/20 MHz)\n* `5g-142-5710-40` - 142 (5710/40 MHz)\n* `5g-144-5720-20` - 144 (5720/20 MHz)\n* `5g-149-5745-20` - 149 (5745/20 MHz)\n* `5g-151-5755-40` - 151 (5755/40 MHz)\n* `5g-153-5765-20` - 153 (5765/20 MHz)\n* `5g-155-5775-80` - 155 (5775/80 MHz)\n* `5g-157-5785-20` - 157 (5785/20 MHz)\n* `5g-159-5795-40` - 159 (5795/40 MHz)\n* `5g-161-5805-20` - 161 (5805/20 MHz)\n* `5g-163-5815-160` - 163 (5815/160 MHz)\n* `5g-165-5825-20` - 165 (5825/20 MHz)\n* `5g-167-5835-40` - 167 (5835/40 MHz)\n* `5g-169-5845-20` - 169 (5845/20 MHz)\n* `5g-171-5855-80` - 171 (5855/80 MHz)\n* `5g-173-5865-20` - 173 (5865/20 MHz)\n* `5g-175-5875-40` - 175 (5875/40 MHz)\n* `5g-177-5885-20` - 177 (5885/20 MHz)\n* `6g-1-5955-20` - 1 (5955/20 MHz)\n* `6g-3-5965-40` - 3 (5965/40 MHz)\n* `6g-5-5975-20` - 5 (5975/20 MHz)\n* `6g-7-5985-80` - 7 (5985/80 MHz)\n* `6g-9-5995-20` - 9 (5995/20 MHz)\n* `6g-11-6005-40` - 11 (6005/40 MHz)\n* `6g-13-6015-20` - 13 (6015/20 MHz)\n* `6g-15-6025-160` - 15 (6025/160 MHz)\n* `6g-17-6035-20` - 17 (6035/20 MHz)\n* `6g-19-6045-40` - 19 (6045/40 MHz)\n* `6g-21-6055-20` - 21 (6055/20 MHz)\n* `6g-23-6065-80` - 23 (6065/80 MHz)\n* `6g-25-6075-20` - 25 (6075/20 MHz)\n* `6g-27-6085-40` - 27 (6085/40 MHz)\n* `6g-29-6095-20` - 29 (6095/20 MHz)\n* `6g-31-6105-320` - 31 (6105/320 MHz)\n* `6g-33-6115-20` - 33 (6115/20 MHz)\n* `6g-35-6125-40` - 35 (6125/40 MHz)\n* `6g-37-6135-20` - 37 (6135/20 MHz)\n* `6g-39-6145-80` - 39 (6145/80 MHz)\n* `6g-41-6155-20` - 41 (6155/20 MHz)\n* `6g-43-6165-40` - 43 (6165/40 MHz)\n* `6g-45-6175-20` - 45 (6175/20 MHz)\n* `6g-47-6185-160` - 47 (6185/160 MHz)\n* `6g-49-6195-20` - 49 (6195/20 MHz)\n* `6g-51-6205-40` - 51 (6205/40 MHz)\n* `6g-53-6215-20` - 53 (6215/20 MHz)\n* `6g-55-6225-80` - 55 (6225/80 MHz)\n* `6g-57-6235-20` - 57 (6235/20 MHz)\n* `6g-59-6245-40` - 59 (6245/40 MHz)\n* `6g-61-6255-20` - 61 (6255/20 MHz)\n* `6g-65-6275-20` - 65 (6275/20 MHz)\n* `6g-67-6285-40` - 67 (6285/40 MHz)\n* `6g-69-6295-20` - 69 (6295/20 MHz)\n* `6g-71-6305-80` - 71 (6305/80 MHz)\n* `6g-73-6315-20` - 73 (6315/20 MHz)\n* `6g-75-6325-40` - 75 (6325/40 MHz)\n* `6g-77-6335-20` - 77 (6335/20 MHz)\n* `6g-79-6345-160` - 79 (6345/160 MHz)\n* `6g-81-6355-20` - 81 (6355/20 MHz)\n* `6g-83-6365-40` - 83 (6365/40 MHz)\n* `6g-85-6375-20` - 85 (6375/20 MHz)\n* `6g-87-6385-80` - 87 (6385/80 MHz)\n* `6g-89-6395-20` - 89 (6395/20 MHz)\n* `6g-91-6405-40` - 91 (6405/40 MHz)\n* `6g-93-6415-20` - 93 (6415/20 MHz)\n* `6g-95-6425-320` - 95 (6425/320 MHz)\n* `6g-97-6435-20` - 97 (6435/20 MHz)\n* `6g-99-6445-40` - 99 (6445/40 MHz)\n* `6g-101-6455-20` - 101 (6455/20 MHz)\n* `6g-103-6465-80` - 103 (6465/80 MHz)\n* `6g-105-6475-20` - 105 (6475/20 MHz)\n* `6g-107-6485-40` - 107 (6485/40 MHz)\n* `6g-109-6495-20` - 109 (6495/20 MHz)\n* `6g-111-6505-160` - 111 (6505/160 MHz)\n* `6g-113-6515-20` - 113 (6515/20 MHz)\n* `6g-115-6525-40` - 115 (6525/40 MHz)\n* `6g-117-6535-20` - 117 (6535/20 MHz)\n* `6g-119-6545-80` - 119 (6545/80 MHz)\n* `6g-121-6555-20` - 121 (6555/20 MHz)\n* `6g-123-6565-40` - 123 (6565/40 MHz)\n* `6g-125-6575-20` - 125 (6575/20 MHz)\n* `6g-129-6595-20` - 129 (6595/20 MHz)\n* `6g-131-6605-40` - 131 (6605/40 MHz)\n* `6g-133-6615-20` - 133 (6615/20 MHz)\n* `6g-135-6625-80` - 135 (6625/80 MHz)\n* `6g-137-6635-20` - 137 (6635/20 MHz)\n* `6g-139-6645-40` - 139 (6645/40 MHz)\n* `6g-141-6655-20` - 141 (6655/20 MHz)\n* `6g-143-6665-160` - 143 (6665/160 MHz)\n* `6g-145-6675-20` - 145 (6675/20 MHz)\n* `6g-147-6685-40` - 147 (6685/40 MHz)\n* `6g-149-6695-20` - 149 (6695/20 MHz)\n* `6g-151-6705-80` - 151 (6705/80 MHz)\n* `6g-153-6715-20` - 153 (6715/20 MHz)\n* `6g-155-6725-40` - 155 (6725/40 MHz)\n* `6g-157-6735-20` - 157 (6735/20 MHz)\n* `6g-159-6745-320` - 159 (6745/320 MHz)\n* `6g-161-6755-20` - 161 (6755/20 MHz)\n* `6g-163-6765-40` - 163 (6765/40 MHz)\n* `6g-165-6775-20` - 165 (6775/20 MHz)\n* `6g-167-6785-80` - 167 (6785/80 MHz)\n* `6g-169-6795-20` - 169 (6795/20 MHz)\n* `6g-171-6805-40` - 171 (6805/40 MHz)\n* `6g-173-6815-20` - 173 (6815/20 MHz)\n* `6g-175-6825-160` - 175 (6825/160 MHz)\n* `6g-177-6835-20` - 177 (6835/20 MHz)\n* `6g-179-6845-40` - 179 (6845/40 MHz)\n* `6g-181-6855-20` - 181 (6855/20 MHz)\n* `6g-183-6865-80` - 183 (6865/80 MHz)\n* `6g-185-6875-20` - 185 (6875/20 MHz)\n* `6g-187-6885-40` - 187 (6885/40 MHz)\n* `6g-189-6895-20` - 189 (6895/20 MHz)\n* `6g-193-6915-20` - 193 (6915/20 MHz)\n* `6g-195-6925-40` - 195 (6925/40 MHz)\n* `6g-197-6935-20` - 197 (6935/20 MHz)\n* `6g-199-6945-80` - 199 (6945/80 MHz)\n* `6g-201-6955-20` - 201 (6955/20 MHz)\n* `6g-203-6965-40` - 203 (6965/40 MHz)\n* `6g-205-6975-20` - 205 (6975/20 MHz)\n* `6g-207-6985-160` - 207 (6985/160 MHz)\n* `6g-209-6995-20` - 209 (6995/20 MHz)\n* `6g-211-7005-40` - 211 (7005/40 MHz)\n* `6g-213-7015-20` - 213 (7015/20 MHz)\n* `6g-215-7025-80` - 215 (7025/80 MHz)\n* `6g-217-7035-20` - 217 (7035/20 MHz)\n* `6g-219-7045-40` - 219 (7045/40 MHz)\n* `6g-221-7055-20` - 221 (7055/20 MHz)\n* `6g-225-7075-20` - 225 (7075/20 MHz)\n* `6g-227-7085-40` - 227 (7085/40 MHz)\n* `6g-229-7095-20` - 229 (7095/20 MHz)\n* `6g-233-7115-20` - 233 (7115/20 MHz)\n* `60g-1-58320-2160` - 1 (58.32/2.16 GHz)\n* `60g-2-60480-2160` - 2 (60.48/2.16 GHz)\n* `60g-3-62640-2160` - 3 (62.64/2.16 GHz)\n* `60g-4-64800-2160` - 4 (64.80/2.16 GHz)\n* `60g-5-66960-2160` - 5 (66.96/2.16 GHz)\n* `60g-6-69120-2160` - 6 (69.12/2.16 GHz)\n* `60g-9-59400-4320` - 9 (59.40/4.32 GHz)\n* `60g-10-61560-4320` - 10 (61.56/4.32 GHz)\n* `60g-11-63720-4320` - 11 (63.72/4.32 GHz)\n* `60g-12-65880-4320` - 12 (65.88/4.32 GHz)\n* `60g-13-68040-4320` - 13 (68.04/4.32 GHz)\n* `60g-17-60480-6480` - 17 (60.48/6.48 GHz)\n* `60g-18-62640-6480` - 18 (62.64/6.48 GHz)\n* `60g-19-64800-6480` - 19 (64.80/6.48 GHz)\n* `60g-20-66960-6480` - 20 (66.96/6.48 GHz)\n* `60g-25-61560-6480` - 25 (61.56/8.64 GHz)\n* `60g-26-63720-6480` - 26 (63.72/8.64 GHz)\n* `60g-27-65880-6480` - 27 (65.88/8.64 GHz)",
+ "x-spec-enum-id": "aac33cc237adc8f9",
+ "nullable": true,
+ "title": "Wireless channel"
+ },
+ "poe_mode": {
+ "enum": [
+ "pd",
+ "pse",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `pd` - PD\n* `pse` - PSE",
+ "x-spec-enum-id": "2f2fe6dcdc7772bd",
+ "nullable": true
+ },
+ "poe_type": {
+ "enum": [
+ "type1-ieee802.3af",
+ "type2-ieee802.3at",
+ "type3-ieee802.3bt",
+ "type4-ieee802.3bt",
+ "passive-24v-2pair",
+ "passive-24v-4pair",
+ "passive-48v-2pair",
+ "passive-48v-4pair",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `type1-ieee802.3af` - 802.3af (Type 1)\n* `type2-ieee802.3at` - 802.3at (Type 2)\n* `type3-ieee802.3bt` - 802.3bt (Type 3)\n* `type4-ieee802.3bt` - 802.3bt (Type 4)\n* `passive-24v-2pair` - Passive 24V (2-pair)\n* `passive-24v-4pair` - Passive 24V (4-pair)\n* `passive-48v-2pair` - Passive 48V (2-pair)\n* `passive-48v-4pair` - Passive 48V (4-pair)",
+ "x-spec-enum-id": "74bd3be4012f6da9",
+ "nullable": true
+ },
+ "rf_channel_frequency": {
+ "type": "number",
+ "format": "double",
+ "maximum": 100000,
+ "minimum": -100000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "title": "Channel frequency (MHz)",
+ "description": "Populated by selected channel (if set)"
+ },
+ "rf_channel_width": {
+ "type": "number",
+ "format": "double",
+ "maximum": 10000,
+ "minimum": -10000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "title": "Channel width (MHz)",
+ "description": "Populated by selected channel (if set)"
+ },
+ "tx_power": {
+ "type": "integer",
+ "maximum": 127,
+ "minimum": -40,
+ "nullable": true,
+ "title": "Transmit power (dBm)"
+ },
+ "untagged_vlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tagged_vlans": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "qinq_svlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vlan_translation_policy": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANTranslationPolicyRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "wireless_lans": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "vrf": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRFRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableInterfaceTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "virtual",
+ "bridge",
+ "lag",
+ "100base-fx",
+ "100base-lfx",
+ "100base-tx",
+ "100base-t1",
+ "1000base-t",
+ "1000base-sx",
+ "1000base-lx",
+ "1000base-tx",
+ "2.5gbase-t",
+ "5gbase-t",
+ "10gbase-t",
+ "10gbase-cx4",
+ "100base-x-sfp",
+ "1000base-x-gbic",
+ "1000base-x-sfp",
+ "10gbase-x-sfpp",
+ "10gbase-x-xfp",
+ "10gbase-x-xenpak",
+ "10gbase-x-x2",
+ "25gbase-x-sfp28",
+ "50gbase-x-sfp56",
+ "40gbase-x-qsfpp",
+ "50gbase-x-sfp28",
+ "100gbase-x-cfp",
+ "100gbase-x-cfp2",
+ "200gbase-x-cfp2",
+ "400gbase-x-cfp2",
+ "100gbase-x-cfp4",
+ "100gbase-x-cxp",
+ "100gbase-x-cpak",
+ "100gbase-x-dsfp",
+ "100gbase-x-sfpdd",
+ "100gbase-x-qsfp28",
+ "100gbase-x-qsfpdd",
+ "200gbase-x-qsfp56",
+ "200gbase-x-qsfpdd",
+ "400gbase-x-qsfp112",
+ "400gbase-x-qsfpdd",
+ "400gbase-x-osfp",
+ "400gbase-x-osfp-rhs",
+ "400gbase-x-cdfp",
+ "400gbase-x-cfp8",
+ "800gbase-x-qsfpdd",
+ "800gbase-x-osfp",
+ "1000base-kx",
+ "2.5gbase-kx",
+ "5gbase-kr",
+ "10gbase-kr",
+ "10gbase-kx4",
+ "25gbase-kr",
+ "40gbase-kr4",
+ "50gbase-kr",
+ "100gbase-kp4",
+ "100gbase-kr2",
+ "100gbase-kr4",
+ "ieee802.11a",
+ "ieee802.11g",
+ "ieee802.11n",
+ "ieee802.11ac",
+ "ieee802.11ad",
+ "ieee802.11ax",
+ "ieee802.11ay",
+ "ieee802.11be",
+ "ieee802.15.1",
+ "ieee802.15.4",
+ "other-wireless",
+ "gsm",
+ "cdma",
+ "lte",
+ "4g",
+ "5g",
+ "sonet-oc3",
+ "sonet-oc12",
+ "sonet-oc48",
+ "sonet-oc192",
+ "sonet-oc768",
+ "sonet-oc1920",
+ "sonet-oc3840",
+ "1gfc-sfp",
+ "2gfc-sfp",
+ "4gfc-sfp",
+ "8gfc-sfpp",
+ "16gfc-sfpp",
+ "32gfc-sfp28",
+ "32gfc-sfpp",
+ "64gfc-qsfpp",
+ "64gfc-sfpdd",
+ "64gfc-sfpp",
+ "128gfc-qsfp28",
+ "infiniband-sdr",
+ "infiniband-ddr",
+ "infiniband-qdr",
+ "infiniband-fdr10",
+ "infiniband-fdr",
+ "infiniband-edr",
+ "infiniband-hdr",
+ "infiniband-ndr",
+ "infiniband-xdr",
+ "t1",
+ "e1",
+ "t3",
+ "e3",
+ "xdsl",
+ "docsis",
+ "moca",
+ "bpon",
+ "epon",
+ "10g-epon",
+ "gpon",
+ "xg-pon",
+ "xgs-pon",
+ "ng-pon2",
+ "25g-pon",
+ "50g-pon",
+ "cisco-stackwise",
+ "cisco-stackwise-plus",
+ "cisco-flexstack",
+ "cisco-flexstack-plus",
+ "cisco-stackwise-80",
+ "cisco-stackwise-160",
+ "cisco-stackwise-320",
+ "cisco-stackwise-480",
+ "cisco-stackwise-1t",
+ "juniper-vcp",
+ "extreme-summitstack",
+ "extreme-summitstack-128",
+ "extreme-summitstack-256",
+ "extreme-summitstack-512",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `virtual` - Virtual\n* `bridge` - Bridge\n* `lag` - Link Aggregation Group (LAG)\n* `100base-fx` - 100BASE-FX (10/100ME FIBER)\n* `100base-lfx` - 100BASE-LFX (10/100ME FIBER)\n* `100base-tx` - 100BASE-TX (10/100ME)\n* `100base-t1` - 100BASE-T1 (10/100ME Single Pair)\n* `1000base-t` - 1000BASE-T (1GE)\n* `1000base-sx` - 1000BASE-SX (1GE)\n* `1000base-lx` - 1000BASE-LX (1GE)\n* `1000base-tx` - 1000BASE-TX (1GE)\n* `2.5gbase-t` - 2.5GBASE-T (2.5GE)\n* `5gbase-t` - 5GBASE-T (5GE)\n* `10gbase-t` - 10GBASE-T (10GE)\n* `10gbase-cx4` - 10GBASE-CX4 (10GE)\n* `100base-x-sfp` - SFP (100ME)\n* `1000base-x-gbic` - GBIC (1GE)\n* `1000base-x-sfp` - SFP (1GE)\n* `10gbase-x-sfpp` - SFP+ (10GE)\n* `10gbase-x-xfp` - XFP (10GE)\n* `10gbase-x-xenpak` - XENPAK (10GE)\n* `10gbase-x-x2` - X2 (10GE)\n* `25gbase-x-sfp28` - SFP28 (25GE)\n* `50gbase-x-sfp56` - SFP56 (50GE)\n* `40gbase-x-qsfpp` - QSFP+ (40GE)\n* `50gbase-x-sfp28` - QSFP28 (50GE)\n* `100gbase-x-cfp` - CFP (100GE)\n* `100gbase-x-cfp2` - CFP2 (100GE)\n* `200gbase-x-cfp2` - CFP2 (200GE)\n* `400gbase-x-cfp2` - CFP2 (400GE)\n* `100gbase-x-cfp4` - CFP4 (100GE)\n* `100gbase-x-cxp` - CXP (100GE)\n* `100gbase-x-cpak` - Cisco CPAK (100GE)\n* `100gbase-x-dsfp` - DSFP (100GE)\n* `100gbase-x-sfpdd` - SFP-DD (100GE)\n* `100gbase-x-qsfp28` - QSFP28 (100GE)\n* `100gbase-x-qsfpdd` - QSFP-DD (100GE)\n* `200gbase-x-qsfp56` - QSFP56 (200GE)\n* `200gbase-x-qsfpdd` - QSFP-DD (200GE)\n* `400gbase-x-qsfp112` - QSFP112 (400GE)\n* `400gbase-x-qsfpdd` - QSFP-DD (400GE)\n* `400gbase-x-osfp` - OSFP (400GE)\n* `400gbase-x-osfp-rhs` - OSFP-RHS (400GE)\n* `400gbase-x-cdfp` - CDFP (400GE)\n* `400gbase-x-cfp8` - CPF8 (400GE)\n* `800gbase-x-qsfpdd` - QSFP-DD (800GE)\n* `800gbase-x-osfp` - OSFP (800GE)\n* `1000base-kx` - 1000BASE-KX (1GE)\n* `2.5gbase-kx` - 2.5GBASE-KX (2.5GE)\n* `5gbase-kr` - 5GBASE-KR (5GE)\n* `10gbase-kr` - 10GBASE-KR (10GE)\n* `10gbase-kx4` - 10GBASE-KX4 (10GE)\n* `25gbase-kr` - 25GBASE-KR (25GE)\n* `40gbase-kr4` - 40GBASE-KR4 (40GE)\n* `50gbase-kr` - 50GBASE-KR (50GE)\n* `100gbase-kp4` - 100GBASE-KP4 (100GE)\n* `100gbase-kr2` - 100GBASE-KR2 (100GE)\n* `100gbase-kr4` - 100GBASE-KR4 (100GE)\n* `ieee802.11a` - IEEE 802.11a\n* `ieee802.11g` - IEEE 802.11b/g\n* `ieee802.11n` - IEEE 802.11n\n* `ieee802.11ac` - IEEE 802.11ac\n* `ieee802.11ad` - IEEE 802.11ad\n* `ieee802.11ax` - IEEE 802.11ax\n* `ieee802.11ay` - IEEE 802.11ay\n* `ieee802.11be` - IEEE 802.11be\n* `ieee802.15.1` - IEEE 802.15.1 (Bluetooth)\n* `ieee802.15.4` - IEEE 802.15.4 (LR-WPAN)\n* `other-wireless` - Other (Wireless)\n* `gsm` - GSM\n* `cdma` - CDMA\n* `lte` - LTE\n* `4g` - 4G\n* `5g` - 5G\n* `sonet-oc3` - OC-3/STM-1\n* `sonet-oc12` - OC-12/STM-4\n* `sonet-oc48` - OC-48/STM-16\n* `sonet-oc192` - OC-192/STM-64\n* `sonet-oc768` - OC-768/STM-256\n* `sonet-oc1920` - OC-1920/STM-640\n* `sonet-oc3840` - OC-3840/STM-1234\n* `1gfc-sfp` - SFP (1GFC)\n* `2gfc-sfp` - SFP (2GFC)\n* `4gfc-sfp` - SFP (4GFC)\n* `8gfc-sfpp` - SFP+ (8GFC)\n* `16gfc-sfpp` - SFP+ (16GFC)\n* `32gfc-sfp28` - SFP28 (32GFC)\n* `32gfc-sfpp` - SFP+ (32GFC)\n* `64gfc-qsfpp` - QSFP+ (64GFC)\n* `64gfc-sfpdd` - SFP-DD (64GFC)\n* `64gfc-sfpp` - SFP+ (64GFC)\n* `128gfc-qsfp28` - QSFP28 (128GFC)\n* `infiniband-sdr` - SDR (2 Gbps)\n* `infiniband-ddr` - DDR (4 Gbps)\n* `infiniband-qdr` - QDR (8 Gbps)\n* `infiniband-fdr10` - FDR10 (10 Gbps)\n* `infiniband-fdr` - FDR (13.5 Gbps)\n* `infiniband-edr` - EDR (25 Gbps)\n* `infiniband-hdr` - HDR (50 Gbps)\n* `infiniband-ndr` - NDR (100 Gbps)\n* `infiniband-xdr` - XDR (250 Gbps)\n* `t1` - T1 (1.544 Mbps)\n* `e1` - E1 (2.048 Mbps)\n* `t3` - T3 (45 Mbps)\n* `e3` - E3 (34 Mbps)\n* `xdsl` - xDSL\n* `docsis` - DOCSIS\n* `moca` - MoCA\n* `bpon` - BPON (622 Mbps / 155 Mbps)\n* `epon` - EPON (1 Gbps)\n* `10g-epon` - 10G-EPON (10 Gbps)\n* `gpon` - GPON (2.5 Gbps / 1.25 Gbps)\n* `xg-pon` - XG-PON (10 Gbps / 2.5 Gbps)\n* `xgs-pon` - XGS-PON (10 Gbps)\n* `ng-pon2` - NG-PON2 (TWDM-PON) (4x10 Gbps)\n* `25g-pon` - 25G-PON (25 Gbps)\n* `50g-pon` - 50G-PON (50 Gbps)\n* `cisco-stackwise` - Cisco StackWise\n* `cisco-stackwise-plus` - Cisco StackWise Plus\n* `cisco-flexstack` - Cisco FlexStack\n* `cisco-flexstack-plus` - Cisco FlexStack Plus\n* `cisco-stackwise-80` - Cisco StackWise-80\n* `cisco-stackwise-160` - Cisco StackWise-160\n* `cisco-stackwise-320` - Cisco StackWise-320\n* `cisco-stackwise-480` - Cisco StackWise-480\n* `cisco-stackwise-1t` - Cisco StackWise-1T\n* `juniper-vcp` - Juniper VCP\n* `extreme-summitstack` - Extreme SummitStack\n* `extreme-summitstack-128` - Extreme SummitStack-128\n* `extreme-summitstack-256` - Extreme SummitStack-256\n* `extreme-summitstack-512` - Extreme SummitStack-512\n* `other` - Other",
+ "x-spec-enum-id": "8c4c5e112f77a383"
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "mgmt_only": {
+ "type": "boolean",
+ "title": "Management only"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "bridge": {
+ "type": "integer",
+ "nullable": true,
+ "title": "Bridge interface"
+ },
+ "poe_mode": {
+ "enum": [
+ "pd",
+ "pse",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `pd` - PD\n* `pse` - PSE",
+ "x-spec-enum-id": "2f2fe6dcdc7772bd",
+ "nullable": true
+ },
+ "poe_type": {
+ "enum": [
+ "type1-ieee802.3af",
+ "type2-ieee802.3at",
+ "type3-ieee802.3bt",
+ "type4-ieee802.3bt",
+ "passive-24v-2pair",
+ "passive-24v-4pair",
+ "passive-48v-2pair",
+ "passive-48v-4pair",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `type1-ieee802.3af` - 802.3af (Type 1)\n* `type2-ieee802.3at` - 802.3at (Type 2)\n* `type3-ieee802.3bt` - 802.3bt (Type 3)\n* `type4-ieee802.3bt` - 802.3bt (Type 4)\n* `passive-24v-2pair` - Passive 24V (2-pair)\n* `passive-24v-4pair` - Passive 24V (4-pair)\n* `passive-48v-2pair` - Passive 48V (2-pair)\n* `passive-48v-4pair` - Passive 48V (4-pair)",
+ "x-spec-enum-id": "74bd3be4012f6da9",
+ "nullable": true
+ },
+ "rf_role": {
+ "enum": [
+ "ap",
+ "station",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `ap` - Access point\n* `station` - Station",
+ "x-spec-enum-id": "d2772dbea88b0fb1",
+ "nullable": true,
+ "title": "Wireless role"
+ }
+ }
+ },
+ "PatchedWritableInventoryItemRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "status": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "2217e87d0c3efdda"
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefInventoryItemRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "part_id": {
+ "type": "string",
+ "description": "Manufacturer-assigned part identifier",
+ "maxLength": 50
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this item",
+ "maxLength": 50
+ },
+ "discovered": {
+ "type": "boolean",
+ "description": "This item was automatically discovered"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "component_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "component_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableJournalEntryRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "assigned_object_type": {
+ "type": "string"
+ },
+ "assigned_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "created_by": {
+ "type": "integer",
+ "nullable": true
+ },
+ "kind": {
+ "enum": [
+ "info",
+ "success",
+ "warning",
+ "danger"
+ ],
+ "type": "string",
+ "description": "* `info` - Info\n* `success` - Success\n* `warning` - Warning\n* `danger` - Danger",
+ "x-spec-enum-id": "a21af280f632fa34"
+ },
+ "comments": {
+ "type": "string",
+ "minLength": 1
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableL2VPNRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "identifier": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": -9223372036854775808,
+ "format": "int64",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "type": {
+ "enum": [
+ "vpws",
+ "vpls",
+ "vxlan",
+ "vxlan-evpn",
+ "mpls-evpn",
+ "pbb-evpn",
+ "evpn-vpws",
+ "epl",
+ "evpl",
+ "ep-lan",
+ "evp-lan",
+ "ep-tree",
+ "evp-tree",
+ "spb"
+ ],
+ "type": "string",
+ "description": "* `vpws` - VPWS\n* `vpls` - VPLS\n* `vxlan` - VXLAN\n* `vxlan-evpn` - VXLAN-EVPN\n* `mpls-evpn` - MPLS EVPN\n* `pbb-evpn` - PBB EVPN\n* `evpn-vpws` - EVPN VPWS\n* `epl` - EPL\n* `evpl` - EVPL\n* `ep-lan` - Ethernet Private LAN\n* `evp-lan` - Ethernet Virtual Private LAN\n* `ep-tree` - Ethernet Private Tree\n* `evp-tree` - Ethernet Virtual Private Tree\n* `spb` - SPB",
+ "x-spec-enum-id": "730136816a2885f9"
+ },
+ "status": {
+ "enum": [
+ "active",
+ "planned",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `planned` - Planned\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "937bacafb9d5d4bb"
+ },
+ "import_targets": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "export_targets": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableLocationRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ]
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "staging",
+ "active",
+ "decommissioning",
+ "retired"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `staging` - Staging\n* `active` - Active\n* `decommissioning` - Decommissioning\n* `retired` - Retired",
+ "x-spec-enum-id": "e363a8ddb138be50"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "facility": {
+ "type": "string",
+ "description": "Local facility ID or description",
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ }
+ },
+ "PatchedWritableModuleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module_bay": {
+ "type": "integer"
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ]
+ },
+ "status": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "2217e87d0c3efdda"
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this device",
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableModuleTypeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "profile": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeProfileRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "part_number": {
+ "type": "string",
+ "description": "Discrete part number (optional)",
+ "maxLength": 50
+ },
+ "airflow": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ "left-to-right",
+ "right-to-left",
+ "side-to-rear",
+ "passive",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front\n* `left-to-right` - Left to right\n* `right-to-left` - Right to left\n* `side-to-rear` - Side to rear\n* `passive` - Passive",
+ "x-spec-enum-id": "f6e5562e0e98d69d",
+ "nullable": true
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "weight_unit": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "attributes": {
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritablePlatformRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "config_template": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplateRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritablePowerFeedRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "power_panel": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefPowerPanelRequest"
+ }
+ ]
+ },
+ "rack": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRackRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "status": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "failed"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `failed` - Failed",
+ "x-spec-enum-id": "b77fc919138c12f6"
+ },
+ "type": {
+ "enum": [
+ "primary",
+ "redundant"
+ ],
+ "type": "string",
+ "description": "* `primary` - Primary\n* `redundant` - Redundant",
+ "x-spec-enum-id": "093a164236819eb8"
+ },
+ "supply": {
+ "enum": [
+ "ac",
+ "dc"
+ ],
+ "type": "string",
+ "description": "* `ac` - AC\n* `dc` - DC",
+ "x-spec-enum-id": "1b6d99616ca6412b"
+ },
+ "phase": {
+ "enum": [
+ "single-phase",
+ "three-phase"
+ ],
+ "type": "string",
+ "description": "* `single-phase` - Single phase\n* `three-phase` - Three-phase",
+ "x-spec-enum-id": "994bc0696f4df57f"
+ },
+ "voltage": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": -32768
+ },
+ "amperage": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 1
+ },
+ "max_utilization": {
+ "type": "integer",
+ "maximum": 100,
+ "minimum": 1,
+ "description": "Maximum permissible draw (percentage)"
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritablePowerOutletRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "iec-60320-c5",
+ "iec-60320-c7",
+ "iec-60320-c13",
+ "iec-60320-c15",
+ "iec-60320-c17",
+ "iec-60320-c19",
+ "iec-60320-c21",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15r",
+ "nema-5-15r",
+ "nema-5-20r",
+ "nema-5-30r",
+ "nema-5-50r",
+ "nema-6-15r",
+ "nema-6-20r",
+ "nema-6-30r",
+ "nema-6-50r",
+ "nema-10-30r",
+ "nema-10-50r",
+ "nema-14-20r",
+ "nema-14-30r",
+ "nema-14-50r",
+ "nema-14-60r",
+ "nema-15-15r",
+ "nema-15-20r",
+ "nema-15-30r",
+ "nema-15-50r",
+ "nema-15-60r",
+ "nema-l1-15r",
+ "nema-l5-15r",
+ "nema-l5-20r",
+ "nema-l5-30r",
+ "nema-l5-50r",
+ "nema-l6-15r",
+ "nema-l6-20r",
+ "nema-l6-30r",
+ "nema-l6-50r",
+ "nema-l10-30r",
+ "nema-l14-20r",
+ "nema-l14-30r",
+ "nema-l14-50r",
+ "nema-l14-60r",
+ "nema-l15-20r",
+ "nema-l15-30r",
+ "nema-l15-50r",
+ "nema-l15-60r",
+ "nema-l21-20r",
+ "nema-l21-30r",
+ "nema-l22-20r",
+ "nema-l22-30r",
+ "CS6360C",
+ "CS6364C",
+ "CS8164C",
+ "CS8264C",
+ "CS8364C",
+ "CS8464C",
+ "ita-e",
+ "ita-f",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "ita-multistandard",
+ "usb-a",
+ "usb-micro-b",
+ "usb-c",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "eaton-c39",
+ "hdot-cx",
+ "saf-d-grid",
+ "neutrik-powercon-20a",
+ "neutrik-powercon-32a",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "8f9617d2648ab261",
+ "nullable": true,
+ "description": "Physical port type\n\n* `iec-60320-c5` - C5\n* `iec-60320-c7` - C7\n* `iec-60320-c13` - C13\n* `iec-60320-c15` - C15\n* `iec-60320-c17` - C17\n* `iec-60320-c19` - C19\n* `iec-60320-c21` - C21\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15r` - NEMA 1-15R\n* `nema-5-15r` - NEMA 5-15R\n* `nema-5-20r` - NEMA 5-20R\n* `nema-5-30r` - NEMA 5-30R\n* `nema-5-50r` - NEMA 5-50R\n* `nema-6-15r` - NEMA 6-15R\n* `nema-6-20r` - NEMA 6-20R\n* `nema-6-30r` - NEMA 6-30R\n* `nema-6-50r` - NEMA 6-50R\n* `nema-10-30r` - NEMA 10-30R\n* `nema-10-50r` - NEMA 10-50R\n* `nema-14-20r` - NEMA 14-20R\n* `nema-14-30r` - NEMA 14-30R\n* `nema-14-50r` - NEMA 14-50R\n* `nema-14-60r` - NEMA 14-60R\n* `nema-15-15r` - NEMA 15-15R\n* `nema-15-20r` - NEMA 15-20R\n* `nema-15-30r` - NEMA 15-30R\n* `nema-15-50r` - NEMA 15-50R\n* `nema-15-60r` - NEMA 15-60R\n* `nema-l1-15r` - NEMA L1-15R\n* `nema-l5-15r` - NEMA L5-15R\n* `nema-l5-20r` - NEMA L5-20R\n* `nema-l5-30r` - NEMA L5-30R\n* `nema-l5-50r` - NEMA L5-50R\n* `nema-l6-15r` - NEMA L6-15R\n* `nema-l6-20r` - NEMA L6-20R\n* `nema-l6-30r` - NEMA L6-30R\n* `nema-l6-50r` - NEMA L6-50R\n* `nema-l10-30r` - NEMA L10-30R\n* `nema-l14-20r` - NEMA L14-20R\n* `nema-l14-30r` - NEMA L14-30R\n* `nema-l14-50r` - NEMA L14-50R\n* `nema-l14-60r` - NEMA L14-60R\n* `nema-l15-20r` - NEMA L15-20R\n* `nema-l15-30r` - NEMA L15-30R\n* `nema-l15-50r` - NEMA L15-50R\n* `nema-l15-60r` - NEMA L15-60R\n* `nema-l21-20r` - NEMA L21-20R\n* `nema-l21-30r` - NEMA L21-30R\n* `nema-l22-20r` - NEMA L22-20R\n* `nema-l22-30r` - NEMA L22-30R\n* `CS6360C` - CS6360C\n* `CS6364C` - CS6364C\n* `CS8164C` - CS8164C\n* `CS8264C` - CS8264C\n* `CS8364C` - CS8364C\n* `CS8464C` - CS8464C\n* `ita-e` - ITA Type E (CEE 7/5)\n* `ita-f` - ITA Type F (CEE 7/3)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `ita-multistandard` - ITA Multistandard\n* `usb-a` - USB Type A\n* `usb-micro-b` - USB Micro B\n* `usb-c` - USB Type C\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `eaton-c39` - Eaton C39\n* `hdot-cx` - HDOT Cx\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20a` - Neutrik powerCON (20A)\n* `neutrik-powercon-32a` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other"
+ },
+ "status": {
+ "enum": [
+ "enabled",
+ "disabled",
+ "faulty"
+ ],
+ "type": "string",
+ "description": "* `enabled` - Enabled\n* `disabled` - Disabled\n* `faulty` - Faulty",
+ "x-spec-enum-id": "1024f7deaed962d7"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "power_port": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPowerPortRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "feed_leg": {
+ "enum": [
+ "A",
+ "B",
+ "C",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "a4902339df0b7c06",
+ "nullable": true,
+ "description": "Phase (for three-phase feeds)\n\n* `A` - A\n* `B` - B\n* `C` - C"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritablePowerOutletTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "iec-60320-c5",
+ "iec-60320-c7",
+ "iec-60320-c13",
+ "iec-60320-c15",
+ "iec-60320-c17",
+ "iec-60320-c19",
+ "iec-60320-c21",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15r",
+ "nema-5-15r",
+ "nema-5-20r",
+ "nema-5-30r",
+ "nema-5-50r",
+ "nema-6-15r",
+ "nema-6-20r",
+ "nema-6-30r",
+ "nema-6-50r",
+ "nema-10-30r",
+ "nema-10-50r",
+ "nema-14-20r",
+ "nema-14-30r",
+ "nema-14-50r",
+ "nema-14-60r",
+ "nema-15-15r",
+ "nema-15-20r",
+ "nema-15-30r",
+ "nema-15-50r",
+ "nema-15-60r",
+ "nema-l1-15r",
+ "nema-l5-15r",
+ "nema-l5-20r",
+ "nema-l5-30r",
+ "nema-l5-50r",
+ "nema-l6-15r",
+ "nema-l6-20r",
+ "nema-l6-30r",
+ "nema-l6-50r",
+ "nema-l10-30r",
+ "nema-l14-20r",
+ "nema-l14-30r",
+ "nema-l14-50r",
+ "nema-l14-60r",
+ "nema-l15-20r",
+ "nema-l15-30r",
+ "nema-l15-50r",
+ "nema-l15-60r",
+ "nema-l21-20r",
+ "nema-l21-30r",
+ "nema-l22-20r",
+ "nema-l22-30r",
+ "CS6360C",
+ "CS6364C",
+ "CS8164C",
+ "CS8264C",
+ "CS8364C",
+ "CS8464C",
+ "ita-e",
+ "ita-f",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "ita-multistandard",
+ "usb-a",
+ "usb-micro-b",
+ "usb-c",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "eaton-c39",
+ "hdot-cx",
+ "saf-d-grid",
+ "neutrik-powercon-20a",
+ "neutrik-powercon-32a",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `iec-60320-c5` - C5\n* `iec-60320-c7` - C7\n* `iec-60320-c13` - C13\n* `iec-60320-c15` - C15\n* `iec-60320-c17` - C17\n* `iec-60320-c19` - C19\n* `iec-60320-c21` - C21\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15r` - NEMA 1-15R\n* `nema-5-15r` - NEMA 5-15R\n* `nema-5-20r` - NEMA 5-20R\n* `nema-5-30r` - NEMA 5-30R\n* `nema-5-50r` - NEMA 5-50R\n* `nema-6-15r` - NEMA 6-15R\n* `nema-6-20r` - NEMA 6-20R\n* `nema-6-30r` - NEMA 6-30R\n* `nema-6-50r` - NEMA 6-50R\n* `nema-10-30r` - NEMA 10-30R\n* `nema-10-50r` - NEMA 10-50R\n* `nema-14-20r` - NEMA 14-20R\n* `nema-14-30r` - NEMA 14-30R\n* `nema-14-50r` - NEMA 14-50R\n* `nema-14-60r` - NEMA 14-60R\n* `nema-15-15r` - NEMA 15-15R\n* `nema-15-20r` - NEMA 15-20R\n* `nema-15-30r` - NEMA 15-30R\n* `nema-15-50r` - NEMA 15-50R\n* `nema-15-60r` - NEMA 15-60R\n* `nema-l1-15r` - NEMA L1-15R\n* `nema-l5-15r` - NEMA L5-15R\n* `nema-l5-20r` - NEMA L5-20R\n* `nema-l5-30r` - NEMA L5-30R\n* `nema-l5-50r` - NEMA L5-50R\n* `nema-l6-15r` - NEMA L6-15R\n* `nema-l6-20r` - NEMA L6-20R\n* `nema-l6-30r` - NEMA L6-30R\n* `nema-l6-50r` - NEMA L6-50R\n* `nema-l10-30r` - NEMA L10-30R\n* `nema-l14-20r` - NEMA L14-20R\n* `nema-l14-30r` - NEMA L14-30R\n* `nema-l14-50r` - NEMA L14-50R\n* `nema-l14-60r` - NEMA L14-60R\n* `nema-l15-20r` - NEMA L15-20R\n* `nema-l15-30r` - NEMA L15-30R\n* `nema-l15-50r` - NEMA L15-50R\n* `nema-l15-60r` - NEMA L15-60R\n* `nema-l21-20r` - NEMA L21-20R\n* `nema-l21-30r` - NEMA L21-30R\n* `nema-l22-20r` - NEMA L22-20R\n* `nema-l22-30r` - NEMA L22-30R\n* `CS6360C` - CS6360C\n* `CS6364C` - CS6364C\n* `CS8164C` - CS8164C\n* `CS8264C` - CS8264C\n* `CS8364C` - CS8364C\n* `CS8464C` - CS8464C\n* `ita-e` - ITA Type E (CEE 7/5)\n* `ita-f` - ITA Type F (CEE 7/3)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `ita-multistandard` - ITA Multistandard\n* `usb-a` - USB Type A\n* `usb-micro-b` - USB Micro B\n* `usb-c` - USB Type C\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `eaton-c39` - Eaton C39\n* `hdot-cx` - HDOT Cx\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20a` - Neutrik powerCON (20A)\n* `neutrik-powercon-32a` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other",
+ "x-spec-enum-id": "8f9617d2648ab261",
+ "nullable": true
+ },
+ "power_port": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPowerPortTemplateRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "feed_leg": {
+ "enum": [
+ "A",
+ "B",
+ "C",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "a4902339df0b7c06",
+ "nullable": true,
+ "description": "Phase (for three-phase feeds)\n\n* `A` - A\n* `B` - B\n* `C` - C"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ }
+ },
+ "PatchedWritablePowerPortRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "iec-60320-c6",
+ "iec-60320-c8",
+ "iec-60320-c14",
+ "iec-60320-c16",
+ "iec-60320-c18",
+ "iec-60320-c20",
+ "iec-60320-c22",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15p",
+ "nema-5-15p",
+ "nema-5-20p",
+ "nema-5-30p",
+ "nema-5-50p",
+ "nema-6-15p",
+ "nema-6-20p",
+ "nema-6-30p",
+ "nema-6-50p",
+ "nema-10-30p",
+ "nema-10-50p",
+ "nema-14-20p",
+ "nema-14-30p",
+ "nema-14-50p",
+ "nema-14-60p",
+ "nema-15-15p",
+ "nema-15-20p",
+ "nema-15-30p",
+ "nema-15-50p",
+ "nema-15-60p",
+ "nema-l1-15p",
+ "nema-l5-15p",
+ "nema-l5-20p",
+ "nema-l5-30p",
+ "nema-l5-50p",
+ "nema-l6-15p",
+ "nema-l6-20p",
+ "nema-l6-30p",
+ "nema-l6-50p",
+ "nema-l10-30p",
+ "nema-l14-20p",
+ "nema-l14-30p",
+ "nema-l14-50p",
+ "nema-l14-60p",
+ "nema-l15-20p",
+ "nema-l15-30p",
+ "nema-l15-50p",
+ "nema-l15-60p",
+ "nema-l21-20p",
+ "nema-l21-30p",
+ "nema-l22-20p",
+ "nema-l22-30p",
+ "cs6361c",
+ "cs6365c",
+ "cs8165c",
+ "cs8265c",
+ "cs8365c",
+ "cs8465c",
+ "ita-c",
+ "ita-e",
+ "ita-f",
+ "ita-ef",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "usb-3-b",
+ "usb-3-micro-b",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "saf-d-grid",
+ "neutrik-powercon-20",
+ "neutrik-powercon-32",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "292850be2c08f7df",
+ "nullable": true,
+ "description": "Physical port type\n\n* `iec-60320-c6` - C6\n* `iec-60320-c8` - C8\n* `iec-60320-c14` - C14\n* `iec-60320-c16` - C16\n* `iec-60320-c18` - C18\n* `iec-60320-c20` - C20\n* `iec-60320-c22` - C22\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15p` - NEMA 1-15P\n* `nema-5-15p` - NEMA 5-15P\n* `nema-5-20p` - NEMA 5-20P\n* `nema-5-30p` - NEMA 5-30P\n* `nema-5-50p` - NEMA 5-50P\n* `nema-6-15p` - NEMA 6-15P\n* `nema-6-20p` - NEMA 6-20P\n* `nema-6-30p` - NEMA 6-30P\n* `nema-6-50p` - NEMA 6-50P\n* `nema-10-30p` - NEMA 10-30P\n* `nema-10-50p` - NEMA 10-50P\n* `nema-14-20p` - NEMA 14-20P\n* `nema-14-30p` - NEMA 14-30P\n* `nema-14-50p` - NEMA 14-50P\n* `nema-14-60p` - NEMA 14-60P\n* `nema-15-15p` - NEMA 15-15P\n* `nema-15-20p` - NEMA 15-20P\n* `nema-15-30p` - NEMA 15-30P\n* `nema-15-50p` - NEMA 15-50P\n* `nema-15-60p` - NEMA 15-60P\n* `nema-l1-15p` - NEMA L1-15P\n* `nema-l5-15p` - NEMA L5-15P\n* `nema-l5-20p` - NEMA L5-20P\n* `nema-l5-30p` - NEMA L5-30P\n* `nema-l5-50p` - NEMA L5-50P\n* `nema-l6-15p` - NEMA L6-15P\n* `nema-l6-20p` - NEMA L6-20P\n* `nema-l6-30p` - NEMA L6-30P\n* `nema-l6-50p` - NEMA L6-50P\n* `nema-l10-30p` - NEMA L10-30P\n* `nema-l14-20p` - NEMA L14-20P\n* `nema-l14-30p` - NEMA L14-30P\n* `nema-l14-50p` - NEMA L14-50P\n* `nema-l14-60p` - NEMA L14-60P\n* `nema-l15-20p` - NEMA L15-20P\n* `nema-l15-30p` - NEMA L15-30P\n* `nema-l15-50p` - NEMA L15-50P\n* `nema-l15-60p` - NEMA L15-60P\n* `nema-l21-20p` - NEMA L21-20P\n* `nema-l21-30p` - NEMA L21-30P\n* `nema-l22-20p` - NEMA L22-20P\n* `nema-l22-30p` - NEMA L22-30P\n* `cs6361c` - CS6361C\n* `cs6365c` - CS6365C\n* `cs8165c` - CS8165C\n* `cs8265c` - CS8265C\n* `cs8365c` - CS8365C\n* `cs8465c` - CS8465C\n* `ita-c` - ITA Type C (CEE 7/16)\n* `ita-e` - ITA Type E (CEE 7/6)\n* `ita-f` - ITA Type F (CEE 7/4)\n* `ita-ef` - ITA Type E/F (CEE 7/7)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `usb-3-b` - USB 3.0 Type B\n* `usb-3-micro-b` - USB 3.0 Micro B\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20` - Neutrik powerCON (20A)\n* `neutrik-powercon-32` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other"
+ },
+ "maximum_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Maximum power draw (watts)"
+ },
+ "allocated_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Allocated power draw (watts)"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritablePowerPortTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "iec-60320-c6",
+ "iec-60320-c8",
+ "iec-60320-c14",
+ "iec-60320-c16",
+ "iec-60320-c18",
+ "iec-60320-c20",
+ "iec-60320-c22",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15p",
+ "nema-5-15p",
+ "nema-5-20p",
+ "nema-5-30p",
+ "nema-5-50p",
+ "nema-6-15p",
+ "nema-6-20p",
+ "nema-6-30p",
+ "nema-6-50p",
+ "nema-10-30p",
+ "nema-10-50p",
+ "nema-14-20p",
+ "nema-14-30p",
+ "nema-14-50p",
+ "nema-14-60p",
+ "nema-15-15p",
+ "nema-15-20p",
+ "nema-15-30p",
+ "nema-15-50p",
+ "nema-15-60p",
+ "nema-l1-15p",
+ "nema-l5-15p",
+ "nema-l5-20p",
+ "nema-l5-30p",
+ "nema-l5-50p",
+ "nema-l6-15p",
+ "nema-l6-20p",
+ "nema-l6-30p",
+ "nema-l6-50p",
+ "nema-l10-30p",
+ "nema-l14-20p",
+ "nema-l14-30p",
+ "nema-l14-50p",
+ "nema-l14-60p",
+ "nema-l15-20p",
+ "nema-l15-30p",
+ "nema-l15-50p",
+ "nema-l15-60p",
+ "nema-l21-20p",
+ "nema-l21-30p",
+ "nema-l22-20p",
+ "nema-l22-30p",
+ "cs6361c",
+ "cs6365c",
+ "cs8165c",
+ "cs8265c",
+ "cs8365c",
+ "cs8465c",
+ "ita-c",
+ "ita-e",
+ "ita-f",
+ "ita-ef",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "usb-3-b",
+ "usb-3-micro-b",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "saf-d-grid",
+ "neutrik-powercon-20",
+ "neutrik-powercon-32",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `iec-60320-c6` - C6\n* `iec-60320-c8` - C8\n* `iec-60320-c14` - C14\n* `iec-60320-c16` - C16\n* `iec-60320-c18` - C18\n* `iec-60320-c20` - C20\n* `iec-60320-c22` - C22\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15p` - NEMA 1-15P\n* `nema-5-15p` - NEMA 5-15P\n* `nema-5-20p` - NEMA 5-20P\n* `nema-5-30p` - NEMA 5-30P\n* `nema-5-50p` - NEMA 5-50P\n* `nema-6-15p` - NEMA 6-15P\n* `nema-6-20p` - NEMA 6-20P\n* `nema-6-30p` - NEMA 6-30P\n* `nema-6-50p` - NEMA 6-50P\n* `nema-10-30p` - NEMA 10-30P\n* `nema-10-50p` - NEMA 10-50P\n* `nema-14-20p` - NEMA 14-20P\n* `nema-14-30p` - NEMA 14-30P\n* `nema-14-50p` - NEMA 14-50P\n* `nema-14-60p` - NEMA 14-60P\n* `nema-15-15p` - NEMA 15-15P\n* `nema-15-20p` - NEMA 15-20P\n* `nema-15-30p` - NEMA 15-30P\n* `nema-15-50p` - NEMA 15-50P\n* `nema-15-60p` - NEMA 15-60P\n* `nema-l1-15p` - NEMA L1-15P\n* `nema-l5-15p` - NEMA L5-15P\n* `nema-l5-20p` - NEMA L5-20P\n* `nema-l5-30p` - NEMA L5-30P\n* `nema-l5-50p` - NEMA L5-50P\n* `nema-l6-15p` - NEMA L6-15P\n* `nema-l6-20p` - NEMA L6-20P\n* `nema-l6-30p` - NEMA L6-30P\n* `nema-l6-50p` - NEMA L6-50P\n* `nema-l10-30p` - NEMA L10-30P\n* `nema-l14-20p` - NEMA L14-20P\n* `nema-l14-30p` - NEMA L14-30P\n* `nema-l14-50p` - NEMA L14-50P\n* `nema-l14-60p` - NEMA L14-60P\n* `nema-l15-20p` - NEMA L15-20P\n* `nema-l15-30p` - NEMA L15-30P\n* `nema-l15-50p` - NEMA L15-50P\n* `nema-l15-60p` - NEMA L15-60P\n* `nema-l21-20p` - NEMA L21-20P\n* `nema-l21-30p` - NEMA L21-30P\n* `nema-l22-20p` - NEMA L22-20P\n* `nema-l22-30p` - NEMA L22-30P\n* `cs6361c` - CS6361C\n* `cs6365c` - CS6365C\n* `cs8165c` - CS8165C\n* `cs8265c` - CS8265C\n* `cs8365c` - CS8365C\n* `cs8465c` - CS8465C\n* `ita-c` - ITA Type C (CEE 7/16)\n* `ita-e` - ITA Type E (CEE 7/6)\n* `ita-f` - ITA Type F (CEE 7/4)\n* `ita-ef` - ITA Type E/F (CEE 7/7)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `usb-3-b` - USB 3.0 Type B\n* `usb-3-micro-b` - USB 3.0 Micro B\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20` - Neutrik powerCON (20A)\n* `neutrik-powercon-32` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other",
+ "x-spec-enum-id": "292850be2c08f7df",
+ "nullable": true
+ },
+ "maximum_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Maximum power draw (watts)"
+ },
+ "allocated_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Allocated power draw (watts)"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ }
+ },
+ "PatchedWritablePrefixRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "prefix": {
+ "type": "string",
+ "minLength": 1
+ },
+ "vrf": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRFRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "scope_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "scope_id": {
+ "type": "integer",
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "container",
+ "active",
+ "reserved",
+ "deprecated"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "d38bee5f512701d9",
+ "description": "Operational status of this prefix\n\n* `container` - Container\n* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated"
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "is_pool": {
+ "type": "boolean",
+ "title": "Is a pool",
+ "description": "All IP addresses within this prefix are considered usable"
+ },
+ "mark_utilized": {
+ "type": "boolean",
+ "description": "Treat as fully utilized"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableRackRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "facility_id": {
+ "type": "string",
+ "nullable": true,
+ "maxLength": 50
+ },
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ]
+ },
+ "location": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefLocationRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "reserved",
+ "available",
+ "planned",
+ "active",
+ "deprecated"
+ ],
+ "type": "string",
+ "description": "* `reserved` - Reserved\n* `available` - Available\n* `planned` - Planned\n* `active` - Active\n* `deprecated` - Deprecated",
+ "x-spec-enum-id": "0c556d55dc1baa13"
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRackRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this rack",
+ "maxLength": 50
+ },
+ "rack_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRackTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "form_factor": {
+ "enum": [
+ "2-post-frame",
+ "4-post-frame",
+ "4-post-cabinet",
+ "wall-frame",
+ "wall-frame-vertical",
+ "wall-cabinet",
+ "wall-cabinet-vertical",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `2-post-frame` - 2-post frame\n* `4-post-frame` - 4-post frame\n* `4-post-cabinet` - 4-post cabinet\n* `wall-frame` - Wall-mounted frame\n* `wall-frame-vertical` - Wall-mounted frame (vertical)\n* `wall-cabinet` - Wall-mounted cabinet\n* `wall-cabinet-vertical` - Wall-mounted cabinet (vertical)",
+ "x-spec-enum-id": "e32aaa89a223f2ea",
+ "nullable": true
+ },
+ "width": {
+ "enum": [
+ 10,
+ 19,
+ 21,
+ 23
+ ],
+ "type": "integer",
+ "x-spec-enum-id": "9b322795f297a9c3",
+ "description": "Rail-to-rail width\n\n* `10` - 10 inches\n* `19` - 19 inches\n* `21` - 21 inches\n* `23` - 23 inches",
+ "minimum": 0,
+ "maximum": 32767
+ },
+ "u_height": {
+ "type": "integer",
+ "maximum": 100,
+ "minimum": 1,
+ "title": "Height (U)",
+ "description": "Height in rack units"
+ },
+ "starting_unit": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 1,
+ "description": "Starting unit for rack"
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "max_weight": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum load capacity for the rack"
+ },
+ "weight_unit": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884",
+ "nullable": true
+ },
+ "desc_units": {
+ "type": "boolean",
+ "title": "Descending units",
+ "description": "Units are numbered top-to-bottom"
+ },
+ "outer_width": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (width)"
+ },
+ "outer_height": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (height)"
+ },
+ "outer_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (depth)"
+ },
+ "outer_unit": {
+ "enum": [
+ "mm",
+ "in",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `mm` - Millimeters\n* `in` - Inches",
+ "x-spec-enum-id": "86a846b6c40f495e",
+ "nullable": true
+ },
+ "mounting_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum depth of a mounted device, in millimeters. For four-post racks, this is the distance between the front and rear rails."
+ },
+ "airflow": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front",
+ "x-spec-enum-id": "a784734d07ef1b3c",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableRackReservationRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "rack": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefRackRequest"
+ }
+ ]
+ },
+ "units": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ }
+ },
+ "status": {
+ "enum": [
+ "pending",
+ "active",
+ "stale"
+ ],
+ "type": "string",
+ "description": "* `pending` - Pending\n* `active` - Active\n* `stale` - Stale",
+ "x-spec-enum-id": "b62013475549e423"
+ },
+ "user": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefUserRequest"
+ }
+ ]
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableRackTypeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "form_factor": {
+ "enum": [
+ "2-post-frame",
+ "4-post-frame",
+ "4-post-cabinet",
+ "wall-frame",
+ "wall-frame-vertical",
+ "wall-cabinet",
+ "wall-cabinet-vertical"
+ ],
+ "type": "string",
+ "description": "* `2-post-frame` - 2-post frame\n* `4-post-frame` - 4-post frame\n* `4-post-cabinet` - 4-post cabinet\n* `wall-frame` - Wall-mounted frame\n* `wall-frame-vertical` - Wall-mounted frame (vertical)\n* `wall-cabinet` - Wall-mounted cabinet\n* `wall-cabinet-vertical` - Wall-mounted cabinet (vertical)",
+ "x-spec-enum-id": "e32aaa89a223f2ea"
+ },
+ "width": {
+ "enum": [
+ 10,
+ 19,
+ 21,
+ 23
+ ],
+ "type": "integer",
+ "x-spec-enum-id": "9b322795f297a9c3",
+ "description": "Rail-to-rail width\n\n* `10` - 10 inches\n* `19` - 19 inches\n* `21` - 21 inches\n* `23` - 23 inches",
+ "minimum": 0,
+ "maximum": 32767
+ },
+ "u_height": {
+ "type": "integer",
+ "maximum": 100,
+ "minimum": 1,
+ "title": "Height (U)",
+ "description": "Height in rack units"
+ },
+ "starting_unit": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 1,
+ "description": "Starting unit for rack"
+ },
+ "desc_units": {
+ "type": "boolean",
+ "title": "Descending units",
+ "description": "Units are numbered top-to-bottom"
+ },
+ "outer_width": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (width)"
+ },
+ "outer_height": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (height)"
+ },
+ "outer_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (depth)"
+ },
+ "outer_unit": {
+ "enum": [
+ "mm",
+ "in",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `mm` - Millimeters\n* `in` - Inches",
+ "x-spec-enum-id": "86a846b6c40f495e",
+ "nullable": true
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "max_weight": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum load capacity for the rack"
+ },
+ "weight_unit": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884",
+ "nullable": true
+ },
+ "mounting_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum depth of a mounted device, in millimeters. For four-post racks, this is the distance between the front and rear rails."
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableRearPortRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "positions": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1,
+ "description": "Number of front ports which may be mapped"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableRearPortTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "positions": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ }
+ },
+ "PatchedWritableRegionRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ }
+ },
+ "PatchedWritableServiceRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "parent_object_type": {
+ "type": "string"
+ },
+ "parent_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "protocol": {
+ "enum": [
+ "tcp",
+ "udp",
+ "sctp"
+ ],
+ "type": "string",
+ "description": "* `tcp` - TCP\n* `udp` - UDP\n* `sctp` - SCTP",
+ "x-spec-enum-id": "5521e084b1ad51de"
+ },
+ "ports": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 1
+ },
+ "title": "Port numbers"
+ },
+ "ipaddresses": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableServiceTemplateRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "protocol": {
+ "enum": [
+ "tcp",
+ "udp",
+ "sctp"
+ ],
+ "type": "string",
+ "description": "* `tcp` - TCP\n* `udp` - UDP\n* `sctp` - SCTP",
+ "x-spec-enum-id": "5521e084b1ad51de"
+ },
+ "ports": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 1
+ },
+ "title": "Port numbers"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableSiteGroupRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ }
+ },
+ "PatchedWritableSiteRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Full name of the site",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "staging",
+ "active",
+ "decommissioning",
+ "retired"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `staging` - Staging\n* `active` - Active\n* `decommissioning` - Decommissioning\n* `retired` - Retired",
+ "x-spec-enum-id": "e363a8ddb138be50"
+ },
+ "region": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRegionRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefSiteGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "facility": {
+ "type": "string",
+ "description": "Local facility ID or description",
+ "maxLength": 50
+ },
+ "time_zone": {
+ "type": "string",
+ "nullable": true,
+ "minLength": 1
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "physical_address": {
+ "type": "string",
+ "description": "Physical location of the building",
+ "maxLength": 200
+ },
+ "shipping_address": {
+ "type": "string",
+ "description": "If different from the physical address",
+ "maxLength": 200
+ },
+ "latitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 100,
+ "minimum": -100,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "longitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": -1000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "asns": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableTenantGroupRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ }
+ },
+ "PatchedWritableTunnelRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "active",
+ "disabled"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `active` - Active\n* `disabled` - Disabled",
+ "x-spec-enum-id": "0d65f7912cba74aa"
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTunnelGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "encapsulation": {
+ "enum": [
+ "ipsec-transport",
+ "ipsec-tunnel",
+ "ip-ip",
+ "gre",
+ "wireguard",
+ "openvpn",
+ "l2tp",
+ "pptp"
+ ],
+ "type": "string",
+ "description": "* `ipsec-transport` - IPsec - Transport\n* `ipsec-tunnel` - IPsec - Tunnel\n* `ip-ip` - IP-in-IP\n* `gre` - GRE\n* `wireguard` - WireGuard\n* `openvpn` - OpenVPN\n* `l2tp` - L2TP\n* `pptp` - PPTP",
+ "x-spec-enum-id": "54a2e45824009c49"
+ },
+ "ipsec_profile": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPSecProfileRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tunnel_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableTunnelTerminationRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "tunnel": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefTunnelRequest"
+ }
+ ]
+ },
+ "role": {
+ "enum": [
+ "peer",
+ "hub",
+ "spoke"
+ ],
+ "type": "string",
+ "description": "* `peer` - Peer\n* `hub` - Hub\n* `spoke` - Spoke",
+ "x-spec-enum-id": "52225cd60b867572"
+ },
+ "termination_type": {
+ "type": "string"
+ },
+ "termination_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "outside_ip": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableVLANRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vid": {
+ "type": "integer",
+ "maximum": 4094,
+ "minimum": 1,
+ "title": "VLAN ID",
+ "description": "Numeric VLAN ID (1-4094)"
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "active",
+ "reserved",
+ "deprecated"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "6388dfb94ca1cc15",
+ "description": "Operational status of this VLAN\n\n* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated"
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "qinq_role": {
+ "enum": [
+ "svlan",
+ "cvlan",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "d2510f2d3e3d3fb1",
+ "nullable": true,
+ "title": "Q-in-Q role",
+ "description": "Customer/service VLAN designation (for Q-in-Q/IEEE 802.1ad)\n\n* `svlan` - Service\n* `cvlan` - Customer"
+ },
+ "qinq_svlan": {
+ "type": "integer",
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableVMInterfaceRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "virtual_machine": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefVirtualMachineRequest"
+ }
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true,
+ "title": "Parent interface"
+ },
+ "bridge": {
+ "type": "integer",
+ "nullable": true,
+ "title": "Bridge interface"
+ },
+ "mtu": {
+ "type": "integer",
+ "maximum": 65536,
+ "minimum": 1,
+ "nullable": true
+ },
+ "primary_mac_address": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefMACAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mode": {
+ "enum": [
+ "access",
+ "tagged",
+ "tagged-all",
+ "q-in-q",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "b6fe48fe21dbf01d",
+ "nullable": true,
+ "description": "IEEE 802.1Q tagging strategy\n\n* `access` - Access\n* `tagged` - Tagged\n* `tagged-all` - Tagged (All)\n* `q-in-q` - Q-in-Q (802.1ad)"
+ },
+ "untagged_vlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tagged_vlans": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "qinq_svlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vlan_translation_policy": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANTranslationPolicyRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vrf": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRFRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableVirtualChassisRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "domain": {
+ "type": "string",
+ "maxLength": 30
+ },
+ "master": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableVirtualCircuitRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "cid": {
+ "type": "string",
+ "minLength": 1,
+ "title": "Circuit ID",
+ "description": "Unique circuit ID",
+ "maxLength": 100
+ },
+ "provider_network": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefProviderNetworkRequest"
+ }
+ ]
+ },
+ "provider_account": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefProviderAccountRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefVirtualCircuitTypeRequest"
+ }
+ ]
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "provisioning",
+ "active",
+ "offline",
+ "deprovisioning",
+ "decommissioned"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `provisioning` - Provisioning\n* `active` - Active\n* `offline` - Offline\n* `deprovisioning` - Deprovisioning\n* `decommissioned` - Decommissioned",
+ "x-spec-enum-id": "63c838134a022200"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableVirtualCircuitTerminationRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "virtual_circuit": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefVirtualCircuitRequest"
+ }
+ ]
+ },
+ "role": {
+ "enum": [
+ "peer",
+ "hub",
+ "spoke"
+ ],
+ "type": "string",
+ "description": "* `peer` - Peer\n* `hub` - Hub\n* `spoke` - Spoke",
+ "x-spec-enum-id": "52225cd60b867572"
+ },
+ "interface": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefInterfaceRequest"
+ }
+ ]
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableVirtualDeviceContextRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "identifier": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip4": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip6": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "active",
+ "planned",
+ "offline"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `planned` - Planned\n* `offline` - Offline",
+ "x-spec-enum-id": "ee1ef02def7a91ab"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableVirtualMachineWithConfigContextRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "status": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "decommissioning",
+ "paused"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `decommissioning` - Decommissioning\n* `paused` - Paused",
+ "x-spec-enum-id": "c649dc8de233760f"
+ },
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "cluster": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefClusterRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "platform": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPlatformRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip4": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip6": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vcpus": {
+ "type": "number",
+ "format": "double",
+ "maximum": 10000,
+ "minimum": 0.01,
+ "exclusiveMaximum": true,
+ "nullable": true
+ },
+ "memory": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Memory (MB)"
+ },
+ "disk": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Disk (MB)"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "config_template": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplateRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "local_context_data": {
+ "nullable": true,
+ "description": "Local config context data takes precedence over source contexts in the final rendered config context"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableWirelessLANGroupRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ }
+ },
+ "PatchedWritableWirelessLANRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "ssid": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 32
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefWirelessLANGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "active",
+ "reserved",
+ "disabled",
+ "deprecated"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `reserved` - Reserved\n* `disabled` - Disabled\n* `deprecated` - Deprecated",
+ "x-spec-enum-id": "412ebdca597f609e"
+ },
+ "vlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "scope_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "scope_id": {
+ "type": "integer",
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "auth_type": {
+ "enum": [
+ "open",
+ "wep",
+ "wpa-personal",
+ "wpa-enterprise",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `open` - Open\n* `wep` - WEP\n* `wpa-personal` - WPA Personal (PSK)\n* `wpa-enterprise` - WPA Enterprise",
+ "x-spec-enum-id": "a2043acb899b3954",
+ "nullable": true,
+ "title": "Authentication type"
+ },
+ "auth_cipher": {
+ "enum": [
+ "auto",
+ "tkip",
+ "aes",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `auto` - Auto\n* `tkip` - TKIP\n* `aes` - AES",
+ "x-spec-enum-id": "8fdaefa727c26fdc",
+ "nullable": true,
+ "title": "Authentication cipher"
+ },
+ "auth_psk": {
+ "type": "string",
+ "title": "Pre-shared key",
+ "maxLength": 64
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "PatchedWritableWirelessLinkRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "interface_a": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefInterfaceRequest"
+ }
+ ]
+ },
+ "interface_b": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefInterfaceRequest"
+ }
+ ]
+ },
+ "ssid": {
+ "type": "string",
+ "maxLength": 32
+ },
+ "status": {
+ "enum": [
+ "connected",
+ "planned",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `connected` - Connected\n* `planned` - Planned\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "fbc2f302c08be50d"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "auth_type": {
+ "enum": [
+ "open",
+ "wep",
+ "wpa-personal",
+ "wpa-enterprise",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `open` - Open\n* `wep` - WEP\n* `wpa-personal` - WPA Personal (PSK)\n* `wpa-enterprise` - WPA Enterprise",
+ "x-spec-enum-id": "a2043acb899b3954",
+ "nullable": true,
+ "title": "Authentication type"
+ },
+ "auth_cipher": {
+ "enum": [
+ "auto",
+ "tkip",
+ "aes",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `auto` - Auto\n* `tkip` - TKIP\n* `aes` - AES",
+ "x-spec-enum-id": "8fdaefa727c26fdc",
+ "nullable": true,
+ "title": "Authentication cipher"
+ },
+ "auth_psk": {
+ "type": "string",
+ "title": "Pre-shared key",
+ "maxLength": 64
+ },
+ "distance": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "distance_unit": {
+ "enum": [
+ "km",
+ "m",
+ "mi",
+ "ft",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `km` - Kilometers\n* `m` - Meters\n* `mi` - Miles\n* `ft` - Feet",
+ "x-spec-enum-id": "53542e7902f946af",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "Platform": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedPlatform"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "manufacturer": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefManufacturer"
+ }
+ ],
+ "nullable": true
+ },
+ "config_template": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplate"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "device_count": {
+ "type": "integer",
+ "readOnly": true,
+ "default": 0
+ },
+ "virtualmachine_count": {
+ "type": "integer",
+ "readOnly": true,
+ "default": 0
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "created",
+ "device_count",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "slug",
+ "url",
+ "virtualmachine_count"
+ ]
+ },
+ "PlatformRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedPlatformRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "config_template": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplateRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "PowerFeed": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "power_panel": {
+ "$ref": "#/components/schemas/BriefPowerPanel"
+ },
+ "rack": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRack"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "failed"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `failed` - Failed",
+ "x-spec-enum-id": "b77fc919138c12f6"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Offline",
+ "Active",
+ "Planned",
+ "Failed"
+ ]
+ }
+ }
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "primary",
+ "redundant"
+ ],
+ "type": "string",
+ "description": "* `primary` - Primary\n* `redundant` - Redundant",
+ "x-spec-enum-id": "093a164236819eb8"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Primary",
+ "Redundant"
+ ]
+ }
+ }
+ },
+ "supply": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "ac",
+ "dc"
+ ],
+ "type": "string",
+ "description": "* `ac` - AC\n* `dc` - DC",
+ "x-spec-enum-id": "1b6d99616ca6412b"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "AC",
+ "DC"
+ ]
+ }
+ }
+ },
+ "phase": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "single-phase",
+ "three-phase"
+ ],
+ "type": "string",
+ "description": "* `single-phase` - Single phase\n* `three-phase` - Three-phase",
+ "x-spec-enum-id": "994bc0696f4df57f"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Single phase",
+ "Three-phase"
+ ]
+ }
+ }
+ },
+ "voltage": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": -32768
+ },
+ "amperage": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 1
+ },
+ "max_utilization": {
+ "type": "integer",
+ "maximum": 100,
+ "minimum": 1,
+ "description": "Maximum permissible draw (percentage)"
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "cable": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefCable"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "cable_end": {
+ "type": "string",
+ "readOnly": true
+ },
+ "link_peers": {
+ "type": "array",
+ "items": {},
+ "readOnly": true
+ },
+ "link_peers_type": {
+ "type": "string",
+ "description": "Return the type of the peer link terminations, or None.",
+ "readOnly": true,
+ "nullable": true
+ },
+ "connected_endpoints": {
+ "type": "array",
+ "items": {},
+ "nullable": true,
+ "readOnly": true
+ },
+ "connected_endpoints_type": {
+ "type": "string",
+ "readOnly": true,
+ "nullable": true
+ },
+ "connected_endpoints_reachable": {
+ "type": "boolean",
+ "readOnly": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "_occupied": {
+ "type": "boolean",
+ "readOnly": true,
+ "title": " occupied"
+ }
+ },
+ "required": [
+ "_occupied",
+ "cable",
+ "cable_end",
+ "connected_endpoints",
+ "connected_endpoints_reachable",
+ "connected_endpoints_type",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "link_peers",
+ "link_peers_type",
+ "name",
+ "power_panel",
+ "url"
+ ]
+ },
+ "PowerFeedRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "power_panel": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefPowerPanelRequest"
+ }
+ ]
+ },
+ "rack": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRackRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "status": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "failed"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `failed` - Failed",
+ "x-spec-enum-id": "b77fc919138c12f6"
+ },
+ "type": {
+ "enum": [
+ "primary",
+ "redundant"
+ ],
+ "type": "string",
+ "description": "* `primary` - Primary\n* `redundant` - Redundant",
+ "x-spec-enum-id": "093a164236819eb8"
+ },
+ "supply": {
+ "enum": [
+ "ac",
+ "dc"
+ ],
+ "type": "string",
+ "description": "* `ac` - AC\n* `dc` - DC",
+ "x-spec-enum-id": "1b6d99616ca6412b"
+ },
+ "phase": {
+ "enum": [
+ "single-phase",
+ "three-phase"
+ ],
+ "type": "string",
+ "description": "* `single-phase` - Single phase\n* `three-phase` - Three-phase",
+ "x-spec-enum-id": "994bc0696f4df57f"
+ },
+ "voltage": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": -32768
+ },
+ "amperage": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 1
+ },
+ "max_utilization": {
+ "type": "integer",
+ "maximum": 100,
+ "minimum": 1,
+ "description": "Maximum permissible draw (percentage)"
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "power_panel"
+ ]
+ },
+ "PowerOutlet": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device": {
+ "$ref": "#/components/schemas/BriefDevice"
+ },
+ "module": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModule"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "iec-60320-c5",
+ "iec-60320-c7",
+ "iec-60320-c13",
+ "iec-60320-c15",
+ "iec-60320-c17",
+ "iec-60320-c19",
+ "iec-60320-c21",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15r",
+ "nema-5-15r",
+ "nema-5-20r",
+ "nema-5-30r",
+ "nema-5-50r",
+ "nema-6-15r",
+ "nema-6-20r",
+ "nema-6-30r",
+ "nema-6-50r",
+ "nema-10-30r",
+ "nema-10-50r",
+ "nema-14-20r",
+ "nema-14-30r",
+ "nema-14-50r",
+ "nema-14-60r",
+ "nema-15-15r",
+ "nema-15-20r",
+ "nema-15-30r",
+ "nema-15-50r",
+ "nema-15-60r",
+ "nema-l1-15r",
+ "nema-l5-15r",
+ "nema-l5-20r",
+ "nema-l5-30r",
+ "nema-l5-50r",
+ "nema-l6-15r",
+ "nema-l6-20r",
+ "nema-l6-30r",
+ "nema-l6-50r",
+ "nema-l10-30r",
+ "nema-l14-20r",
+ "nema-l14-30r",
+ "nema-l14-50r",
+ "nema-l14-60r",
+ "nema-l15-20r",
+ "nema-l15-30r",
+ "nema-l15-50r",
+ "nema-l15-60r",
+ "nema-l21-20r",
+ "nema-l21-30r",
+ "nema-l22-20r",
+ "nema-l22-30r",
+ "CS6360C",
+ "CS6364C",
+ "CS8164C",
+ "CS8264C",
+ "CS8364C",
+ "CS8464C",
+ "ita-e",
+ "ita-f",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "ita-multistandard",
+ "usb-a",
+ "usb-micro-b",
+ "usb-c",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "eaton-c39",
+ "hdot-cx",
+ "saf-d-grid",
+ "neutrik-powercon-20a",
+ "neutrik-powercon-32a",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `iec-60320-c5` - C5\n* `iec-60320-c7` - C7\n* `iec-60320-c13` - C13\n* `iec-60320-c15` - C15\n* `iec-60320-c17` - C17\n* `iec-60320-c19` - C19\n* `iec-60320-c21` - C21\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15r` - NEMA 1-15R\n* `nema-5-15r` - NEMA 5-15R\n* `nema-5-20r` - NEMA 5-20R\n* `nema-5-30r` - NEMA 5-30R\n* `nema-5-50r` - NEMA 5-50R\n* `nema-6-15r` - NEMA 6-15R\n* `nema-6-20r` - NEMA 6-20R\n* `nema-6-30r` - NEMA 6-30R\n* `nema-6-50r` - NEMA 6-50R\n* `nema-10-30r` - NEMA 10-30R\n* `nema-10-50r` - NEMA 10-50R\n* `nema-14-20r` - NEMA 14-20R\n* `nema-14-30r` - NEMA 14-30R\n* `nema-14-50r` - NEMA 14-50R\n* `nema-14-60r` - NEMA 14-60R\n* `nema-15-15r` - NEMA 15-15R\n* `nema-15-20r` - NEMA 15-20R\n* `nema-15-30r` - NEMA 15-30R\n* `nema-15-50r` - NEMA 15-50R\n* `nema-15-60r` - NEMA 15-60R\n* `nema-l1-15r` - NEMA L1-15R\n* `nema-l5-15r` - NEMA L5-15R\n* `nema-l5-20r` - NEMA L5-20R\n* `nema-l5-30r` - NEMA L5-30R\n* `nema-l5-50r` - NEMA L5-50R\n* `nema-l6-15r` - NEMA L6-15R\n* `nema-l6-20r` - NEMA L6-20R\n* `nema-l6-30r` - NEMA L6-30R\n* `nema-l6-50r` - NEMA L6-50R\n* `nema-l10-30r` - NEMA L10-30R\n* `nema-l14-20r` - NEMA L14-20R\n* `nema-l14-30r` - NEMA L14-30R\n* `nema-l14-50r` - NEMA L14-50R\n* `nema-l14-60r` - NEMA L14-60R\n* `nema-l15-20r` - NEMA L15-20R\n* `nema-l15-30r` - NEMA L15-30R\n* `nema-l15-50r` - NEMA L15-50R\n* `nema-l15-60r` - NEMA L15-60R\n* `nema-l21-20r` - NEMA L21-20R\n* `nema-l21-30r` - NEMA L21-30R\n* `nema-l22-20r` - NEMA L22-20R\n* `nema-l22-30r` - NEMA L22-30R\n* `CS6360C` - CS6360C\n* `CS6364C` - CS6364C\n* `CS8164C` - CS8164C\n* `CS8264C` - CS8264C\n* `CS8364C` - CS8364C\n* `CS8464C` - CS8464C\n* `ita-e` - ITA Type E (CEE 7/5)\n* `ita-f` - ITA Type F (CEE 7/3)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `ita-multistandard` - ITA Multistandard\n* `usb-a` - USB Type A\n* `usb-micro-b` - USB Micro B\n* `usb-c` - USB Type C\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `eaton-c39` - Eaton C39\n* `hdot-cx` - HDOT Cx\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20a` - Neutrik powerCON (20A)\n* `neutrik-powercon-32a` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other",
+ "x-spec-enum-id": "8f9617d2648ab261"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "C5",
+ "C7",
+ "C13",
+ "C15",
+ "C17",
+ "C19",
+ "C21",
+ "P+N+E 4H",
+ "P+N+E 6H",
+ "P+N+E 9H",
+ "2P+E 4H",
+ "2P+E 6H",
+ "2P+E 9H",
+ "3P+E 4H",
+ "3P+E 6H",
+ "3P+E 9H",
+ "3P+N+E 4H",
+ "3P+N+E 6H",
+ "3P+N+E 9H",
+ "IEC 60906-1",
+ "2P+T 10A (NBR 14136)",
+ "2P+T 20A (NBR 14136)",
+ "NEMA 1-15R",
+ "NEMA 5-15R",
+ "NEMA 5-20R",
+ "NEMA 5-30R",
+ "NEMA 5-50R",
+ "NEMA 6-15R",
+ "NEMA 6-20R",
+ "NEMA 6-30R",
+ "NEMA 6-50R",
+ "NEMA 10-30R",
+ "NEMA 10-50R",
+ "NEMA 14-20R",
+ "NEMA 14-30R",
+ "NEMA 14-50R",
+ "NEMA 14-60R",
+ "NEMA 15-15R",
+ "NEMA 15-20R",
+ "NEMA 15-30R",
+ "NEMA 15-50R",
+ "NEMA 15-60R",
+ "NEMA L1-15R",
+ "NEMA L5-15R",
+ "NEMA L5-20R",
+ "NEMA L5-30R",
+ "NEMA L5-50R",
+ "NEMA L6-15R",
+ "NEMA L6-20R",
+ "NEMA L6-30R",
+ "NEMA L6-50R",
+ "NEMA L10-30R",
+ "NEMA L14-20R",
+ "NEMA L14-30R",
+ "NEMA L14-50R",
+ "NEMA L14-60R",
+ "NEMA L15-20R",
+ "NEMA L15-30R",
+ "NEMA L15-50R",
+ "NEMA L15-60R",
+ "NEMA L21-20R",
+ "NEMA L21-30R",
+ "NEMA L22-20R",
+ "NEMA L22-30R",
+ "CS6360C",
+ "CS6364C",
+ "CS8164C",
+ "CS8264C",
+ "CS8364C",
+ "CS8464C",
+ "ITA Type E (CEE 7/5)",
+ "ITA Type F (CEE 7/3)",
+ "ITA Type G (BS 1363)",
+ "ITA Type H",
+ "ITA Type I",
+ "ITA Type J",
+ "ITA Type K",
+ "ITA Type L (CEI 23-50)",
+ "ITA Type M (BS 546)",
+ "ITA Type N",
+ "ITA Type O",
+ "ITA Multistandard",
+ "USB Type A",
+ "USB Micro B",
+ "USB Type C",
+ "Molex Micro-Fit 1x2",
+ "Molex Micro-Fit 2x2",
+ "Molex Micro-Fit 2x4",
+ "DC Terminal",
+ "Eaton C39",
+ "HDOT Cx",
+ "Saf-D-Grid",
+ "Neutrik powerCON (20A)",
+ "Neutrik powerCON (32A)",
+ "Neutrik powerCON TRUE1",
+ "Neutrik powerCON TRUE1 TOP",
+ "Ubiquiti SmartPower",
+ "Hardwired",
+ "Other"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "enabled",
+ "disabled",
+ "faulty"
+ ],
+ "type": "string",
+ "description": "* `enabled` - Enabled\n* `disabled` - Disabled\n* `faulty` - Faulty",
+ "x-spec-enum-id": "1024f7deaed962d7"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Enabled",
+ "Disabled",
+ "Faulty"
+ ]
+ }
+ }
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "power_port": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPowerPort"
+ }
+ ],
+ "nullable": true
+ },
+ "feed_leg": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "A",
+ "B",
+ "C",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `A` - A\n* `B` - B\n* `C` - C",
+ "x-spec-enum-id": "a4902339df0b7c06"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "A",
+ "B",
+ "C"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "cable": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefCable"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "cable_end": {
+ "type": "string",
+ "readOnly": true
+ },
+ "link_peers": {
+ "type": "array",
+ "items": {},
+ "readOnly": true
+ },
+ "link_peers_type": {
+ "type": "string",
+ "description": "Return the type of the peer link terminations, or None.",
+ "readOnly": true,
+ "nullable": true
+ },
+ "connected_endpoints": {
+ "type": "array",
+ "items": {},
+ "nullable": true,
+ "readOnly": true
+ },
+ "connected_endpoints_type": {
+ "type": "string",
+ "readOnly": true,
+ "nullable": true
+ },
+ "connected_endpoints_reachable": {
+ "type": "boolean",
+ "readOnly": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "_occupied": {
+ "type": "boolean",
+ "readOnly": true,
+ "title": " occupied"
+ }
+ },
+ "required": [
+ "_occupied",
+ "cable",
+ "cable_end",
+ "connected_endpoints",
+ "connected_endpoints_reachable",
+ "connected_endpoints_type",
+ "created",
+ "device",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "link_peers",
+ "link_peers_type",
+ "name",
+ "url"
+ ]
+ },
+ "PowerOutletRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "iec-60320-c5",
+ "iec-60320-c7",
+ "iec-60320-c13",
+ "iec-60320-c15",
+ "iec-60320-c17",
+ "iec-60320-c19",
+ "iec-60320-c21",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15r",
+ "nema-5-15r",
+ "nema-5-20r",
+ "nema-5-30r",
+ "nema-5-50r",
+ "nema-6-15r",
+ "nema-6-20r",
+ "nema-6-30r",
+ "nema-6-50r",
+ "nema-10-30r",
+ "nema-10-50r",
+ "nema-14-20r",
+ "nema-14-30r",
+ "nema-14-50r",
+ "nema-14-60r",
+ "nema-15-15r",
+ "nema-15-20r",
+ "nema-15-30r",
+ "nema-15-50r",
+ "nema-15-60r",
+ "nema-l1-15r",
+ "nema-l5-15r",
+ "nema-l5-20r",
+ "nema-l5-30r",
+ "nema-l5-50r",
+ "nema-l6-15r",
+ "nema-l6-20r",
+ "nema-l6-30r",
+ "nema-l6-50r",
+ "nema-l10-30r",
+ "nema-l14-20r",
+ "nema-l14-30r",
+ "nema-l14-50r",
+ "nema-l14-60r",
+ "nema-l15-20r",
+ "nema-l15-30r",
+ "nema-l15-50r",
+ "nema-l15-60r",
+ "nema-l21-20r",
+ "nema-l21-30r",
+ "nema-l22-20r",
+ "nema-l22-30r",
+ "CS6360C",
+ "CS6364C",
+ "CS8164C",
+ "CS8264C",
+ "CS8364C",
+ "CS8464C",
+ "ita-e",
+ "ita-f",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "ita-multistandard",
+ "usb-a",
+ "usb-micro-b",
+ "usb-c",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "eaton-c39",
+ "hdot-cx",
+ "saf-d-grid",
+ "neutrik-powercon-20a",
+ "neutrik-powercon-32a",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `iec-60320-c5` - C5\n* `iec-60320-c7` - C7\n* `iec-60320-c13` - C13\n* `iec-60320-c15` - C15\n* `iec-60320-c17` - C17\n* `iec-60320-c19` - C19\n* `iec-60320-c21` - C21\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15r` - NEMA 1-15R\n* `nema-5-15r` - NEMA 5-15R\n* `nema-5-20r` - NEMA 5-20R\n* `nema-5-30r` - NEMA 5-30R\n* `nema-5-50r` - NEMA 5-50R\n* `nema-6-15r` - NEMA 6-15R\n* `nema-6-20r` - NEMA 6-20R\n* `nema-6-30r` - NEMA 6-30R\n* `nema-6-50r` - NEMA 6-50R\n* `nema-10-30r` - NEMA 10-30R\n* `nema-10-50r` - NEMA 10-50R\n* `nema-14-20r` - NEMA 14-20R\n* `nema-14-30r` - NEMA 14-30R\n* `nema-14-50r` - NEMA 14-50R\n* `nema-14-60r` - NEMA 14-60R\n* `nema-15-15r` - NEMA 15-15R\n* `nema-15-20r` - NEMA 15-20R\n* `nema-15-30r` - NEMA 15-30R\n* `nema-15-50r` - NEMA 15-50R\n* `nema-15-60r` - NEMA 15-60R\n* `nema-l1-15r` - NEMA L1-15R\n* `nema-l5-15r` - NEMA L5-15R\n* `nema-l5-20r` - NEMA L5-20R\n* `nema-l5-30r` - NEMA L5-30R\n* `nema-l5-50r` - NEMA L5-50R\n* `nema-l6-15r` - NEMA L6-15R\n* `nema-l6-20r` - NEMA L6-20R\n* `nema-l6-30r` - NEMA L6-30R\n* `nema-l6-50r` - NEMA L6-50R\n* `nema-l10-30r` - NEMA L10-30R\n* `nema-l14-20r` - NEMA L14-20R\n* `nema-l14-30r` - NEMA L14-30R\n* `nema-l14-50r` - NEMA L14-50R\n* `nema-l14-60r` - NEMA L14-60R\n* `nema-l15-20r` - NEMA L15-20R\n* `nema-l15-30r` - NEMA L15-30R\n* `nema-l15-50r` - NEMA L15-50R\n* `nema-l15-60r` - NEMA L15-60R\n* `nema-l21-20r` - NEMA L21-20R\n* `nema-l21-30r` - NEMA L21-30R\n* `nema-l22-20r` - NEMA L22-20R\n* `nema-l22-30r` - NEMA L22-30R\n* `CS6360C` - CS6360C\n* `CS6364C` - CS6364C\n* `CS8164C` - CS8164C\n* `CS8264C` - CS8264C\n* `CS8364C` - CS8364C\n* `CS8464C` - CS8464C\n* `ita-e` - ITA Type E (CEE 7/5)\n* `ita-f` - ITA Type F (CEE 7/3)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `ita-multistandard` - ITA Multistandard\n* `usb-a` - USB Type A\n* `usb-micro-b` - USB Micro B\n* `usb-c` - USB Type C\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `eaton-c39` - Eaton C39\n* `hdot-cx` - HDOT Cx\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20a` - Neutrik powerCON (20A)\n* `neutrik-powercon-32a` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other",
+ "x-spec-enum-id": "8f9617d2648ab261",
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "enabled",
+ "disabled",
+ "faulty"
+ ],
+ "type": "string",
+ "description": "* `enabled` - Enabled\n* `disabled` - Disabled\n* `faulty` - Faulty",
+ "x-spec-enum-id": "1024f7deaed962d7"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "power_port": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPowerPortRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "feed_leg": {
+ "enum": [
+ "A",
+ "B",
+ "C",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `A` - A\n* `B` - B\n* `C` - C",
+ "x-spec-enum-id": "a4902339df0b7c06",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name"
+ ]
+ },
+ "PowerOutletTemplate": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceType"
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleType"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "iec-60320-c5",
+ "iec-60320-c7",
+ "iec-60320-c13",
+ "iec-60320-c15",
+ "iec-60320-c17",
+ "iec-60320-c19",
+ "iec-60320-c21",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15r",
+ "nema-5-15r",
+ "nema-5-20r",
+ "nema-5-30r",
+ "nema-5-50r",
+ "nema-6-15r",
+ "nema-6-20r",
+ "nema-6-30r",
+ "nema-6-50r",
+ "nema-10-30r",
+ "nema-10-50r",
+ "nema-14-20r",
+ "nema-14-30r",
+ "nema-14-50r",
+ "nema-14-60r",
+ "nema-15-15r",
+ "nema-15-20r",
+ "nema-15-30r",
+ "nema-15-50r",
+ "nema-15-60r",
+ "nema-l1-15r",
+ "nema-l5-15r",
+ "nema-l5-20r",
+ "nema-l5-30r",
+ "nema-l5-50r",
+ "nema-l6-15r",
+ "nema-l6-20r",
+ "nema-l6-30r",
+ "nema-l6-50r",
+ "nema-l10-30r",
+ "nema-l14-20r",
+ "nema-l14-30r",
+ "nema-l14-50r",
+ "nema-l14-60r",
+ "nema-l15-20r",
+ "nema-l15-30r",
+ "nema-l15-50r",
+ "nema-l15-60r",
+ "nema-l21-20r",
+ "nema-l21-30r",
+ "nema-l22-20r",
+ "nema-l22-30r",
+ "CS6360C",
+ "CS6364C",
+ "CS8164C",
+ "CS8264C",
+ "CS8364C",
+ "CS8464C",
+ "ita-e",
+ "ita-f",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "ita-multistandard",
+ "usb-a",
+ "usb-micro-b",
+ "usb-c",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "eaton-c39",
+ "hdot-cx",
+ "saf-d-grid",
+ "neutrik-powercon-20a",
+ "neutrik-powercon-32a",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `iec-60320-c5` - C5\n* `iec-60320-c7` - C7\n* `iec-60320-c13` - C13\n* `iec-60320-c15` - C15\n* `iec-60320-c17` - C17\n* `iec-60320-c19` - C19\n* `iec-60320-c21` - C21\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15r` - NEMA 1-15R\n* `nema-5-15r` - NEMA 5-15R\n* `nema-5-20r` - NEMA 5-20R\n* `nema-5-30r` - NEMA 5-30R\n* `nema-5-50r` - NEMA 5-50R\n* `nema-6-15r` - NEMA 6-15R\n* `nema-6-20r` - NEMA 6-20R\n* `nema-6-30r` - NEMA 6-30R\n* `nema-6-50r` - NEMA 6-50R\n* `nema-10-30r` - NEMA 10-30R\n* `nema-10-50r` - NEMA 10-50R\n* `nema-14-20r` - NEMA 14-20R\n* `nema-14-30r` - NEMA 14-30R\n* `nema-14-50r` - NEMA 14-50R\n* `nema-14-60r` - NEMA 14-60R\n* `nema-15-15r` - NEMA 15-15R\n* `nema-15-20r` - NEMA 15-20R\n* `nema-15-30r` - NEMA 15-30R\n* `nema-15-50r` - NEMA 15-50R\n* `nema-15-60r` - NEMA 15-60R\n* `nema-l1-15r` - NEMA L1-15R\n* `nema-l5-15r` - NEMA L5-15R\n* `nema-l5-20r` - NEMA L5-20R\n* `nema-l5-30r` - NEMA L5-30R\n* `nema-l5-50r` - NEMA L5-50R\n* `nema-l6-15r` - NEMA L6-15R\n* `nema-l6-20r` - NEMA L6-20R\n* `nema-l6-30r` - NEMA L6-30R\n* `nema-l6-50r` - NEMA L6-50R\n* `nema-l10-30r` - NEMA L10-30R\n* `nema-l14-20r` - NEMA L14-20R\n* `nema-l14-30r` - NEMA L14-30R\n* `nema-l14-50r` - NEMA L14-50R\n* `nema-l14-60r` - NEMA L14-60R\n* `nema-l15-20r` - NEMA L15-20R\n* `nema-l15-30r` - NEMA L15-30R\n* `nema-l15-50r` - NEMA L15-50R\n* `nema-l15-60r` - NEMA L15-60R\n* `nema-l21-20r` - NEMA L21-20R\n* `nema-l21-30r` - NEMA L21-30R\n* `nema-l22-20r` - NEMA L22-20R\n* `nema-l22-30r` - NEMA L22-30R\n* `CS6360C` - CS6360C\n* `CS6364C` - CS6364C\n* `CS8164C` - CS8164C\n* `CS8264C` - CS8264C\n* `CS8364C` - CS8364C\n* `CS8464C` - CS8464C\n* `ita-e` - ITA Type E (CEE 7/5)\n* `ita-f` - ITA Type F (CEE 7/3)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `ita-multistandard` - ITA Multistandard\n* `usb-a` - USB Type A\n* `usb-micro-b` - USB Micro B\n* `usb-c` - USB Type C\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `eaton-c39` - Eaton C39\n* `hdot-cx` - HDOT Cx\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20a` - Neutrik powerCON (20A)\n* `neutrik-powercon-32a` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other",
+ "x-spec-enum-id": "8f9617d2648ab261"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "C5",
+ "C7",
+ "C13",
+ "C15",
+ "C17",
+ "C19",
+ "C21",
+ "P+N+E 4H",
+ "P+N+E 6H",
+ "P+N+E 9H",
+ "2P+E 4H",
+ "2P+E 6H",
+ "2P+E 9H",
+ "3P+E 4H",
+ "3P+E 6H",
+ "3P+E 9H",
+ "3P+N+E 4H",
+ "3P+N+E 6H",
+ "3P+N+E 9H",
+ "IEC 60906-1",
+ "2P+T 10A (NBR 14136)",
+ "2P+T 20A (NBR 14136)",
+ "NEMA 1-15R",
+ "NEMA 5-15R",
+ "NEMA 5-20R",
+ "NEMA 5-30R",
+ "NEMA 5-50R",
+ "NEMA 6-15R",
+ "NEMA 6-20R",
+ "NEMA 6-30R",
+ "NEMA 6-50R",
+ "NEMA 10-30R",
+ "NEMA 10-50R",
+ "NEMA 14-20R",
+ "NEMA 14-30R",
+ "NEMA 14-50R",
+ "NEMA 14-60R",
+ "NEMA 15-15R",
+ "NEMA 15-20R",
+ "NEMA 15-30R",
+ "NEMA 15-50R",
+ "NEMA 15-60R",
+ "NEMA L1-15R",
+ "NEMA L5-15R",
+ "NEMA L5-20R",
+ "NEMA L5-30R",
+ "NEMA L5-50R",
+ "NEMA L6-15R",
+ "NEMA L6-20R",
+ "NEMA L6-30R",
+ "NEMA L6-50R",
+ "NEMA L10-30R",
+ "NEMA L14-20R",
+ "NEMA L14-30R",
+ "NEMA L14-50R",
+ "NEMA L14-60R",
+ "NEMA L15-20R",
+ "NEMA L15-30R",
+ "NEMA L15-50R",
+ "NEMA L15-60R",
+ "NEMA L21-20R",
+ "NEMA L21-30R",
+ "NEMA L22-20R",
+ "NEMA L22-30R",
+ "CS6360C",
+ "CS6364C",
+ "CS8164C",
+ "CS8264C",
+ "CS8364C",
+ "CS8464C",
+ "ITA Type E (CEE 7/5)",
+ "ITA Type F (CEE 7/3)",
+ "ITA Type G (BS 1363)",
+ "ITA Type H",
+ "ITA Type I",
+ "ITA Type J",
+ "ITA Type K",
+ "ITA Type L (CEI 23-50)",
+ "ITA Type M (BS 546)",
+ "ITA Type N",
+ "ITA Type O",
+ "ITA Multistandard",
+ "USB Type A",
+ "USB Micro B",
+ "USB Type C",
+ "Molex Micro-Fit 1x2",
+ "Molex Micro-Fit 2x2",
+ "Molex Micro-Fit 2x4",
+ "DC Terminal",
+ "Eaton C39",
+ "HDOT Cx",
+ "Saf-D-Grid",
+ "Neutrik powerCON (20A)",
+ "Neutrik powerCON (32A)",
+ "Neutrik powerCON TRUE1",
+ "Neutrik powerCON TRUE1 TOP",
+ "Ubiquiti SmartPower",
+ "Hardwired",
+ "Other"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "power_port": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPowerPortTemplate"
+ }
+ ],
+ "nullable": true
+ },
+ "feed_leg": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "A",
+ "B",
+ "C",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `A` - A\n* `B` - B\n* `C` - C",
+ "x-spec-enum-id": "a4902339df0b7c06"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "A",
+ "B",
+ "C"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "PowerOutletTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "iec-60320-c5",
+ "iec-60320-c7",
+ "iec-60320-c13",
+ "iec-60320-c15",
+ "iec-60320-c17",
+ "iec-60320-c19",
+ "iec-60320-c21",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15r",
+ "nema-5-15r",
+ "nema-5-20r",
+ "nema-5-30r",
+ "nema-5-50r",
+ "nema-6-15r",
+ "nema-6-20r",
+ "nema-6-30r",
+ "nema-6-50r",
+ "nema-10-30r",
+ "nema-10-50r",
+ "nema-14-20r",
+ "nema-14-30r",
+ "nema-14-50r",
+ "nema-14-60r",
+ "nema-15-15r",
+ "nema-15-20r",
+ "nema-15-30r",
+ "nema-15-50r",
+ "nema-15-60r",
+ "nema-l1-15r",
+ "nema-l5-15r",
+ "nema-l5-20r",
+ "nema-l5-30r",
+ "nema-l5-50r",
+ "nema-l6-15r",
+ "nema-l6-20r",
+ "nema-l6-30r",
+ "nema-l6-50r",
+ "nema-l10-30r",
+ "nema-l14-20r",
+ "nema-l14-30r",
+ "nema-l14-50r",
+ "nema-l14-60r",
+ "nema-l15-20r",
+ "nema-l15-30r",
+ "nema-l15-50r",
+ "nema-l15-60r",
+ "nema-l21-20r",
+ "nema-l21-30r",
+ "nema-l22-20r",
+ "nema-l22-30r",
+ "CS6360C",
+ "CS6364C",
+ "CS8164C",
+ "CS8264C",
+ "CS8364C",
+ "CS8464C",
+ "ita-e",
+ "ita-f",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "ita-multistandard",
+ "usb-a",
+ "usb-micro-b",
+ "usb-c",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "eaton-c39",
+ "hdot-cx",
+ "saf-d-grid",
+ "neutrik-powercon-20a",
+ "neutrik-powercon-32a",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `iec-60320-c5` - C5\n* `iec-60320-c7` - C7\n* `iec-60320-c13` - C13\n* `iec-60320-c15` - C15\n* `iec-60320-c17` - C17\n* `iec-60320-c19` - C19\n* `iec-60320-c21` - C21\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15r` - NEMA 1-15R\n* `nema-5-15r` - NEMA 5-15R\n* `nema-5-20r` - NEMA 5-20R\n* `nema-5-30r` - NEMA 5-30R\n* `nema-5-50r` - NEMA 5-50R\n* `nema-6-15r` - NEMA 6-15R\n* `nema-6-20r` - NEMA 6-20R\n* `nema-6-30r` - NEMA 6-30R\n* `nema-6-50r` - NEMA 6-50R\n* `nema-10-30r` - NEMA 10-30R\n* `nema-10-50r` - NEMA 10-50R\n* `nema-14-20r` - NEMA 14-20R\n* `nema-14-30r` - NEMA 14-30R\n* `nema-14-50r` - NEMA 14-50R\n* `nema-14-60r` - NEMA 14-60R\n* `nema-15-15r` - NEMA 15-15R\n* `nema-15-20r` - NEMA 15-20R\n* `nema-15-30r` - NEMA 15-30R\n* `nema-15-50r` - NEMA 15-50R\n* `nema-15-60r` - NEMA 15-60R\n* `nema-l1-15r` - NEMA L1-15R\n* `nema-l5-15r` - NEMA L5-15R\n* `nema-l5-20r` - NEMA L5-20R\n* `nema-l5-30r` - NEMA L5-30R\n* `nema-l5-50r` - NEMA L5-50R\n* `nema-l6-15r` - NEMA L6-15R\n* `nema-l6-20r` - NEMA L6-20R\n* `nema-l6-30r` - NEMA L6-30R\n* `nema-l6-50r` - NEMA L6-50R\n* `nema-l10-30r` - NEMA L10-30R\n* `nema-l14-20r` - NEMA L14-20R\n* `nema-l14-30r` - NEMA L14-30R\n* `nema-l14-50r` - NEMA L14-50R\n* `nema-l14-60r` - NEMA L14-60R\n* `nema-l15-20r` - NEMA L15-20R\n* `nema-l15-30r` - NEMA L15-30R\n* `nema-l15-50r` - NEMA L15-50R\n* `nema-l15-60r` - NEMA L15-60R\n* `nema-l21-20r` - NEMA L21-20R\n* `nema-l21-30r` - NEMA L21-30R\n* `nema-l22-20r` - NEMA L22-20R\n* `nema-l22-30r` - NEMA L22-30R\n* `CS6360C` - CS6360C\n* `CS6364C` - CS6364C\n* `CS8164C` - CS8164C\n* `CS8264C` - CS8264C\n* `CS8364C` - CS8364C\n* `CS8464C` - CS8464C\n* `ita-e` - ITA Type E (CEE 7/5)\n* `ita-f` - ITA Type F (CEE 7/3)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `ita-multistandard` - ITA Multistandard\n* `usb-a` - USB Type A\n* `usb-micro-b` - USB Micro B\n* `usb-c` - USB Type C\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `eaton-c39` - Eaton C39\n* `hdot-cx` - HDOT Cx\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20a` - Neutrik powerCON (20A)\n* `neutrik-powercon-32a` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other",
+ "x-spec-enum-id": "8f9617d2648ab261",
+ "nullable": true
+ },
+ "power_port": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPowerPortTemplateRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "feed_leg": {
+ "enum": [
+ "A",
+ "B",
+ "C",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `A` - A\n* `B` - B\n* `C` - C",
+ "x-spec-enum-id": "a4902339df0b7c06",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "PowerPanel": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "site": {
+ "$ref": "#/components/schemas/BriefSite"
+ },
+ "location": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefLocation"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "powerfeed_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "powerfeed_count",
+ "site",
+ "url"
+ ]
+ },
+ "PowerPanelRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ]
+ },
+ "location": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefLocationRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "site"
+ ]
+ },
+ "PowerPort": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device": {
+ "$ref": "#/components/schemas/BriefDevice"
+ },
+ "module": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModule"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "iec-60320-c6",
+ "iec-60320-c8",
+ "iec-60320-c14",
+ "iec-60320-c16",
+ "iec-60320-c18",
+ "iec-60320-c20",
+ "iec-60320-c22",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15p",
+ "nema-5-15p",
+ "nema-5-20p",
+ "nema-5-30p",
+ "nema-5-50p",
+ "nema-6-15p",
+ "nema-6-20p",
+ "nema-6-30p",
+ "nema-6-50p",
+ "nema-10-30p",
+ "nema-10-50p",
+ "nema-14-20p",
+ "nema-14-30p",
+ "nema-14-50p",
+ "nema-14-60p",
+ "nema-15-15p",
+ "nema-15-20p",
+ "nema-15-30p",
+ "nema-15-50p",
+ "nema-15-60p",
+ "nema-l1-15p",
+ "nema-l5-15p",
+ "nema-l5-20p",
+ "nema-l5-30p",
+ "nema-l5-50p",
+ "nema-l6-15p",
+ "nema-l6-20p",
+ "nema-l6-30p",
+ "nema-l6-50p",
+ "nema-l10-30p",
+ "nema-l14-20p",
+ "nema-l14-30p",
+ "nema-l14-50p",
+ "nema-l14-60p",
+ "nema-l15-20p",
+ "nema-l15-30p",
+ "nema-l15-50p",
+ "nema-l15-60p",
+ "nema-l21-20p",
+ "nema-l21-30p",
+ "nema-l22-20p",
+ "nema-l22-30p",
+ "cs6361c",
+ "cs6365c",
+ "cs8165c",
+ "cs8265c",
+ "cs8365c",
+ "cs8465c",
+ "ita-c",
+ "ita-e",
+ "ita-f",
+ "ita-ef",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "usb-3-b",
+ "usb-3-micro-b",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "saf-d-grid",
+ "neutrik-powercon-20",
+ "neutrik-powercon-32",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `iec-60320-c6` - C6\n* `iec-60320-c8` - C8\n* `iec-60320-c14` - C14\n* `iec-60320-c16` - C16\n* `iec-60320-c18` - C18\n* `iec-60320-c20` - C20\n* `iec-60320-c22` - C22\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15p` - NEMA 1-15P\n* `nema-5-15p` - NEMA 5-15P\n* `nema-5-20p` - NEMA 5-20P\n* `nema-5-30p` - NEMA 5-30P\n* `nema-5-50p` - NEMA 5-50P\n* `nema-6-15p` - NEMA 6-15P\n* `nema-6-20p` - NEMA 6-20P\n* `nema-6-30p` - NEMA 6-30P\n* `nema-6-50p` - NEMA 6-50P\n* `nema-10-30p` - NEMA 10-30P\n* `nema-10-50p` - NEMA 10-50P\n* `nema-14-20p` - NEMA 14-20P\n* `nema-14-30p` - NEMA 14-30P\n* `nema-14-50p` - NEMA 14-50P\n* `nema-14-60p` - NEMA 14-60P\n* `nema-15-15p` - NEMA 15-15P\n* `nema-15-20p` - NEMA 15-20P\n* `nema-15-30p` - NEMA 15-30P\n* `nema-15-50p` - NEMA 15-50P\n* `nema-15-60p` - NEMA 15-60P\n* `nema-l1-15p` - NEMA L1-15P\n* `nema-l5-15p` - NEMA L5-15P\n* `nema-l5-20p` - NEMA L5-20P\n* `nema-l5-30p` - NEMA L5-30P\n* `nema-l5-50p` - NEMA L5-50P\n* `nema-l6-15p` - NEMA L6-15P\n* `nema-l6-20p` - NEMA L6-20P\n* `nema-l6-30p` - NEMA L6-30P\n* `nema-l6-50p` - NEMA L6-50P\n* `nema-l10-30p` - NEMA L10-30P\n* `nema-l14-20p` - NEMA L14-20P\n* `nema-l14-30p` - NEMA L14-30P\n* `nema-l14-50p` - NEMA L14-50P\n* `nema-l14-60p` - NEMA L14-60P\n* `nema-l15-20p` - NEMA L15-20P\n* `nema-l15-30p` - NEMA L15-30P\n* `nema-l15-50p` - NEMA L15-50P\n* `nema-l15-60p` - NEMA L15-60P\n* `nema-l21-20p` - NEMA L21-20P\n* `nema-l21-30p` - NEMA L21-30P\n* `nema-l22-20p` - NEMA L22-20P\n* `nema-l22-30p` - NEMA L22-30P\n* `cs6361c` - CS6361C\n* `cs6365c` - CS6365C\n* `cs8165c` - CS8165C\n* `cs8265c` - CS8265C\n* `cs8365c` - CS8365C\n* `cs8465c` - CS8465C\n* `ita-c` - ITA Type C (CEE 7/16)\n* `ita-e` - ITA Type E (CEE 7/6)\n* `ita-f` - ITA Type F (CEE 7/4)\n* `ita-ef` - ITA Type E/F (CEE 7/7)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `usb-3-b` - USB 3.0 Type B\n* `usb-3-micro-b` - USB 3.0 Micro B\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20` - Neutrik powerCON (20A)\n* `neutrik-powercon-32` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other",
+ "x-spec-enum-id": "292850be2c08f7df"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "C6",
+ "C8",
+ "C14",
+ "C16",
+ "C18",
+ "C20",
+ "C22",
+ "P+N+E 4H",
+ "P+N+E 6H",
+ "P+N+E 9H",
+ "2P+E 4H",
+ "2P+E 6H",
+ "2P+E 9H",
+ "3P+E 4H",
+ "3P+E 6H",
+ "3P+E 9H",
+ "3P+N+E 4H",
+ "3P+N+E 6H",
+ "3P+N+E 9H",
+ "IEC 60906-1",
+ "2P+T 10A (NBR 14136)",
+ "2P+T 20A (NBR 14136)",
+ "NEMA 1-15P",
+ "NEMA 5-15P",
+ "NEMA 5-20P",
+ "NEMA 5-30P",
+ "NEMA 5-50P",
+ "NEMA 6-15P",
+ "NEMA 6-20P",
+ "NEMA 6-30P",
+ "NEMA 6-50P",
+ "NEMA 10-30P",
+ "NEMA 10-50P",
+ "NEMA 14-20P",
+ "NEMA 14-30P",
+ "NEMA 14-50P",
+ "NEMA 14-60P",
+ "NEMA 15-15P",
+ "NEMA 15-20P",
+ "NEMA 15-30P",
+ "NEMA 15-50P",
+ "NEMA 15-60P",
+ "NEMA L1-15P",
+ "NEMA L5-15P",
+ "NEMA L5-20P",
+ "NEMA L5-30P",
+ "NEMA L5-50P",
+ "NEMA L6-15P",
+ "NEMA L6-20P",
+ "NEMA L6-30P",
+ "NEMA L6-50P",
+ "NEMA L10-30P",
+ "NEMA L14-20P",
+ "NEMA L14-30P",
+ "NEMA L14-50P",
+ "NEMA L14-60P",
+ "NEMA L15-20P",
+ "NEMA L15-30P",
+ "NEMA L15-50P",
+ "NEMA L15-60P",
+ "NEMA L21-20P",
+ "NEMA L21-30P",
+ "NEMA L22-20P",
+ "NEMA L22-30P",
+ "CS6361C",
+ "CS6365C",
+ "CS8165C",
+ "CS8265C",
+ "CS8365C",
+ "CS8465C",
+ "ITA Type C (CEE 7/16)",
+ "ITA Type E (CEE 7/6)",
+ "ITA Type F (CEE 7/4)",
+ "ITA Type E/F (CEE 7/7)",
+ "ITA Type G (BS 1363)",
+ "ITA Type H",
+ "ITA Type I",
+ "ITA Type J",
+ "ITA Type K",
+ "ITA Type L (CEI 23-50)",
+ "ITA Type M (BS 546)",
+ "ITA Type N",
+ "ITA Type O",
+ "USB Type A",
+ "USB Type B",
+ "USB Type C",
+ "USB Mini A",
+ "USB Mini B",
+ "USB Micro A",
+ "USB Micro B",
+ "USB Micro AB",
+ "USB 3.0 Type B",
+ "USB 3.0 Micro B",
+ "Molex Micro-Fit 1x2",
+ "Molex Micro-Fit 2x2",
+ "Molex Micro-Fit 2x4",
+ "DC Terminal",
+ "Saf-D-Grid",
+ "Neutrik powerCON (20A)",
+ "Neutrik powerCON (32A)",
+ "Neutrik powerCON TRUE1",
+ "Neutrik powerCON TRUE1 TOP",
+ "Ubiquiti SmartPower",
+ "Hardwired",
+ "Other"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "maximum_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Maximum power draw (watts)"
+ },
+ "allocated_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Allocated power draw (watts)"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "cable": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefCable"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "cable_end": {
+ "type": "string",
+ "readOnly": true
+ },
+ "link_peers": {
+ "type": "array",
+ "items": {},
+ "readOnly": true
+ },
+ "link_peers_type": {
+ "type": "string",
+ "description": "Return the type of the peer link terminations, or None.",
+ "readOnly": true,
+ "nullable": true
+ },
+ "connected_endpoints": {
+ "type": "array",
+ "items": {},
+ "nullable": true,
+ "readOnly": true
+ },
+ "connected_endpoints_type": {
+ "type": "string",
+ "readOnly": true,
+ "nullable": true
+ },
+ "connected_endpoints_reachable": {
+ "type": "boolean",
+ "readOnly": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "_occupied": {
+ "type": "boolean",
+ "readOnly": true,
+ "title": " occupied"
+ }
+ },
+ "required": [
+ "_occupied",
+ "cable",
+ "cable_end",
+ "connected_endpoints",
+ "connected_endpoints_reachable",
+ "connected_endpoints_type",
+ "created",
+ "device",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "link_peers",
+ "link_peers_type",
+ "name",
+ "url"
+ ]
+ },
+ "PowerPortRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "iec-60320-c6",
+ "iec-60320-c8",
+ "iec-60320-c14",
+ "iec-60320-c16",
+ "iec-60320-c18",
+ "iec-60320-c20",
+ "iec-60320-c22",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15p",
+ "nema-5-15p",
+ "nema-5-20p",
+ "nema-5-30p",
+ "nema-5-50p",
+ "nema-6-15p",
+ "nema-6-20p",
+ "nema-6-30p",
+ "nema-6-50p",
+ "nema-10-30p",
+ "nema-10-50p",
+ "nema-14-20p",
+ "nema-14-30p",
+ "nema-14-50p",
+ "nema-14-60p",
+ "nema-15-15p",
+ "nema-15-20p",
+ "nema-15-30p",
+ "nema-15-50p",
+ "nema-15-60p",
+ "nema-l1-15p",
+ "nema-l5-15p",
+ "nema-l5-20p",
+ "nema-l5-30p",
+ "nema-l5-50p",
+ "nema-l6-15p",
+ "nema-l6-20p",
+ "nema-l6-30p",
+ "nema-l6-50p",
+ "nema-l10-30p",
+ "nema-l14-20p",
+ "nema-l14-30p",
+ "nema-l14-50p",
+ "nema-l14-60p",
+ "nema-l15-20p",
+ "nema-l15-30p",
+ "nema-l15-50p",
+ "nema-l15-60p",
+ "nema-l21-20p",
+ "nema-l21-30p",
+ "nema-l22-20p",
+ "nema-l22-30p",
+ "cs6361c",
+ "cs6365c",
+ "cs8165c",
+ "cs8265c",
+ "cs8365c",
+ "cs8465c",
+ "ita-c",
+ "ita-e",
+ "ita-f",
+ "ita-ef",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "usb-3-b",
+ "usb-3-micro-b",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "saf-d-grid",
+ "neutrik-powercon-20",
+ "neutrik-powercon-32",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `iec-60320-c6` - C6\n* `iec-60320-c8` - C8\n* `iec-60320-c14` - C14\n* `iec-60320-c16` - C16\n* `iec-60320-c18` - C18\n* `iec-60320-c20` - C20\n* `iec-60320-c22` - C22\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15p` - NEMA 1-15P\n* `nema-5-15p` - NEMA 5-15P\n* `nema-5-20p` - NEMA 5-20P\n* `nema-5-30p` - NEMA 5-30P\n* `nema-5-50p` - NEMA 5-50P\n* `nema-6-15p` - NEMA 6-15P\n* `nema-6-20p` - NEMA 6-20P\n* `nema-6-30p` - NEMA 6-30P\n* `nema-6-50p` - NEMA 6-50P\n* `nema-10-30p` - NEMA 10-30P\n* `nema-10-50p` - NEMA 10-50P\n* `nema-14-20p` - NEMA 14-20P\n* `nema-14-30p` - NEMA 14-30P\n* `nema-14-50p` - NEMA 14-50P\n* `nema-14-60p` - NEMA 14-60P\n* `nema-15-15p` - NEMA 15-15P\n* `nema-15-20p` - NEMA 15-20P\n* `nema-15-30p` - NEMA 15-30P\n* `nema-15-50p` - NEMA 15-50P\n* `nema-15-60p` - NEMA 15-60P\n* `nema-l1-15p` - NEMA L1-15P\n* `nema-l5-15p` - NEMA L5-15P\n* `nema-l5-20p` - NEMA L5-20P\n* `nema-l5-30p` - NEMA L5-30P\n* `nema-l5-50p` - NEMA L5-50P\n* `nema-l6-15p` - NEMA L6-15P\n* `nema-l6-20p` - NEMA L6-20P\n* `nema-l6-30p` - NEMA L6-30P\n* `nema-l6-50p` - NEMA L6-50P\n* `nema-l10-30p` - NEMA L10-30P\n* `nema-l14-20p` - NEMA L14-20P\n* `nema-l14-30p` - NEMA L14-30P\n* `nema-l14-50p` - NEMA L14-50P\n* `nema-l14-60p` - NEMA L14-60P\n* `nema-l15-20p` - NEMA L15-20P\n* `nema-l15-30p` - NEMA L15-30P\n* `nema-l15-50p` - NEMA L15-50P\n* `nema-l15-60p` - NEMA L15-60P\n* `nema-l21-20p` - NEMA L21-20P\n* `nema-l21-30p` - NEMA L21-30P\n* `nema-l22-20p` - NEMA L22-20P\n* `nema-l22-30p` - NEMA L22-30P\n* `cs6361c` - CS6361C\n* `cs6365c` - CS6365C\n* `cs8165c` - CS8165C\n* `cs8265c` - CS8265C\n* `cs8365c` - CS8365C\n* `cs8465c` - CS8465C\n* `ita-c` - ITA Type C (CEE 7/16)\n* `ita-e` - ITA Type E (CEE 7/6)\n* `ita-f` - ITA Type F (CEE 7/4)\n* `ita-ef` - ITA Type E/F (CEE 7/7)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `usb-3-b` - USB 3.0 Type B\n* `usb-3-micro-b` - USB 3.0 Micro B\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20` - Neutrik powerCON (20A)\n* `neutrik-powercon-32` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other",
+ "x-spec-enum-id": "292850be2c08f7df",
+ "nullable": true
+ },
+ "maximum_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Maximum power draw (watts)"
+ },
+ "allocated_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Allocated power draw (watts)"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name"
+ ]
+ },
+ "PowerPortTemplate": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceType"
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleType"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "iec-60320-c6",
+ "iec-60320-c8",
+ "iec-60320-c14",
+ "iec-60320-c16",
+ "iec-60320-c18",
+ "iec-60320-c20",
+ "iec-60320-c22",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15p",
+ "nema-5-15p",
+ "nema-5-20p",
+ "nema-5-30p",
+ "nema-5-50p",
+ "nema-6-15p",
+ "nema-6-20p",
+ "nema-6-30p",
+ "nema-6-50p",
+ "nema-10-30p",
+ "nema-10-50p",
+ "nema-14-20p",
+ "nema-14-30p",
+ "nema-14-50p",
+ "nema-14-60p",
+ "nema-15-15p",
+ "nema-15-20p",
+ "nema-15-30p",
+ "nema-15-50p",
+ "nema-15-60p",
+ "nema-l1-15p",
+ "nema-l5-15p",
+ "nema-l5-20p",
+ "nema-l5-30p",
+ "nema-l5-50p",
+ "nema-l6-15p",
+ "nema-l6-20p",
+ "nema-l6-30p",
+ "nema-l6-50p",
+ "nema-l10-30p",
+ "nema-l14-20p",
+ "nema-l14-30p",
+ "nema-l14-50p",
+ "nema-l14-60p",
+ "nema-l15-20p",
+ "nema-l15-30p",
+ "nema-l15-50p",
+ "nema-l15-60p",
+ "nema-l21-20p",
+ "nema-l21-30p",
+ "nema-l22-20p",
+ "nema-l22-30p",
+ "cs6361c",
+ "cs6365c",
+ "cs8165c",
+ "cs8265c",
+ "cs8365c",
+ "cs8465c",
+ "ita-c",
+ "ita-e",
+ "ita-f",
+ "ita-ef",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "usb-3-b",
+ "usb-3-micro-b",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "saf-d-grid",
+ "neutrik-powercon-20",
+ "neutrik-powercon-32",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `iec-60320-c6` - C6\n* `iec-60320-c8` - C8\n* `iec-60320-c14` - C14\n* `iec-60320-c16` - C16\n* `iec-60320-c18` - C18\n* `iec-60320-c20` - C20\n* `iec-60320-c22` - C22\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15p` - NEMA 1-15P\n* `nema-5-15p` - NEMA 5-15P\n* `nema-5-20p` - NEMA 5-20P\n* `nema-5-30p` - NEMA 5-30P\n* `nema-5-50p` - NEMA 5-50P\n* `nema-6-15p` - NEMA 6-15P\n* `nema-6-20p` - NEMA 6-20P\n* `nema-6-30p` - NEMA 6-30P\n* `nema-6-50p` - NEMA 6-50P\n* `nema-10-30p` - NEMA 10-30P\n* `nema-10-50p` - NEMA 10-50P\n* `nema-14-20p` - NEMA 14-20P\n* `nema-14-30p` - NEMA 14-30P\n* `nema-14-50p` - NEMA 14-50P\n* `nema-14-60p` - NEMA 14-60P\n* `nema-15-15p` - NEMA 15-15P\n* `nema-15-20p` - NEMA 15-20P\n* `nema-15-30p` - NEMA 15-30P\n* `nema-15-50p` - NEMA 15-50P\n* `nema-15-60p` - NEMA 15-60P\n* `nema-l1-15p` - NEMA L1-15P\n* `nema-l5-15p` - NEMA L5-15P\n* `nema-l5-20p` - NEMA L5-20P\n* `nema-l5-30p` - NEMA L5-30P\n* `nema-l5-50p` - NEMA L5-50P\n* `nema-l6-15p` - NEMA L6-15P\n* `nema-l6-20p` - NEMA L6-20P\n* `nema-l6-30p` - NEMA L6-30P\n* `nema-l6-50p` - NEMA L6-50P\n* `nema-l10-30p` - NEMA L10-30P\n* `nema-l14-20p` - NEMA L14-20P\n* `nema-l14-30p` - NEMA L14-30P\n* `nema-l14-50p` - NEMA L14-50P\n* `nema-l14-60p` - NEMA L14-60P\n* `nema-l15-20p` - NEMA L15-20P\n* `nema-l15-30p` - NEMA L15-30P\n* `nema-l15-50p` - NEMA L15-50P\n* `nema-l15-60p` - NEMA L15-60P\n* `nema-l21-20p` - NEMA L21-20P\n* `nema-l21-30p` - NEMA L21-30P\n* `nema-l22-20p` - NEMA L22-20P\n* `nema-l22-30p` - NEMA L22-30P\n* `cs6361c` - CS6361C\n* `cs6365c` - CS6365C\n* `cs8165c` - CS8165C\n* `cs8265c` - CS8265C\n* `cs8365c` - CS8365C\n* `cs8465c` - CS8465C\n* `ita-c` - ITA Type C (CEE 7/16)\n* `ita-e` - ITA Type E (CEE 7/6)\n* `ita-f` - ITA Type F (CEE 7/4)\n* `ita-ef` - ITA Type E/F (CEE 7/7)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `usb-3-b` - USB 3.0 Type B\n* `usb-3-micro-b` - USB 3.0 Micro B\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20` - Neutrik powerCON (20A)\n* `neutrik-powercon-32` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other",
+ "x-spec-enum-id": "292850be2c08f7df"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "C6",
+ "C8",
+ "C14",
+ "C16",
+ "C18",
+ "C20",
+ "C22",
+ "P+N+E 4H",
+ "P+N+E 6H",
+ "P+N+E 9H",
+ "2P+E 4H",
+ "2P+E 6H",
+ "2P+E 9H",
+ "3P+E 4H",
+ "3P+E 6H",
+ "3P+E 9H",
+ "3P+N+E 4H",
+ "3P+N+E 6H",
+ "3P+N+E 9H",
+ "IEC 60906-1",
+ "2P+T 10A (NBR 14136)",
+ "2P+T 20A (NBR 14136)",
+ "NEMA 1-15P",
+ "NEMA 5-15P",
+ "NEMA 5-20P",
+ "NEMA 5-30P",
+ "NEMA 5-50P",
+ "NEMA 6-15P",
+ "NEMA 6-20P",
+ "NEMA 6-30P",
+ "NEMA 6-50P",
+ "NEMA 10-30P",
+ "NEMA 10-50P",
+ "NEMA 14-20P",
+ "NEMA 14-30P",
+ "NEMA 14-50P",
+ "NEMA 14-60P",
+ "NEMA 15-15P",
+ "NEMA 15-20P",
+ "NEMA 15-30P",
+ "NEMA 15-50P",
+ "NEMA 15-60P",
+ "NEMA L1-15P",
+ "NEMA L5-15P",
+ "NEMA L5-20P",
+ "NEMA L5-30P",
+ "NEMA L5-50P",
+ "NEMA L6-15P",
+ "NEMA L6-20P",
+ "NEMA L6-30P",
+ "NEMA L6-50P",
+ "NEMA L10-30P",
+ "NEMA L14-20P",
+ "NEMA L14-30P",
+ "NEMA L14-50P",
+ "NEMA L14-60P",
+ "NEMA L15-20P",
+ "NEMA L15-30P",
+ "NEMA L15-50P",
+ "NEMA L15-60P",
+ "NEMA L21-20P",
+ "NEMA L21-30P",
+ "NEMA L22-20P",
+ "NEMA L22-30P",
+ "CS6361C",
+ "CS6365C",
+ "CS8165C",
+ "CS8265C",
+ "CS8365C",
+ "CS8465C",
+ "ITA Type C (CEE 7/16)",
+ "ITA Type E (CEE 7/6)",
+ "ITA Type F (CEE 7/4)",
+ "ITA Type E/F (CEE 7/7)",
+ "ITA Type G (BS 1363)",
+ "ITA Type H",
+ "ITA Type I",
+ "ITA Type J",
+ "ITA Type K",
+ "ITA Type L (CEI 23-50)",
+ "ITA Type M (BS 546)",
+ "ITA Type N",
+ "ITA Type O",
+ "USB Type A",
+ "USB Type B",
+ "USB Type C",
+ "USB Mini A",
+ "USB Mini B",
+ "USB Micro A",
+ "USB Micro B",
+ "USB Micro AB",
+ "USB 3.0 Type B",
+ "USB 3.0 Micro B",
+ "Molex Micro-Fit 1x2",
+ "Molex Micro-Fit 2x2",
+ "Molex Micro-Fit 2x4",
+ "DC Terminal",
+ "Saf-D-Grid",
+ "Neutrik powerCON (20A)",
+ "Neutrik powerCON (32A)",
+ "Neutrik powerCON TRUE1",
+ "Neutrik powerCON TRUE1 TOP",
+ "Ubiquiti SmartPower",
+ "Hardwired",
+ "Other"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "maximum_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Maximum power draw (watts)"
+ },
+ "allocated_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Allocated power draw (watts)"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "PowerPortTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "iec-60320-c6",
+ "iec-60320-c8",
+ "iec-60320-c14",
+ "iec-60320-c16",
+ "iec-60320-c18",
+ "iec-60320-c20",
+ "iec-60320-c22",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15p",
+ "nema-5-15p",
+ "nema-5-20p",
+ "nema-5-30p",
+ "nema-5-50p",
+ "nema-6-15p",
+ "nema-6-20p",
+ "nema-6-30p",
+ "nema-6-50p",
+ "nema-10-30p",
+ "nema-10-50p",
+ "nema-14-20p",
+ "nema-14-30p",
+ "nema-14-50p",
+ "nema-14-60p",
+ "nema-15-15p",
+ "nema-15-20p",
+ "nema-15-30p",
+ "nema-15-50p",
+ "nema-15-60p",
+ "nema-l1-15p",
+ "nema-l5-15p",
+ "nema-l5-20p",
+ "nema-l5-30p",
+ "nema-l5-50p",
+ "nema-l6-15p",
+ "nema-l6-20p",
+ "nema-l6-30p",
+ "nema-l6-50p",
+ "nema-l10-30p",
+ "nema-l14-20p",
+ "nema-l14-30p",
+ "nema-l14-50p",
+ "nema-l14-60p",
+ "nema-l15-20p",
+ "nema-l15-30p",
+ "nema-l15-50p",
+ "nema-l15-60p",
+ "nema-l21-20p",
+ "nema-l21-30p",
+ "nema-l22-20p",
+ "nema-l22-30p",
+ "cs6361c",
+ "cs6365c",
+ "cs8165c",
+ "cs8265c",
+ "cs8365c",
+ "cs8465c",
+ "ita-c",
+ "ita-e",
+ "ita-f",
+ "ita-ef",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "usb-3-b",
+ "usb-3-micro-b",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "saf-d-grid",
+ "neutrik-powercon-20",
+ "neutrik-powercon-32",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `iec-60320-c6` - C6\n* `iec-60320-c8` - C8\n* `iec-60320-c14` - C14\n* `iec-60320-c16` - C16\n* `iec-60320-c18` - C18\n* `iec-60320-c20` - C20\n* `iec-60320-c22` - C22\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15p` - NEMA 1-15P\n* `nema-5-15p` - NEMA 5-15P\n* `nema-5-20p` - NEMA 5-20P\n* `nema-5-30p` - NEMA 5-30P\n* `nema-5-50p` - NEMA 5-50P\n* `nema-6-15p` - NEMA 6-15P\n* `nema-6-20p` - NEMA 6-20P\n* `nema-6-30p` - NEMA 6-30P\n* `nema-6-50p` - NEMA 6-50P\n* `nema-10-30p` - NEMA 10-30P\n* `nema-10-50p` - NEMA 10-50P\n* `nema-14-20p` - NEMA 14-20P\n* `nema-14-30p` - NEMA 14-30P\n* `nema-14-50p` - NEMA 14-50P\n* `nema-14-60p` - NEMA 14-60P\n* `nema-15-15p` - NEMA 15-15P\n* `nema-15-20p` - NEMA 15-20P\n* `nema-15-30p` - NEMA 15-30P\n* `nema-15-50p` - NEMA 15-50P\n* `nema-15-60p` - NEMA 15-60P\n* `nema-l1-15p` - NEMA L1-15P\n* `nema-l5-15p` - NEMA L5-15P\n* `nema-l5-20p` - NEMA L5-20P\n* `nema-l5-30p` - NEMA L5-30P\n* `nema-l5-50p` - NEMA L5-50P\n* `nema-l6-15p` - NEMA L6-15P\n* `nema-l6-20p` - NEMA L6-20P\n* `nema-l6-30p` - NEMA L6-30P\n* `nema-l6-50p` - NEMA L6-50P\n* `nema-l10-30p` - NEMA L10-30P\n* `nema-l14-20p` - NEMA L14-20P\n* `nema-l14-30p` - NEMA L14-30P\n* `nema-l14-50p` - NEMA L14-50P\n* `nema-l14-60p` - NEMA L14-60P\n* `nema-l15-20p` - NEMA L15-20P\n* `nema-l15-30p` - NEMA L15-30P\n* `nema-l15-50p` - NEMA L15-50P\n* `nema-l15-60p` - NEMA L15-60P\n* `nema-l21-20p` - NEMA L21-20P\n* `nema-l21-30p` - NEMA L21-30P\n* `nema-l22-20p` - NEMA L22-20P\n* `nema-l22-30p` - NEMA L22-30P\n* `cs6361c` - CS6361C\n* `cs6365c` - CS6365C\n* `cs8165c` - CS8165C\n* `cs8265c` - CS8265C\n* `cs8365c` - CS8365C\n* `cs8465c` - CS8465C\n* `ita-c` - ITA Type C (CEE 7/16)\n* `ita-e` - ITA Type E (CEE 7/6)\n* `ita-f` - ITA Type F (CEE 7/4)\n* `ita-ef` - ITA Type E/F (CEE 7/7)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `usb-3-b` - USB 3.0 Type B\n* `usb-3-micro-b` - USB 3.0 Micro B\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20` - Neutrik powerCON (20A)\n* `neutrik-powercon-32` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other",
+ "x-spec-enum-id": "292850be2c08f7df",
+ "nullable": true
+ },
+ "maximum_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Maximum power draw (watts)"
+ },
+ "allocated_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Allocated power draw (watts)"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "Prefix": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "family": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ 4,
+ 6
+ ],
+ "type": "integer",
+ "description": "* `4` - IPv4\n* `6` - IPv6",
+ "x-spec-enum-id": "d72003fd1af3603d"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "IPv4",
+ "IPv6"
+ ]
+ }
+ },
+ "readOnly": true
+ },
+ "prefix": {
+ "type": "string"
+ },
+ "vrf": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRF"
+ }
+ ],
+ "nullable": true
+ },
+ "scope_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "scope_id": {
+ "type": "integer",
+ "nullable": true
+ },
+ "scope": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "vlan": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLAN"
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "container",
+ "active",
+ "reserved",
+ "deprecated"
+ ],
+ "type": "string",
+ "description": "* `container` - Container\n* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated",
+ "x-spec-enum-id": "d38bee5f512701d9"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Container",
+ "Active",
+ "Reserved",
+ "Deprecated"
+ ]
+ }
+ }
+ },
+ "role": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRole"
+ }
+ ],
+ "nullable": true
+ },
+ "is_pool": {
+ "type": "boolean",
+ "title": "Is a pool",
+ "description": "All IP addresses within this prefix are considered usable"
+ },
+ "mark_utilized": {
+ "type": "boolean",
+ "description": "Treat as fully utilized"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "children": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "children",
+ "created",
+ "display",
+ "display_url",
+ "family",
+ "id",
+ "last_updated",
+ "prefix",
+ "scope",
+ "url"
+ ]
+ },
+ "PrefixRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "prefix": {
+ "type": "string",
+ "minLength": 1
+ },
+ "vrf": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRFRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "scope_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "scope_id": {
+ "type": "integer",
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "container",
+ "active",
+ "reserved",
+ "deprecated"
+ ],
+ "type": "string",
+ "description": "* `container` - Container\n* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated",
+ "x-spec-enum-id": "d38bee5f512701d9"
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "is_pool": {
+ "type": "boolean",
+ "title": "Is a pool",
+ "description": "All IP addresses within this prefix are considered usable"
+ },
+ "mark_utilized": {
+ "type": "boolean",
+ "description": "Treat as fully utilized"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "prefix"
+ ]
+ },
+ "Provider": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "description": "Full name of the provider",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "accounts": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedProviderAccount"
+ }
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "asns": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ASN"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "circuit_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "circuit_count",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "slug",
+ "url"
+ ]
+ },
+ "ProviderAccount": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "provider": {
+ "$ref": "#/components/schemas/BriefProvider"
+ },
+ "name": {
+ "type": "string",
+ "default": "",
+ "maxLength": 100
+ },
+ "account": {
+ "type": "string",
+ "title": "Account ID",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "account",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "provider",
+ "url"
+ ]
+ },
+ "ProviderAccountRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "provider": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefProviderRequest"
+ }
+ ]
+ },
+ "name": {
+ "type": "string",
+ "default": "",
+ "maxLength": 100
+ },
+ "account": {
+ "type": "string",
+ "minLength": 1,
+ "title": "Account ID",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "account",
+ "provider"
+ ]
+ },
+ "ProviderNetwork": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "provider": {
+ "$ref": "#/components/schemas/BriefProvider"
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "service_id": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "provider",
+ "url"
+ ]
+ },
+ "ProviderNetworkRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "provider": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefProviderRequest"
+ }
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "service_id": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "provider"
+ ]
+ },
+ "ProviderRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Full name of the provider",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "accounts": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "asns": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "RIR": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "is_private": {
+ "type": "boolean",
+ "title": "Private",
+ "description": "IP space managed by this RIR is considered private"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "aggregate_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "aggregate_count",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "slug",
+ "url"
+ ]
+ },
+ "RIRRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "is_private": {
+ "type": "boolean",
+ "title": "Private",
+ "description": "IP space managed by this RIR is considered private"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "Rack": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "facility_id": {
+ "type": "string",
+ "nullable": true,
+ "maxLength": 50
+ },
+ "site": {
+ "$ref": "#/components/schemas/BriefSite"
+ },
+ "location": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefLocation"
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "reserved",
+ "available",
+ "planned",
+ "active",
+ "deprecated"
+ ],
+ "type": "string",
+ "description": "* `reserved` - Reserved\n* `available` - Available\n* `planned` - Planned\n* `active` - Active\n* `deprecated` - Deprecated",
+ "x-spec-enum-id": "0c556d55dc1baa13"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Reserved",
+ "Available",
+ "Planned",
+ "Active",
+ "Deprecated"
+ ]
+ }
+ }
+ },
+ "role": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRackRole"
+ }
+ ],
+ "nullable": true
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this rack",
+ "maxLength": 50
+ },
+ "rack_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRackType"
+ }
+ ],
+ "nullable": true
+ },
+ "form_factor": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "2-post-frame",
+ "4-post-frame",
+ "4-post-cabinet",
+ "wall-frame",
+ "wall-frame-vertical",
+ "wall-cabinet",
+ "wall-cabinet-vertical",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `2-post-frame` - 2-post frame\n* `4-post-frame` - 4-post frame\n* `4-post-cabinet` - 4-post cabinet\n* `wall-frame` - Wall-mounted frame\n* `wall-frame-vertical` - Wall-mounted frame (vertical)\n* `wall-cabinet` - Wall-mounted cabinet\n* `wall-cabinet-vertical` - Wall-mounted cabinet (vertical)",
+ "x-spec-enum-id": "e32aaa89a223f2ea"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "2-post frame",
+ "4-post frame",
+ "4-post cabinet",
+ "Wall-mounted frame",
+ "Wall-mounted frame (vertical)",
+ "Wall-mounted cabinet",
+ "Wall-mounted cabinet (vertical)"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "width": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ 10,
+ 19,
+ 21,
+ 23
+ ],
+ "type": "integer",
+ "description": "* `10` - 10 inches\n* `19` - 19 inches\n* `21` - 21 inches\n* `23` - 23 inches",
+ "x-spec-enum-id": "9b322795f297a9c3"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "10 inches",
+ "19 inches",
+ "21 inches",
+ "23 inches"
+ ]
+ }
+ }
+ },
+ "u_height": {
+ "type": "integer",
+ "maximum": 100,
+ "minimum": 1,
+ "title": "Height (U)",
+ "description": "Height in rack units"
+ },
+ "starting_unit": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 1,
+ "description": "Starting unit for rack"
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "max_weight": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum load capacity for the rack"
+ },
+ "weight_unit": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Kilograms",
+ "Grams",
+ "Pounds",
+ "Ounces"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "desc_units": {
+ "type": "boolean",
+ "title": "Descending units",
+ "description": "Units are numbered top-to-bottom"
+ },
+ "outer_width": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (width)"
+ },
+ "outer_height": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (height)"
+ },
+ "outer_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (depth)"
+ },
+ "outer_unit": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "mm",
+ "in",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `mm` - Millimeters\n* `in` - Inches",
+ "x-spec-enum-id": "86a846b6c40f495e"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Millimeters",
+ "Inches"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "mounting_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum depth of a mounted device, in millimeters. For four-post racks, this is the distance between the front and rear rails."
+ },
+ "airflow": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ ""
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front",
+ "x-spec-enum-id": "a784734d07ef1b3c"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Front to rear",
+ "Rear to front"
+ ]
+ }
+ }
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "device_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "powerfeed_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "device_count",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "powerfeed_count",
+ "site",
+ "url"
+ ]
+ },
+ "RackRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "facility_id": {
+ "type": "string",
+ "nullable": true,
+ "maxLength": 50
+ },
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ]
+ },
+ "location": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefLocationRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "reserved",
+ "available",
+ "planned",
+ "active",
+ "deprecated"
+ ],
+ "type": "string",
+ "description": "* `reserved` - Reserved\n* `available` - Available\n* `planned` - Planned\n* `active` - Active\n* `deprecated` - Deprecated",
+ "x-spec-enum-id": "0c556d55dc1baa13"
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRackRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this rack",
+ "maxLength": 50
+ },
+ "rack_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRackTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "form_factor": {
+ "enum": [
+ "2-post-frame",
+ "4-post-frame",
+ "4-post-cabinet",
+ "wall-frame",
+ "wall-frame-vertical",
+ "wall-cabinet",
+ "wall-cabinet-vertical",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `2-post-frame` - 2-post frame\n* `4-post-frame` - 4-post frame\n* `4-post-cabinet` - 4-post cabinet\n* `wall-frame` - Wall-mounted frame\n* `wall-frame-vertical` - Wall-mounted frame (vertical)\n* `wall-cabinet` - Wall-mounted cabinet\n* `wall-cabinet-vertical` - Wall-mounted cabinet (vertical)",
+ "x-spec-enum-id": "e32aaa89a223f2ea",
+ "nullable": true
+ },
+ "width": {
+ "enum": [
+ 10,
+ 19,
+ 21,
+ 23
+ ],
+ "type": "integer",
+ "description": "* `10` - 10 inches\n* `19` - 19 inches\n* `21` - 21 inches\n* `23` - 23 inches",
+ "x-spec-enum-id": "9b322795f297a9c3"
+ },
+ "u_height": {
+ "type": "integer",
+ "maximum": 100,
+ "minimum": 1,
+ "title": "Height (U)",
+ "description": "Height in rack units"
+ },
+ "starting_unit": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 1,
+ "description": "Starting unit for rack"
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "max_weight": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum load capacity for the rack"
+ },
+ "weight_unit": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884",
+ "nullable": true
+ },
+ "desc_units": {
+ "type": "boolean",
+ "title": "Descending units",
+ "description": "Units are numbered top-to-bottom"
+ },
+ "outer_width": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (width)"
+ },
+ "outer_height": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (height)"
+ },
+ "outer_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (depth)"
+ },
+ "outer_unit": {
+ "enum": [
+ "mm",
+ "in",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `mm` - Millimeters\n* `in` - Inches",
+ "x-spec-enum-id": "86a846b6c40f495e",
+ "nullable": true
+ },
+ "mounting_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum depth of a mounted device, in millimeters. For four-post racks, this is the distance between the front and rear rails."
+ },
+ "airflow": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ ""
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front",
+ "x-spec-enum-id": "a784734d07ef1b3c"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "site"
+ ]
+ },
+ "RackReservation": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "rack": {
+ "$ref": "#/components/schemas/BriefRack"
+ },
+ "units": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ }
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "pending",
+ "active",
+ "stale"
+ ],
+ "type": "string",
+ "description": "* `pending` - Pending\n* `active` - Active\n* `stale` - Stale",
+ "x-spec-enum-id": "b62013475549e423"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Pending",
+ "Active",
+ "Stale"
+ ]
+ }
+ }
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "user": {
+ "$ref": "#/components/schemas/BriefUser"
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "created",
+ "description",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "rack",
+ "units",
+ "url",
+ "user"
+ ]
+ },
+ "RackReservationRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "rack": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefRackRequest"
+ }
+ ]
+ },
+ "units": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ }
+ },
+ "status": {
+ "enum": [
+ "pending",
+ "active",
+ "stale"
+ ],
+ "type": "string",
+ "description": "* `pending` - Pending\n* `active` - Active\n* `stale` - Stale",
+ "x-spec-enum-id": "b62013475549e423"
+ },
+ "user": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefUserRequest"
+ }
+ ]
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "description",
+ "rack",
+ "units",
+ "user"
+ ]
+ },
+ "RackRole": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "rack_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "rack_count",
+ "slug",
+ "url"
+ ]
+ },
+ "RackRoleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "color": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "RackType": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "manufacturer": {
+ "$ref": "#/components/schemas/BriefManufacturer"
+ },
+ "model": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "form_factor": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "2-post-frame",
+ "4-post-frame",
+ "4-post-cabinet",
+ "wall-frame",
+ "wall-frame-vertical",
+ "wall-cabinet",
+ "wall-cabinet-vertical",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `2-post-frame` - 2-post frame\n* `4-post-frame` - 4-post frame\n* `4-post-cabinet` - 4-post cabinet\n* `wall-frame` - Wall-mounted frame\n* `wall-frame-vertical` - Wall-mounted frame (vertical)\n* `wall-cabinet` - Wall-mounted cabinet\n* `wall-cabinet-vertical` - Wall-mounted cabinet (vertical)",
+ "x-spec-enum-id": "e32aaa89a223f2ea"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "2-post frame",
+ "4-post frame",
+ "4-post cabinet",
+ "Wall-mounted frame",
+ "Wall-mounted frame (vertical)",
+ "Wall-mounted cabinet",
+ "Wall-mounted cabinet (vertical)"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "width": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ 10,
+ 19,
+ 21,
+ 23
+ ],
+ "type": "integer",
+ "description": "* `10` - 10 inches\n* `19` - 19 inches\n* `21` - 21 inches\n* `23` - 23 inches",
+ "x-spec-enum-id": "9b322795f297a9c3"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "10 inches",
+ "19 inches",
+ "21 inches",
+ "23 inches"
+ ]
+ }
+ }
+ },
+ "u_height": {
+ "type": "integer",
+ "maximum": 100,
+ "minimum": 1,
+ "title": "Height (U)",
+ "description": "Height in rack units"
+ },
+ "starting_unit": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 1,
+ "description": "Starting unit for rack"
+ },
+ "desc_units": {
+ "type": "boolean",
+ "title": "Descending units",
+ "description": "Units are numbered top-to-bottom"
+ },
+ "outer_width": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (width)"
+ },
+ "outer_height": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (height)"
+ },
+ "outer_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (depth)"
+ },
+ "outer_unit": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "mm",
+ "in",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `mm` - Millimeters\n* `in` - Inches",
+ "x-spec-enum-id": "86a846b6c40f495e"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Millimeters",
+ "Inches"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "max_weight": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum load capacity for the rack"
+ },
+ "weight_unit": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Kilograms",
+ "Grams",
+ "Pounds",
+ "Ounces"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "mounting_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum depth of a mounted device, in millimeters. For four-post racks, this is the distance between the front and rear rails."
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "manufacturer",
+ "model",
+ "slug",
+ "url"
+ ]
+ },
+ "RackTypeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "form_factor": {
+ "enum": [
+ "2-post-frame",
+ "4-post-frame",
+ "4-post-cabinet",
+ "wall-frame",
+ "wall-frame-vertical",
+ "wall-cabinet",
+ "wall-cabinet-vertical",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `2-post-frame` - 2-post frame\n* `4-post-frame` - 4-post frame\n* `4-post-cabinet` - 4-post cabinet\n* `wall-frame` - Wall-mounted frame\n* `wall-frame-vertical` - Wall-mounted frame (vertical)\n* `wall-cabinet` - Wall-mounted cabinet\n* `wall-cabinet-vertical` - Wall-mounted cabinet (vertical)",
+ "x-spec-enum-id": "e32aaa89a223f2ea",
+ "nullable": true
+ },
+ "width": {
+ "enum": [
+ 10,
+ 19,
+ 21,
+ 23
+ ],
+ "type": "integer",
+ "description": "* `10` - 10 inches\n* `19` - 19 inches\n* `21` - 21 inches\n* `23` - 23 inches",
+ "x-spec-enum-id": "9b322795f297a9c3"
+ },
+ "u_height": {
+ "type": "integer",
+ "maximum": 100,
+ "minimum": 1,
+ "title": "Height (U)",
+ "description": "Height in rack units"
+ },
+ "starting_unit": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 1,
+ "description": "Starting unit for rack"
+ },
+ "desc_units": {
+ "type": "boolean",
+ "title": "Descending units",
+ "description": "Units are numbered top-to-bottom"
+ },
+ "outer_width": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (width)"
+ },
+ "outer_height": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (height)"
+ },
+ "outer_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (depth)"
+ },
+ "outer_unit": {
+ "enum": [
+ "mm",
+ "in",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `mm` - Millimeters\n* `in` - Inches",
+ "x-spec-enum-id": "86a846b6c40f495e",
+ "nullable": true
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "max_weight": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum load capacity for the rack"
+ },
+ "weight_unit": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884",
+ "nullable": true
+ },
+ "mounting_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum depth of a mounted device, in millimeters. For four-post racks, this is the distance between the front and rear rails."
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "manufacturer",
+ "model",
+ "slug"
+ ]
+ },
+ "RackUnit": {
+ "type": "object",
+ "description": "A rack unit is an abstraction formed by the set (rack, position, face); it does not exist as a row in the database.",
+ "properties": {
+ "id": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": -1000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "readOnly": true
+ },
+ "face": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "front",
+ "rear"
+ ],
+ "type": "string",
+ "description": "* `front` - Front\n* `rear` - Rear",
+ "x-spec-enum-id": "d2fb9b3f75158b83"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Front",
+ "Rear"
+ ]
+ }
+ },
+ "readOnly": true
+ },
+ "device": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDevice"
+ }
+ ],
+ "readOnly": true
+ },
+ "occupied": {
+ "type": "boolean",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "device",
+ "display",
+ "face",
+ "id",
+ "name",
+ "occupied"
+ ]
+ },
+ "RearPort": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device": {
+ "$ref": "#/components/schemas/BriefDevice"
+ },
+ "module": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModule"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "8P8C",
+ "8P6C",
+ "8P4C",
+ "8P2C",
+ "6P6C",
+ "6P4C",
+ "6P2C",
+ "4P4C",
+ "4P2C",
+ "GG45",
+ "TERA 4P",
+ "TERA 2P",
+ "TERA 1P",
+ "110 Punch",
+ "BNC",
+ "F Connector",
+ "N Connector",
+ "MRJ21",
+ "FC",
+ "FC/PC",
+ "FC/UPC",
+ "FC/APC",
+ "LC",
+ "LC/PC",
+ "LC/UPC",
+ "LC/APC",
+ "LSH",
+ "LSH/PC",
+ "LSH/UPC",
+ "LSH/APC",
+ "LX.5",
+ "LX.5/PC",
+ "LX.5/UPC",
+ "LX.5/APC",
+ "MPO",
+ "MTRJ",
+ "SC",
+ "SC/PC",
+ "SC/UPC",
+ "SC/APC",
+ "ST",
+ "CS",
+ "SN",
+ "SMA 905",
+ "SMA 906",
+ "URM-P2",
+ "URM-P4",
+ "URM-P8",
+ "Splice",
+ "USB Type A",
+ "USB Type B",
+ "USB Type C",
+ "USB Mini A",
+ "USB Mini B",
+ "USB Micro A",
+ "USB Micro B",
+ "USB Micro AB",
+ "Other"
+ ]
+ }
+ }
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "positions": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1,
+ "description": "Number of front ports which may be mapped"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "cable": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefCable"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "cable_end": {
+ "type": "string",
+ "readOnly": true
+ },
+ "link_peers": {
+ "type": "array",
+ "items": {},
+ "readOnly": true
+ },
+ "link_peers_type": {
+ "type": "string",
+ "description": "Return the type of the peer link terminations, or None.",
+ "readOnly": true,
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "_occupied": {
+ "type": "boolean",
+ "readOnly": true,
+ "title": " occupied"
+ }
+ },
+ "required": [
+ "_occupied",
+ "cable",
+ "cable_end",
+ "created",
+ "device",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "link_peers",
+ "link_peers_type",
+ "name",
+ "type",
+ "url"
+ ]
+ },
+ "RearPortRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "positions": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1,
+ "description": "Number of front ports which may be mapped"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name",
+ "type"
+ ]
+ },
+ "RearPortTemplate": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "device_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceType"
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleType"
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "8P8C",
+ "8P6C",
+ "8P4C",
+ "8P2C",
+ "6P6C",
+ "6P4C",
+ "6P2C",
+ "4P4C",
+ "4P2C",
+ "GG45",
+ "TERA 4P",
+ "TERA 2P",
+ "TERA 1P",
+ "110 Punch",
+ "BNC",
+ "F Connector",
+ "N Connector",
+ "MRJ21",
+ "FC",
+ "FC/PC",
+ "FC/UPC",
+ "FC/APC",
+ "LC",
+ "LC/PC",
+ "LC/UPC",
+ "LC/APC",
+ "LSH",
+ "LSH/PC",
+ "LSH/UPC",
+ "LSH/APC",
+ "LX.5",
+ "LX.5/PC",
+ "LX.5/UPC",
+ "LX.5/APC",
+ "MPO",
+ "MTRJ",
+ "SC",
+ "SC/PC",
+ "SC/UPC",
+ "SC/APC",
+ "ST",
+ "CS",
+ "SN",
+ "SMA 905",
+ "SMA 906",
+ "URM-P2",
+ "URM-P4",
+ "URM-P8",
+ "Splice",
+ "USB Type A",
+ "USB Type B",
+ "USB Type C",
+ "USB Mini A",
+ "USB Mini B",
+ "USB Micro A",
+ "USB Micro B",
+ "USB Micro AB",
+ "Other"
+ ]
+ }
+ }
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "positions": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "id",
+ "last_updated",
+ "name",
+ "type",
+ "url"
+ ]
+ },
+ "RearPortTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "positions": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name",
+ "type"
+ ]
+ },
+ "Region": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedRegion"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "site_count": {
+ "type": "integer",
+ "readOnly": true,
+ "default": 0
+ },
+ "prefix_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "prefix_count",
+ "site_count",
+ "slug",
+ "url"
+ ]
+ },
+ "RegionRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedRegionRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "Role": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "prefix_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "vlan_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "prefix_count",
+ "slug",
+ "url",
+ "vlan_count"
+ ]
+ },
+ "RoleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "RouteTarget": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "description": "Route target value (formatted in accordance with RFC 4360)",
+ "maxLength": 21
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "url"
+ ]
+ },
+ "RouteTargetRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Route target value (formatted in accordance with RFC 4360)",
+ "maxLength": 21
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "SavedFilter": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "user": {
+ "type": "integer",
+ "nullable": true
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "shared": {
+ "type": "boolean"
+ },
+ "parameters": {},
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "object_types",
+ "parameters",
+ "slug",
+ "url"
+ ]
+ },
+ "SavedFilterRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "user": {
+ "type": "integer",
+ "nullable": true
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "shared": {
+ "type": "boolean"
+ },
+ "parameters": {}
+ },
+ "required": [
+ "name",
+ "object_types",
+ "parameters",
+ "slug"
+ ]
+ },
+ "Script": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "module": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "readOnly": true
+ },
+ "description": {
+ "type": "string",
+ "nullable": true,
+ "readOnly": true
+ },
+ "vars": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "result": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefJob"
+ }
+ ],
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "is_executable": {
+ "type": "boolean",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "description",
+ "display",
+ "display_url",
+ "id",
+ "is_executable",
+ "module",
+ "name",
+ "result",
+ "url",
+ "vars"
+ ]
+ },
+ "ScriptInputRequest": {
+ "type": "object",
+ "properties": {
+ "data": {},
+ "commit": {
+ "type": "boolean"
+ },
+ "schedule_at": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "interval": {
+ "type": "integer",
+ "nullable": true
+ }
+ },
+ "required": [
+ "commit",
+ "data"
+ ]
+ },
+ "Service": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "parent_object_type": {
+ "type": "string"
+ },
+ "parent_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "parent": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "protocol": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "tcp",
+ "udp",
+ "sctp"
+ ],
+ "type": "string",
+ "description": "* `tcp` - TCP\n* `udp` - UDP\n* `sctp` - SCTP",
+ "x-spec-enum-id": "5521e084b1ad51de"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "TCP",
+ "UDP",
+ "SCTP"
+ ]
+ }
+ }
+ },
+ "ports": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 1
+ },
+ "title": "Port numbers"
+ },
+ "ipaddresses": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/IPAddress"
+ }
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "parent",
+ "parent_object_id",
+ "parent_object_type",
+ "ports",
+ "url"
+ ]
+ },
+ "ServiceRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "parent_object_type": {
+ "type": "string"
+ },
+ "parent_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "protocol": {
+ "enum": [
+ "tcp",
+ "udp",
+ "sctp"
+ ],
+ "type": "string",
+ "description": "* `tcp` - TCP\n* `udp` - UDP\n* `sctp` - SCTP",
+ "x-spec-enum-id": "5521e084b1ad51de"
+ },
+ "ports": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 1
+ },
+ "title": "Port numbers"
+ },
+ "ipaddresses": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "parent_object_id",
+ "parent_object_type",
+ "ports"
+ ]
+ },
+ "ServiceTemplate": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "protocol": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "tcp",
+ "udp",
+ "sctp"
+ ],
+ "type": "string",
+ "description": "* `tcp` - TCP\n* `udp` - UDP\n* `sctp` - SCTP",
+ "x-spec-enum-id": "5521e084b1ad51de"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "TCP",
+ "UDP",
+ "SCTP"
+ ]
+ }
+ }
+ },
+ "ports": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 1
+ },
+ "title": "Port numbers"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "ports",
+ "url"
+ ]
+ },
+ "ServiceTemplateRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "protocol": {
+ "enum": [
+ "tcp",
+ "udp",
+ "sctp"
+ ],
+ "type": "string",
+ "description": "* `tcp` - TCP\n* `udp` - UDP\n* `sctp` - SCTP",
+ "x-spec-enum-id": "5521e084b1ad51de"
+ },
+ "ports": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 1
+ },
+ "title": "Port numbers"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "ports"
+ ]
+ },
+ "Site": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "description": "Full name of the site",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "planned",
+ "staging",
+ "active",
+ "decommissioning",
+ "retired"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `staging` - Staging\n* `active` - Active\n* `decommissioning` - Decommissioning\n* `retired` - Retired",
+ "x-spec-enum-id": "e363a8ddb138be50"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Planned",
+ "Staging",
+ "Active",
+ "Decommissioning",
+ "Retired"
+ ]
+ }
+ }
+ },
+ "region": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRegion"
+ }
+ ],
+ "nullable": true
+ },
+ "group": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefSiteGroup"
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "facility": {
+ "type": "string",
+ "description": "Local facility ID or description",
+ "maxLength": 50
+ },
+ "time_zone": {
+ "type": "string",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "physical_address": {
+ "type": "string",
+ "description": "Physical location of the building",
+ "maxLength": 200
+ },
+ "shipping_address": {
+ "type": "string",
+ "description": "If different from the physical address",
+ "maxLength": 200
+ },
+ "latitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 100,
+ "minimum": -100,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "longitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": -1000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "asns": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ASN"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "circuit_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "device_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "prefix_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "rack_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "virtualmachine_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "vlan_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "circuit_count",
+ "created",
+ "device_count",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "prefix_count",
+ "rack_count",
+ "slug",
+ "url",
+ "virtualmachine_count",
+ "vlan_count"
+ ]
+ },
+ "SiteGroup": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedSiteGroup"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "site_count": {
+ "type": "integer",
+ "readOnly": true,
+ "default": 0
+ },
+ "prefix_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "prefix_count",
+ "site_count",
+ "slug",
+ "url"
+ ]
+ },
+ "SiteGroupRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedSiteGroupRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "SiteRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Full name of the site",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "staging",
+ "active",
+ "decommissioning",
+ "retired"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `staging` - Staging\n* `active` - Active\n* `decommissioning` - Decommissioning\n* `retired` - Retired",
+ "x-spec-enum-id": "e363a8ddb138be50"
+ },
+ "region": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRegionRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefSiteGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "facility": {
+ "type": "string",
+ "description": "Local facility ID or description",
+ "maxLength": 50
+ },
+ "time_zone": {
+ "type": "string",
+ "nullable": true,
+ "minLength": 1
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "physical_address": {
+ "type": "string",
+ "description": "Physical location of the building",
+ "maxLength": 200
+ },
+ "shipping_address": {
+ "type": "string",
+ "description": "If different from the physical address",
+ "maxLength": 200
+ },
+ "latitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 100,
+ "minimum": -100,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "longitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": -1000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "asns": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "Subscription": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "object": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "user": {
+ "$ref": "#/components/schemas/BriefUser"
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "id",
+ "object",
+ "object_id",
+ "object_type",
+ "url",
+ "user"
+ ]
+ },
+ "SubscriptionRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "user": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefUserRequest"
+ }
+ ]
+ }
+ },
+ "required": [
+ "object_id",
+ "object_type",
+ "user"
+ ]
+ },
+ "TableConfig": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "object_type": {
+ "type": "string"
+ },
+ "table": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "user": {
+ "type": "integer",
+ "nullable": true
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "shared": {
+ "type": "boolean"
+ },
+ "columns": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 100
+ }
+ },
+ "ordering": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "nullable": true
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "columns",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "object_type",
+ "table",
+ "url"
+ ]
+ },
+ "TableConfigRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_type": {
+ "type": "string"
+ },
+ "table": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "user": {
+ "type": "integer",
+ "nullable": true
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "shared": {
+ "type": "boolean"
+ },
+ "columns": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ }
+ },
+ "ordering": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "nullable": true
+ }
+ },
+ "required": [
+ "columns",
+ "name",
+ "object_type",
+ "table"
+ ]
+ },
+ "Tag": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "pattern": "^[-\\w]+$",
+ "maxLength": 100
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "tagged_items": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "slug",
+ "tagged_items",
+ "url"
+ ]
+ },
+ "TagRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[-\\w]+$",
+ "maxLength": 100
+ },
+ "color": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ },
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "TaggedItem": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "object_type": {
+ "type": "string",
+ "readOnly": true
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": -2147483648
+ },
+ "object": {
+ "readOnly": true
+ },
+ "tag": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTag"
+ }
+ ],
+ "readOnly": true
+ }
+ },
+ "required": [
+ "display",
+ "id",
+ "object",
+ "object_id",
+ "object_type",
+ "tag",
+ "url"
+ ]
+ },
+ "Tenant": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "group": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantGroup"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "circuit_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "device_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "ipaddress_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "prefix_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "rack_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "site_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "virtualmachine_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "vlan_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "vrf_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "cluster_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "circuit_count",
+ "cluster_count",
+ "created",
+ "device_count",
+ "display",
+ "display_url",
+ "id",
+ "ipaddress_count",
+ "last_updated",
+ "name",
+ "prefix_count",
+ "rack_count",
+ "site_count",
+ "slug",
+ "url",
+ "virtualmachine_count",
+ "vlan_count",
+ "vrf_count"
+ ]
+ },
+ "TenantGroup": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedTenantGroup"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "tenant_count": {
+ "type": "integer",
+ "readOnly": true,
+ "default": 0
+ },
+ "comments": {
+ "type": "string"
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "slug",
+ "tenant_count",
+ "url"
+ ]
+ },
+ "TenantGroupRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedTenantGroupRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "TenantRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "Token": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "user": {
+ "$ref": "#/components/schemas/BriefUser"
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true
+ },
+ "expires": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "last_used": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "write_enabled": {
+ "type": "boolean",
+ "description": "Permit create/update/delete operations using this key"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "url",
+ "user"
+ ]
+ },
+ "TokenProvision": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "user": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefUser"
+ }
+ ],
+ "readOnly": true
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true
+ },
+ "expires": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "last_used": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true
+ },
+ "key": {
+ "type": "string",
+ "readOnly": true
+ },
+ "write_enabled": {
+ "type": "boolean",
+ "description": "Permit create/update/delete operations using this key"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "key",
+ "last_used",
+ "url",
+ "user"
+ ]
+ },
+ "TokenProvisionRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "expires": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "write_enabled": {
+ "type": "boolean",
+ "description": "Permit create/update/delete operations using this key"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "username": {
+ "type": "string",
+ "writeOnly": true,
+ "minLength": 1
+ },
+ "password": {
+ "type": "string",
+ "writeOnly": true,
+ "minLength": 1
+ }
+ },
+ "required": [
+ "password",
+ "username"
+ ]
+ },
+ "TokenRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "user": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefUserRequest"
+ }
+ ]
+ },
+ "expires": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "last_used": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "key": {
+ "type": "string",
+ "writeOnly": true,
+ "maxLength": 40,
+ "minLength": 40
+ },
+ "write_enabled": {
+ "type": "boolean",
+ "description": "Permit create/update/delete operations using this key"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "user"
+ ]
+ },
+ "Tunnel": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "planned",
+ "active",
+ "disabled"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `active` - Active\n* `disabled` - Disabled",
+ "x-spec-enum-id": "0d65f7912cba74aa"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Planned",
+ "Active",
+ "Disabled"
+ ]
+ }
+ }
+ },
+ "group": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTunnelGroup"
+ }
+ ],
+ "nullable": true
+ },
+ "encapsulation": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "ipsec-transport",
+ "ipsec-tunnel",
+ "ip-ip",
+ "gre",
+ "wireguard",
+ "openvpn",
+ "l2tp",
+ "pptp"
+ ],
+ "type": "string",
+ "description": "* `ipsec-transport` - IPsec - Transport\n* `ipsec-tunnel` - IPsec - Tunnel\n* `ip-ip` - IP-in-IP\n* `gre` - GRE\n* `wireguard` - WireGuard\n* `openvpn` - OpenVPN\n* `l2tp` - L2TP\n* `pptp` - PPTP",
+ "x-spec-enum-id": "54a2e45824009c49"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "IPsec - Transport",
+ "IPsec - Tunnel",
+ "IP-in-IP",
+ "GRE",
+ "WireGuard",
+ "OpenVPN",
+ "L2TP",
+ "PPTP"
+ ]
+ }
+ }
+ },
+ "ipsec_profile": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPSecProfile"
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "tunnel_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "terminations_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "encapsulation",
+ "id",
+ "last_updated",
+ "name",
+ "status",
+ "terminations_count",
+ "url"
+ ]
+ },
+ "TunnelGroup": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "tunnel_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "slug",
+ "tunnel_count",
+ "url"
+ ]
+ },
+ "TunnelGroupRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "TunnelRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "active",
+ "disabled"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `active` - Active\n* `disabled` - Disabled",
+ "x-spec-enum-id": "0d65f7912cba74aa"
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTunnelGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "encapsulation": {
+ "enum": [
+ "ipsec-transport",
+ "ipsec-tunnel",
+ "ip-ip",
+ "gre",
+ "wireguard",
+ "openvpn",
+ "l2tp",
+ "pptp"
+ ],
+ "type": "string",
+ "description": "* `ipsec-transport` - IPsec - Transport\n* `ipsec-tunnel` - IPsec - Tunnel\n* `ip-ip` - IP-in-IP\n* `gre` - GRE\n* `wireguard` - WireGuard\n* `openvpn` - OpenVPN\n* `l2tp` - L2TP\n* `pptp` - PPTP",
+ "x-spec-enum-id": "54a2e45824009c49"
+ },
+ "ipsec_profile": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPSecProfileRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tunnel_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "encapsulation",
+ "name",
+ "status"
+ ]
+ },
+ "TunnelTermination": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "tunnel": {
+ "$ref": "#/components/schemas/BriefTunnel"
+ },
+ "role": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "peer",
+ "hub",
+ "spoke"
+ ],
+ "type": "string",
+ "description": "* `peer` - Peer\n* `hub` - Hub\n* `spoke` - Spoke",
+ "x-spec-enum-id": "52225cd60b867572"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Peer",
+ "Hub",
+ "Spoke"
+ ]
+ }
+ }
+ },
+ "termination_type": {
+ "type": "string"
+ },
+ "termination_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "termination": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "outside_ip": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "role",
+ "termination",
+ "termination_type",
+ "tunnel",
+ "url"
+ ]
+ },
+ "TunnelTerminationRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "tunnel": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefTunnelRequest"
+ }
+ ]
+ },
+ "role": {
+ "enum": [
+ "peer",
+ "hub",
+ "spoke"
+ ],
+ "type": "string",
+ "description": "* `peer` - Peer\n* `hub` - Hub\n* `spoke` - Spoke",
+ "x-spec-enum-id": "52225cd60b867572"
+ },
+ "termination_type": {
+ "type": "string"
+ },
+ "termination_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "outside_ip": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "role",
+ "termination_type",
+ "tunnel"
+ ]
+ },
+ "User": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "username": {
+ "type": "string",
+ "description": "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
+ "pattern": "^[\\w.@+-]+$",
+ "maxLength": 150
+ },
+ "first_name": {
+ "type": "string",
+ "maxLength": 150
+ },
+ "last_name": {
+ "type": "string",
+ "maxLength": 150
+ },
+ "email": {
+ "type": "string",
+ "format": "email",
+ "title": "Email address",
+ "maxLength": 254
+ },
+ "is_staff": {
+ "type": "boolean",
+ "title": "Staff status",
+ "description": "Designates whether the user can log into this admin site."
+ },
+ "is_active": {
+ "type": "boolean",
+ "title": "Active",
+ "description": "Designates whether this user should be treated as active. Unselect this instead of deleting accounts."
+ },
+ "date_joined": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "last_login": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "groups": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/Group"
+ }
+ },
+ "permissions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/ObjectPermission"
+ }
+ }
+ },
+ "required": [
+ "display",
+ "display_url",
+ "id",
+ "url",
+ "username"
+ ]
+ },
+ "UserRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "username": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
+ "pattern": "^[\\w.@+-]+$",
+ "maxLength": 150
+ },
+ "password": {
+ "type": "string",
+ "writeOnly": true,
+ "minLength": 1,
+ "maxLength": 128
+ },
+ "first_name": {
+ "type": "string",
+ "maxLength": 150
+ },
+ "last_name": {
+ "type": "string",
+ "maxLength": 150
+ },
+ "email": {
+ "type": "string",
+ "format": "email",
+ "title": "Email address",
+ "maxLength": 254
+ },
+ "is_staff": {
+ "type": "boolean",
+ "title": "Staff status",
+ "description": "Designates whether the user can log into this admin site."
+ },
+ "is_active": {
+ "type": "boolean",
+ "title": "Active",
+ "description": "Designates whether this user should be treated as active. Unselect this instead of deleting accounts."
+ },
+ "date_joined": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "last_login": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ },
+ "groups": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "permissions": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ },
+ "required": [
+ "password",
+ "username"
+ ]
+ },
+ "VLAN": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "site": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefSite"
+ }
+ ],
+ "nullable": true
+ },
+ "group": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANGroup"
+ }
+ ],
+ "nullable": true
+ },
+ "vid": {
+ "type": "integer",
+ "maximum": 4094,
+ "minimum": 1,
+ "title": "VLAN ID",
+ "description": "Numeric VLAN ID (1-4094)"
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "active",
+ "reserved",
+ "deprecated"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated",
+ "x-spec-enum-id": "6388dfb94ca1cc15"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Active",
+ "Reserved",
+ "Deprecated"
+ ]
+ }
+ }
+ },
+ "role": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRole"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "qinq_role": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "svlan",
+ "cvlan",
+ null
+ ],
+ "type": "string",
+ "description": "* `svlan` - Service\n* `cvlan` - Customer",
+ "x-spec-enum-id": "d2510f2d3e3d3fb1"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Service",
+ "Customer"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "qinq_svlan": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedVLAN"
+ }
+ ],
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "l2vpn_termination": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefL2VPNTermination"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "prefix_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "l2vpn_termination",
+ "last_updated",
+ "name",
+ "prefix_count",
+ "url",
+ "vid"
+ ]
+ },
+ "VLANGroup": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "scope_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "scope_id": {
+ "type": "integer",
+ "nullable": true
+ },
+ "scope": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "vid_ranges": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/IntegerRange"
+ }
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "vlan_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "utilization": {
+ "type": "string",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "scope",
+ "slug",
+ "url",
+ "utilization",
+ "vlan_count"
+ ]
+ },
+ "VLANGroupRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "scope_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "scope_id": {
+ "type": "integer",
+ "nullable": true
+ },
+ "vid_ranges": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/IntegerRangeRequest"
+ }
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "VLANRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vid": {
+ "type": "integer",
+ "maximum": 4094,
+ "minimum": 1,
+ "title": "VLAN ID",
+ "description": "Numeric VLAN ID (1-4094)"
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "active",
+ "reserved",
+ "deprecated"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated",
+ "x-spec-enum-id": "6388dfb94ca1cc15"
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "qinq_role": {
+ "enum": [
+ "svlan",
+ "cvlan",
+ null
+ ],
+ "type": "string",
+ "description": "* `svlan` - Service\n* `cvlan` - Customer",
+ "x-spec-enum-id": "d2510f2d3e3d3fb1",
+ "nullable": true
+ },
+ "qinq_svlan": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedVLANRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "vid"
+ ]
+ },
+ "VLANTranslationPolicy": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "rules": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VLANTranslationRule"
+ },
+ "readOnly": true
+ }
+ },
+ "required": [
+ "display",
+ "id",
+ "name",
+ "rules",
+ "url"
+ ]
+ },
+ "VLANTranslationPolicyRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "VLANTranslationRule": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "policy": {
+ "type": "integer"
+ },
+ "local_vid": {
+ "type": "integer",
+ "maximum": 4094,
+ "minimum": 1,
+ "title": "Local VLAN ID",
+ "description": "Numeric VLAN ID (1-4094)"
+ },
+ "remote_vid": {
+ "type": "integer",
+ "maximum": 4094,
+ "minimum": 1,
+ "title": "Remote VLAN ID",
+ "description": "Numeric VLAN ID (1-4094)"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "display",
+ "id",
+ "local_vid",
+ "policy",
+ "remote_vid",
+ "url"
+ ]
+ },
+ "VLANTranslationRuleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "policy": {
+ "type": "integer"
+ },
+ "local_vid": {
+ "type": "integer",
+ "maximum": 4094,
+ "minimum": 1,
+ "title": "Local VLAN ID",
+ "description": "Numeric VLAN ID (1-4094)"
+ },
+ "remote_vid": {
+ "type": "integer",
+ "maximum": 4094,
+ "minimum": 1,
+ "title": "Remote VLAN ID",
+ "description": "Numeric VLAN ID (1-4094)"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "local_vid",
+ "policy",
+ "remote_vid"
+ ]
+ },
+ "VMInterface": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "virtual_machine": {
+ "$ref": "#/components/schemas/BriefVirtualMachine"
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedVMInterface"
+ }
+ ],
+ "nullable": true
+ },
+ "bridge": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedVMInterface"
+ }
+ ],
+ "nullable": true
+ },
+ "mtu": {
+ "type": "integer",
+ "maximum": 65536,
+ "minimum": 1,
+ "nullable": true
+ },
+ "mac_address": {
+ "type": "string",
+ "readOnly": true,
+ "nullable": true
+ },
+ "primary_mac_address": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefMACAddress"
+ }
+ ],
+ "nullable": true
+ },
+ "mac_addresses": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/BriefMACAddress"
+ },
+ "readOnly": true,
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mode": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "access",
+ "tagged",
+ "tagged-all",
+ "q-in-q",
+ ""
+ ],
+ "type": "string",
+ "description": "* `access` - Access\n* `tagged` - Tagged\n* `tagged-all` - Tagged (All)\n* `q-in-q` - Q-in-Q (802.1ad)",
+ "x-spec-enum-id": "b6fe48fe21dbf01d"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Access",
+ "Tagged",
+ "Tagged (All)",
+ "Q-in-Q (802.1ad)"
+ ]
+ }
+ }
+ },
+ "untagged_vlan": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLAN"
+ }
+ ],
+ "nullable": true
+ },
+ "tagged_vlans": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/VLAN"
+ }
+ },
+ "qinq_svlan": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLAN"
+ }
+ ],
+ "nullable": true
+ },
+ "vlan_translation_policy": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANTranslationPolicy"
+ }
+ ],
+ "nullable": true
+ },
+ "vrf": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRF"
+ }
+ ],
+ "nullable": true
+ },
+ "l2vpn_termination": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefL2VPNTermination"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "count_ipaddresses": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "count_fhrp_groups": {
+ "type": "integer",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "count_fhrp_groups",
+ "count_ipaddresses",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "l2vpn_termination",
+ "last_updated",
+ "mac_address",
+ "mac_addresses",
+ "name",
+ "url",
+ "virtual_machine"
+ ]
+ },
+ "VMInterfaceRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "virtual_machine": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefVirtualMachineRequest"
+ }
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedVMInterfaceRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "bridge": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedVMInterfaceRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "mtu": {
+ "type": "integer",
+ "maximum": 65536,
+ "minimum": 1,
+ "nullable": true
+ },
+ "primary_mac_address": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefMACAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mode": {
+ "enum": [
+ "access",
+ "tagged",
+ "tagged-all",
+ "q-in-q",
+ ""
+ ],
+ "type": "string",
+ "description": "* `access` - Access\n* `tagged` - Tagged\n* `tagged-all` - Tagged (All)\n* `q-in-q` - Q-in-Q (802.1ad)",
+ "x-spec-enum-id": "b6fe48fe21dbf01d"
+ },
+ "untagged_vlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tagged_vlans": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "qinq_svlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vlan_translation_policy": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANTranslationPolicyRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vrf": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRFRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "virtual_machine"
+ ]
+ },
+ "VRF": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "rd": {
+ "type": "string",
+ "nullable": true,
+ "title": "Route distinguisher",
+ "description": "Unique route distinguisher (as defined in RFC 4364)",
+ "maxLength": 21
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "enforce_unique": {
+ "type": "boolean",
+ "title": "Enforce unique space",
+ "description": "Prevent duplicate prefixes/IP addresses within this VRF"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "import_targets": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RouteTarget"
+ }
+ },
+ "export_targets": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/RouteTarget"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "ipaddress_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ },
+ "prefix_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "ipaddress_count",
+ "last_updated",
+ "name",
+ "prefix_count",
+ "url"
+ ]
+ },
+ "VRFRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "rd": {
+ "type": "string",
+ "nullable": true,
+ "title": "Route distinguisher",
+ "description": "Unique route distinguisher (as defined in RFC 4364)",
+ "maxLength": 21
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "enforce_unique": {
+ "type": "boolean",
+ "title": "Enforce unique space",
+ "description": "Prevent duplicate prefixes/IP addresses within this VRF"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "import_targets": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "export_targets": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "VirtualChassis": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "domain": {
+ "type": "string",
+ "maxLength": 30
+ },
+ "master": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedDevice"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "member_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "members": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedDevice"
+ },
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "member_count",
+ "members",
+ "name",
+ "url"
+ ]
+ },
+ "VirtualChassisRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "domain": {
+ "type": "string",
+ "maxLength": 30
+ },
+ "master": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedDeviceRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "VirtualCircuit": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "cid": {
+ "type": "string",
+ "title": "Circuit ID",
+ "description": "Unique circuit ID",
+ "maxLength": 100
+ },
+ "provider_network": {
+ "$ref": "#/components/schemas/BriefProviderNetwork"
+ },
+ "provider_account": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefProviderAccount"
+ }
+ ],
+ "nullable": true
+ },
+ "type": {
+ "$ref": "#/components/schemas/BriefVirtualCircuitType"
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "planned",
+ "provisioning",
+ "active",
+ "offline",
+ "deprovisioning",
+ "decommissioned"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `provisioning` - Provisioning\n* `active` - Active\n* `offline` - Offline\n* `deprovisioning` - Deprovisioning\n* `decommissioned` - Decommissioned",
+ "x-spec-enum-id": "63c838134a022200"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Planned",
+ "Provisioning",
+ "Active",
+ "Offline",
+ "Deprovisioning",
+ "Decommissioned"
+ ]
+ }
+ }
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "cid",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "provider_network",
+ "type",
+ "url"
+ ]
+ },
+ "VirtualCircuitRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "cid": {
+ "type": "string",
+ "minLength": 1,
+ "title": "Circuit ID",
+ "description": "Unique circuit ID",
+ "maxLength": 100
+ },
+ "provider_network": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefProviderNetworkRequest"
+ }
+ ]
+ },
+ "provider_account": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefProviderAccountRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefVirtualCircuitTypeRequest"
+ }
+ ]
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "provisioning",
+ "active",
+ "offline",
+ "deprovisioning",
+ "decommissioned"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `provisioning` - Provisioning\n* `active` - Active\n* `offline` - Offline\n* `deprovisioning` - Deprovisioning\n* `decommissioned` - Decommissioned",
+ "x-spec-enum-id": "63c838134a022200"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "cid",
+ "provider_network",
+ "type"
+ ]
+ },
+ "VirtualCircuitTermination": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "virtual_circuit": {
+ "$ref": "#/components/schemas/BriefVirtualCircuit"
+ },
+ "role": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "peer",
+ "hub",
+ "spoke"
+ ],
+ "type": "string",
+ "description": "* `peer` - Peer\n* `hub` - Hub\n* `spoke` - Spoke",
+ "x-spec-enum-id": "52225cd60b867572"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Peer",
+ "Hub",
+ "Spoke"
+ ]
+ }
+ }
+ },
+ "interface": {
+ "$ref": "#/components/schemas/BriefInterface"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "interface",
+ "last_updated",
+ "url",
+ "virtual_circuit"
+ ]
+ },
+ "VirtualCircuitTerminationRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "virtual_circuit": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefVirtualCircuitRequest"
+ }
+ ]
+ },
+ "role": {
+ "enum": [
+ "peer",
+ "hub",
+ "spoke"
+ ],
+ "type": "string",
+ "description": "* `peer` - Peer\n* `hub` - Hub\n* `spoke` - Spoke",
+ "x-spec-enum-id": "52225cd60b867572"
+ },
+ "interface": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefInterfaceRequest"
+ }
+ ]
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "interface",
+ "virtual_circuit"
+ ]
+ },
+ "VirtualCircuitType": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "virtual_circuit_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "slug",
+ "url",
+ "virtual_circuit_count"
+ ]
+ },
+ "VirtualCircuitTypeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "VirtualDeviceContext": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "device": {
+ "$ref": "#/components/schemas/BriefDevice"
+ },
+ "identifier": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "primary_ip4": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip6": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "active",
+ "planned",
+ "offline"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `planned` - Planned\n* `offline` - Offline",
+ "x-spec-enum-id": "ee1ef02def7a91ab"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Active",
+ "Planned",
+ "Offline"
+ ]
+ }
+ }
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "interface_count": {
+ "type": "integer",
+ "format": "int64",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "created",
+ "device",
+ "display",
+ "display_url",
+ "id",
+ "interface_count",
+ "last_updated",
+ "name",
+ "primary_ip",
+ "status",
+ "url"
+ ]
+ },
+ "VirtualDeviceContextRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "identifier": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip4": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip6": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "active",
+ "planned",
+ "offline"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `planned` - Planned\n* `offline` - Offline",
+ "x-spec-enum-id": "ee1ef02def7a91ab"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name",
+ "status"
+ ]
+ },
+ "VirtualDisk": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "virtual_machine": {
+ "$ref": "#/components/schemas/BriefVirtualMachine"
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "size": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "title": "Size (MB)"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "size",
+ "url",
+ "virtual_machine"
+ ]
+ },
+ "VirtualDiskRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "virtual_machine": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefVirtualMachineRequest"
+ }
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "size": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "title": "Size (MB)"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "size",
+ "virtual_machine"
+ ]
+ },
+ "VirtualMachineWithConfigContext": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "decommissioning",
+ "paused"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `decommissioning` - Decommissioning\n* `paused` - Paused",
+ "x-spec-enum-id": "c649dc8de233760f"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Offline",
+ "Active",
+ "Planned",
+ "Staged",
+ "Failed",
+ "Decommissioning",
+ "Paused"
+ ]
+ }
+ }
+ },
+ "site": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefSite"
+ }
+ ],
+ "nullable": true
+ },
+ "cluster": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefCluster"
+ }
+ ],
+ "nullable": true
+ },
+ "device": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDevice"
+ }
+ ],
+ "nullable": true
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "role": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceRole"
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "platform": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPlatform"
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ }
+ ],
+ "readOnly": true,
+ "nullable": true
+ },
+ "primary_ip4": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip6": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddress"
+ }
+ ],
+ "nullable": true
+ },
+ "vcpus": {
+ "type": "number",
+ "format": "double",
+ "maximum": 10000,
+ "minimum": 0.01,
+ "exclusiveMaximum": true,
+ "nullable": true
+ },
+ "memory": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Memory (MB)"
+ },
+ "disk": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Disk (MB)"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "config_template": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplate"
+ }
+ ],
+ "nullable": true
+ },
+ "local_context_data": {
+ "nullable": true,
+ "description": "Local config context data takes precedence over source contexts in the final rendered config context"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "config_context": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "interface_count": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "virtual_disk_count": {
+ "type": "integer",
+ "readOnly": true
+ }
+ },
+ "required": [
+ "config_context",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "interface_count",
+ "last_updated",
+ "name",
+ "primary_ip",
+ "url",
+ "virtual_disk_count"
+ ]
+ },
+ "VirtualMachineWithConfigContextRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "status": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "decommissioning",
+ "paused"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `decommissioning` - Decommissioning\n* `paused` - Paused",
+ "x-spec-enum-id": "c649dc8de233760f"
+ },
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "cluster": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefClusterRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "platform": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPlatformRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip4": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip6": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vcpus": {
+ "type": "number",
+ "format": "double",
+ "maximum": 10000,
+ "minimum": 0.01,
+ "exclusiveMaximum": true,
+ "nullable": true
+ },
+ "memory": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Memory (MB)"
+ },
+ "disk": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Disk (MB)"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "config_template": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplateRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "local_context_data": {
+ "nullable": true,
+ "description": "Local config context data takes precedence over source contexts in the final rendered config context"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "Webhook": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 150
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "payload_url": {
+ "type": "string",
+ "title": "URL",
+ "description": "This URL will be called using the HTTP method defined when the webhook is called. Jinja2 template processing is supported with the same context as the request body.",
+ "maxLength": 500
+ },
+ "http_method": {
+ "enum": [
+ "GET",
+ "POST",
+ "PUT",
+ "PATCH",
+ "DELETE"
+ ],
+ "type": "string",
+ "description": "* `GET` - GET\n* `POST` - POST\n* `PUT` - PUT\n* `PATCH` - PATCH\n* `DELETE` - DELETE",
+ "x-spec-enum-id": "a12018571a034921"
+ },
+ "http_content_type": {
+ "type": "string",
+ "description": "The complete list of official content types is available here.",
+ "maxLength": 100
+ },
+ "additional_headers": {
+ "type": "string",
+ "description": "User-supplied HTTP headers to be sent with the request in addition to the HTTP content type. Headers should be defined in the format Name: Value. Jinja2 template processing is supported with the same context as the request body (below)."
+ },
+ "body_template": {
+ "type": "string",
+ "description": "Jinja2 template for a custom request body. If blank, a JSON object representing the change will be included. Available context data includes: event, model, timestamp, username, request_id, and data."
+ },
+ "secret": {
+ "type": "string",
+ "description": "When provided, the request will include a X-Hook-Signature header containing a HMAC hex digest of the payload body using the secret as the key. The secret is not transmitted in the request.",
+ "maxLength": 255
+ },
+ "ssl_verification": {
+ "type": "boolean",
+ "description": "Enable SSL certificate verification. Disable with caution!"
+ },
+ "ca_file_path": {
+ "type": "string",
+ "nullable": true,
+ "description": "The specific CA certificate file to use for SSL verification. Leave blank to use the system defaults.",
+ "maxLength": 4096
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "payload_url",
+ "url"
+ ]
+ },
+ "WebhookRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 150
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "payload_url": {
+ "type": "string",
+ "minLength": 1,
+ "title": "URL",
+ "description": "This URL will be called using the HTTP method defined when the webhook is called. Jinja2 template processing is supported with the same context as the request body.",
+ "maxLength": 500
+ },
+ "http_method": {
+ "enum": [
+ "GET",
+ "POST",
+ "PUT",
+ "PATCH",
+ "DELETE"
+ ],
+ "type": "string",
+ "description": "* `GET` - GET\n* `POST` - POST\n* `PUT` - PUT\n* `PATCH` - PATCH\n* `DELETE` - DELETE",
+ "x-spec-enum-id": "a12018571a034921"
+ },
+ "http_content_type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The complete list of official content types is available here.",
+ "maxLength": 100
+ },
+ "additional_headers": {
+ "type": "string",
+ "description": "User-supplied HTTP headers to be sent with the request in addition to the HTTP content type. Headers should be defined in the format Name: Value. Jinja2 template processing is supported with the same context as the request body (below)."
+ },
+ "body_template": {
+ "type": "string",
+ "description": "Jinja2 template for a custom request body. If blank, a JSON object representing the change will be included. Available context data includes: event, model, timestamp, username, request_id, and data."
+ },
+ "secret": {
+ "type": "string",
+ "description": "When provided, the request will include a X-Hook-Signature header containing a HMAC hex digest of the payload body using the secret as the key. The secret is not transmitted in the request.",
+ "maxLength": 255
+ },
+ "ssl_verification": {
+ "type": "boolean",
+ "description": "Enable SSL certificate verification. Disable with caution!"
+ },
+ "ca_file_path": {
+ "type": "string",
+ "nullable": true,
+ "description": "The specific CA certificate file to use for SSL verification. Leave blank to use the system defaults.",
+ "maxLength": 4096
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ }
+ },
+ "required": [
+ "name",
+ "payload_url"
+ ]
+ },
+ "WirelessLAN": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "ssid": {
+ "type": "string",
+ "maxLength": 32
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "group": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefWirelessLANGroup"
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "active",
+ "reserved",
+ "disabled",
+ "deprecated",
+ ""
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `reserved` - Reserved\n* `disabled` - Disabled\n* `deprecated` - Deprecated",
+ "x-spec-enum-id": "412ebdca597f609e"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Active",
+ "Reserved",
+ "Disabled",
+ "Deprecated"
+ ]
+ }
+ }
+ },
+ "vlan": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLAN"
+ }
+ ],
+ "nullable": true
+ },
+ "scope_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "scope_id": {
+ "type": "integer",
+ "nullable": true
+ },
+ "scope": {
+ "nullable": true,
+ "readOnly": true
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "auth_type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "open",
+ "wep",
+ "wpa-personal",
+ "wpa-enterprise",
+ ""
+ ],
+ "type": "string",
+ "description": "* `open` - Open\n* `wep` - WEP\n* `wpa-personal` - WPA Personal (PSK)\n* `wpa-enterprise` - WPA Enterprise",
+ "x-spec-enum-id": "a2043acb899b3954"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Open",
+ "WEP",
+ "WPA Personal (PSK)",
+ "WPA Enterprise"
+ ]
+ }
+ }
+ },
+ "auth_cipher": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "auto",
+ "tkip",
+ "aes",
+ ""
+ ],
+ "type": "string",
+ "description": "* `auto` - Auto\n* `tkip` - TKIP\n* `aes` - AES",
+ "x-spec-enum-id": "8fdaefa727c26fdc"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Auto",
+ "TKIP",
+ "AES"
+ ]
+ }
+ }
+ },
+ "auth_psk": {
+ "type": "string",
+ "title": "Pre-shared key",
+ "maxLength": 64
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "scope",
+ "ssid",
+ "url"
+ ]
+ },
+ "WirelessLANGroup": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedWirelessLANGroup"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "wirelesslan_count": {
+ "type": "integer",
+ "readOnly": true,
+ "default": 0
+ },
+ "comments": {
+ "type": "string"
+ },
+ "_depth": {
+ "type": "integer",
+ "readOnly": true,
+ "title": " depth"
+ }
+ },
+ "required": [
+ "_depth",
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "last_updated",
+ "name",
+ "slug",
+ "url",
+ "wirelesslan_count"
+ ]
+ },
+ "WirelessLANGroupRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/NestedWirelessLANGroupRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "WirelessLANRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "ssid": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 32
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefWirelessLANGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "active",
+ "reserved",
+ "disabled",
+ "deprecated",
+ ""
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `reserved` - Reserved\n* `disabled` - Disabled\n* `deprecated` - Deprecated",
+ "x-spec-enum-id": "412ebdca597f609e"
+ },
+ "vlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "scope_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "scope_id": {
+ "type": "integer",
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "auth_type": {
+ "enum": [
+ "open",
+ "wep",
+ "wpa-personal",
+ "wpa-enterprise",
+ ""
+ ],
+ "type": "string",
+ "description": "* `open` - Open\n* `wep` - WEP\n* `wpa-personal` - WPA Personal (PSK)\n* `wpa-enterprise` - WPA Enterprise",
+ "x-spec-enum-id": "a2043acb899b3954"
+ },
+ "auth_cipher": {
+ "enum": [
+ "auto",
+ "tkip",
+ "aes",
+ ""
+ ],
+ "type": "string",
+ "description": "* `auto` - Auto\n* `tkip` - TKIP\n* `aes` - AES",
+ "x-spec-enum-id": "8fdaefa727c26fdc"
+ },
+ "auth_psk": {
+ "type": "string",
+ "title": "Pre-shared key",
+ "maxLength": 64
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "ssid"
+ ]
+ },
+ "WirelessLink": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "readOnly": true
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display_url": {
+ "type": "string",
+ "format": "uri",
+ "readOnly": true
+ },
+ "display": {
+ "type": "string",
+ "readOnly": true
+ },
+ "interface_a": {
+ "$ref": "#/components/schemas/BriefInterface"
+ },
+ "interface_b": {
+ "$ref": "#/components/schemas/BriefInterface"
+ },
+ "ssid": {
+ "type": "string",
+ "maxLength": 32
+ },
+ "status": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "connected",
+ "planned",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `connected` - Connected\n* `planned` - Planned\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "fbc2f302c08be50d"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Connected",
+ "Planned",
+ "Decommissioning"
+ ]
+ }
+ }
+ },
+ "tenant": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenant"
+ }
+ ],
+ "nullable": true
+ },
+ "auth_type": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "open",
+ "wep",
+ "wpa-personal",
+ "wpa-enterprise",
+ ""
+ ],
+ "type": "string",
+ "description": "* `open` - Open\n* `wep` - WEP\n* `wpa-personal` - WPA Personal (PSK)\n* `wpa-enterprise` - WPA Enterprise",
+ "x-spec-enum-id": "a2043acb899b3954"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Open",
+ "WEP",
+ "WPA Personal (PSK)",
+ "WPA Enterprise"
+ ]
+ }
+ }
+ },
+ "auth_cipher": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "auto",
+ "tkip",
+ "aes",
+ ""
+ ],
+ "type": "string",
+ "description": "* `auto` - Auto\n* `tkip` - TKIP\n* `aes` - AES",
+ "x-spec-enum-id": "8fdaefa727c26fdc"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Auto",
+ "TKIP",
+ "AES"
+ ]
+ }
+ }
+ },
+ "auth_psk": {
+ "type": "string",
+ "title": "Pre-shared key",
+ "maxLength": 64
+ },
+ "distance": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "distance_unit": {
+ "type": "object",
+ "properties": {
+ "value": {
+ "enum": [
+ "km",
+ "m",
+ "mi",
+ "ft",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `km` - Kilometers\n* `m` - Meters\n* `mi` - Miles\n* `ft` - Feet",
+ "x-spec-enum-id": "53542e7902f946af"
+ },
+ "label": {
+ "type": "string",
+ "enum": [
+ "Kilometers",
+ "Meters",
+ "Miles",
+ "Feet"
+ ]
+ }
+ },
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTag"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "created": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ },
+ "last_updated": {
+ "type": "string",
+ "format": "date-time",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "created",
+ "display",
+ "display_url",
+ "id",
+ "interface_a",
+ "interface_b",
+ "last_updated",
+ "url"
+ ]
+ },
+ "WirelessLinkRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "interface_a": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefInterfaceRequest"
+ }
+ ]
+ },
+ "interface_b": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefInterfaceRequest"
+ }
+ ]
+ },
+ "ssid": {
+ "type": "string",
+ "maxLength": 32
+ },
+ "status": {
+ "enum": [
+ "connected",
+ "planned",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `connected` - Connected\n* `planned` - Planned\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "fbc2f302c08be50d"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "auth_type": {
+ "enum": [
+ "open",
+ "wep",
+ "wpa-personal",
+ "wpa-enterprise",
+ ""
+ ],
+ "type": "string",
+ "description": "* `open` - Open\n* `wep` - WEP\n* `wpa-personal` - WPA Personal (PSK)\n* `wpa-enterprise` - WPA Enterprise",
+ "x-spec-enum-id": "a2043acb899b3954"
+ },
+ "auth_cipher": {
+ "enum": [
+ "auto",
+ "tkip",
+ "aes",
+ ""
+ ],
+ "type": "string",
+ "description": "* `auto` - Auto\n* `tkip` - TKIP\n* `aes` - AES",
+ "x-spec-enum-id": "8fdaefa727c26fdc"
+ },
+ "auth_psk": {
+ "type": "string",
+ "title": "Pre-shared key",
+ "maxLength": 64
+ },
+ "distance": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "distance_unit": {
+ "enum": [
+ "km",
+ "m",
+ "mi",
+ "ft",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `km` - Kilometers\n* `m` - Meters\n* `mi` - Miles\n* `ft` - Feet",
+ "x-spec-enum-id": "53542e7902f946af",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "interface_a",
+ "interface_b"
+ ]
+ },
+ "WritableAggregateRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "prefix": {
+ "type": "string",
+ "minLength": 1
+ },
+ "rir": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefRIRRequest"
+ }
+ ]
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "date_added": {
+ "type": "string",
+ "format": "date",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "prefix",
+ "rir"
+ ]
+ },
+ "WritableCableRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "type": {
+ "enum": [
+ "cat3",
+ "cat5",
+ "cat5e",
+ "cat6",
+ "cat6a",
+ "cat7",
+ "cat7a",
+ "cat8",
+ "dac-active",
+ "dac-passive",
+ "mrj21-trunk",
+ "coaxial",
+ "mmf",
+ "mmf-om1",
+ "mmf-om2",
+ "mmf-om3",
+ "mmf-om4",
+ "mmf-om5",
+ "smf",
+ "smf-os1",
+ "smf-os2",
+ "aoc",
+ "usb",
+ "power",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `cat3` - CAT3\n* `cat5` - CAT5\n* `cat5e` - CAT5e\n* `cat6` - CAT6\n* `cat6a` - CAT6a\n* `cat7` - CAT7\n* `cat7a` - CAT7a\n* `cat8` - CAT8\n* `dac-active` - Direct Attach Copper (Active)\n* `dac-passive` - Direct Attach Copper (Passive)\n* `mrj21-trunk` - MRJ21 Trunk\n* `coaxial` - Coaxial\n* `mmf` - Multimode Fiber\n* `mmf-om1` - Multimode Fiber (OM1)\n* `mmf-om2` - Multimode Fiber (OM2)\n* `mmf-om3` - Multimode Fiber (OM3)\n* `mmf-om4` - Multimode Fiber (OM4)\n* `mmf-om5` - Multimode Fiber (OM5)\n* `smf` - Singlemode Fiber\n* `smf-os1` - Singlemode Fiber (OS1)\n* `smf-os2` - Singlemode Fiber (OS2)\n* `aoc` - Active Optical Cabling (AOC)\n* `usb` - USB\n* `power` - Power",
+ "x-spec-enum-id": "7b11d524b2b1a7ef",
+ "nullable": true
+ },
+ "a_terminations": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/GenericObjectRequest"
+ }
+ },
+ "b_terminations": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/GenericObjectRequest"
+ }
+ },
+ "status": {
+ "enum": [
+ "connected",
+ "planned",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `connected` - Connected\n* `planned` - Planned\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "fbc2f302c08be50d"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "label": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "length": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "length_unit": {
+ "enum": [
+ "km",
+ "m",
+ "cm",
+ "mi",
+ "ft",
+ "in",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `km` - Kilometers\n* `m` - Meters\n* `cm` - Centimeters\n* `mi` - Miles\n* `ft` - Feet\n* `in` - Inches",
+ "x-spec-enum-id": "e64ce3a2c5997172",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ }
+ },
+ "WritableCircuitGroupAssignmentRequest": {
+ "type": "object",
+ "description": "Base serializer for group assignments under CircuitSerializer.",
+ "properties": {
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefCircuitGroupRequest"
+ }
+ ]
+ },
+ "member_type": {
+ "type": "string"
+ },
+ "member_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "priority": {
+ "enum": [
+ "primary",
+ "secondary",
+ "tertiary",
+ "inactive",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `primary` - Primary\n* `secondary` - Secondary\n* `tertiary` - Tertiary\n* `inactive` - Inactive",
+ "x-spec-enum-id": "ef3a31644cec7524",
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ }
+ },
+ "required": [
+ "group",
+ "member_id",
+ "member_type"
+ ]
+ },
+ "WritableCircuitRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "cid": {
+ "type": "string",
+ "minLength": 1,
+ "title": "Circuit ID",
+ "description": "Unique circuit ID",
+ "maxLength": 100
+ },
+ "provider": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefProviderRequest"
+ }
+ ]
+ },
+ "provider_account": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefProviderAccountRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefCircuitTypeRequest"
+ }
+ ]
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "provisioning",
+ "active",
+ "offline",
+ "deprovisioning",
+ "decommissioned"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `provisioning` - Provisioning\n* `active` - Active\n* `offline` - Offline\n* `deprovisioning` - Deprovisioning\n* `decommissioned` - Decommissioned",
+ "x-spec-enum-id": "63c838134a022200"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "install_date": {
+ "type": "string",
+ "format": "date",
+ "nullable": true,
+ "title": "Installed"
+ },
+ "termination_date": {
+ "type": "string",
+ "format": "date",
+ "nullable": true,
+ "title": "Terminates"
+ },
+ "commit_rate": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Commit rate (Kbps)",
+ "description": "Committed rate"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "distance": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "distance_unit": {
+ "enum": [
+ "km",
+ "m",
+ "mi",
+ "ft",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `km` - Kilometers\n* `m` - Meters\n* `mi` - Miles\n* `ft` - Feet",
+ "x-spec-enum-id": "53542e7902f946af",
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "assignments": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/BriefCircuitGroupAssignmentSerializer_Request"
+ }
+ }
+ },
+ "required": [
+ "cid",
+ "provider",
+ "type"
+ ]
+ },
+ "WritableClusterRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefClusterTypeRequest"
+ }
+ ]
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefClusterGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "staging",
+ "active",
+ "decommissioning",
+ "offline"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `staging` - Staging\n* `active` - Active\n* `decommissioning` - Decommissioning\n* `offline` - Offline",
+ "x-spec-enum-id": "79d20a734d0eecbb"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "scope_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "scope_id": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "type"
+ ]
+ },
+ "WritableConsolePortRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "c5f7197b7211818a",
+ "nullable": true,
+ "description": "Physical port type\n\n* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other"
+ },
+ "speed": {
+ "enum": [
+ 1200,
+ 2400,
+ 4800,
+ 9600,
+ 19200,
+ 38400,
+ 57600,
+ 115200,
+ null
+ ],
+ "type": "integer",
+ "x-spec-enum-id": "ab6d9635c131a378",
+ "nullable": true,
+ "description": "Port speed in bits per second\n\n* `1200` - 1200 bps\n* `2400` - 2400 bps\n* `4800` - 4800 bps\n* `9600` - 9600 bps\n* `19200` - 19.2 kbps\n* `38400` - 38.4 kbps\n* `57600` - 57.6 kbps\n* `115200` - 115.2 kbps",
+ "minimum": 0,
+ "maximum": 2147483647
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name"
+ ]
+ },
+ "WritableConsolePortTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "c5f7197b7211818a",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "WritableConsoleServerPortRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "c5f7197b7211818a",
+ "nullable": true,
+ "description": "Physical port type\n\n* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other"
+ },
+ "speed": {
+ "enum": [
+ 1200,
+ 2400,
+ 4800,
+ 9600,
+ 19200,
+ 38400,
+ 57600,
+ 115200,
+ null
+ ],
+ "type": "integer",
+ "x-spec-enum-id": "ab6d9635c131a378",
+ "nullable": true,
+ "description": "Port speed in bits per second\n\n* `1200` - 1200 bps\n* `2400` - 2400 bps\n* `4800` - 4800 bps\n* `9600` - 9600 bps\n* `19200` - 19.2 kbps\n* `38400` - 38.4 kbps\n* `57600` - 57.6 kbps\n* `115200` - 115.2 kbps",
+ "minimum": 0,
+ "maximum": 2147483647
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name"
+ ]
+ },
+ "WritableConsoleServerPortTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "de-9",
+ "db-25",
+ "rj-11",
+ "rj-12",
+ "rj-45",
+ "mini-din-8",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `de-9` - DE-9\n* `db-25` - DB-25\n* `rj-11` - RJ-11\n* `rj-12` - RJ-12\n* `rj-45` - RJ-45\n* `mini-din-8` - Mini-DIN 8\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "c5f7197b7211818a",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "WritableContactAssignmentRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "object_type": {
+ "type": "string"
+ },
+ "object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "contact": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefContactRequest"
+ }
+ ]
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefContactRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "priority": {
+ "enum": [
+ "primary",
+ "secondary",
+ "tertiary",
+ "inactive",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `primary` - Primary\n* `secondary` - Secondary\n* `tertiary` - Tertiary\n* `inactive` - Inactive",
+ "x-spec-enum-id": "ef3a31644cec7524",
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "contact",
+ "object_id",
+ "object_type"
+ ]
+ },
+ "WritableContactGroupRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "WritableCustomFieldChoiceSetRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "base_choices": {
+ "enum": [
+ "IATA",
+ "ISO_3166",
+ "UN_LOCODE",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "cf0efb5195f85007",
+ "nullable": true,
+ "description": "Base set of predefined choices (optional)\n\n* `IATA` - IATA (Airport codes)\n* `ISO_3166` - ISO 3166 (Country codes)\n* `UN_LOCODE` - UN/LOCODE (Location codes)"
+ },
+ "extra_choices": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {},
+ "maxItems": 2,
+ "minItems": 2
+ }
+ },
+ "order_alphabetically": {
+ "type": "boolean",
+ "description": "Choices are automatically ordered alphabetically"
+ }
+ },
+ "required": [
+ "extra_choices",
+ "name"
+ ]
+ },
+ "WritableCustomFieldRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "type": {
+ "enum": [
+ "text",
+ "longtext",
+ "integer",
+ "decimal",
+ "boolean",
+ "date",
+ "datetime",
+ "url",
+ "json",
+ "select",
+ "multiselect",
+ "object",
+ "multiobject"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "22e3a64138d10046",
+ "description": "The type of data this custom field holds\n\n* `text` - Text\n* `longtext` - Text (long)\n* `integer` - Integer\n* `decimal` - Decimal\n* `boolean` - Boolean (true/false)\n* `date` - Date\n* `datetime` - Date & time\n* `url` - URL\n* `json` - JSON\n* `select` - Selection\n* `multiselect` - Multiple selection\n* `object` - Object\n* `multiobject` - Multiple objects"
+ },
+ "related_object_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Internal field name",
+ "pattern": "^[a-z0-9_]+$",
+ "maxLength": 50
+ },
+ "label": {
+ "type": "string",
+ "description": "Name of the field as displayed to users (if not provided, 'the field's name will be used)",
+ "maxLength": 50
+ },
+ "group_name": {
+ "type": "string",
+ "description": "Custom fields within the same group will be displayed together",
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "required": {
+ "type": "boolean",
+ "description": "This field is required when creating new objects or editing an existing object."
+ },
+ "unique": {
+ "type": "boolean",
+ "title": "Must be unique",
+ "description": "The value of this field must be unique for the assigned object"
+ },
+ "search_weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "description": "Weighting for search. Lower values are considered more important. Fields with a search weight of zero will be ignored."
+ },
+ "filter_logic": {
+ "enum": [
+ "disabled",
+ "loose",
+ "exact"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "a958350ae21c10ee",
+ "description": "Loose matches any instance of a given string; exact matches the entire field.\n\n* `disabled` - Disabled\n* `loose` - Loose\n* `exact` - Exact"
+ },
+ "ui_visible": {
+ "enum": [
+ "always",
+ "if-set",
+ "hidden"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "cd2cf94af56de747",
+ "description": "Specifies whether the custom field is displayed in the UI\n\n* `always` - Always\n* `if-set` - If set\n* `hidden` - Hidden"
+ },
+ "ui_editable": {
+ "enum": [
+ "yes",
+ "no",
+ "hidden"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "1065673147e26bb5",
+ "description": "Specifies whether the custom field value can be edited in the UI\n\n* `yes` - Yes\n* `no` - No\n* `hidden` - Hidden"
+ },
+ "is_cloneable": {
+ "type": "boolean",
+ "description": "Replicate this value when cloning objects"
+ },
+ "default": {
+ "nullable": true,
+ "description": "Default value for the field (must be a JSON value). Encapsulate strings with double quotes (e.g. \"Foo\")."
+ },
+ "related_object_filter": {
+ "nullable": true,
+ "description": "Filter the object selection choices using a query_params dict (must be a JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")."
+ },
+ "weight": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "title": "Display weight",
+ "description": "Fields with higher weights appear lower in a form."
+ },
+ "validation_minimum": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": -9223372036854775808,
+ "format": "int64",
+ "nullable": true,
+ "title": "Minimum value",
+ "description": "Minimum allowed value (for numeric fields)"
+ },
+ "validation_maximum": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": -9223372036854775808,
+ "format": "int64",
+ "nullable": true,
+ "title": "Maximum value",
+ "description": "Maximum allowed value (for numeric fields)"
+ },
+ "validation_regex": {
+ "type": "string",
+ "description": "Regular expression to enforce on text field values. Use ^ and $ to force matching of entire string. For example, ^[A-Z]{3}$ will limit values to exactly three uppercase letters.",
+ "maxLength": 500
+ },
+ "choice_set": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefCustomFieldChoiceSetRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "object_types"
+ ]
+ },
+ "WritableDataSourceRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 50
+ },
+ "source_url": {
+ "type": "string",
+ "minLength": 1,
+ "title": "URL",
+ "maxLength": 200
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "sync_interval": {
+ "enum": [
+ 1,
+ 60,
+ 720,
+ 1440,
+ 10080,
+ 43200,
+ null
+ ],
+ "type": "integer",
+ "description": "* `1` - Minutely\n* `60` - Hourly\n* `720` - 12 hours\n* `1440` - Daily\n* `10080` - Weekly\n* `43200` - 30 days",
+ "x-spec-enum-id": "2e9f2567ecd93fbe",
+ "nullable": true,
+ "minimum": 0,
+ "maximum": 32767
+ },
+ "parameters": {
+ "nullable": true
+ },
+ "ignore_rules": {
+ "type": "string",
+ "description": "Patterns (one per line) matching files to ignore when syncing"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "source_url",
+ "type"
+ ]
+ },
+ "WritableDeviceRoleRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "color": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "vm_role": {
+ "type": "boolean",
+ "description": "Virtual machines may be assigned to this role"
+ },
+ "config_template": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplateRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "WritableDeviceTypeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ]
+ },
+ "default_platform": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPlatformRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "model": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "part_number": {
+ "type": "string",
+ "description": "Discrete part number (optional)",
+ "maxLength": 50
+ },
+ "u_height": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": 0.0,
+ "exclusiveMaximum": true,
+ "default": 1.0,
+ "title": "Position (U)"
+ },
+ "exclude_from_utilization": {
+ "type": "boolean",
+ "description": "Devices of this type are excluded when calculating rack utilization."
+ },
+ "is_full_depth": {
+ "type": "boolean",
+ "description": "Device consumes both front and rear rack faces."
+ },
+ "subdevice_role": {
+ "enum": [
+ "parent",
+ "child",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "d10d91f690a856c2",
+ "nullable": true,
+ "title": "Parent/child status",
+ "description": "Parent devices house child devices in device bays. Leave blank if this device type is neither a parent nor a child.\n\n* `parent` - Parent\n* `child` - Child"
+ },
+ "airflow": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ "left-to-right",
+ "right-to-left",
+ "side-to-rear",
+ "rear-to-side",
+ "bottom-to-top",
+ "top-to-bottom",
+ "passive",
+ "mixed",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front\n* `left-to-right` - Left to right\n* `right-to-left` - Right to left\n* `side-to-rear` - Side to rear\n* `rear-to-side` - Rear to side\n* `bottom-to-top` - Bottom to top\n* `top-to-bottom` - Top to bottom\n* `passive` - Passive\n* `mixed` - Mixed",
+ "x-spec-enum-id": "943288113dad6782",
+ "nullable": true
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "weight_unit": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884",
+ "nullable": true
+ },
+ "front_image": {
+ "type": "string",
+ "format": "binary",
+ "nullable": true
+ },
+ "rear_image": {
+ "type": "string",
+ "format": "binary",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "manufacturer",
+ "model",
+ "slug"
+ ]
+ },
+ "WritableDeviceWithConfigContextRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "nullable": true,
+ "maxLength": 64
+ },
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ]
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRoleRequest"
+ }
+ ]
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "platform": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPlatformRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "description": "Chassis serial number, assigned by the manufacturer",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this device",
+ "maxLength": 50
+ },
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ]
+ },
+ "location": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefLocationRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "rack": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRackRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "position": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": 0.5,
+ "exclusiveMaximum": true,
+ "nullable": true,
+ "title": "Position (U)"
+ },
+ "face": {
+ "enum": [
+ "front",
+ "rear",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `front` - Front\n* `rear` - Rear",
+ "x-spec-enum-id": "d2fb9b3f75158b83",
+ "nullable": true,
+ "title": "Rack face"
+ },
+ "latitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 100,
+ "minimum": -100,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "longitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": -1000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "status": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "inventory",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `inventory` - Inventory\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "8d8971779f16ee18"
+ },
+ "airflow": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ "left-to-right",
+ "right-to-left",
+ "side-to-rear",
+ "rear-to-side",
+ "bottom-to-top",
+ "top-to-bottom",
+ "passive",
+ "mixed",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front\n* `left-to-right` - Left to right\n* `right-to-left` - Right to left\n* `side-to-rear` - Side to rear\n* `rear-to-side` - Rear to side\n* `bottom-to-top` - Bottom to top\n* `top-to-bottom` - Top to bottom\n* `passive` - Passive\n* `mixed` - Mixed",
+ "x-spec-enum-id": "943288113dad6782",
+ "nullable": true
+ },
+ "primary_ip4": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip6": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "oob_ip": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "cluster": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefClusterRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "virtual_chassis": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVirtualChassisRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vc_position": {
+ "type": "integer",
+ "maximum": 255,
+ "minimum": 0,
+ "nullable": true
+ },
+ "vc_priority": {
+ "type": "integer",
+ "maximum": 255,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Virtual chassis master election priority"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "config_template": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplateRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "local_context_data": {
+ "nullable": true,
+ "description": "Local config context data takes precedence over source contexts in the final rendered config context"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device_type",
+ "role",
+ "site"
+ ]
+ },
+ "WritableEventRuleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "object_types": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 150
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "event_types": {
+ "type": "array",
+ "items": {
+ "enum": [
+ "object_created",
+ "object_updated",
+ "object_deleted",
+ "job_started",
+ "job_completed",
+ "job_failed",
+ "job_errored"
+ ],
+ "type": "string",
+ "description": "* `object_created` - Object created\n* `object_updated` - Object updated\n* `object_deleted` - Object deleted\n* `job_started` - Job started\n* `job_completed` - Job completed\n* `job_failed` - Job failed\n* `job_errored` - Job errored",
+ "x-spec-enum-id": "80d172232f4af424"
+ },
+ "description": "The types of event which will trigger this rule."
+ },
+ "conditions": {
+ "nullable": true,
+ "description": "A set of conditions which determine whether the event will be generated."
+ },
+ "action_type": {
+ "enum": [
+ "webhook",
+ "script",
+ "notification"
+ ],
+ "type": "string",
+ "description": "* `webhook` - Webhook\n* `script` - Script\n* `notification` - Notification",
+ "x-spec-enum-id": "d07193c73ebc03c6"
+ },
+ "action_object_type": {
+ "type": "string"
+ },
+ "action_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ }
+ },
+ "required": [
+ "action_object_type",
+ "event_types",
+ "name",
+ "object_types"
+ ]
+ },
+ "WritableFrontPortRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "rear_port": {
+ "type": "integer"
+ },
+ "rear_port_position": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1,
+ "description": "Mapped position on corresponding rear port"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name",
+ "rear_port",
+ "type"
+ ]
+ },
+ "WritableFrontPortTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "rear_port": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefRearPortTemplateRequest"
+ }
+ ]
+ },
+ "rear_port_position": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name",
+ "rear_port",
+ "type"
+ ]
+ },
+ "WritableIKEPolicyRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "version": {
+ "enum": [
+ 1,
+ 2
+ ],
+ "type": "integer",
+ "description": "* `1` - IKEv1\n* `2` - IKEv2",
+ "x-spec-enum-id": "00872b77916a1fde",
+ "minimum": 0,
+ "maximum": 32767
+ },
+ "mode": {
+ "enum": [
+ "aggressive",
+ "main",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `aggressive` - Aggressive\n* `main` - Main",
+ "x-spec-enum-id": "64c1be7bdb2548ca",
+ "nullable": true
+ },
+ "proposals": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "preshared_key": {
+ "type": "string",
+ "title": "Pre-shared key"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "WritableIKEProposalRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "authentication_method": {
+ "enum": [
+ "preshared-keys",
+ "certificates",
+ "rsa-signatures",
+ "dsa-signatures"
+ ],
+ "type": "string",
+ "description": "* `preshared-keys` - Pre-shared keys\n* `certificates` - Certificates\n* `rsa-signatures` - RSA signatures\n* `dsa-signatures` - DSA signatures",
+ "x-spec-enum-id": "92bb2f1103b3a262"
+ },
+ "encryption_algorithm": {
+ "enum": [
+ "aes-128-cbc",
+ "aes-128-gcm",
+ "aes-192-cbc",
+ "aes-192-gcm",
+ "aes-256-cbc",
+ "aes-256-gcm",
+ "3des-cbc",
+ "des-cbc"
+ ],
+ "type": "string",
+ "description": "* `aes-128-cbc` - 128-bit AES (CBC)\n* `aes-128-gcm` - 128-bit AES (GCM)\n* `aes-192-cbc` - 192-bit AES (CBC)\n* `aes-192-gcm` - 192-bit AES (GCM)\n* `aes-256-cbc` - 256-bit AES (CBC)\n* `aes-256-gcm` - 256-bit AES (GCM)\n* `3des-cbc` - 3DES\n* `des-cbc` - DES",
+ "x-spec-enum-id": "b022535cfdee79fe"
+ },
+ "authentication_algorithm": {
+ "enum": [
+ "hmac-sha1",
+ "hmac-sha256",
+ "hmac-sha384",
+ "hmac-sha512",
+ "hmac-md5",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `hmac-sha1` - SHA-1 HMAC\n* `hmac-sha256` - SHA-256 HMAC\n* `hmac-sha384` - SHA-384 HMAC\n* `hmac-sha512` - SHA-512 HMAC\n* `hmac-md5` - MD5 HMAC",
+ "x-spec-enum-id": "0830e8839f5dea4f",
+ "nullable": true
+ },
+ "group": {
+ "enum": [
+ 1,
+ 2,
+ 5,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34
+ ],
+ "type": "integer",
+ "x-spec-enum-id": "dbef43be795462a8",
+ "description": "Diffie-Hellman group ID\n\n* `1` - Group 1\n* `2` - Group 2\n* `5` - Group 5\n* `14` - Group 14\n* `15` - Group 15\n* `16` - Group 16\n* `17` - Group 17\n* `18` - Group 18\n* `19` - Group 19\n* `20` - Group 20\n* `21` - Group 21\n* `22` - Group 22\n* `23` - Group 23\n* `24` - Group 24\n* `25` - Group 25\n* `26` - Group 26\n* `27` - Group 27\n* `28` - Group 28\n* `29` - Group 29\n* `30` - Group 30\n* `31` - Group 31\n* `32` - Group 32\n* `33` - Group 33\n* `34` - Group 34",
+ "minimum": 0,
+ "maximum": 32767
+ },
+ "sa_lifetime": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Security association lifetime (in seconds)"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "authentication_method",
+ "encryption_algorithm",
+ "group",
+ "name"
+ ]
+ },
+ "WritableIPAddressRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "address": {
+ "type": "string",
+ "minLength": 1
+ },
+ "vrf": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRFRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "active",
+ "reserved",
+ "deprecated",
+ "dhcp",
+ "slaac"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "24935cfee15bd268",
+ "description": "The operational status of this IP\n\n* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated\n* `dhcp` - DHCP\n* `slaac` - SLAAC"
+ },
+ "role": {
+ "enum": [
+ "loopback",
+ "secondary",
+ "anycast",
+ "vip",
+ "vrrp",
+ "hsrp",
+ "glbp",
+ "carp",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "10fbcb4930889b0f",
+ "nullable": true,
+ "description": "The functional role of this IP\n\n* `loopback` - Loopback\n* `secondary` - Secondary\n* `anycast` - Anycast\n* `vip` - VIP\n* `vrrp` - VRRP\n* `hsrp` - HSRP\n* `glbp` - GLBP\n* `carp` - CARP"
+ },
+ "assigned_object_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "assigned_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "nat_inside": {
+ "type": "integer",
+ "nullable": true,
+ "title": "NAT (inside)",
+ "description": "The IP for which this address is the \"outside\" IP"
+ },
+ "dns_name": {
+ "type": "string",
+ "description": "Hostname or FQDN (not case-sensitive)",
+ "pattern": "^([0-9A-Za-z_-]+|\\*)(\\.[0-9A-Za-z_-]+)*\\.?$",
+ "maxLength": 255
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "address"
+ ]
+ },
+ "WritableIPRangeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "start_address": {
+ "type": "string",
+ "minLength": 1
+ },
+ "end_address": {
+ "type": "string",
+ "minLength": 1
+ },
+ "vrf": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRFRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "active",
+ "reserved",
+ "deprecated"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "6388dfb94ca1cc15",
+ "description": "Operational status of this range\n\n* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated"
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "mark_populated": {
+ "type": "boolean",
+ "description": "Prevent the creation of IP addresses within this range"
+ },
+ "mark_utilized": {
+ "type": "boolean",
+ "description": "Report space as 100% utilized"
+ }
+ },
+ "required": [
+ "end_address",
+ "start_address"
+ ]
+ },
+ "WritableIPSecPolicyRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "proposals": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "pfs_group": {
+ "enum": [
+ 1,
+ 2,
+ 5,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ null
+ ],
+ "type": "integer",
+ "x-spec-enum-id": "dbef43be795462a8",
+ "nullable": true,
+ "description": "Diffie-Hellman group for Perfect Forward Secrecy\n\n* `1` - Group 1\n* `2` - Group 2\n* `5` - Group 5\n* `14` - Group 14\n* `15` - Group 15\n* `16` - Group 16\n* `17` - Group 17\n* `18` - Group 18\n* `19` - Group 19\n* `20` - Group 20\n* `21` - Group 21\n* `22` - Group 22\n* `23` - Group 23\n* `24` - Group 24\n* `25` - Group 25\n* `26` - Group 26\n* `27` - Group 27\n* `28` - Group 28\n* `29` - Group 29\n* `30` - Group 30\n* `31` - Group 31\n* `32` - Group 32\n* `33` - Group 33\n* `34` - Group 34",
+ "minimum": 0,
+ "maximum": 32767
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "WritableIPSecProfileRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mode": {
+ "enum": [
+ "esp",
+ "ah"
+ ],
+ "type": "string",
+ "description": "* `esp` - ESP\n* `ah` - AH",
+ "x-spec-enum-id": "1136c2cdfee84436"
+ },
+ "ike_policy": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefIKEPolicyRequest"
+ }
+ ]
+ },
+ "ipsec_policy": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefIPSecPolicyRequest"
+ }
+ ]
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "ike_policy",
+ "ipsec_policy",
+ "mode",
+ "name"
+ ]
+ },
+ "WritableIPSecProposalRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "encryption_algorithm": {
+ "enum": [
+ "aes-128-cbc",
+ "aes-128-gcm",
+ "aes-192-cbc",
+ "aes-192-gcm",
+ "aes-256-cbc",
+ "aes-256-gcm",
+ "3des-cbc",
+ "des-cbc",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `aes-128-cbc` - 128-bit AES (CBC)\n* `aes-128-gcm` - 128-bit AES (GCM)\n* `aes-192-cbc` - 192-bit AES (CBC)\n* `aes-192-gcm` - 192-bit AES (GCM)\n* `aes-256-cbc` - 256-bit AES (CBC)\n* `aes-256-gcm` - 256-bit AES (GCM)\n* `3des-cbc` - 3DES\n* `des-cbc` - DES",
+ "x-spec-enum-id": "b022535cfdee79fe",
+ "nullable": true,
+ "title": "Encryption"
+ },
+ "authentication_algorithm": {
+ "enum": [
+ "hmac-sha1",
+ "hmac-sha256",
+ "hmac-sha384",
+ "hmac-sha512",
+ "hmac-md5",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `hmac-sha1` - SHA-1 HMAC\n* `hmac-sha256` - SHA-256 HMAC\n* `hmac-sha384` - SHA-384 HMAC\n* `hmac-sha512` - SHA-512 HMAC\n* `hmac-md5` - MD5 HMAC",
+ "x-spec-enum-id": "0830e8839f5dea4f",
+ "nullable": true,
+ "title": "Authentication"
+ },
+ "sa_lifetime_seconds": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "SA lifetime (seconds)",
+ "description": "Security association lifetime (seconds)"
+ },
+ "sa_lifetime_data": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "SA lifetime (KB)",
+ "description": "Security association lifetime (in kilobytes)"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "WritableInterfaceRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "vdcs": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "virtual",
+ "bridge",
+ "lag",
+ "100base-fx",
+ "100base-lfx",
+ "100base-tx",
+ "100base-t1",
+ "1000base-t",
+ "1000base-sx",
+ "1000base-lx",
+ "1000base-tx",
+ "2.5gbase-t",
+ "5gbase-t",
+ "10gbase-t",
+ "10gbase-cx4",
+ "100base-x-sfp",
+ "1000base-x-gbic",
+ "1000base-x-sfp",
+ "10gbase-x-sfpp",
+ "10gbase-x-xfp",
+ "10gbase-x-xenpak",
+ "10gbase-x-x2",
+ "25gbase-x-sfp28",
+ "50gbase-x-sfp56",
+ "40gbase-x-qsfpp",
+ "50gbase-x-sfp28",
+ "100gbase-x-cfp",
+ "100gbase-x-cfp2",
+ "200gbase-x-cfp2",
+ "400gbase-x-cfp2",
+ "100gbase-x-cfp4",
+ "100gbase-x-cxp",
+ "100gbase-x-cpak",
+ "100gbase-x-dsfp",
+ "100gbase-x-sfpdd",
+ "100gbase-x-qsfp28",
+ "100gbase-x-qsfpdd",
+ "200gbase-x-qsfp56",
+ "200gbase-x-qsfpdd",
+ "400gbase-x-qsfp112",
+ "400gbase-x-qsfpdd",
+ "400gbase-x-osfp",
+ "400gbase-x-osfp-rhs",
+ "400gbase-x-cdfp",
+ "400gbase-x-cfp8",
+ "800gbase-x-qsfpdd",
+ "800gbase-x-osfp",
+ "1000base-kx",
+ "2.5gbase-kx",
+ "5gbase-kr",
+ "10gbase-kr",
+ "10gbase-kx4",
+ "25gbase-kr",
+ "40gbase-kr4",
+ "50gbase-kr",
+ "100gbase-kp4",
+ "100gbase-kr2",
+ "100gbase-kr4",
+ "ieee802.11a",
+ "ieee802.11g",
+ "ieee802.11n",
+ "ieee802.11ac",
+ "ieee802.11ad",
+ "ieee802.11ax",
+ "ieee802.11ay",
+ "ieee802.11be",
+ "ieee802.15.1",
+ "ieee802.15.4",
+ "other-wireless",
+ "gsm",
+ "cdma",
+ "lte",
+ "4g",
+ "5g",
+ "sonet-oc3",
+ "sonet-oc12",
+ "sonet-oc48",
+ "sonet-oc192",
+ "sonet-oc768",
+ "sonet-oc1920",
+ "sonet-oc3840",
+ "1gfc-sfp",
+ "2gfc-sfp",
+ "4gfc-sfp",
+ "8gfc-sfpp",
+ "16gfc-sfpp",
+ "32gfc-sfp28",
+ "32gfc-sfpp",
+ "64gfc-qsfpp",
+ "64gfc-sfpdd",
+ "64gfc-sfpp",
+ "128gfc-qsfp28",
+ "infiniband-sdr",
+ "infiniband-ddr",
+ "infiniband-qdr",
+ "infiniband-fdr10",
+ "infiniband-fdr",
+ "infiniband-edr",
+ "infiniband-hdr",
+ "infiniband-ndr",
+ "infiniband-xdr",
+ "t1",
+ "e1",
+ "t3",
+ "e3",
+ "xdsl",
+ "docsis",
+ "moca",
+ "bpon",
+ "epon",
+ "10g-epon",
+ "gpon",
+ "xg-pon",
+ "xgs-pon",
+ "ng-pon2",
+ "25g-pon",
+ "50g-pon",
+ "cisco-stackwise",
+ "cisco-stackwise-plus",
+ "cisco-flexstack",
+ "cisco-flexstack-plus",
+ "cisco-stackwise-80",
+ "cisco-stackwise-160",
+ "cisco-stackwise-320",
+ "cisco-stackwise-480",
+ "cisco-stackwise-1t",
+ "juniper-vcp",
+ "extreme-summitstack",
+ "extreme-summitstack-128",
+ "extreme-summitstack-256",
+ "extreme-summitstack-512",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `virtual` - Virtual\n* `bridge` - Bridge\n* `lag` - Link Aggregation Group (LAG)\n* `100base-fx` - 100BASE-FX (10/100ME FIBER)\n* `100base-lfx` - 100BASE-LFX (10/100ME FIBER)\n* `100base-tx` - 100BASE-TX (10/100ME)\n* `100base-t1` - 100BASE-T1 (10/100ME Single Pair)\n* `1000base-t` - 1000BASE-T (1GE)\n* `1000base-sx` - 1000BASE-SX (1GE)\n* `1000base-lx` - 1000BASE-LX (1GE)\n* `1000base-tx` - 1000BASE-TX (1GE)\n* `2.5gbase-t` - 2.5GBASE-T (2.5GE)\n* `5gbase-t` - 5GBASE-T (5GE)\n* `10gbase-t` - 10GBASE-T (10GE)\n* `10gbase-cx4` - 10GBASE-CX4 (10GE)\n* `100base-x-sfp` - SFP (100ME)\n* `1000base-x-gbic` - GBIC (1GE)\n* `1000base-x-sfp` - SFP (1GE)\n* `10gbase-x-sfpp` - SFP+ (10GE)\n* `10gbase-x-xfp` - XFP (10GE)\n* `10gbase-x-xenpak` - XENPAK (10GE)\n* `10gbase-x-x2` - X2 (10GE)\n* `25gbase-x-sfp28` - SFP28 (25GE)\n* `50gbase-x-sfp56` - SFP56 (50GE)\n* `40gbase-x-qsfpp` - QSFP+ (40GE)\n* `50gbase-x-sfp28` - QSFP28 (50GE)\n* `100gbase-x-cfp` - CFP (100GE)\n* `100gbase-x-cfp2` - CFP2 (100GE)\n* `200gbase-x-cfp2` - CFP2 (200GE)\n* `400gbase-x-cfp2` - CFP2 (400GE)\n* `100gbase-x-cfp4` - CFP4 (100GE)\n* `100gbase-x-cxp` - CXP (100GE)\n* `100gbase-x-cpak` - Cisco CPAK (100GE)\n* `100gbase-x-dsfp` - DSFP (100GE)\n* `100gbase-x-sfpdd` - SFP-DD (100GE)\n* `100gbase-x-qsfp28` - QSFP28 (100GE)\n* `100gbase-x-qsfpdd` - QSFP-DD (100GE)\n* `200gbase-x-qsfp56` - QSFP56 (200GE)\n* `200gbase-x-qsfpdd` - QSFP-DD (200GE)\n* `400gbase-x-qsfp112` - QSFP112 (400GE)\n* `400gbase-x-qsfpdd` - QSFP-DD (400GE)\n* `400gbase-x-osfp` - OSFP (400GE)\n* `400gbase-x-osfp-rhs` - OSFP-RHS (400GE)\n* `400gbase-x-cdfp` - CDFP (400GE)\n* `400gbase-x-cfp8` - CPF8 (400GE)\n* `800gbase-x-qsfpdd` - QSFP-DD (800GE)\n* `800gbase-x-osfp` - OSFP (800GE)\n* `1000base-kx` - 1000BASE-KX (1GE)\n* `2.5gbase-kx` - 2.5GBASE-KX (2.5GE)\n* `5gbase-kr` - 5GBASE-KR (5GE)\n* `10gbase-kr` - 10GBASE-KR (10GE)\n* `10gbase-kx4` - 10GBASE-KX4 (10GE)\n* `25gbase-kr` - 25GBASE-KR (25GE)\n* `40gbase-kr4` - 40GBASE-KR4 (40GE)\n* `50gbase-kr` - 50GBASE-KR (50GE)\n* `100gbase-kp4` - 100GBASE-KP4 (100GE)\n* `100gbase-kr2` - 100GBASE-KR2 (100GE)\n* `100gbase-kr4` - 100GBASE-KR4 (100GE)\n* `ieee802.11a` - IEEE 802.11a\n* `ieee802.11g` - IEEE 802.11b/g\n* `ieee802.11n` - IEEE 802.11n\n* `ieee802.11ac` - IEEE 802.11ac\n* `ieee802.11ad` - IEEE 802.11ad\n* `ieee802.11ax` - IEEE 802.11ax\n* `ieee802.11ay` - IEEE 802.11ay\n* `ieee802.11be` - IEEE 802.11be\n* `ieee802.15.1` - IEEE 802.15.1 (Bluetooth)\n* `ieee802.15.4` - IEEE 802.15.4 (LR-WPAN)\n* `other-wireless` - Other (Wireless)\n* `gsm` - GSM\n* `cdma` - CDMA\n* `lte` - LTE\n* `4g` - 4G\n* `5g` - 5G\n* `sonet-oc3` - OC-3/STM-1\n* `sonet-oc12` - OC-12/STM-4\n* `sonet-oc48` - OC-48/STM-16\n* `sonet-oc192` - OC-192/STM-64\n* `sonet-oc768` - OC-768/STM-256\n* `sonet-oc1920` - OC-1920/STM-640\n* `sonet-oc3840` - OC-3840/STM-1234\n* `1gfc-sfp` - SFP (1GFC)\n* `2gfc-sfp` - SFP (2GFC)\n* `4gfc-sfp` - SFP (4GFC)\n* `8gfc-sfpp` - SFP+ (8GFC)\n* `16gfc-sfpp` - SFP+ (16GFC)\n* `32gfc-sfp28` - SFP28 (32GFC)\n* `32gfc-sfpp` - SFP+ (32GFC)\n* `64gfc-qsfpp` - QSFP+ (64GFC)\n* `64gfc-sfpdd` - SFP-DD (64GFC)\n* `64gfc-sfpp` - SFP+ (64GFC)\n* `128gfc-qsfp28` - QSFP28 (128GFC)\n* `infiniband-sdr` - SDR (2 Gbps)\n* `infiniband-ddr` - DDR (4 Gbps)\n* `infiniband-qdr` - QDR (8 Gbps)\n* `infiniband-fdr10` - FDR10 (10 Gbps)\n* `infiniband-fdr` - FDR (13.5 Gbps)\n* `infiniband-edr` - EDR (25 Gbps)\n* `infiniband-hdr` - HDR (50 Gbps)\n* `infiniband-ndr` - NDR (100 Gbps)\n* `infiniband-xdr` - XDR (250 Gbps)\n* `t1` - T1 (1.544 Mbps)\n* `e1` - E1 (2.048 Mbps)\n* `t3` - T3 (45 Mbps)\n* `e3` - E3 (34 Mbps)\n* `xdsl` - xDSL\n* `docsis` - DOCSIS\n* `moca` - MoCA\n* `bpon` - BPON (622 Mbps / 155 Mbps)\n* `epon` - EPON (1 Gbps)\n* `10g-epon` - 10G-EPON (10 Gbps)\n* `gpon` - GPON (2.5 Gbps / 1.25 Gbps)\n* `xg-pon` - XG-PON (10 Gbps / 2.5 Gbps)\n* `xgs-pon` - XGS-PON (10 Gbps)\n* `ng-pon2` - NG-PON2 (TWDM-PON) (4x10 Gbps)\n* `25g-pon` - 25G-PON (25 Gbps)\n* `50g-pon` - 50G-PON (50 Gbps)\n* `cisco-stackwise` - Cisco StackWise\n* `cisco-stackwise-plus` - Cisco StackWise Plus\n* `cisco-flexstack` - Cisco FlexStack\n* `cisco-flexstack-plus` - Cisco FlexStack Plus\n* `cisco-stackwise-80` - Cisco StackWise-80\n* `cisco-stackwise-160` - Cisco StackWise-160\n* `cisco-stackwise-320` - Cisco StackWise-320\n* `cisco-stackwise-480` - Cisco StackWise-480\n* `cisco-stackwise-1t` - Cisco StackWise-1T\n* `juniper-vcp` - Juniper VCP\n* `extreme-summitstack` - Extreme SummitStack\n* `extreme-summitstack-128` - Extreme SummitStack-128\n* `extreme-summitstack-256` - Extreme SummitStack-256\n* `extreme-summitstack-512` - Extreme SummitStack-512\n* `other` - Other",
+ "x-spec-enum-id": "8c4c5e112f77a383"
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true,
+ "title": "Parent interface"
+ },
+ "bridge": {
+ "type": "integer",
+ "nullable": true,
+ "title": "Bridge interface"
+ },
+ "lag": {
+ "type": "integer",
+ "nullable": true,
+ "title": "Parent LAG"
+ },
+ "mtu": {
+ "type": "integer",
+ "maximum": 65536,
+ "minimum": 1,
+ "nullable": true
+ },
+ "primary_mac_address": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefMACAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "speed": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Speed (Kbps)"
+ },
+ "duplex": {
+ "enum": [
+ "half",
+ "full",
+ "auto",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `half` - Half\n* `full` - Full\n* `auto` - Auto",
+ "x-spec-enum-id": "47eab9b1a65a1e21",
+ "nullable": true
+ },
+ "wwn": {
+ "type": "string",
+ "nullable": true
+ },
+ "mgmt_only": {
+ "type": "boolean",
+ "title": "Management only",
+ "description": "This interface is used only for out-of-band management"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mode": {
+ "enum": [
+ "access",
+ "tagged",
+ "tagged-all",
+ "q-in-q",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "b6fe48fe21dbf01d",
+ "nullable": true,
+ "description": "IEEE 802.1Q tagging strategy\n\n* `access` - Access\n* `tagged` - Tagged\n* `tagged-all` - Tagged (All)\n* `q-in-q` - Q-in-Q (802.1ad)"
+ },
+ "rf_role": {
+ "enum": [
+ "ap",
+ "station",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `ap` - Access point\n* `station` - Station",
+ "x-spec-enum-id": "d2772dbea88b0fb1",
+ "nullable": true,
+ "title": "Wireless role"
+ },
+ "rf_channel": {
+ "enum": [
+ "2.4g-1-2412-22",
+ "2.4g-2-2417-22",
+ "2.4g-3-2422-22",
+ "2.4g-4-2427-22",
+ "2.4g-5-2432-22",
+ "2.4g-6-2437-22",
+ "2.4g-7-2442-22",
+ "2.4g-8-2447-22",
+ "2.4g-9-2452-22",
+ "2.4g-10-2457-22",
+ "2.4g-11-2462-22",
+ "2.4g-12-2467-22",
+ "2.4g-13-2472-22",
+ "5g-32-5160-20",
+ "5g-34-5170-40",
+ "5g-36-5180-20",
+ "5g-38-5190-40",
+ "5g-40-5200-20",
+ "5g-42-5210-80",
+ "5g-44-5220-20",
+ "5g-46-5230-40",
+ "5g-48-5240-20",
+ "5g-50-5250-160",
+ "5g-52-5260-20",
+ "5g-54-5270-40",
+ "5g-56-5280-20",
+ "5g-58-5290-80",
+ "5g-60-5300-20",
+ "5g-62-5310-40",
+ "5g-64-5320-20",
+ "5g-100-5500-20",
+ "5g-102-5510-40",
+ "5g-104-5520-20",
+ "5g-106-5530-80",
+ "5g-108-5540-20",
+ "5g-110-5550-40",
+ "5g-112-5560-20",
+ "5g-114-5570-160",
+ "5g-116-5580-20",
+ "5g-118-5590-40",
+ "5g-120-5600-20",
+ "5g-122-5610-80",
+ "5g-124-5620-20",
+ "5g-126-5630-40",
+ "5g-128-5640-20",
+ "5g-132-5660-20",
+ "5g-134-5670-40",
+ "5g-136-5680-20",
+ "5g-138-5690-80",
+ "5g-140-5700-20",
+ "5g-142-5710-40",
+ "5g-144-5720-20",
+ "5g-149-5745-20",
+ "5g-151-5755-40",
+ "5g-153-5765-20",
+ "5g-155-5775-80",
+ "5g-157-5785-20",
+ "5g-159-5795-40",
+ "5g-161-5805-20",
+ "5g-163-5815-160",
+ "5g-165-5825-20",
+ "5g-167-5835-40",
+ "5g-169-5845-20",
+ "5g-171-5855-80",
+ "5g-173-5865-20",
+ "5g-175-5875-40",
+ "5g-177-5885-20",
+ "6g-1-5955-20",
+ "6g-3-5965-40",
+ "6g-5-5975-20",
+ "6g-7-5985-80",
+ "6g-9-5995-20",
+ "6g-11-6005-40",
+ "6g-13-6015-20",
+ "6g-15-6025-160",
+ "6g-17-6035-20",
+ "6g-19-6045-40",
+ "6g-21-6055-20",
+ "6g-23-6065-80",
+ "6g-25-6075-20",
+ "6g-27-6085-40",
+ "6g-29-6095-20",
+ "6g-31-6105-320",
+ "6g-33-6115-20",
+ "6g-35-6125-40",
+ "6g-37-6135-20",
+ "6g-39-6145-80",
+ "6g-41-6155-20",
+ "6g-43-6165-40",
+ "6g-45-6175-20",
+ "6g-47-6185-160",
+ "6g-49-6195-20",
+ "6g-51-6205-40",
+ "6g-53-6215-20",
+ "6g-55-6225-80",
+ "6g-57-6235-20",
+ "6g-59-6245-40",
+ "6g-61-6255-20",
+ "6g-65-6275-20",
+ "6g-67-6285-40",
+ "6g-69-6295-20",
+ "6g-71-6305-80",
+ "6g-73-6315-20",
+ "6g-75-6325-40",
+ "6g-77-6335-20",
+ "6g-79-6345-160",
+ "6g-81-6355-20",
+ "6g-83-6365-40",
+ "6g-85-6375-20",
+ "6g-87-6385-80",
+ "6g-89-6395-20",
+ "6g-91-6405-40",
+ "6g-93-6415-20",
+ "6g-95-6425-320",
+ "6g-97-6435-20",
+ "6g-99-6445-40",
+ "6g-101-6455-20",
+ "6g-103-6465-80",
+ "6g-105-6475-20",
+ "6g-107-6485-40",
+ "6g-109-6495-20",
+ "6g-111-6505-160",
+ "6g-113-6515-20",
+ "6g-115-6525-40",
+ "6g-117-6535-20",
+ "6g-119-6545-80",
+ "6g-121-6555-20",
+ "6g-123-6565-40",
+ "6g-125-6575-20",
+ "6g-129-6595-20",
+ "6g-131-6605-40",
+ "6g-133-6615-20",
+ "6g-135-6625-80",
+ "6g-137-6635-20",
+ "6g-139-6645-40",
+ "6g-141-6655-20",
+ "6g-143-6665-160",
+ "6g-145-6675-20",
+ "6g-147-6685-40",
+ "6g-149-6695-20",
+ "6g-151-6705-80",
+ "6g-153-6715-20",
+ "6g-155-6725-40",
+ "6g-157-6735-20",
+ "6g-159-6745-320",
+ "6g-161-6755-20",
+ "6g-163-6765-40",
+ "6g-165-6775-20",
+ "6g-167-6785-80",
+ "6g-169-6795-20",
+ "6g-171-6805-40",
+ "6g-173-6815-20",
+ "6g-175-6825-160",
+ "6g-177-6835-20",
+ "6g-179-6845-40",
+ "6g-181-6855-20",
+ "6g-183-6865-80",
+ "6g-185-6875-20",
+ "6g-187-6885-40",
+ "6g-189-6895-20",
+ "6g-193-6915-20",
+ "6g-195-6925-40",
+ "6g-197-6935-20",
+ "6g-199-6945-80",
+ "6g-201-6955-20",
+ "6g-203-6965-40",
+ "6g-205-6975-20",
+ "6g-207-6985-160",
+ "6g-209-6995-20",
+ "6g-211-7005-40",
+ "6g-213-7015-20",
+ "6g-215-7025-80",
+ "6g-217-7035-20",
+ "6g-219-7045-40",
+ "6g-221-7055-20",
+ "6g-225-7075-20",
+ "6g-227-7085-40",
+ "6g-229-7095-20",
+ "6g-233-7115-20",
+ "60g-1-58320-2160",
+ "60g-2-60480-2160",
+ "60g-3-62640-2160",
+ "60g-4-64800-2160",
+ "60g-5-66960-2160",
+ "60g-6-69120-2160",
+ "60g-9-59400-4320",
+ "60g-10-61560-4320",
+ "60g-11-63720-4320",
+ "60g-12-65880-4320",
+ "60g-13-68040-4320",
+ "60g-17-60480-6480",
+ "60g-18-62640-6480",
+ "60g-19-64800-6480",
+ "60g-20-66960-6480",
+ "60g-25-61560-6480",
+ "60g-26-63720-6480",
+ "60g-27-65880-6480",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `2.4g-1-2412-22` - 1 (2412 MHz)\n* `2.4g-2-2417-22` - 2 (2417 MHz)\n* `2.4g-3-2422-22` - 3 (2422 MHz)\n* `2.4g-4-2427-22` - 4 (2427 MHz)\n* `2.4g-5-2432-22` - 5 (2432 MHz)\n* `2.4g-6-2437-22` - 6 (2437 MHz)\n* `2.4g-7-2442-22` - 7 (2442 MHz)\n* `2.4g-8-2447-22` - 8 (2447 MHz)\n* `2.4g-9-2452-22` - 9 (2452 MHz)\n* `2.4g-10-2457-22` - 10 (2457 MHz)\n* `2.4g-11-2462-22` - 11 (2462 MHz)\n* `2.4g-12-2467-22` - 12 (2467 MHz)\n* `2.4g-13-2472-22` - 13 (2472 MHz)\n* `5g-32-5160-20` - 32 (5160/20 MHz)\n* `5g-34-5170-40` - 34 (5170/40 MHz)\n* `5g-36-5180-20` - 36 (5180/20 MHz)\n* `5g-38-5190-40` - 38 (5190/40 MHz)\n* `5g-40-5200-20` - 40 (5200/20 MHz)\n* `5g-42-5210-80` - 42 (5210/80 MHz)\n* `5g-44-5220-20` - 44 (5220/20 MHz)\n* `5g-46-5230-40` - 46 (5230/40 MHz)\n* `5g-48-5240-20` - 48 (5240/20 MHz)\n* `5g-50-5250-160` - 50 (5250/160 MHz)\n* `5g-52-5260-20` - 52 (5260/20 MHz)\n* `5g-54-5270-40` - 54 (5270/40 MHz)\n* `5g-56-5280-20` - 56 (5280/20 MHz)\n* `5g-58-5290-80` - 58 (5290/80 MHz)\n* `5g-60-5300-20` - 60 (5300/20 MHz)\n* `5g-62-5310-40` - 62 (5310/40 MHz)\n* `5g-64-5320-20` - 64 (5320/20 MHz)\n* `5g-100-5500-20` - 100 (5500/20 MHz)\n* `5g-102-5510-40` - 102 (5510/40 MHz)\n* `5g-104-5520-20` - 104 (5520/20 MHz)\n* `5g-106-5530-80` - 106 (5530/80 MHz)\n* `5g-108-5540-20` - 108 (5540/20 MHz)\n* `5g-110-5550-40` - 110 (5550/40 MHz)\n* `5g-112-5560-20` - 112 (5560/20 MHz)\n* `5g-114-5570-160` - 114 (5570/160 MHz)\n* `5g-116-5580-20` - 116 (5580/20 MHz)\n* `5g-118-5590-40` - 118 (5590/40 MHz)\n* `5g-120-5600-20` - 120 (5600/20 MHz)\n* `5g-122-5610-80` - 122 (5610/80 MHz)\n* `5g-124-5620-20` - 124 (5620/20 MHz)\n* `5g-126-5630-40` - 126 (5630/40 MHz)\n* `5g-128-5640-20` - 128 (5640/20 MHz)\n* `5g-132-5660-20` - 132 (5660/20 MHz)\n* `5g-134-5670-40` - 134 (5670/40 MHz)\n* `5g-136-5680-20` - 136 (5680/20 MHz)\n* `5g-138-5690-80` - 138 (5690/80 MHz)\n* `5g-140-5700-20` - 140 (5700/20 MHz)\n* `5g-142-5710-40` - 142 (5710/40 MHz)\n* `5g-144-5720-20` - 144 (5720/20 MHz)\n* `5g-149-5745-20` - 149 (5745/20 MHz)\n* `5g-151-5755-40` - 151 (5755/40 MHz)\n* `5g-153-5765-20` - 153 (5765/20 MHz)\n* `5g-155-5775-80` - 155 (5775/80 MHz)\n* `5g-157-5785-20` - 157 (5785/20 MHz)\n* `5g-159-5795-40` - 159 (5795/40 MHz)\n* `5g-161-5805-20` - 161 (5805/20 MHz)\n* `5g-163-5815-160` - 163 (5815/160 MHz)\n* `5g-165-5825-20` - 165 (5825/20 MHz)\n* `5g-167-5835-40` - 167 (5835/40 MHz)\n* `5g-169-5845-20` - 169 (5845/20 MHz)\n* `5g-171-5855-80` - 171 (5855/80 MHz)\n* `5g-173-5865-20` - 173 (5865/20 MHz)\n* `5g-175-5875-40` - 175 (5875/40 MHz)\n* `5g-177-5885-20` - 177 (5885/20 MHz)\n* `6g-1-5955-20` - 1 (5955/20 MHz)\n* `6g-3-5965-40` - 3 (5965/40 MHz)\n* `6g-5-5975-20` - 5 (5975/20 MHz)\n* `6g-7-5985-80` - 7 (5985/80 MHz)\n* `6g-9-5995-20` - 9 (5995/20 MHz)\n* `6g-11-6005-40` - 11 (6005/40 MHz)\n* `6g-13-6015-20` - 13 (6015/20 MHz)\n* `6g-15-6025-160` - 15 (6025/160 MHz)\n* `6g-17-6035-20` - 17 (6035/20 MHz)\n* `6g-19-6045-40` - 19 (6045/40 MHz)\n* `6g-21-6055-20` - 21 (6055/20 MHz)\n* `6g-23-6065-80` - 23 (6065/80 MHz)\n* `6g-25-6075-20` - 25 (6075/20 MHz)\n* `6g-27-6085-40` - 27 (6085/40 MHz)\n* `6g-29-6095-20` - 29 (6095/20 MHz)\n* `6g-31-6105-320` - 31 (6105/320 MHz)\n* `6g-33-6115-20` - 33 (6115/20 MHz)\n* `6g-35-6125-40` - 35 (6125/40 MHz)\n* `6g-37-6135-20` - 37 (6135/20 MHz)\n* `6g-39-6145-80` - 39 (6145/80 MHz)\n* `6g-41-6155-20` - 41 (6155/20 MHz)\n* `6g-43-6165-40` - 43 (6165/40 MHz)\n* `6g-45-6175-20` - 45 (6175/20 MHz)\n* `6g-47-6185-160` - 47 (6185/160 MHz)\n* `6g-49-6195-20` - 49 (6195/20 MHz)\n* `6g-51-6205-40` - 51 (6205/40 MHz)\n* `6g-53-6215-20` - 53 (6215/20 MHz)\n* `6g-55-6225-80` - 55 (6225/80 MHz)\n* `6g-57-6235-20` - 57 (6235/20 MHz)\n* `6g-59-6245-40` - 59 (6245/40 MHz)\n* `6g-61-6255-20` - 61 (6255/20 MHz)\n* `6g-65-6275-20` - 65 (6275/20 MHz)\n* `6g-67-6285-40` - 67 (6285/40 MHz)\n* `6g-69-6295-20` - 69 (6295/20 MHz)\n* `6g-71-6305-80` - 71 (6305/80 MHz)\n* `6g-73-6315-20` - 73 (6315/20 MHz)\n* `6g-75-6325-40` - 75 (6325/40 MHz)\n* `6g-77-6335-20` - 77 (6335/20 MHz)\n* `6g-79-6345-160` - 79 (6345/160 MHz)\n* `6g-81-6355-20` - 81 (6355/20 MHz)\n* `6g-83-6365-40` - 83 (6365/40 MHz)\n* `6g-85-6375-20` - 85 (6375/20 MHz)\n* `6g-87-6385-80` - 87 (6385/80 MHz)\n* `6g-89-6395-20` - 89 (6395/20 MHz)\n* `6g-91-6405-40` - 91 (6405/40 MHz)\n* `6g-93-6415-20` - 93 (6415/20 MHz)\n* `6g-95-6425-320` - 95 (6425/320 MHz)\n* `6g-97-6435-20` - 97 (6435/20 MHz)\n* `6g-99-6445-40` - 99 (6445/40 MHz)\n* `6g-101-6455-20` - 101 (6455/20 MHz)\n* `6g-103-6465-80` - 103 (6465/80 MHz)\n* `6g-105-6475-20` - 105 (6475/20 MHz)\n* `6g-107-6485-40` - 107 (6485/40 MHz)\n* `6g-109-6495-20` - 109 (6495/20 MHz)\n* `6g-111-6505-160` - 111 (6505/160 MHz)\n* `6g-113-6515-20` - 113 (6515/20 MHz)\n* `6g-115-6525-40` - 115 (6525/40 MHz)\n* `6g-117-6535-20` - 117 (6535/20 MHz)\n* `6g-119-6545-80` - 119 (6545/80 MHz)\n* `6g-121-6555-20` - 121 (6555/20 MHz)\n* `6g-123-6565-40` - 123 (6565/40 MHz)\n* `6g-125-6575-20` - 125 (6575/20 MHz)\n* `6g-129-6595-20` - 129 (6595/20 MHz)\n* `6g-131-6605-40` - 131 (6605/40 MHz)\n* `6g-133-6615-20` - 133 (6615/20 MHz)\n* `6g-135-6625-80` - 135 (6625/80 MHz)\n* `6g-137-6635-20` - 137 (6635/20 MHz)\n* `6g-139-6645-40` - 139 (6645/40 MHz)\n* `6g-141-6655-20` - 141 (6655/20 MHz)\n* `6g-143-6665-160` - 143 (6665/160 MHz)\n* `6g-145-6675-20` - 145 (6675/20 MHz)\n* `6g-147-6685-40` - 147 (6685/40 MHz)\n* `6g-149-6695-20` - 149 (6695/20 MHz)\n* `6g-151-6705-80` - 151 (6705/80 MHz)\n* `6g-153-6715-20` - 153 (6715/20 MHz)\n* `6g-155-6725-40` - 155 (6725/40 MHz)\n* `6g-157-6735-20` - 157 (6735/20 MHz)\n* `6g-159-6745-320` - 159 (6745/320 MHz)\n* `6g-161-6755-20` - 161 (6755/20 MHz)\n* `6g-163-6765-40` - 163 (6765/40 MHz)\n* `6g-165-6775-20` - 165 (6775/20 MHz)\n* `6g-167-6785-80` - 167 (6785/80 MHz)\n* `6g-169-6795-20` - 169 (6795/20 MHz)\n* `6g-171-6805-40` - 171 (6805/40 MHz)\n* `6g-173-6815-20` - 173 (6815/20 MHz)\n* `6g-175-6825-160` - 175 (6825/160 MHz)\n* `6g-177-6835-20` - 177 (6835/20 MHz)\n* `6g-179-6845-40` - 179 (6845/40 MHz)\n* `6g-181-6855-20` - 181 (6855/20 MHz)\n* `6g-183-6865-80` - 183 (6865/80 MHz)\n* `6g-185-6875-20` - 185 (6875/20 MHz)\n* `6g-187-6885-40` - 187 (6885/40 MHz)\n* `6g-189-6895-20` - 189 (6895/20 MHz)\n* `6g-193-6915-20` - 193 (6915/20 MHz)\n* `6g-195-6925-40` - 195 (6925/40 MHz)\n* `6g-197-6935-20` - 197 (6935/20 MHz)\n* `6g-199-6945-80` - 199 (6945/80 MHz)\n* `6g-201-6955-20` - 201 (6955/20 MHz)\n* `6g-203-6965-40` - 203 (6965/40 MHz)\n* `6g-205-6975-20` - 205 (6975/20 MHz)\n* `6g-207-6985-160` - 207 (6985/160 MHz)\n* `6g-209-6995-20` - 209 (6995/20 MHz)\n* `6g-211-7005-40` - 211 (7005/40 MHz)\n* `6g-213-7015-20` - 213 (7015/20 MHz)\n* `6g-215-7025-80` - 215 (7025/80 MHz)\n* `6g-217-7035-20` - 217 (7035/20 MHz)\n* `6g-219-7045-40` - 219 (7045/40 MHz)\n* `6g-221-7055-20` - 221 (7055/20 MHz)\n* `6g-225-7075-20` - 225 (7075/20 MHz)\n* `6g-227-7085-40` - 227 (7085/40 MHz)\n* `6g-229-7095-20` - 229 (7095/20 MHz)\n* `6g-233-7115-20` - 233 (7115/20 MHz)\n* `60g-1-58320-2160` - 1 (58.32/2.16 GHz)\n* `60g-2-60480-2160` - 2 (60.48/2.16 GHz)\n* `60g-3-62640-2160` - 3 (62.64/2.16 GHz)\n* `60g-4-64800-2160` - 4 (64.80/2.16 GHz)\n* `60g-5-66960-2160` - 5 (66.96/2.16 GHz)\n* `60g-6-69120-2160` - 6 (69.12/2.16 GHz)\n* `60g-9-59400-4320` - 9 (59.40/4.32 GHz)\n* `60g-10-61560-4320` - 10 (61.56/4.32 GHz)\n* `60g-11-63720-4320` - 11 (63.72/4.32 GHz)\n* `60g-12-65880-4320` - 12 (65.88/4.32 GHz)\n* `60g-13-68040-4320` - 13 (68.04/4.32 GHz)\n* `60g-17-60480-6480` - 17 (60.48/6.48 GHz)\n* `60g-18-62640-6480` - 18 (62.64/6.48 GHz)\n* `60g-19-64800-6480` - 19 (64.80/6.48 GHz)\n* `60g-20-66960-6480` - 20 (66.96/6.48 GHz)\n* `60g-25-61560-6480` - 25 (61.56/8.64 GHz)\n* `60g-26-63720-6480` - 26 (63.72/8.64 GHz)\n* `60g-27-65880-6480` - 27 (65.88/8.64 GHz)",
+ "x-spec-enum-id": "aac33cc237adc8f9",
+ "nullable": true,
+ "title": "Wireless channel"
+ },
+ "poe_mode": {
+ "enum": [
+ "pd",
+ "pse",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `pd` - PD\n* `pse` - PSE",
+ "x-spec-enum-id": "2f2fe6dcdc7772bd",
+ "nullable": true
+ },
+ "poe_type": {
+ "enum": [
+ "type1-ieee802.3af",
+ "type2-ieee802.3at",
+ "type3-ieee802.3bt",
+ "type4-ieee802.3bt",
+ "passive-24v-2pair",
+ "passive-24v-4pair",
+ "passive-48v-2pair",
+ "passive-48v-4pair",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `type1-ieee802.3af` - 802.3af (Type 1)\n* `type2-ieee802.3at` - 802.3at (Type 2)\n* `type3-ieee802.3bt` - 802.3bt (Type 3)\n* `type4-ieee802.3bt` - 802.3bt (Type 4)\n* `passive-24v-2pair` - Passive 24V (2-pair)\n* `passive-24v-4pair` - Passive 24V (4-pair)\n* `passive-48v-2pair` - Passive 48V (2-pair)\n* `passive-48v-4pair` - Passive 48V (4-pair)",
+ "x-spec-enum-id": "74bd3be4012f6da9",
+ "nullable": true
+ },
+ "rf_channel_frequency": {
+ "type": "number",
+ "format": "double",
+ "maximum": 100000,
+ "minimum": -100000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "title": "Channel frequency (MHz)",
+ "description": "Populated by selected channel (if set)"
+ },
+ "rf_channel_width": {
+ "type": "number",
+ "format": "double",
+ "maximum": 10000,
+ "minimum": -10000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "title": "Channel width (MHz)",
+ "description": "Populated by selected channel (if set)"
+ },
+ "tx_power": {
+ "type": "integer",
+ "maximum": 127,
+ "minimum": -40,
+ "nullable": true,
+ "title": "Transmit power (dBm)"
+ },
+ "untagged_vlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tagged_vlans": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "qinq_svlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vlan_translation_policy": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANTranslationPolicyRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "wireless_lans": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "vrf": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRFRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name",
+ "type"
+ ]
+ },
+ "WritableInterfaceTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "virtual",
+ "bridge",
+ "lag",
+ "100base-fx",
+ "100base-lfx",
+ "100base-tx",
+ "100base-t1",
+ "1000base-t",
+ "1000base-sx",
+ "1000base-lx",
+ "1000base-tx",
+ "2.5gbase-t",
+ "5gbase-t",
+ "10gbase-t",
+ "10gbase-cx4",
+ "100base-x-sfp",
+ "1000base-x-gbic",
+ "1000base-x-sfp",
+ "10gbase-x-sfpp",
+ "10gbase-x-xfp",
+ "10gbase-x-xenpak",
+ "10gbase-x-x2",
+ "25gbase-x-sfp28",
+ "50gbase-x-sfp56",
+ "40gbase-x-qsfpp",
+ "50gbase-x-sfp28",
+ "100gbase-x-cfp",
+ "100gbase-x-cfp2",
+ "200gbase-x-cfp2",
+ "400gbase-x-cfp2",
+ "100gbase-x-cfp4",
+ "100gbase-x-cxp",
+ "100gbase-x-cpak",
+ "100gbase-x-dsfp",
+ "100gbase-x-sfpdd",
+ "100gbase-x-qsfp28",
+ "100gbase-x-qsfpdd",
+ "200gbase-x-qsfp56",
+ "200gbase-x-qsfpdd",
+ "400gbase-x-qsfp112",
+ "400gbase-x-qsfpdd",
+ "400gbase-x-osfp",
+ "400gbase-x-osfp-rhs",
+ "400gbase-x-cdfp",
+ "400gbase-x-cfp8",
+ "800gbase-x-qsfpdd",
+ "800gbase-x-osfp",
+ "1000base-kx",
+ "2.5gbase-kx",
+ "5gbase-kr",
+ "10gbase-kr",
+ "10gbase-kx4",
+ "25gbase-kr",
+ "40gbase-kr4",
+ "50gbase-kr",
+ "100gbase-kp4",
+ "100gbase-kr2",
+ "100gbase-kr4",
+ "ieee802.11a",
+ "ieee802.11g",
+ "ieee802.11n",
+ "ieee802.11ac",
+ "ieee802.11ad",
+ "ieee802.11ax",
+ "ieee802.11ay",
+ "ieee802.11be",
+ "ieee802.15.1",
+ "ieee802.15.4",
+ "other-wireless",
+ "gsm",
+ "cdma",
+ "lte",
+ "4g",
+ "5g",
+ "sonet-oc3",
+ "sonet-oc12",
+ "sonet-oc48",
+ "sonet-oc192",
+ "sonet-oc768",
+ "sonet-oc1920",
+ "sonet-oc3840",
+ "1gfc-sfp",
+ "2gfc-sfp",
+ "4gfc-sfp",
+ "8gfc-sfpp",
+ "16gfc-sfpp",
+ "32gfc-sfp28",
+ "32gfc-sfpp",
+ "64gfc-qsfpp",
+ "64gfc-sfpdd",
+ "64gfc-sfpp",
+ "128gfc-qsfp28",
+ "infiniband-sdr",
+ "infiniband-ddr",
+ "infiniband-qdr",
+ "infiniband-fdr10",
+ "infiniband-fdr",
+ "infiniband-edr",
+ "infiniband-hdr",
+ "infiniband-ndr",
+ "infiniband-xdr",
+ "t1",
+ "e1",
+ "t3",
+ "e3",
+ "xdsl",
+ "docsis",
+ "moca",
+ "bpon",
+ "epon",
+ "10g-epon",
+ "gpon",
+ "xg-pon",
+ "xgs-pon",
+ "ng-pon2",
+ "25g-pon",
+ "50g-pon",
+ "cisco-stackwise",
+ "cisco-stackwise-plus",
+ "cisco-flexstack",
+ "cisco-flexstack-plus",
+ "cisco-stackwise-80",
+ "cisco-stackwise-160",
+ "cisco-stackwise-320",
+ "cisco-stackwise-480",
+ "cisco-stackwise-1t",
+ "juniper-vcp",
+ "extreme-summitstack",
+ "extreme-summitstack-128",
+ "extreme-summitstack-256",
+ "extreme-summitstack-512",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `virtual` - Virtual\n* `bridge` - Bridge\n* `lag` - Link Aggregation Group (LAG)\n* `100base-fx` - 100BASE-FX (10/100ME FIBER)\n* `100base-lfx` - 100BASE-LFX (10/100ME FIBER)\n* `100base-tx` - 100BASE-TX (10/100ME)\n* `100base-t1` - 100BASE-T1 (10/100ME Single Pair)\n* `1000base-t` - 1000BASE-T (1GE)\n* `1000base-sx` - 1000BASE-SX (1GE)\n* `1000base-lx` - 1000BASE-LX (1GE)\n* `1000base-tx` - 1000BASE-TX (1GE)\n* `2.5gbase-t` - 2.5GBASE-T (2.5GE)\n* `5gbase-t` - 5GBASE-T (5GE)\n* `10gbase-t` - 10GBASE-T (10GE)\n* `10gbase-cx4` - 10GBASE-CX4 (10GE)\n* `100base-x-sfp` - SFP (100ME)\n* `1000base-x-gbic` - GBIC (1GE)\n* `1000base-x-sfp` - SFP (1GE)\n* `10gbase-x-sfpp` - SFP+ (10GE)\n* `10gbase-x-xfp` - XFP (10GE)\n* `10gbase-x-xenpak` - XENPAK (10GE)\n* `10gbase-x-x2` - X2 (10GE)\n* `25gbase-x-sfp28` - SFP28 (25GE)\n* `50gbase-x-sfp56` - SFP56 (50GE)\n* `40gbase-x-qsfpp` - QSFP+ (40GE)\n* `50gbase-x-sfp28` - QSFP28 (50GE)\n* `100gbase-x-cfp` - CFP (100GE)\n* `100gbase-x-cfp2` - CFP2 (100GE)\n* `200gbase-x-cfp2` - CFP2 (200GE)\n* `400gbase-x-cfp2` - CFP2 (400GE)\n* `100gbase-x-cfp4` - CFP4 (100GE)\n* `100gbase-x-cxp` - CXP (100GE)\n* `100gbase-x-cpak` - Cisco CPAK (100GE)\n* `100gbase-x-dsfp` - DSFP (100GE)\n* `100gbase-x-sfpdd` - SFP-DD (100GE)\n* `100gbase-x-qsfp28` - QSFP28 (100GE)\n* `100gbase-x-qsfpdd` - QSFP-DD (100GE)\n* `200gbase-x-qsfp56` - QSFP56 (200GE)\n* `200gbase-x-qsfpdd` - QSFP-DD (200GE)\n* `400gbase-x-qsfp112` - QSFP112 (400GE)\n* `400gbase-x-qsfpdd` - QSFP-DD (400GE)\n* `400gbase-x-osfp` - OSFP (400GE)\n* `400gbase-x-osfp-rhs` - OSFP-RHS (400GE)\n* `400gbase-x-cdfp` - CDFP (400GE)\n* `400gbase-x-cfp8` - CPF8 (400GE)\n* `800gbase-x-qsfpdd` - QSFP-DD (800GE)\n* `800gbase-x-osfp` - OSFP (800GE)\n* `1000base-kx` - 1000BASE-KX (1GE)\n* `2.5gbase-kx` - 2.5GBASE-KX (2.5GE)\n* `5gbase-kr` - 5GBASE-KR (5GE)\n* `10gbase-kr` - 10GBASE-KR (10GE)\n* `10gbase-kx4` - 10GBASE-KX4 (10GE)\n* `25gbase-kr` - 25GBASE-KR (25GE)\n* `40gbase-kr4` - 40GBASE-KR4 (40GE)\n* `50gbase-kr` - 50GBASE-KR (50GE)\n* `100gbase-kp4` - 100GBASE-KP4 (100GE)\n* `100gbase-kr2` - 100GBASE-KR2 (100GE)\n* `100gbase-kr4` - 100GBASE-KR4 (100GE)\n* `ieee802.11a` - IEEE 802.11a\n* `ieee802.11g` - IEEE 802.11b/g\n* `ieee802.11n` - IEEE 802.11n\n* `ieee802.11ac` - IEEE 802.11ac\n* `ieee802.11ad` - IEEE 802.11ad\n* `ieee802.11ax` - IEEE 802.11ax\n* `ieee802.11ay` - IEEE 802.11ay\n* `ieee802.11be` - IEEE 802.11be\n* `ieee802.15.1` - IEEE 802.15.1 (Bluetooth)\n* `ieee802.15.4` - IEEE 802.15.4 (LR-WPAN)\n* `other-wireless` - Other (Wireless)\n* `gsm` - GSM\n* `cdma` - CDMA\n* `lte` - LTE\n* `4g` - 4G\n* `5g` - 5G\n* `sonet-oc3` - OC-3/STM-1\n* `sonet-oc12` - OC-12/STM-4\n* `sonet-oc48` - OC-48/STM-16\n* `sonet-oc192` - OC-192/STM-64\n* `sonet-oc768` - OC-768/STM-256\n* `sonet-oc1920` - OC-1920/STM-640\n* `sonet-oc3840` - OC-3840/STM-1234\n* `1gfc-sfp` - SFP (1GFC)\n* `2gfc-sfp` - SFP (2GFC)\n* `4gfc-sfp` - SFP (4GFC)\n* `8gfc-sfpp` - SFP+ (8GFC)\n* `16gfc-sfpp` - SFP+ (16GFC)\n* `32gfc-sfp28` - SFP28 (32GFC)\n* `32gfc-sfpp` - SFP+ (32GFC)\n* `64gfc-qsfpp` - QSFP+ (64GFC)\n* `64gfc-sfpdd` - SFP-DD (64GFC)\n* `64gfc-sfpp` - SFP+ (64GFC)\n* `128gfc-qsfp28` - QSFP28 (128GFC)\n* `infiniband-sdr` - SDR (2 Gbps)\n* `infiniband-ddr` - DDR (4 Gbps)\n* `infiniband-qdr` - QDR (8 Gbps)\n* `infiniband-fdr10` - FDR10 (10 Gbps)\n* `infiniband-fdr` - FDR (13.5 Gbps)\n* `infiniband-edr` - EDR (25 Gbps)\n* `infiniband-hdr` - HDR (50 Gbps)\n* `infiniband-ndr` - NDR (100 Gbps)\n* `infiniband-xdr` - XDR (250 Gbps)\n* `t1` - T1 (1.544 Mbps)\n* `e1` - E1 (2.048 Mbps)\n* `t3` - T3 (45 Mbps)\n* `e3` - E3 (34 Mbps)\n* `xdsl` - xDSL\n* `docsis` - DOCSIS\n* `moca` - MoCA\n* `bpon` - BPON (622 Mbps / 155 Mbps)\n* `epon` - EPON (1 Gbps)\n* `10g-epon` - 10G-EPON (10 Gbps)\n* `gpon` - GPON (2.5 Gbps / 1.25 Gbps)\n* `xg-pon` - XG-PON (10 Gbps / 2.5 Gbps)\n* `xgs-pon` - XGS-PON (10 Gbps)\n* `ng-pon2` - NG-PON2 (TWDM-PON) (4x10 Gbps)\n* `25g-pon` - 25G-PON (25 Gbps)\n* `50g-pon` - 50G-PON (50 Gbps)\n* `cisco-stackwise` - Cisco StackWise\n* `cisco-stackwise-plus` - Cisco StackWise Plus\n* `cisco-flexstack` - Cisco FlexStack\n* `cisco-flexstack-plus` - Cisco FlexStack Plus\n* `cisco-stackwise-80` - Cisco StackWise-80\n* `cisco-stackwise-160` - Cisco StackWise-160\n* `cisco-stackwise-320` - Cisco StackWise-320\n* `cisco-stackwise-480` - Cisco StackWise-480\n* `cisco-stackwise-1t` - Cisco StackWise-1T\n* `juniper-vcp` - Juniper VCP\n* `extreme-summitstack` - Extreme SummitStack\n* `extreme-summitstack-128` - Extreme SummitStack-128\n* `extreme-summitstack-256` - Extreme SummitStack-256\n* `extreme-summitstack-512` - Extreme SummitStack-512\n* `other` - Other",
+ "x-spec-enum-id": "8c4c5e112f77a383"
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "mgmt_only": {
+ "type": "boolean",
+ "title": "Management only"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "bridge": {
+ "type": "integer",
+ "nullable": true,
+ "title": "Bridge interface"
+ },
+ "poe_mode": {
+ "enum": [
+ "pd",
+ "pse",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `pd` - PD\n* `pse` - PSE",
+ "x-spec-enum-id": "2f2fe6dcdc7772bd",
+ "nullable": true
+ },
+ "poe_type": {
+ "enum": [
+ "type1-ieee802.3af",
+ "type2-ieee802.3at",
+ "type3-ieee802.3bt",
+ "type4-ieee802.3bt",
+ "passive-24v-2pair",
+ "passive-24v-4pair",
+ "passive-48v-2pair",
+ "passive-48v-4pair",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `type1-ieee802.3af` - 802.3af (Type 1)\n* `type2-ieee802.3at` - 802.3at (Type 2)\n* `type3-ieee802.3bt` - 802.3bt (Type 3)\n* `type4-ieee802.3bt` - 802.3bt (Type 4)\n* `passive-24v-2pair` - Passive 24V (2-pair)\n* `passive-24v-4pair` - Passive 24V (4-pair)\n* `passive-48v-2pair` - Passive 48V (2-pair)\n* `passive-48v-4pair` - Passive 48V (4-pair)",
+ "x-spec-enum-id": "74bd3be4012f6da9",
+ "nullable": true
+ },
+ "rf_role": {
+ "enum": [
+ "ap",
+ "station",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `ap` - Access point\n* `station` - Station",
+ "x-spec-enum-id": "d2772dbea88b0fb1",
+ "nullable": true,
+ "title": "Wireless role"
+ }
+ },
+ "required": [
+ "name",
+ "type"
+ ]
+ },
+ "WritableInventoryItemRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "status": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "2217e87d0c3efdda"
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefInventoryItemRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "part_id": {
+ "type": "string",
+ "description": "Manufacturer-assigned part identifier",
+ "maxLength": 50
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this item",
+ "maxLength": 50
+ },
+ "discovered": {
+ "type": "boolean",
+ "description": "This item was automatically discovered"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "component_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "component_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name"
+ ]
+ },
+ "WritableJournalEntryRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "assigned_object_type": {
+ "type": "string"
+ },
+ "assigned_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "created_by": {
+ "type": "integer",
+ "nullable": true
+ },
+ "kind": {
+ "enum": [
+ "info",
+ "success",
+ "warning",
+ "danger"
+ ],
+ "type": "string",
+ "description": "* `info` - Info\n* `success` - Success\n* `warning` - Warning\n* `danger` - Danger",
+ "x-spec-enum-id": "a21af280f632fa34"
+ },
+ "comments": {
+ "type": "string",
+ "minLength": 1
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "assigned_object_id",
+ "assigned_object_type",
+ "comments"
+ ]
+ },
+ "WritableL2VPNRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "identifier": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": -9223372036854775808,
+ "format": "int64",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "type": {
+ "enum": [
+ "vpws",
+ "vpls",
+ "vxlan",
+ "vxlan-evpn",
+ "mpls-evpn",
+ "pbb-evpn",
+ "evpn-vpws",
+ "epl",
+ "evpl",
+ "ep-lan",
+ "evp-lan",
+ "ep-tree",
+ "evp-tree",
+ "spb"
+ ],
+ "type": "string",
+ "description": "* `vpws` - VPWS\n* `vpls` - VPLS\n* `vxlan` - VXLAN\n* `vxlan-evpn` - VXLAN-EVPN\n* `mpls-evpn` - MPLS EVPN\n* `pbb-evpn` - PBB EVPN\n* `evpn-vpws` - EVPN VPWS\n* `epl` - EPL\n* `evpl` - EVPL\n* `ep-lan` - Ethernet Private LAN\n* `evp-lan` - Ethernet Virtual Private LAN\n* `ep-tree` - Ethernet Private Tree\n* `evp-tree` - Ethernet Virtual Private Tree\n* `spb` - SPB",
+ "x-spec-enum-id": "730136816a2885f9"
+ },
+ "status": {
+ "enum": [
+ "active",
+ "planned",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `planned` - Planned\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "937bacafb9d5d4bb"
+ },
+ "import_targets": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "export_targets": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug",
+ "type"
+ ]
+ },
+ "WritableLocationRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ]
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "staging",
+ "active",
+ "decommissioning",
+ "retired"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `staging` - Staging\n* `active` - Active\n* `decommissioning` - Decommissioning\n* `retired` - Retired",
+ "x-spec-enum-id": "e363a8ddb138be50"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "facility": {
+ "type": "string",
+ "description": "Local facility ID or description",
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "site",
+ "slug"
+ ]
+ },
+ "WritableModuleRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module_bay": {
+ "type": "integer"
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ]
+ },
+ "status": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "2217e87d0c3efdda"
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this device",
+ "maxLength": 50
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "module_bay",
+ "module_type"
+ ]
+ },
+ "WritableModuleTypeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "profile": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeProfileRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "part_number": {
+ "type": "string",
+ "description": "Discrete part number (optional)",
+ "maxLength": 50
+ },
+ "airflow": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ "left-to-right",
+ "right-to-left",
+ "side-to-rear",
+ "passive",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front\n* `left-to-right` - Left to right\n* `right-to-left` - Right to left\n* `side-to-rear` - Side to rear\n* `passive` - Passive",
+ "x-spec-enum-id": "f6e5562e0e98d69d",
+ "nullable": true
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "weight_unit": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "attributes": {
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "manufacturer",
+ "model"
+ ]
+ },
+ "WritablePlatformRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "config_template": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplateRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "WritablePowerFeedRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "power_panel": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefPowerPanelRequest"
+ }
+ ]
+ },
+ "rack": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRackRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "status": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "failed"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `failed` - Failed",
+ "x-spec-enum-id": "b77fc919138c12f6"
+ },
+ "type": {
+ "enum": [
+ "primary",
+ "redundant"
+ ],
+ "type": "string",
+ "description": "* `primary` - Primary\n* `redundant` - Redundant",
+ "x-spec-enum-id": "093a164236819eb8"
+ },
+ "supply": {
+ "enum": [
+ "ac",
+ "dc"
+ ],
+ "type": "string",
+ "description": "* `ac` - AC\n* `dc` - DC",
+ "x-spec-enum-id": "1b6d99616ca6412b"
+ },
+ "phase": {
+ "enum": [
+ "single-phase",
+ "three-phase"
+ ],
+ "type": "string",
+ "description": "* `single-phase` - Single phase\n* `three-phase` - Three-phase",
+ "x-spec-enum-id": "994bc0696f4df57f"
+ },
+ "voltage": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": -32768
+ },
+ "amperage": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 1
+ },
+ "max_utilization": {
+ "type": "integer",
+ "maximum": 100,
+ "minimum": 1,
+ "description": "Maximum permissible draw (percentage)"
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "power_panel"
+ ]
+ },
+ "WritablePowerOutletRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "iec-60320-c5",
+ "iec-60320-c7",
+ "iec-60320-c13",
+ "iec-60320-c15",
+ "iec-60320-c17",
+ "iec-60320-c19",
+ "iec-60320-c21",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15r",
+ "nema-5-15r",
+ "nema-5-20r",
+ "nema-5-30r",
+ "nema-5-50r",
+ "nema-6-15r",
+ "nema-6-20r",
+ "nema-6-30r",
+ "nema-6-50r",
+ "nema-10-30r",
+ "nema-10-50r",
+ "nema-14-20r",
+ "nema-14-30r",
+ "nema-14-50r",
+ "nema-14-60r",
+ "nema-15-15r",
+ "nema-15-20r",
+ "nema-15-30r",
+ "nema-15-50r",
+ "nema-15-60r",
+ "nema-l1-15r",
+ "nema-l5-15r",
+ "nema-l5-20r",
+ "nema-l5-30r",
+ "nema-l5-50r",
+ "nema-l6-15r",
+ "nema-l6-20r",
+ "nema-l6-30r",
+ "nema-l6-50r",
+ "nema-l10-30r",
+ "nema-l14-20r",
+ "nema-l14-30r",
+ "nema-l14-50r",
+ "nema-l14-60r",
+ "nema-l15-20r",
+ "nema-l15-30r",
+ "nema-l15-50r",
+ "nema-l15-60r",
+ "nema-l21-20r",
+ "nema-l21-30r",
+ "nema-l22-20r",
+ "nema-l22-30r",
+ "CS6360C",
+ "CS6364C",
+ "CS8164C",
+ "CS8264C",
+ "CS8364C",
+ "CS8464C",
+ "ita-e",
+ "ita-f",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "ita-multistandard",
+ "usb-a",
+ "usb-micro-b",
+ "usb-c",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "eaton-c39",
+ "hdot-cx",
+ "saf-d-grid",
+ "neutrik-powercon-20a",
+ "neutrik-powercon-32a",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "8f9617d2648ab261",
+ "nullable": true,
+ "description": "Physical port type\n\n* `iec-60320-c5` - C5\n* `iec-60320-c7` - C7\n* `iec-60320-c13` - C13\n* `iec-60320-c15` - C15\n* `iec-60320-c17` - C17\n* `iec-60320-c19` - C19\n* `iec-60320-c21` - C21\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15r` - NEMA 1-15R\n* `nema-5-15r` - NEMA 5-15R\n* `nema-5-20r` - NEMA 5-20R\n* `nema-5-30r` - NEMA 5-30R\n* `nema-5-50r` - NEMA 5-50R\n* `nema-6-15r` - NEMA 6-15R\n* `nema-6-20r` - NEMA 6-20R\n* `nema-6-30r` - NEMA 6-30R\n* `nema-6-50r` - NEMA 6-50R\n* `nema-10-30r` - NEMA 10-30R\n* `nema-10-50r` - NEMA 10-50R\n* `nema-14-20r` - NEMA 14-20R\n* `nema-14-30r` - NEMA 14-30R\n* `nema-14-50r` - NEMA 14-50R\n* `nema-14-60r` - NEMA 14-60R\n* `nema-15-15r` - NEMA 15-15R\n* `nema-15-20r` - NEMA 15-20R\n* `nema-15-30r` - NEMA 15-30R\n* `nema-15-50r` - NEMA 15-50R\n* `nema-15-60r` - NEMA 15-60R\n* `nema-l1-15r` - NEMA L1-15R\n* `nema-l5-15r` - NEMA L5-15R\n* `nema-l5-20r` - NEMA L5-20R\n* `nema-l5-30r` - NEMA L5-30R\n* `nema-l5-50r` - NEMA L5-50R\n* `nema-l6-15r` - NEMA L6-15R\n* `nema-l6-20r` - NEMA L6-20R\n* `nema-l6-30r` - NEMA L6-30R\n* `nema-l6-50r` - NEMA L6-50R\n* `nema-l10-30r` - NEMA L10-30R\n* `nema-l14-20r` - NEMA L14-20R\n* `nema-l14-30r` - NEMA L14-30R\n* `nema-l14-50r` - NEMA L14-50R\n* `nema-l14-60r` - NEMA L14-60R\n* `nema-l15-20r` - NEMA L15-20R\n* `nema-l15-30r` - NEMA L15-30R\n* `nema-l15-50r` - NEMA L15-50R\n* `nema-l15-60r` - NEMA L15-60R\n* `nema-l21-20r` - NEMA L21-20R\n* `nema-l21-30r` - NEMA L21-30R\n* `nema-l22-20r` - NEMA L22-20R\n* `nema-l22-30r` - NEMA L22-30R\n* `CS6360C` - CS6360C\n* `CS6364C` - CS6364C\n* `CS8164C` - CS8164C\n* `CS8264C` - CS8264C\n* `CS8364C` - CS8364C\n* `CS8464C` - CS8464C\n* `ita-e` - ITA Type E (CEE 7/5)\n* `ita-f` - ITA Type F (CEE 7/3)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `ita-multistandard` - ITA Multistandard\n* `usb-a` - USB Type A\n* `usb-micro-b` - USB Micro B\n* `usb-c` - USB Type C\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `eaton-c39` - Eaton C39\n* `hdot-cx` - HDOT Cx\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20a` - Neutrik powerCON (20A)\n* `neutrik-powercon-32a` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other"
+ },
+ "status": {
+ "enum": [
+ "enabled",
+ "disabled",
+ "faulty"
+ ],
+ "type": "string",
+ "description": "* `enabled` - Enabled\n* `disabled` - Disabled\n* `faulty` - Faulty",
+ "x-spec-enum-id": "1024f7deaed962d7"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "power_port": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPowerPortRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "feed_leg": {
+ "enum": [
+ "A",
+ "B",
+ "C",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "a4902339df0b7c06",
+ "nullable": true,
+ "description": "Phase (for three-phase feeds)\n\n* `A` - A\n* `B` - B\n* `C` - C"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name"
+ ]
+ },
+ "WritablePowerOutletTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "iec-60320-c5",
+ "iec-60320-c7",
+ "iec-60320-c13",
+ "iec-60320-c15",
+ "iec-60320-c17",
+ "iec-60320-c19",
+ "iec-60320-c21",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15r",
+ "nema-5-15r",
+ "nema-5-20r",
+ "nema-5-30r",
+ "nema-5-50r",
+ "nema-6-15r",
+ "nema-6-20r",
+ "nema-6-30r",
+ "nema-6-50r",
+ "nema-10-30r",
+ "nema-10-50r",
+ "nema-14-20r",
+ "nema-14-30r",
+ "nema-14-50r",
+ "nema-14-60r",
+ "nema-15-15r",
+ "nema-15-20r",
+ "nema-15-30r",
+ "nema-15-50r",
+ "nema-15-60r",
+ "nema-l1-15r",
+ "nema-l5-15r",
+ "nema-l5-20r",
+ "nema-l5-30r",
+ "nema-l5-50r",
+ "nema-l6-15r",
+ "nema-l6-20r",
+ "nema-l6-30r",
+ "nema-l6-50r",
+ "nema-l10-30r",
+ "nema-l14-20r",
+ "nema-l14-30r",
+ "nema-l14-50r",
+ "nema-l14-60r",
+ "nema-l15-20r",
+ "nema-l15-30r",
+ "nema-l15-50r",
+ "nema-l15-60r",
+ "nema-l21-20r",
+ "nema-l21-30r",
+ "nema-l22-20r",
+ "nema-l22-30r",
+ "CS6360C",
+ "CS6364C",
+ "CS8164C",
+ "CS8264C",
+ "CS8364C",
+ "CS8464C",
+ "ita-e",
+ "ita-f",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "ita-multistandard",
+ "usb-a",
+ "usb-micro-b",
+ "usb-c",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "eaton-c39",
+ "hdot-cx",
+ "saf-d-grid",
+ "neutrik-powercon-20a",
+ "neutrik-powercon-32a",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `iec-60320-c5` - C5\n* `iec-60320-c7` - C7\n* `iec-60320-c13` - C13\n* `iec-60320-c15` - C15\n* `iec-60320-c17` - C17\n* `iec-60320-c19` - C19\n* `iec-60320-c21` - C21\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15r` - NEMA 1-15R\n* `nema-5-15r` - NEMA 5-15R\n* `nema-5-20r` - NEMA 5-20R\n* `nema-5-30r` - NEMA 5-30R\n* `nema-5-50r` - NEMA 5-50R\n* `nema-6-15r` - NEMA 6-15R\n* `nema-6-20r` - NEMA 6-20R\n* `nema-6-30r` - NEMA 6-30R\n* `nema-6-50r` - NEMA 6-50R\n* `nema-10-30r` - NEMA 10-30R\n* `nema-10-50r` - NEMA 10-50R\n* `nema-14-20r` - NEMA 14-20R\n* `nema-14-30r` - NEMA 14-30R\n* `nema-14-50r` - NEMA 14-50R\n* `nema-14-60r` - NEMA 14-60R\n* `nema-15-15r` - NEMA 15-15R\n* `nema-15-20r` - NEMA 15-20R\n* `nema-15-30r` - NEMA 15-30R\n* `nema-15-50r` - NEMA 15-50R\n* `nema-15-60r` - NEMA 15-60R\n* `nema-l1-15r` - NEMA L1-15R\n* `nema-l5-15r` - NEMA L5-15R\n* `nema-l5-20r` - NEMA L5-20R\n* `nema-l5-30r` - NEMA L5-30R\n* `nema-l5-50r` - NEMA L5-50R\n* `nema-l6-15r` - NEMA L6-15R\n* `nema-l6-20r` - NEMA L6-20R\n* `nema-l6-30r` - NEMA L6-30R\n* `nema-l6-50r` - NEMA L6-50R\n* `nema-l10-30r` - NEMA L10-30R\n* `nema-l14-20r` - NEMA L14-20R\n* `nema-l14-30r` - NEMA L14-30R\n* `nema-l14-50r` - NEMA L14-50R\n* `nema-l14-60r` - NEMA L14-60R\n* `nema-l15-20r` - NEMA L15-20R\n* `nema-l15-30r` - NEMA L15-30R\n* `nema-l15-50r` - NEMA L15-50R\n* `nema-l15-60r` - NEMA L15-60R\n* `nema-l21-20r` - NEMA L21-20R\n* `nema-l21-30r` - NEMA L21-30R\n* `nema-l22-20r` - NEMA L22-20R\n* `nema-l22-30r` - NEMA L22-30R\n* `CS6360C` - CS6360C\n* `CS6364C` - CS6364C\n* `CS8164C` - CS8164C\n* `CS8264C` - CS8264C\n* `CS8364C` - CS8364C\n* `CS8464C` - CS8464C\n* `ita-e` - ITA Type E (CEE 7/5)\n* `ita-f` - ITA Type F (CEE 7/3)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `ita-multistandard` - ITA Multistandard\n* `usb-a` - USB Type A\n* `usb-micro-b` - USB Micro B\n* `usb-c` - USB Type C\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `eaton-c39` - Eaton C39\n* `hdot-cx` - HDOT Cx\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20a` - Neutrik powerCON (20A)\n* `neutrik-powercon-32a` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other",
+ "x-spec-enum-id": "8f9617d2648ab261",
+ "nullable": true
+ },
+ "power_port": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPowerPortTemplateRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "feed_leg": {
+ "enum": [
+ "A",
+ "B",
+ "C",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "a4902339df0b7c06",
+ "nullable": true,
+ "description": "Phase (for three-phase feeds)\n\n* `A` - A\n* `B` - B\n* `C` - C"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "WritablePowerPortRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "iec-60320-c6",
+ "iec-60320-c8",
+ "iec-60320-c14",
+ "iec-60320-c16",
+ "iec-60320-c18",
+ "iec-60320-c20",
+ "iec-60320-c22",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15p",
+ "nema-5-15p",
+ "nema-5-20p",
+ "nema-5-30p",
+ "nema-5-50p",
+ "nema-6-15p",
+ "nema-6-20p",
+ "nema-6-30p",
+ "nema-6-50p",
+ "nema-10-30p",
+ "nema-10-50p",
+ "nema-14-20p",
+ "nema-14-30p",
+ "nema-14-50p",
+ "nema-14-60p",
+ "nema-15-15p",
+ "nema-15-20p",
+ "nema-15-30p",
+ "nema-15-50p",
+ "nema-15-60p",
+ "nema-l1-15p",
+ "nema-l5-15p",
+ "nema-l5-20p",
+ "nema-l5-30p",
+ "nema-l5-50p",
+ "nema-l6-15p",
+ "nema-l6-20p",
+ "nema-l6-30p",
+ "nema-l6-50p",
+ "nema-l10-30p",
+ "nema-l14-20p",
+ "nema-l14-30p",
+ "nema-l14-50p",
+ "nema-l14-60p",
+ "nema-l15-20p",
+ "nema-l15-30p",
+ "nema-l15-50p",
+ "nema-l15-60p",
+ "nema-l21-20p",
+ "nema-l21-30p",
+ "nema-l22-20p",
+ "nema-l22-30p",
+ "cs6361c",
+ "cs6365c",
+ "cs8165c",
+ "cs8265c",
+ "cs8365c",
+ "cs8465c",
+ "ita-c",
+ "ita-e",
+ "ita-f",
+ "ita-ef",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "usb-3-b",
+ "usb-3-micro-b",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "saf-d-grid",
+ "neutrik-powercon-20",
+ "neutrik-powercon-32",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "292850be2c08f7df",
+ "nullable": true,
+ "description": "Physical port type\n\n* `iec-60320-c6` - C6\n* `iec-60320-c8` - C8\n* `iec-60320-c14` - C14\n* `iec-60320-c16` - C16\n* `iec-60320-c18` - C18\n* `iec-60320-c20` - C20\n* `iec-60320-c22` - C22\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15p` - NEMA 1-15P\n* `nema-5-15p` - NEMA 5-15P\n* `nema-5-20p` - NEMA 5-20P\n* `nema-5-30p` - NEMA 5-30P\n* `nema-5-50p` - NEMA 5-50P\n* `nema-6-15p` - NEMA 6-15P\n* `nema-6-20p` - NEMA 6-20P\n* `nema-6-30p` - NEMA 6-30P\n* `nema-6-50p` - NEMA 6-50P\n* `nema-10-30p` - NEMA 10-30P\n* `nema-10-50p` - NEMA 10-50P\n* `nema-14-20p` - NEMA 14-20P\n* `nema-14-30p` - NEMA 14-30P\n* `nema-14-50p` - NEMA 14-50P\n* `nema-14-60p` - NEMA 14-60P\n* `nema-15-15p` - NEMA 15-15P\n* `nema-15-20p` - NEMA 15-20P\n* `nema-15-30p` - NEMA 15-30P\n* `nema-15-50p` - NEMA 15-50P\n* `nema-15-60p` - NEMA 15-60P\n* `nema-l1-15p` - NEMA L1-15P\n* `nema-l5-15p` - NEMA L5-15P\n* `nema-l5-20p` - NEMA L5-20P\n* `nema-l5-30p` - NEMA L5-30P\n* `nema-l5-50p` - NEMA L5-50P\n* `nema-l6-15p` - NEMA L6-15P\n* `nema-l6-20p` - NEMA L6-20P\n* `nema-l6-30p` - NEMA L6-30P\n* `nema-l6-50p` - NEMA L6-50P\n* `nema-l10-30p` - NEMA L10-30P\n* `nema-l14-20p` - NEMA L14-20P\n* `nema-l14-30p` - NEMA L14-30P\n* `nema-l14-50p` - NEMA L14-50P\n* `nema-l14-60p` - NEMA L14-60P\n* `nema-l15-20p` - NEMA L15-20P\n* `nema-l15-30p` - NEMA L15-30P\n* `nema-l15-50p` - NEMA L15-50P\n* `nema-l15-60p` - NEMA L15-60P\n* `nema-l21-20p` - NEMA L21-20P\n* `nema-l21-30p` - NEMA L21-30P\n* `nema-l22-20p` - NEMA L22-20P\n* `nema-l22-30p` - NEMA L22-30P\n* `cs6361c` - CS6361C\n* `cs6365c` - CS6365C\n* `cs8165c` - CS8165C\n* `cs8265c` - CS8265C\n* `cs8365c` - CS8365C\n* `cs8465c` - CS8465C\n* `ita-c` - ITA Type C (CEE 7/16)\n* `ita-e` - ITA Type E (CEE 7/6)\n* `ita-f` - ITA Type F (CEE 7/4)\n* `ita-ef` - ITA Type E/F (CEE 7/7)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `usb-3-b` - USB 3.0 Type B\n* `usb-3-micro-b` - USB 3.0 Micro B\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20` - Neutrik powerCON (20A)\n* `neutrik-powercon-32` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other"
+ },
+ "maximum_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Maximum power draw (watts)"
+ },
+ "allocated_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Allocated power draw (watts)"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name"
+ ]
+ },
+ "WritablePowerPortTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "iec-60320-c6",
+ "iec-60320-c8",
+ "iec-60320-c14",
+ "iec-60320-c16",
+ "iec-60320-c18",
+ "iec-60320-c20",
+ "iec-60320-c22",
+ "iec-60309-p-n-e-4h",
+ "iec-60309-p-n-e-6h",
+ "iec-60309-p-n-e-9h",
+ "iec-60309-2p-e-4h",
+ "iec-60309-2p-e-6h",
+ "iec-60309-2p-e-9h",
+ "iec-60309-3p-e-4h",
+ "iec-60309-3p-e-6h",
+ "iec-60309-3p-e-9h",
+ "iec-60309-3p-n-e-4h",
+ "iec-60309-3p-n-e-6h",
+ "iec-60309-3p-n-e-9h",
+ "iec-60906-1",
+ "nbr-14136-10a",
+ "nbr-14136-20a",
+ "nema-1-15p",
+ "nema-5-15p",
+ "nema-5-20p",
+ "nema-5-30p",
+ "nema-5-50p",
+ "nema-6-15p",
+ "nema-6-20p",
+ "nema-6-30p",
+ "nema-6-50p",
+ "nema-10-30p",
+ "nema-10-50p",
+ "nema-14-20p",
+ "nema-14-30p",
+ "nema-14-50p",
+ "nema-14-60p",
+ "nema-15-15p",
+ "nema-15-20p",
+ "nema-15-30p",
+ "nema-15-50p",
+ "nema-15-60p",
+ "nema-l1-15p",
+ "nema-l5-15p",
+ "nema-l5-20p",
+ "nema-l5-30p",
+ "nema-l5-50p",
+ "nema-l6-15p",
+ "nema-l6-20p",
+ "nema-l6-30p",
+ "nema-l6-50p",
+ "nema-l10-30p",
+ "nema-l14-20p",
+ "nema-l14-30p",
+ "nema-l14-50p",
+ "nema-l14-60p",
+ "nema-l15-20p",
+ "nema-l15-30p",
+ "nema-l15-50p",
+ "nema-l15-60p",
+ "nema-l21-20p",
+ "nema-l21-30p",
+ "nema-l22-20p",
+ "nema-l22-30p",
+ "cs6361c",
+ "cs6365c",
+ "cs8165c",
+ "cs8265c",
+ "cs8365c",
+ "cs8465c",
+ "ita-c",
+ "ita-e",
+ "ita-f",
+ "ita-ef",
+ "ita-g",
+ "ita-h",
+ "ita-i",
+ "ita-j",
+ "ita-k",
+ "ita-l",
+ "ita-m",
+ "ita-n",
+ "ita-o",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "usb-3-b",
+ "usb-3-micro-b",
+ "molex-micro-fit-1x2",
+ "molex-micro-fit-2x2",
+ "molex-micro-fit-2x4",
+ "dc-terminal",
+ "saf-d-grid",
+ "neutrik-powercon-20",
+ "neutrik-powercon-32",
+ "neutrik-powercon-true1",
+ "neutrik-powercon-true1-top",
+ "ubiquiti-smartpower",
+ "hardwired",
+ "other",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `iec-60320-c6` - C6\n* `iec-60320-c8` - C8\n* `iec-60320-c14` - C14\n* `iec-60320-c16` - C16\n* `iec-60320-c18` - C18\n* `iec-60320-c20` - C20\n* `iec-60320-c22` - C22\n* `iec-60309-p-n-e-4h` - P+N+E 4H\n* `iec-60309-p-n-e-6h` - P+N+E 6H\n* `iec-60309-p-n-e-9h` - P+N+E 9H\n* `iec-60309-2p-e-4h` - 2P+E 4H\n* `iec-60309-2p-e-6h` - 2P+E 6H\n* `iec-60309-2p-e-9h` - 2P+E 9H\n* `iec-60309-3p-e-4h` - 3P+E 4H\n* `iec-60309-3p-e-6h` - 3P+E 6H\n* `iec-60309-3p-e-9h` - 3P+E 9H\n* `iec-60309-3p-n-e-4h` - 3P+N+E 4H\n* `iec-60309-3p-n-e-6h` - 3P+N+E 6H\n* `iec-60309-3p-n-e-9h` - 3P+N+E 9H\n* `iec-60906-1` - IEC 60906-1\n* `nbr-14136-10a` - 2P+T 10A (NBR 14136)\n* `nbr-14136-20a` - 2P+T 20A (NBR 14136)\n* `nema-1-15p` - NEMA 1-15P\n* `nema-5-15p` - NEMA 5-15P\n* `nema-5-20p` - NEMA 5-20P\n* `nema-5-30p` - NEMA 5-30P\n* `nema-5-50p` - NEMA 5-50P\n* `nema-6-15p` - NEMA 6-15P\n* `nema-6-20p` - NEMA 6-20P\n* `nema-6-30p` - NEMA 6-30P\n* `nema-6-50p` - NEMA 6-50P\n* `nema-10-30p` - NEMA 10-30P\n* `nema-10-50p` - NEMA 10-50P\n* `nema-14-20p` - NEMA 14-20P\n* `nema-14-30p` - NEMA 14-30P\n* `nema-14-50p` - NEMA 14-50P\n* `nema-14-60p` - NEMA 14-60P\n* `nema-15-15p` - NEMA 15-15P\n* `nema-15-20p` - NEMA 15-20P\n* `nema-15-30p` - NEMA 15-30P\n* `nema-15-50p` - NEMA 15-50P\n* `nema-15-60p` - NEMA 15-60P\n* `nema-l1-15p` - NEMA L1-15P\n* `nema-l5-15p` - NEMA L5-15P\n* `nema-l5-20p` - NEMA L5-20P\n* `nema-l5-30p` - NEMA L5-30P\n* `nema-l5-50p` - NEMA L5-50P\n* `nema-l6-15p` - NEMA L6-15P\n* `nema-l6-20p` - NEMA L6-20P\n* `nema-l6-30p` - NEMA L6-30P\n* `nema-l6-50p` - NEMA L6-50P\n* `nema-l10-30p` - NEMA L10-30P\n* `nema-l14-20p` - NEMA L14-20P\n* `nema-l14-30p` - NEMA L14-30P\n* `nema-l14-50p` - NEMA L14-50P\n* `nema-l14-60p` - NEMA L14-60P\n* `nema-l15-20p` - NEMA L15-20P\n* `nema-l15-30p` - NEMA L15-30P\n* `nema-l15-50p` - NEMA L15-50P\n* `nema-l15-60p` - NEMA L15-60P\n* `nema-l21-20p` - NEMA L21-20P\n* `nema-l21-30p` - NEMA L21-30P\n* `nema-l22-20p` - NEMA L22-20P\n* `nema-l22-30p` - NEMA L22-30P\n* `cs6361c` - CS6361C\n* `cs6365c` - CS6365C\n* `cs8165c` - CS8165C\n* `cs8265c` - CS8265C\n* `cs8365c` - CS8365C\n* `cs8465c` - CS8465C\n* `ita-c` - ITA Type C (CEE 7/16)\n* `ita-e` - ITA Type E (CEE 7/6)\n* `ita-f` - ITA Type F (CEE 7/4)\n* `ita-ef` - ITA Type E/F (CEE 7/7)\n* `ita-g` - ITA Type G (BS 1363)\n* `ita-h` - ITA Type H\n* `ita-i` - ITA Type I\n* `ita-j` - ITA Type J\n* `ita-k` - ITA Type K\n* `ita-l` - ITA Type L (CEI 23-50)\n* `ita-m` - ITA Type M (BS 546)\n* `ita-n` - ITA Type N\n* `ita-o` - ITA Type O\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `usb-3-b` - USB 3.0 Type B\n* `usb-3-micro-b` - USB 3.0 Micro B\n* `molex-micro-fit-1x2` - Molex Micro-Fit 1x2\n* `molex-micro-fit-2x2` - Molex Micro-Fit 2x2\n* `molex-micro-fit-2x4` - Molex Micro-Fit 2x4\n* `dc-terminal` - DC Terminal\n* `saf-d-grid` - Saf-D-Grid\n* `neutrik-powercon-20` - Neutrik powerCON (20A)\n* `neutrik-powercon-32` - Neutrik powerCON (32A)\n* `neutrik-powercon-true1` - Neutrik powerCON TRUE1\n* `neutrik-powercon-true1-top` - Neutrik powerCON TRUE1 TOP\n* `ubiquiti-smartpower` - Ubiquiti SmartPower\n* `hardwired` - Hardwired\n* `other` - Other",
+ "x-spec-enum-id": "292850be2c08f7df",
+ "nullable": true
+ },
+ "maximum_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Maximum power draw (watts)"
+ },
+ "allocated_draw": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 1,
+ "nullable": true,
+ "description": "Allocated power draw (watts)"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "WritablePrefixRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "prefix": {
+ "type": "string",
+ "minLength": 1
+ },
+ "vrf": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRFRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "scope_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "scope_id": {
+ "type": "integer",
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "container",
+ "active",
+ "reserved",
+ "deprecated"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "d38bee5f512701d9",
+ "description": "Operational status of this prefix\n\n* `container` - Container\n* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated"
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "is_pool": {
+ "type": "boolean",
+ "title": "Is a pool",
+ "description": "All IP addresses within this prefix are considered usable"
+ },
+ "mark_utilized": {
+ "type": "boolean",
+ "description": "Treat as fully utilized"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "prefix"
+ ]
+ },
+ "WritableRackRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "facility_id": {
+ "type": "string",
+ "nullable": true,
+ "maxLength": 50
+ },
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ]
+ },
+ "location": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefLocationRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "reserved",
+ "available",
+ "planned",
+ "active",
+ "deprecated"
+ ],
+ "type": "string",
+ "description": "* `reserved` - Reserved\n* `available` - Available\n* `planned` - Planned\n* `active` - Active\n* `deprecated` - Deprecated",
+ "x-spec-enum-id": "0c556d55dc1baa13"
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRackRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "asset_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "A unique tag used to identify this rack",
+ "maxLength": 50
+ },
+ "rack_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRackTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "form_factor": {
+ "enum": [
+ "2-post-frame",
+ "4-post-frame",
+ "4-post-cabinet",
+ "wall-frame",
+ "wall-frame-vertical",
+ "wall-cabinet",
+ "wall-cabinet-vertical",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `2-post-frame` - 2-post frame\n* `4-post-frame` - 4-post frame\n* `4-post-cabinet` - 4-post cabinet\n* `wall-frame` - Wall-mounted frame\n* `wall-frame-vertical` - Wall-mounted frame (vertical)\n* `wall-cabinet` - Wall-mounted cabinet\n* `wall-cabinet-vertical` - Wall-mounted cabinet (vertical)",
+ "x-spec-enum-id": "e32aaa89a223f2ea",
+ "nullable": true
+ },
+ "width": {
+ "enum": [
+ 10,
+ 19,
+ 21,
+ 23
+ ],
+ "type": "integer",
+ "x-spec-enum-id": "9b322795f297a9c3",
+ "description": "Rail-to-rail width\n\n* `10` - 10 inches\n* `19` - 19 inches\n* `21` - 21 inches\n* `23` - 23 inches",
+ "minimum": 0,
+ "maximum": 32767
+ },
+ "u_height": {
+ "type": "integer",
+ "maximum": 100,
+ "minimum": 1,
+ "title": "Height (U)",
+ "description": "Height in rack units"
+ },
+ "starting_unit": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 1,
+ "description": "Starting unit for rack"
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "max_weight": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum load capacity for the rack"
+ },
+ "weight_unit": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884",
+ "nullable": true
+ },
+ "desc_units": {
+ "type": "boolean",
+ "title": "Descending units",
+ "description": "Units are numbered top-to-bottom"
+ },
+ "outer_width": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (width)"
+ },
+ "outer_height": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (height)"
+ },
+ "outer_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (depth)"
+ },
+ "outer_unit": {
+ "enum": [
+ "mm",
+ "in",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `mm` - Millimeters\n* `in` - Inches",
+ "x-spec-enum-id": "86a846b6c40f495e",
+ "nullable": true
+ },
+ "mounting_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum depth of a mounted device, in millimeters. For four-post racks, this is the distance between the front and rear rails."
+ },
+ "airflow": {
+ "enum": [
+ "front-to-rear",
+ "rear-to-front",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `front-to-rear` - Front to rear\n* `rear-to-front` - Rear to front",
+ "x-spec-enum-id": "a784734d07ef1b3c",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "site"
+ ]
+ },
+ "WritableRackReservationRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "rack": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefRackRequest"
+ }
+ ]
+ },
+ "units": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0
+ }
+ },
+ "status": {
+ "enum": [
+ "pending",
+ "active",
+ "stale"
+ ],
+ "type": "string",
+ "description": "* `pending` - Pending\n* `active` - Active\n* `stale` - Stale",
+ "x-spec-enum-id": "b62013475549e423"
+ },
+ "user": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefUserRequest"
+ }
+ ]
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "description",
+ "rack",
+ "units",
+ "user"
+ ]
+ },
+ "WritableRackTypeRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "manufacturer": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefManufacturerRequest"
+ }
+ ]
+ },
+ "model": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "form_factor": {
+ "enum": [
+ "2-post-frame",
+ "4-post-frame",
+ "4-post-cabinet",
+ "wall-frame",
+ "wall-frame-vertical",
+ "wall-cabinet",
+ "wall-cabinet-vertical"
+ ],
+ "type": "string",
+ "description": "* `2-post-frame` - 2-post frame\n* `4-post-frame` - 4-post frame\n* `4-post-cabinet` - 4-post cabinet\n* `wall-frame` - Wall-mounted frame\n* `wall-frame-vertical` - Wall-mounted frame (vertical)\n* `wall-cabinet` - Wall-mounted cabinet\n* `wall-cabinet-vertical` - Wall-mounted cabinet (vertical)",
+ "x-spec-enum-id": "e32aaa89a223f2ea"
+ },
+ "width": {
+ "enum": [
+ 10,
+ 19,
+ 21,
+ 23
+ ],
+ "type": "integer",
+ "x-spec-enum-id": "9b322795f297a9c3",
+ "description": "Rail-to-rail width\n\n* `10` - 10 inches\n* `19` - 19 inches\n* `21` - 21 inches\n* `23` - 23 inches",
+ "minimum": 0,
+ "maximum": 32767
+ },
+ "u_height": {
+ "type": "integer",
+ "maximum": 100,
+ "minimum": 1,
+ "title": "Height (U)",
+ "description": "Height in rack units"
+ },
+ "starting_unit": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 1,
+ "description": "Starting unit for rack"
+ },
+ "desc_units": {
+ "type": "boolean",
+ "title": "Descending units",
+ "description": "Units are numbered top-to-bottom"
+ },
+ "outer_width": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (width)"
+ },
+ "outer_height": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (height)"
+ },
+ "outer_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Outer dimension of rack (depth)"
+ },
+ "outer_unit": {
+ "enum": [
+ "mm",
+ "in",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `mm` - Millimeters\n* `in` - Inches",
+ "x-spec-enum-id": "86a846b6c40f495e",
+ "nullable": true
+ },
+ "weight": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "max_weight": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum load capacity for the rack"
+ },
+ "weight_unit": {
+ "enum": [
+ "kg",
+ "g",
+ "lb",
+ "oz",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `kg` - Kilograms\n* `g` - Grams\n* `lb` - Pounds\n* `oz` - Ounces",
+ "x-spec-enum-id": "7c1876f422815884",
+ "nullable": true
+ },
+ "mounting_depth": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true,
+ "description": "Maximum depth of a mounted device, in millimeters. For four-post racks, this is the distance between the front and rear rails."
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "form_factor",
+ "manufacturer",
+ "model",
+ "slug"
+ ]
+ },
+ "WritableRearPortRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "module": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "positions": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1,
+ "description": "Number of front ports which may be mapped"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mark_connected": {
+ "type": "boolean",
+ "description": "Treat as if a cable is connected"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name",
+ "type"
+ ]
+ },
+ "WritableRearPortTemplateRequest": {
+ "type": "object",
+ "description": "Extends the built-in ModelSerializer to enforce calling full_clean() on a copy of the associated instance during\nvalidation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)",
+ "properties": {
+ "device_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "module_type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefModuleTypeRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "{module} is accepted as a substitution for the module bay position when attached to a module type.",
+ "maxLength": 64
+ },
+ "label": {
+ "type": "string",
+ "description": "Physical label",
+ "maxLength": 64
+ },
+ "type": {
+ "enum": [
+ "8p8c",
+ "8p6c",
+ "8p4c",
+ "8p2c",
+ "6p6c",
+ "6p4c",
+ "6p2c",
+ "4p4c",
+ "4p2c",
+ "gg45",
+ "tera-4p",
+ "tera-2p",
+ "tera-1p",
+ "110-punch",
+ "bnc",
+ "f",
+ "n",
+ "mrj21",
+ "fc",
+ "fc-pc",
+ "fc-upc",
+ "fc-apc",
+ "lc",
+ "lc-pc",
+ "lc-upc",
+ "lc-apc",
+ "lsh",
+ "lsh-pc",
+ "lsh-upc",
+ "lsh-apc",
+ "lx5",
+ "lx5-pc",
+ "lx5-upc",
+ "lx5-apc",
+ "mpo",
+ "mtrj",
+ "sc",
+ "sc-pc",
+ "sc-upc",
+ "sc-apc",
+ "st",
+ "cs",
+ "sn",
+ "sma-905",
+ "sma-906",
+ "urm-p2",
+ "urm-p4",
+ "urm-p8",
+ "splice",
+ "usb-a",
+ "usb-b",
+ "usb-c",
+ "usb-mini-a",
+ "usb-mini-b",
+ "usb-micro-a",
+ "usb-micro-b",
+ "usb-micro-ab",
+ "other"
+ ],
+ "type": "string",
+ "description": "* `8p8c` - 8P8C\n* `8p6c` - 8P6C\n* `8p4c` - 8P4C\n* `8p2c` - 8P2C\n* `6p6c` - 6P6C\n* `6p4c` - 6P4C\n* `6p2c` - 6P2C\n* `4p4c` - 4P4C\n* `4p2c` - 4P2C\n* `gg45` - GG45\n* `tera-4p` - TERA 4P\n* `tera-2p` - TERA 2P\n* `tera-1p` - TERA 1P\n* `110-punch` - 110 Punch\n* `bnc` - BNC\n* `f` - F Connector\n* `n` - N Connector\n* `mrj21` - MRJ21\n* `fc` - FC\n* `fc-pc` - FC/PC\n* `fc-upc` - FC/UPC\n* `fc-apc` - FC/APC\n* `lc` - LC\n* `lc-pc` - LC/PC\n* `lc-upc` - LC/UPC\n* `lc-apc` - LC/APC\n* `lsh` - LSH\n* `lsh-pc` - LSH/PC\n* `lsh-upc` - LSH/UPC\n* `lsh-apc` - LSH/APC\n* `lx5` - LX.5\n* `lx5-pc` - LX.5/PC\n* `lx5-upc` - LX.5/UPC\n* `lx5-apc` - LX.5/APC\n* `mpo` - MPO\n* `mtrj` - MTRJ\n* `sc` - SC\n* `sc-pc` - SC/PC\n* `sc-upc` - SC/UPC\n* `sc-apc` - SC/APC\n* `st` - ST\n* `cs` - CS\n* `sn` - SN\n* `sma-905` - SMA 905\n* `sma-906` - SMA 906\n* `urm-p2` - URM-P2\n* `urm-p4` - URM-P4\n* `urm-p8` - URM-P8\n* `splice` - Splice\n* `usb-a` - USB Type A\n* `usb-b` - USB Type B\n* `usb-c` - USB Type C\n* `usb-mini-a` - USB Mini A\n* `usb-mini-b` - USB Mini B\n* `usb-micro-a` - USB Micro A\n* `usb-micro-b` - USB Micro B\n* `usb-micro-ab` - USB Micro AB\n* `other` - Other",
+ "x-spec-enum-id": "ea67ae8ba4602f8a"
+ },
+ "color": {
+ "type": "string",
+ "pattern": "^[0-9a-f]{6}$",
+ "maxLength": 6
+ },
+ "positions": {
+ "type": "integer",
+ "maximum": 1024,
+ "minimum": 1
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ }
+ },
+ "required": [
+ "name",
+ "type"
+ ]
+ },
+ "WritableRegionRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "WritableServiceRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "parent_object_type": {
+ "type": "string"
+ },
+ "parent_object_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64"
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "protocol": {
+ "enum": [
+ "tcp",
+ "udp",
+ "sctp"
+ ],
+ "type": "string",
+ "description": "* `tcp` - TCP\n* `udp` - UDP\n* `sctp` - SCTP",
+ "x-spec-enum-id": "5521e084b1ad51de"
+ },
+ "ports": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 1
+ },
+ "title": "Port numbers"
+ },
+ "ipaddresses": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "parent_object_id",
+ "parent_object_type",
+ "ports",
+ "protocol"
+ ]
+ },
+ "WritableServiceTemplateRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "protocol": {
+ "enum": [
+ "tcp",
+ "udp",
+ "sctp"
+ ],
+ "type": "string",
+ "description": "* `tcp` - TCP\n* `udp` - UDP\n* `sctp` - SCTP",
+ "x-spec-enum-id": "5521e084b1ad51de"
+ },
+ "ports": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "maximum": 65535,
+ "minimum": 1
+ },
+ "title": "Port numbers"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "ports",
+ "protocol"
+ ]
+ },
+ "WritableSiteGroupRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "WritableSiteRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Full name of the site",
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "staging",
+ "active",
+ "decommissioning",
+ "retired"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `staging` - Staging\n* `active` - Active\n* `decommissioning` - Decommissioning\n* `retired` - Retired",
+ "x-spec-enum-id": "e363a8ddb138be50"
+ },
+ "region": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRegionRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefSiteGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "facility": {
+ "type": "string",
+ "description": "Local facility ID or description",
+ "maxLength": 50
+ },
+ "time_zone": {
+ "type": "string",
+ "nullable": true,
+ "minLength": 1
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "physical_address": {
+ "type": "string",
+ "description": "Physical location of the building",
+ "maxLength": 200
+ },
+ "shipping_address": {
+ "type": "string",
+ "description": "If different from the physical address",
+ "maxLength": 200
+ },
+ "latitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 100,
+ "minimum": -100,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "longitude": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000,
+ "minimum": -1000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true,
+ "description": "GPS coordinate in decimal format (xx.yyyyyy)"
+ },
+ "comments": {
+ "type": "string"
+ },
+ "asns": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "WritableTenantGroupRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "WritableTunnelRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "active",
+ "disabled"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `active` - Active\n* `disabled` - Disabled",
+ "x-spec-enum-id": "0d65f7912cba74aa"
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTunnelGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "encapsulation": {
+ "enum": [
+ "ipsec-transport",
+ "ipsec-tunnel",
+ "ip-ip",
+ "gre",
+ "wireguard",
+ "openvpn",
+ "l2tp",
+ "pptp"
+ ],
+ "type": "string",
+ "description": "* `ipsec-transport` - IPsec - Transport\n* `ipsec-tunnel` - IPsec - Tunnel\n* `ip-ip` - IP-in-IP\n* `gre` - GRE\n* `wireguard` - WireGuard\n* `openvpn` - OpenVPN\n* `l2tp` - L2TP\n* `pptp` - PPTP",
+ "x-spec-enum-id": "54a2e45824009c49"
+ },
+ "ipsec_profile": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPSecProfileRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tunnel_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "encapsulation",
+ "name"
+ ]
+ },
+ "WritableTunnelTerminationRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "tunnel": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefTunnelRequest"
+ }
+ ]
+ },
+ "role": {
+ "enum": [
+ "peer",
+ "hub",
+ "spoke"
+ ],
+ "type": "string",
+ "description": "* `peer` - Peer\n* `hub` - Hub\n* `spoke` - Spoke",
+ "x-spec-enum-id": "52225cd60b867572"
+ },
+ "termination_type": {
+ "type": "string"
+ },
+ "termination_id": {
+ "type": "integer",
+ "maximum": 9223372036854775807,
+ "minimum": 0,
+ "format": "int64",
+ "nullable": true
+ },
+ "outside_ip": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "termination_type",
+ "tunnel"
+ ]
+ },
+ "WritableVLANRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vid": {
+ "type": "integer",
+ "maximum": 4094,
+ "minimum": 1,
+ "title": "VLAN ID",
+ "description": "Numeric VLAN ID (1-4094)"
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "active",
+ "reserved",
+ "deprecated"
+ ],
+ "type": "string",
+ "x-spec-enum-id": "6388dfb94ca1cc15",
+ "description": "Operational status of this VLAN\n\n* `active` - Active\n* `reserved` - Reserved\n* `deprecated` - Deprecated"
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "qinq_role": {
+ "enum": [
+ "svlan",
+ "cvlan",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "d2510f2d3e3d3fb1",
+ "nullable": true,
+ "title": "Q-in-Q role",
+ "description": "Customer/service VLAN designation (for Q-in-Q/IEEE 802.1ad)\n\n* `svlan` - Service\n* `cvlan` - Customer"
+ },
+ "qinq_svlan": {
+ "type": "integer",
+ "nullable": true
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "vid"
+ ]
+ },
+ "WritableVMInterfaceRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "virtual_machine": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefVirtualMachineRequest"
+ }
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true,
+ "title": "Parent interface"
+ },
+ "bridge": {
+ "type": "integer",
+ "nullable": true,
+ "title": "Bridge interface"
+ },
+ "mtu": {
+ "type": "integer",
+ "maximum": 65536,
+ "minimum": 1,
+ "nullable": true
+ },
+ "primary_mac_address": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefMACAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "mode": {
+ "enum": [
+ "access",
+ "tagged",
+ "tagged-all",
+ "q-in-q",
+ "",
+ null
+ ],
+ "type": "string",
+ "x-spec-enum-id": "b6fe48fe21dbf01d",
+ "nullable": true,
+ "description": "IEEE 802.1Q tagging strategy\n\n* `access` - Access\n* `tagged` - Tagged\n* `tagged-all` - Tagged (All)\n* `q-in-q` - Q-in-Q (802.1ad)"
+ },
+ "untagged_vlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tagged_vlans": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ },
+ "qinq_svlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vlan_translation_policy": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANTranslationPolicyRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vrf": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVRFRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name",
+ "virtual_machine"
+ ]
+ },
+ "WritableVirtualChassisRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "domain": {
+ "type": "string",
+ "maxLength": 30
+ },
+ "master": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "WritableVirtualCircuitRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "cid": {
+ "type": "string",
+ "minLength": 1,
+ "title": "Circuit ID",
+ "description": "Unique circuit ID",
+ "maxLength": 100
+ },
+ "provider_network": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefProviderNetworkRequest"
+ }
+ ]
+ },
+ "provider_account": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefProviderAccountRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "type": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefVirtualCircuitTypeRequest"
+ }
+ ]
+ },
+ "status": {
+ "enum": [
+ "planned",
+ "provisioning",
+ "active",
+ "offline",
+ "deprovisioning",
+ "decommissioned"
+ ],
+ "type": "string",
+ "description": "* `planned` - Planned\n* `provisioning` - Provisioning\n* `active` - Active\n* `offline` - Offline\n* `deprovisioning` - Deprovisioning\n* `decommissioned` - Decommissioned",
+ "x-spec-enum-id": "63c838134a022200"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "cid",
+ "provider_network",
+ "type"
+ ]
+ },
+ "WritableVirtualCircuitTerminationRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "virtual_circuit": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefVirtualCircuitRequest"
+ }
+ ]
+ },
+ "role": {
+ "enum": [
+ "peer",
+ "hub",
+ "spoke"
+ ],
+ "type": "string",
+ "description": "* `peer` - Peer\n* `hub` - Hub\n* `spoke` - Spoke",
+ "x-spec-enum-id": "52225cd60b867572"
+ },
+ "interface": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefInterfaceRequest"
+ }
+ ]
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "interface",
+ "virtual_circuit"
+ ]
+ },
+ "WritableVirtualDeviceContextRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ]
+ },
+ "identifier": {
+ "type": "integer",
+ "maximum": 32767,
+ "minimum": 0,
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip4": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip6": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "active",
+ "planned",
+ "offline"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `planned` - Planned\n* `offline` - Offline",
+ "x-spec-enum-id": "ee1ef02def7a91ab"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "device",
+ "name",
+ "status"
+ ]
+ },
+ "WritableVirtualMachineWithConfigContextRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 64
+ },
+ "status": {
+ "enum": [
+ "offline",
+ "active",
+ "planned",
+ "staged",
+ "failed",
+ "decommissioning",
+ "paused"
+ ],
+ "type": "string",
+ "description": "* `offline` - Offline\n* `active` - Active\n* `planned` - Planned\n* `staged` - Staged\n* `failed` - Failed\n* `decommissioning` - Decommissioning\n* `paused` - Paused",
+ "x-spec-enum-id": "c649dc8de233760f"
+ },
+ "site": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefSiteRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "cluster": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefClusterRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "device": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "serial": {
+ "type": "string",
+ "title": "Serial number",
+ "maxLength": 50
+ },
+ "role": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefDeviceRoleRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "platform": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefPlatformRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip4": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "primary_ip6": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefIPAddressRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "vcpus": {
+ "type": "number",
+ "format": "double",
+ "maximum": 10000,
+ "minimum": 0.01,
+ "exclusiveMaximum": true,
+ "nullable": true
+ },
+ "memory": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Memory (MB)"
+ },
+ "disk": {
+ "type": "integer",
+ "maximum": 2147483647,
+ "minimum": 0,
+ "nullable": true,
+ "title": "Disk (MB)"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "config_template": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefConfigTemplateRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "local_context_data": {
+ "nullable": true,
+ "description": "Local config context data takes precedence over source contexts in the final rendered config context"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "name"
+ ]
+ },
+ "WritableWirelessLANGroupRequest": {
+ "type": "object",
+ "description": "Extends PrimaryModelSerializer to include MPTT support.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100
+ },
+ "slug": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 100,
+ "pattern": "^[-a-zA-Z0-9_]+$"
+ },
+ "parent": {
+ "type": "integer",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ },
+ "comments": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "slug"
+ ]
+ },
+ "WritableWirelessLANRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "ssid": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 32
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "group": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefWirelessLANGroupRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "enum": [
+ "active",
+ "reserved",
+ "disabled",
+ "deprecated"
+ ],
+ "type": "string",
+ "description": "* `active` - Active\n* `reserved` - Reserved\n* `disabled` - Disabled\n* `deprecated` - Deprecated",
+ "x-spec-enum-id": "412ebdca597f609e"
+ },
+ "vlan": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefVLANRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "scope_type": {
+ "type": "string",
+ "nullable": true
+ },
+ "scope_id": {
+ "type": "integer",
+ "nullable": true
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "auth_type": {
+ "enum": [
+ "open",
+ "wep",
+ "wpa-personal",
+ "wpa-enterprise",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `open` - Open\n* `wep` - WEP\n* `wpa-personal` - WPA Personal (PSK)\n* `wpa-enterprise` - WPA Enterprise",
+ "x-spec-enum-id": "a2043acb899b3954",
+ "nullable": true,
+ "title": "Authentication type"
+ },
+ "auth_cipher": {
+ "enum": [
+ "auto",
+ "tkip",
+ "aes",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `auto` - Auto\n* `tkip` - TKIP\n* `aes` - AES",
+ "x-spec-enum-id": "8fdaefa727c26fdc",
+ "nullable": true,
+ "title": "Authentication cipher"
+ },
+ "auth_psk": {
+ "type": "string",
+ "title": "Pre-shared key",
+ "maxLength": 64
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "ssid"
+ ]
+ },
+ "WritableWirelessLinkRequest": {
+ "type": "object",
+ "description": "Adds support for custom fields and tags.",
+ "properties": {
+ "interface_a": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefInterfaceRequest"
+ }
+ ]
+ },
+ "interface_b": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "$ref": "#/components/schemas/BriefInterfaceRequest"
+ }
+ ]
+ },
+ "ssid": {
+ "type": "string",
+ "maxLength": 32
+ },
+ "status": {
+ "enum": [
+ "connected",
+ "planned",
+ "decommissioning"
+ ],
+ "type": "string",
+ "description": "* `connected` - Connected\n* `planned` - Planned\n* `decommissioning` - Decommissioning",
+ "x-spec-enum-id": "fbc2f302c08be50d"
+ },
+ "tenant": {
+ "oneOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/BriefTenantRequest"
+ }
+ ],
+ "nullable": true
+ }
+ ],
+ "nullable": true
+ },
+ "auth_type": {
+ "enum": [
+ "open",
+ "wep",
+ "wpa-personal",
+ "wpa-enterprise",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `open` - Open\n* `wep` - WEP\n* `wpa-personal` - WPA Personal (PSK)\n* `wpa-enterprise` - WPA Enterprise",
+ "x-spec-enum-id": "a2043acb899b3954",
+ "nullable": true,
+ "title": "Authentication type"
+ },
+ "auth_cipher": {
+ "enum": [
+ "auto",
+ "tkip",
+ "aes",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `auto` - Auto\n* `tkip` - TKIP\n* `aes` - AES",
+ "x-spec-enum-id": "8fdaefa727c26fdc",
+ "nullable": true,
+ "title": "Authentication cipher"
+ },
+ "auth_psk": {
+ "type": "string",
+ "title": "Pre-shared key",
+ "maxLength": 64
+ },
+ "distance": {
+ "type": "number",
+ "format": "double",
+ "maximum": 1000000,
+ "minimum": -1000000,
+ "exclusiveMaximum": true,
+ "exclusiveMinimum": true,
+ "nullable": true
+ },
+ "distance_unit": {
+ "enum": [
+ "km",
+ "m",
+ "mi",
+ "ft",
+ "",
+ null
+ ],
+ "type": "string",
+ "description": "* `km` - Kilometers\n* `m` - Meters\n* `mi` - Miles\n* `ft` - Feet",
+ "x-spec-enum-id": "53542e7902f946af",
+ "nullable": true
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 200
+ },
+ "comments": {
+ "type": "string"
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/NestedTagRequest"
+ }
+ },
+ "custom_fields": {
+ "type": "object",
+ "additionalProperties": {}
+ }
+ },
+ "required": [
+ "interface_a",
+ "interface_b"
+ ]
+ }
+ },
+ "securitySchemes": {
+ "cookieAuth": {
+ "type": "apiKey",
+ "in": "cookie",
+ "name": "sessionid"
+ },
+ "tokenAuth": {
+ "type": "apiKey",
+ "in": "header",
+ "name": "Authorization",
+ "description": "Token-based authentication with required prefix \"Token\""
+ }
+ }
+ },
+ "servers": [
+ {
+ "url": "",
+ "description": "NetBox"
+ }
+ ]
+}
diff --git a/docs/administration/authentication/microsoft-entra-id.md b/docs/administration/authentication/microsoft-entra-id.md
index b44499fbe0..66794ae0c9 100644
--- a/docs/administration/authentication/microsoft-entra-id.md
+++ b/docs/administration/authentication/microsoft-entra-id.md
@@ -25,7 +25,7 @@ Once finished, make note of the application (client) ID; this will be used when

!!! tip "Multitenant authentication"
- NetBox also supports multitenant authentication via Azure AD, however it requires a different backend and an additional configuration parameter. Please see the [`python-social-auth` documentation](https://python-social-auth.readthedocs.io/en/latest/backends/azuread.html#tenant-support) for details concerning multitenant authentication.
+ NetBox also supports multitenant authentication via Azure AD; however, it requires a different backend and an additional configuration parameter. Please see the [`python-social-auth` documentation](https://python-social-auth.readthedocs.io/en/latest/backends/azuread.html#tenant-support) for details concerning multitenant authentication.
### 3. Create a secret
diff --git a/docs/administration/error-reporting.md b/docs/administration/error-reporting.md
index ccc0a84a55..8b43122739 100644
--- a/docs/administration/error-reporting.md
+++ b/docs/administration/error-reporting.md
@@ -4,7 +4,7 @@
### Enabling Error Reporting
-NetBox supports native integration with [Sentry](https://sentry.io/) for automatic error reporting. To enable this functionality, set `SENTRY_ENABLED` to True and define your unique [data source name (DSN)](https://docs.sentry.io/product/sentry-basics/concepts/dsn-explainer/) in `configuration.py`.
+NetBox supports native integration with [Sentry](https://sentry.io/) for automatic error reporting. To enable this functionality, set `SENTRY_ENABLED` to `True` and define your unique [data source name (DSN)](https://docs.sentry.io/product/sentry-basics/concepts/dsn-explainer/) in `configuration.py`.
```python
SENTRY_ENABLED = True
diff --git a/docs/administration/housekeeping.md b/docs/administration/housekeeping.md
deleted file mode 100644
index 674ceb3128..0000000000
--- a/docs/administration/housekeeping.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# Housekeeping
-
-NetBox includes a `housekeeping` management command that should be run nightly. This command handles:
-
-* Clearing expired authentication sessions from the database
-* Deleting changelog records older than the configured [retention time](../configuration/miscellaneous.md#changelog_retention)
-* Deleting job result records older than the configured [retention time](../configuration/miscellaneous.md#job_retention)
-* Check for new NetBox releases (if [`RELEASE_CHECK_URL`](../configuration/miscellaneous.md#release_check_url) is set)
-
-This command can be invoked directly, or by using the shell script provided at `/opt/netbox/contrib/netbox-housekeeping.sh`.
-
-## Scheduling
-
-### Using Cron
-
-This script can be linked from your cron scheduler's daily jobs directory (e.g. `/etc/cron.daily`) or referenced directly within the cron configuration file.
-
-```shell
-sudo ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
-```
-
-!!! note
- On Debian-based systems, be sure to omit the `.sh` file extension when linking to the script from within a cron directory. Otherwise, the task may not run.
-
-### Using Systemd
-
-First, create symbolic links for the systemd service and timer files. Link the existing service and timer files from the `/opt/netbox/contrib/` directory to the `/etc/systemd/system/` directory:
-
-```bash
-sudo ln -s /opt/netbox/contrib/netbox-housekeeping.service /etc/systemd/system/netbox-housekeeping.service
-sudo ln -s /opt/netbox/contrib/netbox-housekeeping.timer /etc/systemd/system/netbox-housekeeping.timer
-```
-
-Then, reload the systemd configuration and enable the timer to start automatically at boot:
-
-```bash
-sudo systemctl daemon-reload
-sudo systemctl enable --now netbox-housekeeping.timer
-```
-
-Check the status of your timer by running:
-
-```bash
-sudo systemctl list-timers --all
-```
-
-This command will show a list of all timers, including your `netbox-housekeeping.timer`. Make sure the timer is active and properly scheduled.
-
-That's it! Your NetBox housekeeping service is now configured to run daily using systemd.
diff --git a/docs/administration/netbox-shell.md b/docs/administration/netbox-shell.md
index 21cef01b20..a74c5114ba 100644
--- a/docs/administration/netbox-shell.md
+++ b/docs/administration/netbox-shell.md
@@ -106,7 +106,7 @@ This approach can span multiple levels of relations. For example, the following
```
!!! note
- While the above query is functional, it's not very efficient. There are ways to optimize such requests, however they are out of scope for this document. For more information, see the [Django queryset method reference](https://docs.djangoproject.com/en/stable/ref/models/querysets/) documentation.
+ While the above query is functional, it's not very efficient. There are ways to optimize such requests; however, they are out of scope for this document. For more information, see the [Django queryset method reference](https://docs.djangoproject.com/en/stable/ref/models/querysets/) documentation.
Reverse relationships can be traversed as well. For example, the following will find all devices with an interface named "em0":
diff --git a/docs/configuration/data-validation.md b/docs/configuration/data-validation.md
index 1b8263de35..9988f6e0b6 100644
--- a/docs/configuration/data-validation.md
+++ b/docs/configuration/data-validation.md
@@ -17,7 +17,7 @@ CUSTOM_VALIDATORS = {
},
"my_plugin.validators.Validator1"
],
- "dim.device": [
+ "dcim.device": [
"my_plugin.validators.Validator1"
]
}
diff --git a/docs/configuration/miscellaneous.md b/docs/configuration/miscellaneous.md
index 1fbd0ee35e..18de6458d1 100644
--- a/docs/configuration/miscellaneous.md
+++ b/docs/configuration/miscellaneous.md
@@ -108,8 +108,6 @@ By default, NetBox will prevent the creation of duplicate prefixes and IP addres
## EVENTS_PIPELINE
-!!! info "This parameter was introduced in NetBox v4.2."
-
Default: `['extras.events.process_event_queue',]`
NetBox will call dotted paths to the functions listed here for events (create, update, delete) on models as well as when custom EventRules are fired.
diff --git a/docs/configuration/required-parameters.md b/docs/configuration/required-parameters.md
index 25aa7978a7..19222740df 100644
--- a/docs/configuration/required-parameters.md
+++ b/docs/configuration/required-parameters.md
@@ -34,8 +34,6 @@ See the [`DATABASES`](#databases) configuration below for usage.
## DATABASES
-!!! info "This parameter was introduced in NetBox v4.3."
-
NetBox requires access to a PostgreSQL 14 or later database service to store data. This service can run locally on the NetBox server or on a remote system. Databases are defined as named dictionaries:
```python
diff --git a/docs/configuration/system.md b/docs/configuration/system.md
index e294abb9c4..8a73f629f7 100644
--- a/docs/configuration/system.md
+++ b/docs/configuration/system.md
@@ -14,8 +14,6 @@ BASE_PATH = 'netbox/'
## DATABASE_ROUTERS
-!!! info "This parameter was introduced in NetBox v4.3."
-
Default: `[]` (empty list)
An iterable of [database routers](https://docs.djangoproject.com/en/stable/topics/db/multi-db/) to use for automatically selecting the appropriate database(s) for a query. This is useful only when [multiple databases](./required-parameters.md#databases) have been configured.
@@ -72,6 +70,16 @@ Email is sent from NetBox only for critical events or if configured for [logging
---
+## HOSTNAME
+
+!!! info "This parameter was introduced in NetBox v4.4."
+
+Default: System hostname
+
+The hostname displayed in the user interface identifying the system on which NetBox is running. If not defined, this defaults to the system hostname as reported by Python's `platform.node()`.
+
+---
+
## HTTP_PROXIES
Default: `None`
@@ -159,6 +167,7 @@ LOGGING = {
* `netbox.auth.*` - Authentication events
* `netbox.api.views.*` - Views which handle business logic for the REST API
* `netbox.event_rules` - Event rules
+* `netbox.jobs.*` - Background jobs
* `netbox.reports.*` - Report execution (`module.name`)
* `netbox.scripts.*` - Custom script execution (`module.name`)
* `netbox.views.*` - Views which handle business logic for the web UI
@@ -175,8 +184,6 @@ The file path to the location where media files (such as image attachments) are
## PROXY_ROUTERS
-!!! info "This parameter was introduced in NetBox v4.3."
-
Default: `["utilities.proxy.DefaultProxyRouter"]`
A list of Python classes responsible for determining which proxy server(s) to use for outbound HTTP requests. Each item in the list can be the class itself or the dotted path to the class.
@@ -250,6 +257,46 @@ The specific configuration settings for each storage backend can be found in the
!!! note
Any keys defined in the `STORAGES` configuration parameter replace those in the default configuration. It is only necessary to define keys within the `STORAGES` for the specific backend(s) you wish to configure.
+### Environment Variables and Third-Party Libraries
+
+NetBox uses an explicit Python configuration approach rather than automatic environment variable detection. While this provides clear configuration management and version control capabilities, it affects how some third-party libraries like `django-storages` function within NetBox's context.
+
+Many Django libraries (including `django-storages`) expect to automatically detect environment variables like `AWS_STORAGE_BUCKET_NAME` or `AWS_S3_ACCESS_KEY_ID`. However, NetBox's configuration processing prevents this automatic detection from working as documented in some of these libraries.
+
+When using third-party libraries that rely on environment variable detection, you may need to explicitly read environment variables in your NetBox `configuration.py`:
+
+```python
+import os
+
+STORAGES = {
+ 'default': {
+ 'BACKEND': 'storages.backends.s3.S3Storage',
+ 'OPTIONS': {
+ 'bucket_name': os.environ.get('AWS_STORAGE_BUCKET_NAME'),
+ 'access_key': os.environ.get('AWS_S3_ACCESS_KEY_ID'),
+ 'secret_key': os.environ.get('AWS_S3_SECRET_ACCESS_KEY'),
+ 'endpoint_url': os.environ.get('AWS_S3_ENDPOINT_URL'),
+ 'location': 'media/',
+ }
+ },
+ 'staticfiles': {
+ 'BACKEND': 'storages.backends.s3.S3Storage',
+ 'OPTIONS': {
+ 'bucket_name': os.environ.get('AWS_STORAGE_BUCKET_NAME'),
+ 'access_key': os.environ.get('AWS_S3_ACCESS_KEY_ID'),
+ 'secret_key': os.environ.get('AWS_S3_SECRET_ACCESS_KEY'),
+ 'endpoint_url': os.environ.get('AWS_S3_ENDPOINT_URL'),
+ 'location': 'static/',
+ }
+ },
+}
+```
+
+This approach works because the environment variables are resolved during NetBox's configuration processing, before the third-party library attempts its own environment variable detection.
+
+!!! warning "Configuration Behavior"
+ Simply setting environment variables like `AWS_STORAGE_BUCKET_NAME` without explicitly reading them in your configuration will not work. The variables must be read using `os.environ.get()` within your `configuration.py` file.
+
---
## TIME_ZONE
diff --git a/docs/customization/custom-scripts.md b/docs/customization/custom-scripts.md
index e7536a654e..df9437634d 100644
--- a/docs/customization/custom-scripts.md
+++ b/docs/customization/custom-scripts.md
@@ -275,6 +275,15 @@ Stores a numeric integer. Options include:
* `min_value` - Minimum value
* `max_value` - Maximum value
+### DecimalVar
+
+Stores a numeric decimal. Options include:
+
+* `min_value` - Minimum value
+* `max_value` - Maximum value
+* `max_digits` - Maximum number of digits, including decimal places
+* `decimal_places` - Number of decimal places
+
### BooleanVar
A true/false flag. This field has no options beyond the defaults listed above.
diff --git a/docs/development/application-registry.md b/docs/development/application-registry.md
index fc96bfd769..8d36ccf962 100644
--- a/docs/development/application-registry.md
+++ b/docs/development/application-registry.md
@@ -22,24 +22,9 @@ Stores registration made using `netbox.denormalized.register()`. For each model,
### `model_features`
-A dictionary of particular features (e.g. custom fields) mapped to the NetBox models which support them, arranged by app. For example:
+A dictionary of model features (e.g. custom fields, tags, etc.) mapped to the functions used to qualify a model as supporting each feature. Model features are registered using the `register_model_feature()` function in `netbox.utils`.
-```python
-{
- 'custom_fields': {
- 'circuits': ['provider', 'circuit'],
- 'dcim': ['site', 'rack', 'devicetype', ...],
- ...
- },
- 'event_rules': {
- 'extras': ['configcontext', 'tag', ...],
- 'dcim': ['site', 'rack', 'devicetype', ...],
- },
- ...
-}
-```
-
-Supported model features are listed in the [features matrix](./models.md#features-matrix).
+Core model features are listed in the [features matrix](./models.md#features-matrix).
### `models`
diff --git a/docs/development/models.md b/docs/development/models.md
index 1b91db515a..5daa677424 100644
--- a/docs/development/models.md
+++ b/docs/development/models.md
@@ -10,19 +10,26 @@ The Django [content types](https://docs.djangoproject.com/en/stable/ref/contrib/
Depending on its classification, each NetBox model may support various features which enhance its operation. Each feature is enabled by inheriting from its designated mixin class, and some features also make use of the [application registry](./application-registry.md#model_features).
-| Feature | Feature Mixin | Registry Key | Description |
-|------------------------------------------------------------|-------------------------|--------------------|-----------------------------------------------------------------------------------------|
-| [Change logging](../features/change-logging.md) | `ChangeLoggingMixin` | - | Changes to these objects are automatically recorded in the change log |
-| Cloning | `CloningMixin` | - | Provides the `clone()` method to prepare a copy |
-| [Custom fields](../customization/custom-fields.md) | `CustomFieldsMixin` | `custom_fields` | These models support the addition of user-defined fields |
-| [Custom links](../customization/custom-links.md) | `CustomLinksMixin` | `custom_links` | These models support the assignment of custom links |
-| [Custom validation](../customization/custom-validation.md) | `CustomValidationMixin` | - | Supports the enforcement of custom validation rules |
-| [Export templates](../customization/export-templates.md) | `ExportTemplatesMixin` | `export_templates` | Users can create custom export templates for these models |
-| [Job results](../features/background-jobs.md) | `JobsMixin` | `jobs` | Background jobs can be scheduled for these models |
-| [Journaling](../features/journaling.md) | `JournalingMixin` | `journaling` | These models support persistent historical commentary |
-| [Synchronized data](../integrations/synchronized-data.md) | `SyncedDataMixin` | `synced_data` | Certain model data can be automatically synchronized from a remote data source |
-| [Tagging](../models/extras/tag.md) | `TagsMixin` | `tags` | The models can be tagged with user-defined tags |
-| [Event rules](../features/event-rules.md) | `EventRulesMixin` | `event_rules` | Event rules can send webhooks or run custom scripts automatically in response to events |
+| Feature | Feature Mixin | Registry Key | Description |
+|------------------------------------------------------------|-------------------------|---------------------|-----------------------------------------------------------------------------------------|
+| [Bookmarks](../features/customization.md#bookmarks) | `BookmarksMixin` | `bookmarks` | These models can be bookmarked natively in the user interface |
+| [Change logging](../features/change-logging.md) | `ChangeLoggingMixin` | `change_logging` | Changes to these objects are automatically recorded in the change log |
+| Cloning | `CloningMixin` | `cloning` | Provides the `clone()` method to prepare a copy |
+| [Contacts](../features/contacts.md) | `ContactsMixin` | `contacts` | Contacts can be associated with these models |
+| [Custom fields](../customization/custom-fields.md) | `CustomFieldsMixin` | `custom_fields` | These models support the addition of user-defined fields |
+| [Custom links](../customization/custom-links.md) | `CustomLinksMixin` | `custom_links` | These models support the assignment of custom links |
+| [Custom validation](../customization/custom-validation.md) | `CustomValidationMixin` | - | Supports the enforcement of custom validation rules |
+| [Event rules](../features/event-rules.md) | `EventRulesMixin` | `event_rules` | Event rules can send webhooks or run custom scripts automatically in response to events |
+| [Export templates](../customization/export-templates.md) | `ExportTemplatesMixin` | `export_templates` | Users can create custom export templates for these models |
+| [Image attachments](../models/extras/imageattachment.md) | `ImageAttachmentsMixin` | `image_attachments` | Image uploads can be attached to these models |
+| [Jobs](../features/background-jobs.md) | `JobsMixin` | `jobs` | Background jobs can be scheduled for these models |
+| [Journaling](../features/journaling.md) | `JournalingMixin` | `journaling` | These models support persistent historical commentary |
+| [Notifications](../features/notifications.md) | `NotificationsMixin` | `notifications` | These models support user notifications |
+| [Synchronized data](../integrations/synchronized-data.md) | `SyncedDataMixin` | `synced_data` | Certain model data can be automatically synchronized from a remote data source |
+| [Tagging](../models/extras/tag.md) | `TagsMixin` | `tags` | The models can be tagged with user-defined tags |
+
+!!! note
+ The above listed features are supported natively by NetBox. Beginning with NetBox v4.4.0, plugins can register their own model features as well.
## Models Index
diff --git a/docs/development/release-checklist.md b/docs/development/release-checklist.md
index 5478e37e97..90d7ea3827 100644
--- a/docs/development/release-checklist.md
+++ b/docs/development/release-checklist.md
@@ -31,28 +31,14 @@ Close the [release milestone](https://github.com/netbox-community/netbox/milesto
Check that a link to the release notes for the new version is present in the navigation menu (defined in `mkdocs.yml`), and that a summary of all major new features has been added to `docs/index.md`.
-### Update the Dependency Requirements Matrix
-
-For every minor release, update the dependency requirements matrix in `docs/installation/upgrading.md` ("All versions") to reflect the supported versions of Python, PostgreSQL, and Redis:
-
-1. Add a new row with the supported dependency versions.
-2. Include a documentation link using the release tag format: `https://github.com/netbox-community/netbox/blob/v4.2.0/docs/installation/index.md`
-3. Bold any version changes for clarity.
-
-**Example Update:**
-
-```markdown
-| NetBox Version | Python min | Python max | PostgreSQL min | Redis min | Documentation |
-|:--------------:|:----------:|:----------:|:--------------:|:---------:|:-------------------------------------------------------------------------------------------------:|
-| 4.2 | 3.10 | 3.12 | **13** | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.2.0/docs/installation/index.md) |
-```
-
### Update System Requirements
If a new Django release is adopted or other major dependencies (Python, PostgreSQL, Redis) change:
* Update the installation guide (`docs/installation/index.md`) with the new minimum versions.
-* Update the upgrade guide (`docs/installation/upgrading.md`) for the current version accordingly.
+* Update the upgrade guide (`docs/installation/upgrading.md`) for the current version.
+ * Update the minimum versions for each dependency.
+ * Add a new row to the release history table. Bold any version changes for clarity.
* Update the minimum PostgreSQL version in the programming error template (`netbox/templates/exceptions/programming_error.html`).
* Update the minimum and supported Python versions in the project metadata file (`pyproject.toml`)
@@ -137,16 +123,6 @@ $ node bundle.js
Done in 1.00s.
```
-### Rebuild the Device Type Definition Schema
-
-Run the following command to update the device type definition validation schema:
-
-```nohighlight
-./manage.py buildschema --write
-```
-
-This will automatically update the schema file at `contrib/generated_schema.json`.
-
### Update & Compile Translations
Updated language translations should be pulled from [Transifex](https://app.transifex.com/netbox-community/netbox/dashboard/) and re-compiled for each new release. First, retrieve any updated translation files using the Transifex CLI client:
@@ -174,6 +150,24 @@ Then, compile these portable (`.po`) files for use in the application:
!!! tip
Put yourself in the shoes of the user when recording change notes. Focus on the effect that each change has for the end user, rather than the specific bits of code that were modified in a PR. Ensure that each message conveys meaning absent context of the initial feature request or bug report. Remember to include keywords or phrases (such as exception names) that can be easily searched.
+### Rebuild the Device Type Definition Schema
+
+Run the following command to update the device type definition validation schema:
+
+```nohighlight
+./manage.py buildschema --write
+```
+
+This will automatically update the schema file at `contrib/generated_schema.json`.
+
+### Update the OpenAPI Schema
+
+Update the static OpenAPI schema definition at `contrib/openapi.json` with the management command below. If the schema file is up-to-date, only the NetBox version will be changed.
+
+```nohighlight
+./manage.py spectacular --format openapi-json > ../contrib/openapi.json
+```
+
### Submit a Pull Request
Commit the above changes and submit a pull request titled **"Release vX.Y.Z"** to merge the current release branch (e.g. `release-vX.Y.Z`) into `main`. Copy the documented release notes into the pull request's body.
diff --git a/docs/features/change-logging.md b/docs/features/change-logging.md
index 919f591107..73e23709c9 100644
--- a/docs/features/change-logging.md
+++ b/docs/features/change-logging.md
@@ -8,6 +8,12 @@ When a request is made, a UUID is generated and attached to any change records r
Change records are exposed in the API via the read-only endpoint `/api/extras/object-changes/`. They may also be exported via the web UI in CSV format.
+## User Messages
+
+!!! info "This feature was introduced in NetBox v4.4."
+
+When creating, modifying, or deleting an object in NetBox, a user has the option of recording an arbitrary message that will appear in the change record. This can be helpful to capture additional context, such as the reason for the change.
+
## Correlating Changes by Request
Every request made to NetBox is assigned a random unique ID that can be used to correlate change records. For example, if you change the status of three sites using the UI's bulk edit feature, you will see three new change records (one for each site) all referencing the same request ID. This shows that all three changes were made as part of the same request.
diff --git a/docs/features/ipam.md b/docs/features/ipam.md
index 3cbe4319de..5879a5fde5 100644
--- a/docs/features/ipam.md
+++ b/docs/features/ipam.md
@@ -62,8 +62,8 @@ VRF modeling in NetBox very closely follows what you find in real-world network
An often overlooked component of IPAM, NetBox also tracks autonomous system (AS) numbers and their assignment to sites. Both 16- and 32-bit AS numbers are supported, and like aggregates each ASN is assigned to an authoritative RIR.
-## Service Mapping
+## Application Service Mapping
NetBox models network applications as discrete service objects associated with devices and/or virtual machines, and optionally with specific IP addresses attached to those parent objects. These can be used to catalog the applications running on your network for reference by other objects or integrated tools.
-To model services in NetBox, begin by creating a service template defining the name, protocol, and port number(s) on which the service listens. This template can then be easily instantiated to "attach" new services to a device or virtual machine. It's also possible to create new services by hand, without a template, however this approach can be tedious.
+To model application services in NetBox, begin by creating an application service template defining the name, protocol, and port number(s) on which the service listens. This template can then be easily instantiated to "attach" new services to a device or virtual machine. It's also possible to create new application services by hand, without a template, however this approach can be tedious.
diff --git a/docs/getting-started/planning.md b/docs/getting-started/planning.md
index 9641cd98bd..7893db55b5 100644
--- a/docs/getting-started/planning.md
+++ b/docs/getting-started/planning.md
@@ -17,7 +17,7 @@ Dedicate some time to take stock of your own sources of truth for your infrastru
* **Multiple conflicting sources** for a given domain. For example, there may be multiple versions of a spreadsheet circulating, each of which asserts a conflicting set of data.
* **Sources with no domain defined.** You may encounter that different teams within your organization use different tools for the same purpose, with no normal definition of when either should be used.
-* **Inaccessible data formatting.** Some tools are better suited for programmatic usage than others. For example, spreadsheets are generally very easy to parse and export, however free-form notes on wiki or similar application are much more difficult to consume.
+* **Inaccessible data formatting.** Some tools are better suited for programmatic usage than others. For example, spreadsheets are generally very easy to parse and export; however, free-form notes on wiki or similar application are much more difficult to consume.
* **There is no source of truth.** Sometimes you'll find that a source of truth simply doesn't exist for a domain. For example, when assigning IP addresses, operators may be just using any (presumed) available IP from a subnet without ever recording its usage.
See if you can identify each domain of infrastructure data for your organization, and the source of truth for each. Once you have these compiled, you'll need to determine what belongs in NetBox.
diff --git a/docs/installation/3-netbox.md b/docs/installation/3-netbox.md
index a91ce5e9cd..acf04dc2ac 100644
--- a/docs/installation/3-netbox.md
+++ b/docs/installation/3-netbox.md
@@ -264,18 +264,6 @@ cd /opt/netbox/netbox
python3 manage.py createsuperuser
```
-## Schedule the Housekeeping Task
-
-NetBox includes a `housekeeping` management command that handles some recurring cleanup tasks, such as clearing out old sessions and expired change records. Although this command may be run manually, it is recommended to configure a scheduled job using the system's `cron` daemon or a similar utility.
-
-A shell script which invokes this command is included at `contrib/netbox-housekeeping.sh`. It can be copied to or linked from your system's daily cron task directory, or included within the crontab directly. (If installing NetBox into a nonstandard path, be sure to update the system paths within this script first.)
-
-```shell
-sudo ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
-```
-
-See the [housekeeping documentation](../administration/housekeeping.md) for further details.
-
## Test the Application
At this point, we should be able to run NetBox's development server for testing. We can check by starting a development instance locally.
diff --git a/docs/installation/upgrading.md b/docs/installation/upgrading.md
index 0a02f7a047..cf0a167543 100644
--- a/docs/installation/upgrading.md
+++ b/docs/installation/upgrading.md
@@ -25,42 +25,21 @@ NetBox requires the following dependencies:
### Version History
-| NetBox Version | Python min | Python max | PostgreSQL min | Redis min | Documentation |
-|:--------------:|:----------:|:----------:|:--------------:|:---------:|:-------------------------------------------------------------------------------------------------:|
-| 4.3 | 3.10 | 3.12 | 14 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.3.0/docs/installation/index.md) |
-| 4.2 | 3.10 | 3.12 | 13 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.2.0/docs/installation/index.md) |
-| 4.1 | 3.10 | 3.12 | 12 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.1.0/docs/installation/index.md) |
-| 4.0 | 3.10 | 3.12 | 12 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.0.0/docs/installation/index.md) |
-| 3.7 | 3.8 | 3.11 | 12 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.7.0/docs/installation/index.md) |
-| 3.6 | 3.8 | 3.11 | 12 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.6.0/docs/installation/index.md) |
-| 3.5 | 3.8 | 3.10 | 11 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.5.0/docs/installation/index.md) |
-| 3.4 | 3.8 | 3.10 | 11 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.4.0/docs/installation/index.md) |
-| 3.3 | 3.8 | 3.10 | 10 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.3.0/docs/installation/index.md) |
-| 3.2 | 3.8 | 3.10 | 10 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.2.0/docs/installation/index.md) |
-| 3.1 | 3.7 | 3.9 | 10 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.1.0/docs/installation/index.md) |
-| 3.0 | 3.7 | 3.9 | 9.6 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.0.0/docs/installation/index.md) |
-| 2.11 | 3.6 | 3.9 | 9.6 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v2.11.0/docs/installation/index.md) |
-| 2.10 | 3.6 | 3.8 | 9.6 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v2.10.0/docs/installation/index.md) |
-| 2.9 | 3.6 | 3.8 | 9.5 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v2.9.0/docs/installation/index.md) |
-| 2.8 | 3.6 | 3.8 | 9.5 | 3.4 | [Link](https://github.com/netbox-community/netbox/blob/v2.8.0/docs/installation/index.md) |
-| 2.7 | 3.5 | 3.7 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.7.0/docs/installation/index.md) |
-| 2.6 | 3.5 | 3.7 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.6.0/docs/installation/index.md) |
-| 2.5 | 3.5 | 3.7 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.5.0/docs/installation/index.md) |
-| 2.4 | 3.4 | 3.7 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.4.0/docs/installation/index.md) |
-| 2.3 | 2.7 | 3.6 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.3.0/docs/installation/postgresql.md) |
-| 2.2 | 2.7 | 3.6 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.2.0/docs/installation/postgresql.md) |
-| 2.1 | 2.7 | 3.6 | 9.3 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.1.0/docs/installation/postgresql.md) |
-| 2.0 | 2.7 | 3.6 | 9.3 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.0.0/docs/installation/postgresql.md) |
-| 1.9 | 2.7 | 3.5 | 9.2 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.9.0-r1/docs/installation/postgresql.md) |
-| 1.8 | 2.7 | 3.5 | 9.2 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.8.0/docs/installation/postgresql.md) |
-| 1.7 | 2.7 | 3.5 | 9.2 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.7.0/docs/installation/postgresql.md) |
-| 1.6 | 2.7 | 3.5 | 9.2 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.6.0/docs/installation/postgresql.md) |
-| 1.5 | 2.7 | 3.5 | 9.2 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.5.0/docs/installation/postgresql.md) |
-| 1.4 | 2.7 | 3.5 | 9.1 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.4.0/docs/installation/postgresql.md) |
-| 1.3 | 2.7 | 3.5 | 9.1 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.3.0/docs/installation/postgresql.md) |
-| 1.2 | 2.7 | 3.5 | 9.1 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.2.0/docs/installation/postgresql.md) |
-| 1.1 | 2.7 | 3.5 | 9.1 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.1.0/docs/getting-started.md) |
-| 1.0 | 2.7 | 3.5 | 9.1 | - | [Link](https://github.com/netbox-community/netbox/blob/1.0.0/docs/getting-started.md) |
+| NetBox Version | Python min | Python max | PostgreSQL min | Redis min | Documentation |
+|:--------------:|:----------:|:----------:|:--------------:|:---------:|:-----------------------------------------------------------------------------------------:|
+| 4.4 | 3.10 | 3.12 | 14 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.4.0/docs/installation/index.md) |
+| 4.3 | 3.10 | 3.12 | 14 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.3.0/docs/installation/index.md) |
+| 4.2 | 3.10 | 3.12 | 13 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.2.0/docs/installation/index.md) |
+| 4.1 | 3.10 | 3.12 | 12 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.1.0/docs/installation/index.md) |
+| 4.0 | 3.10 | 3.12 | 12 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.0.0/docs/installation/index.md) |
+| 3.7 | 3.8 | 3.11 | 12 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.7.0/docs/installation/index.md) |
+| 3.6 | 3.8 | 3.11 | 12 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.6.0/docs/installation/index.md) |
+| 3.5 | 3.8 | 3.10 | 11 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.5.0/docs/installation/index.md) |
+| 3.4 | 3.8 | 3.10 | 11 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.4.0/docs/installation/index.md) |
+| 3.3 | 3.8 | 3.10 | 10 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.3.0/docs/installation/index.md) |
+| 3.2 | 3.8 | 3.10 | 10 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.2.0/docs/installation/index.md) |
+| 3.1 | 3.7 | 3.9 | 10 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.1.0/docs/installation/index.md) |
+| 3.0 | 3.7 | 3.9 | 9.6 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.0.0/docs/installation/index.md) |
## 3. Install the Latest Release
@@ -183,13 +162,3 @@ Finally, restart the gunicorn and RQ services:
```no-highlight
sudo systemctl restart netbox netbox-rq
```
-
-## 6. Verify Housekeeping Scheduling
-
-If upgrading from a release prior to NetBox v3.0, check that a cron task (or similar scheduled process) has been configured to run NetBox's nightly housekeeping command. A shell script which invokes this command is included at `contrib/netbox-housekeeping.sh`. It can be linked from your system's daily cron task directory, or included within the crontab directly. (If NetBox has been installed in a nonstandard path, be sure to update the system paths within this script first.)
-
-```shell
-sudo ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
-```
-
-See the [housekeeping documentation](../administration/housekeeping.md) for further details.
diff --git a/docs/integrations/prometheus-metrics.md b/docs/integrations/prometheus-metrics.md
index 006ff16a4e..3f0e0ebda7 100644
--- a/docs/integrations/prometheus-metrics.md
+++ b/docs/integrations/prometheus-metrics.md
@@ -11,6 +11,8 @@ NetBox makes use of the [django-prometheus](https://github.com/korfuri/django-pr
- Per model insert, update, and delete counters
- Per view request counters
- Per view request latency histograms
+- REST API requests (by endpoint & method)
+- GraphQL API requests
- Request body size histograms
- Response body size histograms
- Response code counters
diff --git a/docs/integrations/rest-api.md b/docs/integrations/rest-api.md
index 7a0d3e176b..47fb65494b 100644
--- a/docs/integrations/rest-api.md
+++ b/docs/integrations/rest-api.md
@@ -608,6 +608,28 @@ http://netbox/api/dcim/sites/ \
!!! note
The bulk deletion of objects is an all-or-none operation, meaning that if NetBox fails to delete any of the specified objects (e.g. due a dependency by a related object), the entire operation will be aborted and none of the objects will be deleted.
+## Changelog Messages
+
+!!! info "This feature was introduced in NetBox v4.4."
+
+Most objects in NetBox support [change logging](../features/change-logging.md), which generates a detailed record each time an object is created, modified, or deleted. Beginning in NetBox v4.4, users can attach a message to the change record as well. This is accomplished via the REST API by including a `changelog_message` field in the object representation.
+
+For example, the following API request will create a new site and record a message in the resulting changelog entry:
+
+```no-highlight
+curl -s -X POST \
+-H "Authorization: Token $TOKEN" \
+-H "Content-Type: application/json" \
+http://netbox/api/dcim/sites/ \
+--data '{
+ "name": "Site A",
+ "slug": "site-a",
+ "changelog_message": "Adding a site for ticket #4137"
+}'
+```
+
+This approach works when creating, modifying, or deleting objects, either individually or in bulk.
+
## Uploading Files
As JSON does not support the inclusion of binary data, files cannot be uploaded using JSON-formatted API requests. Instead, we can use form data encoding to attach a local file.
diff --git a/docs/models/circuits/circuit.md b/docs/models/circuits/circuit.md
index c75e203221..6e999f28d1 100644
--- a/docs/models/circuits/circuit.md
+++ b/docs/models/circuits/circuit.md
@@ -38,8 +38,6 @@ The operational status of the circuit. By default, the following statuses are av
### Distance
-!!! info "This field was introduced in NetBox v4.2."
-
The distance between the circuit's two endpoints, including a unit designation (e.g. 100 meters or 25 feet).
### Description
diff --git a/docs/models/circuits/virtualcircuit.md b/docs/models/circuits/virtualcircuit.md
index 17328b87a2..51dfd1c209 100644
--- a/docs/models/circuits/virtualcircuit.md
+++ b/docs/models/circuits/virtualcircuit.md
@@ -1,7 +1,5 @@
# Virtual Circuits
-!!! info "This feature was introduced in NetBox v4.2."
-
A virtual circuit can connect two or more interfaces atop a set of decoupled physical connections. For example, it's very common to form a virtual connection between two virtual interfaces, each of which is bound to a physical interface on its respective device and physically connected to a [provider network](./providernetwork.md) via an independent [physical circuit](./circuit.md).
## Fields
diff --git a/docs/models/circuits/virtualcircuittermination.md b/docs/models/circuits/virtualcircuittermination.md
index a7833e13c3..82ea43eefe 100644
--- a/docs/models/circuits/virtualcircuittermination.md
+++ b/docs/models/circuits/virtualcircuittermination.md
@@ -1,7 +1,5 @@
# Virtual Circuit Terminations
-!!! info "This feature was introduced in NetBox v4.2."
-
This model represents the connection of a virtual [interface](../dcim/interface.md) to a [virtual circuit](./virtualcircuit.md).
## Fields
diff --git a/docs/models/core/datasource.md b/docs/models/core/datasource.md
index 527d93939d..64a087cb69 100644
--- a/docs/models/core/datasource.md
+++ b/docs/models/core/datasource.md
@@ -46,8 +46,6 @@ A set of rules (one per line) identifying filenames to ignore during synchroniza
### Sync Interval
-!!! info "This field was introduced in NetBox v4.3."
-
The interval at which the data source should automatically synchronize. If not set, the data source must be synchronized manually.
### Last Synced
diff --git a/docs/models/dcim/devicerole.md b/docs/models/dcim/devicerole.md
index abff149d62..e58373565c 100644
--- a/docs/models/dcim/devicerole.md
+++ b/docs/models/dcim/devicerole.md
@@ -6,8 +6,6 @@ Devices can be organized by functional roles, which are fully customizable by th
### Parent
-!!! info "This field was introduced in NetBox v4.3."
-
The parent role of which this role is a child (optional).
### Name
diff --git a/docs/models/dcim/interface.md b/docs/models/dcim/interface.md
index b7115050fe..7f67e4e7ad 100644
--- a/docs/models/dcim/interface.md
+++ b/docs/models/dcim/interface.md
@@ -126,8 +126,6 @@ The tagged VLANs which are configured to be carried by this interface. Valid onl
### Q-in-Q SVLAN
-!!! info "This field was introduced in NetBox v4.2."
-
The assigned service VLAN (for Q-in-Q/802.1ad interfaces).
### Wireless Role
@@ -155,6 +153,4 @@ The [wireless LANs](../wireless/wirelesslan.md) for which this interface carries
### VLAN Translation Policy
-!!! info "This field was introduced in NetBox v4.2."
-
The [VLAN translation policy](../ipam/vlantranslationpolicy.md) that applies to this interface (optional).
diff --git a/docs/models/dcim/inventoryitem.md b/docs/models/dcim/inventoryitem.md
index 6aed0fc86e..22be2c5aa0 100644
--- a/docs/models/dcim/inventoryitem.md
+++ b/docs/models/dcim/inventoryitem.md
@@ -30,8 +30,6 @@ An alternative physical label identifying the inventory item.
### Status
-!!! info "This field was introduced in NetBox v4.2."
-
The inventory item's operational status.
### Role
diff --git a/docs/models/dcim/macaddress.md b/docs/models/dcim/macaddress.md
index 5b1dd93be2..fe3d1f0e36 100644
--- a/docs/models/dcim/macaddress.md
+++ b/docs/models/dcim/macaddress.md
@@ -1,7 +1,5 @@
# MAC Addresses
-!!! info "This feature was introduced in NetBox v4.2."
-
A MAC address object in NetBox comprises a single Ethernet link layer address, and represents a MAC address as reported by or assigned to a network interface. MAC addresses can be assigned to [device](../dcim/device.md) and [virtual machine](../virtualization/virtualmachine.md) interfaces. A MAC address can be specified as the primary MAC address for a given device or VM interface.
Most interfaces have only a single MAC address, hard-coded at the factory. However, on some devices (particularly virtual interfaces) it is possible to assign additional MAC addresses or change existing ones. For this reason NetBox allows multiple MACAddress objects to be assigned to a single interface.
diff --git a/docs/models/dcim/moduletypeprofile.md b/docs/models/dcim/moduletypeprofile.md
index 80345c82b5..8e98793985 100644
--- a/docs/models/dcim/moduletypeprofile.md
+++ b/docs/models/dcim/moduletypeprofile.md
@@ -1,7 +1,5 @@
# Module Type Profiles
-!!! info "This model was introduced in NetBox v4.3."
-
Each [module type](./moduletype.md) may optionally be assigned a profile according to its classification. A profile can extend module types with user-configured attributes. For example, you might want to specify the input current and voltage of a power supply, or the clock speed and number of cores for a processor.
Module type attributes are managed via the configuration of a [JSON schema](https://json-schema.org/) on the profile. For example, the following schema introduces three module type attributes, two of which are designated as required attributes.
diff --git a/docs/models/dcim/platform.md b/docs/models/dcim/platform.md
index 0914d0aa6a..3400294e60 100644
--- a/docs/models/dcim/platform.md
+++ b/docs/models/dcim/platform.md
@@ -2,19 +2,27 @@
A platform defines the type of software running on a [device](./device.md) or [virtual machine](../virtualization/virtualmachine.md). This can be helpful to model when it is necessary to distinguish between different versions or feature sets. Note that two devices of the same type may be assigned different platforms: For example, one Juniper MX240 might run Junos 14 while another runs Junos 15.
+Platforms may be nested under parents to form a hierarchy. For example, platforms named "Debian" and "RHEL" might both be created under a generic "Linux" parent.
+
Platforms may optionally be limited by [manufacturer](./manufacturer.md): If a platform is assigned to a particular manufacturer, it can only be assigned to devices with a type belonging to that manufacturer.
-The assignment of platforms to devices is an optional feature, and may be disregarded if not desired.
+The assignment of platforms to devices and virtual machines is optional.
## Fields
+## Parent
+
+!!! "This field was introduced in NetBox v4.4."
+
+The parent platform class to which this platform belongs (optional).
+
### Name
-A unique human-friendly name.
+A human-friendly name for the platform. Must be unique per manufacturer.
### Slug
-A unique URL-friendly identifier. (This value can be used for filtering.)
+A URL-friendly identifier; must be unique per manufacturer. (This value can be used for filtering.)
### Manufacturer
diff --git a/docs/models/dcim/poweroutlet.md b/docs/models/dcim/poweroutlet.md
index 22a7ec63eb..2aa95737a6 100644
--- a/docs/models/dcim/poweroutlet.md
+++ b/docs/models/dcim/poweroutlet.md
@@ -40,12 +40,8 @@ The operational status of the power outlet. By default, the following statuses a
!!! tip "Custom power outlet statuses"
Additional power outlet statuses may be defined by setting `PowerOutlet.status` under the [`FIELD_CHOICES`](../../configuration/data-validation.md#field_choices) configuration parameter.
-!!! info "This field was introduced in NetBox v4.3."
-
### Color
-!!! info "This field was introduced in NetBox v4.2."
-
The power outlet's color (optional).
### Power Port
diff --git a/docs/models/dcim/rackreservation.md b/docs/models/dcim/rackreservation.md
index 32d52c9d7f..8eaa11af8c 100644
--- a/docs/models/dcim/rackreservation.md
+++ b/docs/models/dcim/rackreservation.md
@@ -12,6 +12,13 @@ The [rack](./rack.md) being reserved.
The rack unit or units being reserved. Multiple units can be expressed using commas and/or hyphens. For example, `1,3,5-7` specifies units 1, 3, 5, 6, and 7.
+### Status
+
+The current status of the reservation. (This is for documentation only: The status of a reservation has no impact on the installation of devices within a reserved rack unit.)
+
+!!! tip
+ Additional statuses may be defined by setting `RackReservation.status` under the [`FIELD_CHOICES`](../../configuration/data-validation.md#field_choices) configuration parameter.
+
### User
The NetBox user account associated with the reservation. Note that users with sufficient permission can make rack reservations for other users.
diff --git a/docs/models/dcim/racktype.md b/docs/models/dcim/racktype.md
index 5298e8b268..ecaf539c97 100644
--- a/docs/models/dcim/racktype.md
+++ b/docs/models/dcim/racktype.md
@@ -42,8 +42,6 @@ The number of the numerically lowest unit in the rack. This value defaults to on
The external width, height and depth of the rack can be tracked to aid in floorplan calculations. These measurements must be designated in either millimeters or inches.
-!!! info "The `outer_height` field was introduced in NetBox v4.3."
-
### Mounting Depth
The maximum depth of a mounted device that the rack can accommodate, in millimeters. For four-post frames or cabinets, this is the horizontal distance between the front and rear vertical rails. (Note that this measurement does _not_ include space between the rails and the cabinet doors.)
diff --git a/docs/models/extras/configcontext.md b/docs/models/extras/configcontext.md
index 1e58b9e017..7c5c597a9a 100644
--- a/docs/models/extras/configcontext.md
+++ b/docs/models/extras/configcontext.md
@@ -14,6 +14,10 @@ A unique human-friendly name.
A numeric value which influences the order in which context data is merged. Contexts with a lower weight are merged before those with a higher weight.
+### Profile
+
+The [profile](./configcontextprofile.md) to which the config context is assigned (optional). Profiles can be used to enforce structure in their data.
+
### Data
The context data expressed in JSON format.
diff --git a/docs/models/extras/configcontextprofile.md b/docs/models/extras/configcontextprofile.md
new file mode 100644
index 0000000000..289cce20ac
--- /dev/null
+++ b/docs/models/extras/configcontextprofile.md
@@ -0,0 +1,33 @@
+# Config Context Profiles
+
+Profiles can be used to organize [configuration contexts](./configcontext.md) and to enforce a desired structure for their data. The later is achieved by defining a [JSON schema](https://json-schema.org/) to which all config context with this profile assigned must comply.
+
+For example, the following schema defines two keys, `size` and `priority`, of which the former is required:
+
+```json
+{
+ "properties": {
+ "size": {
+ "type": "integer"
+ },
+ "priority": {
+ "type": "string",
+ "enum": ["high", "medium", "low"],
+ "default": "medium"
+ }
+ },
+ "required": [
+ "size"
+ ]
+}
+```
+
+## Fields
+
+### Name
+
+A unique human-friendly name.
+
+### Schema
+
+The JSON schema to be enforced for all assigned config contexts (optional).
diff --git a/docs/models/extras/configtemplate.md b/docs/models/extras/configtemplate.md
index ac059bdc54..7fe3e865f9 100644
--- a/docs/models/extras/configtemplate.md
+++ b/docs/models/extras/configtemplate.md
@@ -34,24 +34,15 @@ The `undefined` and `finalize` Jinja environment parameters, which must referenc
### MIME Type
-!!! info "This field was introduced in NetBox v4.3."
-
The MIME type to indicate in the response when rendering the configuration template (optional). Defaults to `text/plain`.
### File Name
-!!! info "This field was introduced in NetBox v4.3."
-
The file name to give to the rendered export file (optional).
### File Extension
-!!! info "This field was introduced in NetBox v4.3."
-
The file extension to append to the file name in the response (optional).
### As Attachment
-
-!!! info "This field was introduced in NetBox v4.3."
-
If selected, the rendered content will be returned as a file attachment, rather than displayed directly in-browser (where supported).
\ No newline at end of file
diff --git a/docs/models/extras/exporttemplate.md b/docs/models/extras/exporttemplate.md
index 32ee5eabcf..3d80ffd696 100644
--- a/docs/models/extras/exporttemplate.md
+++ b/docs/models/extras/exporttemplate.md
@@ -22,8 +22,6 @@ Jinja2 template code for rendering the exported data.
### Environment Parameters
-!!! info "This field was introduced in NetBox v4.3."
-
A dictionary of any additional parameters to pass when instantiating the [Jinja2 environment](https://jinja.palletsprojects.com/en/3.1.x/api/#jinja2.Environment). Jinja2 supports various optional parameters which can be used to modify its default behavior.
The `undefined` and `finalize` Jinja environment parameters, which must reference a Python class or function, can define a dotted path to the desired resource. For example:
diff --git a/docs/models/extras/tag.md b/docs/models/extras/tag.md
index c4bc91b5a9..b8a50b2eb5 100644
--- a/docs/models/extras/tag.md
+++ b/docs/models/extras/tag.md
@@ -20,8 +20,6 @@ The color to use when displaying the tag in the NetBox UI.
A numeric weight employed to influence the ordering of tags. Tags with a lower weight will be listed before those with higher weights. Values must be within the range **0** to **32767**.
-!!! info "This field was introduced in NetBox v4.3."
-
### Object Types
The assignment of a tag may be limited to a prescribed set of objects. For example, it may be desirable to limit the application of a specific tag to only devices and virtual machines.
diff --git a/docs/models/ipam/service.md b/docs/models/ipam/service.md
index 0d5f12a170..fc6ab73d2e 100644
--- a/docs/models/ipam/service.md
+++ b/docs/models/ipam/service.md
@@ -1,14 +1,18 @@
-# Services
+# Application Services
-A service represents a layer seven application available on a device or virtual machine. For example, a service might be created in NetBox to represent an HTTP server running on TCP/8000. Each service may optionally be further bound to one or more specific interfaces assigned to the selected device or virtual machine.
+An application service represents a layer seven application available on a device or virtual machine. For example, a service might be created in NetBox to represent an HTTP server running on TCP/8000. Each service may optionally be further bound to one or more specific interfaces assigned to the selected device or virtual machine.
-To aid in the efficient creation of services, users may opt to first create a [service template](./servicetemplate.md) from which service definitions can be quickly replicated.
+To aid in the efficient creation of application services, users may opt to first create an [application service template](./servicetemplate.md) from which service definitions can be quickly replicated.
+
+!!! note "Changed in NetBox v4.4"
+
+ Previously, application services were referred to simply as "services". The name has been changed in the UI to better reflect their intended use. There is no change to the name of the model or in any programmatic NetBox APIs.
## Fields
### Parent
-The parent object to which the service is assigned. This must be one of [Device](../dcim/device.md),
+The parent object to which the application service is assigned. This must be one of [Device](../dcim/device.md),
[VirtualMachine](../virtualization/virtualmachine.md), or [FHRP Group](./fhrpgroup.md).
!!! note "Changed in NetBox v4.3"
diff --git a/docs/models/ipam/servicetemplate.md b/docs/models/ipam/servicetemplate.md
index 28c66b6480..9dd69b3c48 100644
--- a/docs/models/ipam/servicetemplate.md
+++ b/docs/models/ipam/servicetemplate.md
@@ -1,6 +1,10 @@
-# Service Templates
+# Application Service Templates
-Service templates can be used to instantiate [services](./service.md) on [devices](../dcim/device.md) and [virtual machines](../virtualization/virtualmachine.md).
+Application service templates can be used to instantiate [application services](./service.md) on [devices](../dcim/device.md) and [virtual machines](../virtualization/virtualmachine.md).
+
+!!! note "Changed in NetBox v4.4"
+
+ Previously, application service templates were referred to simply as "service templates". The name has been changed in the UI to better reflect their intended use. There is no change to the name of the model or in any programmatic NetBox APIs.
## Fields
diff --git a/docs/models/ipam/vlan.md b/docs/models/ipam/vlan.md
index 3c90d8cc96..58fc9f551d 100644
--- a/docs/models/ipam/vlan.md
+++ b/docs/models/ipam/vlan.md
@@ -25,16 +25,15 @@ The user-defined functional [role](./role.md) assigned to the VLAN.
### VLAN Group or Site
+!!! warning "Site assignment is deprecated"
+ The assignment of individual VLANs directly to a site has been deprecated. This ability will be removed in a future NetBox release. Users are strongly encouraged to utilize VLAN groups, which have the added benefit of supporting the assignment of a VLAN to multiple sites.
+
The [VLAN group](./vlangroup.md) or [site](../dcim/site.md) to which the VLAN is assigned.
### Q-in-Q Role
-!!! info "This field was introduced in NetBox v4.2."
-
For VLANs which comprise a Q-in-Q/IEEE 802.1ad topology, this field indicates whether the VLAN is treated as a service or customer VLAN.
### Q-in-Q Service VLAN
-!!! info "This field was introduced in NetBox v4.2."
-
The designated parent service VLAN for a Q-in-Q customer VLAN. This may be set only for Q-in-Q custom VLANs.
diff --git a/docs/models/ipam/vlantranslationpolicy.md b/docs/models/ipam/vlantranslationpolicy.md
index 9e3e8de984..59541931e4 100644
--- a/docs/models/ipam/vlantranslationpolicy.md
+++ b/docs/models/ipam/vlantranslationpolicy.md
@@ -1,7 +1,5 @@
# VLAN Translation Policies
-!!! info "This feature was introduced in NetBox v4.2."
-
VLAN translation is a feature that consists of VLAN translation policies and [VLAN translation rules](./vlantranslationrule.md). Many rules can belong to a policy, and each rule defines a mapping of a local to remote VLAN ID (VID). A policy can then be assigned to an [Interface](../dcim/interface.md) or [VMInterface](../virtualization/vminterface.md), and all VLAN translation rules associated with that policy will be visible in the interface details.
There are uniqueness constraints on `(policy, local_vid)` and on `(policy, remote_vid)` in the `VLANTranslationRule` model. Thus, you cannot have multiple rules linked to the same policy that have the same local VID or the same remote VID. A set of policies and rules might look like this:
diff --git a/docs/models/ipam/vlantranslationrule.md b/docs/models/ipam/vlantranslationrule.md
index eb356d0d06..bffc030edb 100644
--- a/docs/models/ipam/vlantranslationrule.md
+++ b/docs/models/ipam/vlantranslationrule.md
@@ -1,7 +1,5 @@
# VLAN Translation Rules
-!!! info "This feature was introduced in NetBox v4.2."
-
A VLAN translation rule represents a one-to-one mapping of a local VLAN ID (VID) to a remote VID. Many rules can belong to a single policy.
See [VLAN translation policies](./vlantranslationpolicy.md) for an overview of the VLAN Translation feature.
diff --git a/docs/models/virtualization/vminterface.md b/docs/models/virtualization/vminterface.md
index ba0c68b15e..726060c052 100644
--- a/docs/models/virtualization/vminterface.md
+++ b/docs/models/virtualization/vminterface.md
@@ -1,6 +1,6 @@
## Interfaces
-[Virtual machine](./virtualmachine.md) interfaces behave similarly to device [interfaces](../dcim/interface.md): They can be assigned to VRFs, may have IP addresses, VLANs, and services attached to them, and so on. However, given their virtual nature, they lack properties pertaining to physical attributes. For example, VM interfaces do not have a physical type and cannot have cables attached to them.
+[Virtual machine](./virtualmachine.md) interfaces behave similarly to device [interfaces](../dcim/interface.md): They can be assigned to VRFs, may have IP addresses, VLANs, and so on. However, given their virtual nature, they lack properties pertaining to physical attributes. For example, VM interfaces do not have a physical type and cannot have cables attached to them.
## Fields
@@ -59,8 +59,6 @@ The tagged VLANs which are configured to be carried by this interface. Valid onl
### Q-in-Q SVLAN
-!!! info "This field was introduced in NetBox v4.2."
-
The assigned service VLAN (for Q-in-Q/802.1ad interfaces).
### VRF
@@ -69,6 +67,4 @@ The [virtual routing and forwarding](../ipam/vrf.md) instance to which this inte
### VLAN Translation Policy
-!!! info "This field was introduced in NetBox v4.2."
-
The [VLAN translation policy](../ipam/vlantranslationpolicy.md) that applies to this interface (optional).
diff --git a/docs/models/vpn/l2vpn.md b/docs/models/vpn/l2vpn.md
index 983095ef86..0bf17fa1b0 100644
--- a/docs/models/vpn/l2vpn.md
+++ b/docs/models/vpn/l2vpn.md
@@ -44,8 +44,6 @@ The operational status of the L2VPN. By default, the following statuses are avai
!!! tip "Custom L2VPN statuses"
Additional L2VPN statuses may be defined by setting `L2VPN.status` under the [`FIELD_CHOICES`](../../configuration/data-validation.md#field_choices) configuration parameter.
-!!! info "This field was introduced in NetBox v4.3."
-
### Identifier
An optional numeric identifier. This can be used to track a pseudowire ID, for example.
diff --git a/docs/models/wireless/wirelesslan.md b/docs/models/wireless/wirelesslan.md
index 2ce673086b..a448c42a2a 100644
--- a/docs/models/wireless/wirelesslan.md
+++ b/docs/models/wireless/wirelesslan.md
@@ -46,6 +46,4 @@ The security key configured on each client to grant access to the secured wirele
### Scope
-!!! info "This field was introduced in NetBox v4.2."
-
The [region](../dcim/region.md), [site](../dcim/site.md), [site group](../dcim/sitegroup.md) or [location](../dcim/location.md) with which this wireless LAN is associated.
diff --git a/docs/plugins/development/background-jobs.md b/docs/plugins/development/background-jobs.md
index 6fc8c4e754..98229b78d6 100644
--- a/docs/plugins/development/background-jobs.md
+++ b/docs/plugins/development/background-jobs.md
@@ -39,6 +39,27 @@ You can schedule the background job from within your code (e.g. from a model's `
This is the human-friendly names of your background job. If omitted, the class name will be used.
+### Logging
+
+!!! info "This feature was introduced in NetBox v4.4."
+
+A Python logger is instantiated by the runner for each job. It can be utilized within a job's `run()` method as needed:
+
+```python
+def run(self, *args, **kwargs):
+ obj = MyModel.objects.get(pk=kwargs.get('pk'))
+ self.logger.info("Retrieved object {obj}")
+```
+
+Four of the standard Python logging levels are supported:
+
+* `debug()`
+* `info()`
+* `warning()`
+* `error()`
+
+Log entries recorded using the runner's logger will be saved in the job's log in the database in addition to being processed by other [system logging handlers](../../configuration/system.md#logging).
+
### Scheduled Jobs
As described above, jobs can be scheduled for immediate execution or at any later time using the `enqueue()` method. However, for management purposes, the `enqueue_once()` method allows a job to be scheduled exactly once avoiding duplicates. If a job is already scheduled for a particular instance, a second one won't be scheduled, respecting thread safety. An example use case would be to schedule a periodic task that is bound to an instance in general, but not to any event of that instance (such as updates). The parameters of the `enqueue_once()` method are identical to those of `enqueue()`.
@@ -68,8 +89,6 @@ class MyModel(NetBoxModel):
### System Jobs
-!!! info "This feature was introduced in NetBox v4.2."
-
Some plugins may implement background jobs that are decoupled from the request/response cycle. Typical use cases would be housekeeping tasks or synchronization jobs. These can be registered as _system jobs_ using the `system_job()` decorator. The job interval must be passed as an integer (in minutes) when registering a system job. System jobs are scheduled automatically when the RQ worker (`manage.py rqworker`) is run.
#### Example
diff --git a/docs/plugins/development/index.md b/docs/plugins/development/index.md
index 56bde5e41f..0acf5f90ac 100644
--- a/docs/plugins/development/index.md
+++ b/docs/plugins/development/index.md
@@ -66,7 +66,7 @@ The top level is the project root, which can have any name that you like. Immedi
* `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.
+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.
@@ -186,7 +186,7 @@ Many of these are self-explanatory, but for more information, see the [pyproject
## Create a Virtual Environment
-It is strongly recommended to create a Python [virtual environment](https://docs.python.org/3/tutorial/venv.html) for the development of your plugin, as opposed to using system-wide packages. This will afford you complete control over the installed versions of all dependencies and avoid conflict with system packages. This environment can live wherever you'd like, however it should be excluded from revision control. (A popular convention is to keep all virtual environments in the user's home directory, e.g. `~/.virtualenvs/`.)
+It is strongly recommended to create a Python [virtual environment](https://docs.python.org/3/tutorial/venv.html) for the development of your plugin, as opposed to using system-wide packages. This will afford you complete control over the installed versions of all dependencies and avoid conflict with system packages. This environment can live wherever you'd like;however, it should be excluded from revision control. (A popular convention is to keep all virtual environments in the user's home directory, e.g. `~/.virtualenvs/`.)
```shell
python3 -m venv ~/.virtualenvs/my_plugin
diff --git a/docs/plugins/development/models.md b/docs/plugins/development/models.md
index 508c4ce89c..eb12204ff4 100644
--- a/docs/plugins/development/models.md
+++ b/docs/plugins/development/models.md
@@ -24,20 +24,7 @@ Every model includes by default a numeric primary key. This value is generated a
## Enabling NetBox Features
-Plugin models can leverage certain NetBox features by inheriting from NetBox's `NetBoxModel` class. This class extends the plugin model to enable features unique to NetBox, including:
-
-* Bookmarks
-* Change logging
-* Cloning
-* Custom fields
-* Custom links
-* Custom validation
-* Export templates
-* Journaling
-* Tags
-* Webhooks
-
-This class performs two crucial functions:
+Plugin models can leverage certain [model features](../../development/models.md#features-matrix) (such as tags, custom fields, event rules, etc.) by inheriting from NetBox's `NetBoxModel` class. This class performs two crucial functions:
1. Apply any fields, methods, and/or attributes necessary to the operation of these features
2. Register the model with NetBox as utilizing these features
@@ -119,8 +106,6 @@ For more information about database migrations, see the [Django documentation](h
::: netbox.models.features.ContactsMixin
-!!! info "Plugin support for ContactsMixin was introduced in NetBox v4.3."
-
::: netbox.models.features.CustomLinksMixin
::: netbox.models.features.CustomFieldsMixin
@@ -137,6 +122,27 @@ For more information about database migrations, see the [Django documentation](h
::: netbox.models.features.TagsMixin
+## Custom Model Features
+
+In addition to utilizing the model features provided natively by NetBox (listed above), plugins can register their own model features. This is done using the `register_model_feature()` function from `netbox.utils`. This function takes two arguments: a feature name, and a callable which accepts a model class. The callable must return a boolean value indicting whether the given model supports the named feature.
+
+This function can be used as a decorator:
+
+```python
+@register_model_feature('foo')
+def supports_foo(model):
+ # Your logic here
+```
+
+Or it can be called directly:
+
+```python
+register_model_feature('foo', supports_foo)
+```
+
+!!! tip
+ Consider performing feature registration inside your PluginConfig's `ready()` method.
+
## Choice Sets
For model fields which support the selection of one or more values from a predefined list of choices, NetBox provides the `ChoiceSet` utility class. This can be used in place of a regular choices tuple to provide enhanced functionality, namely dynamic configuration and colorization. (See [Django's documentation](https://docs.djangoproject.com/en/stable/ref/models/fields/#choices) on the `choices` parameter for supported model fields.)
diff --git a/docs/plugins/development/tables.md b/docs/plugins/development/tables.md
index 6fe8357b38..c511588493 100644
--- a/docs/plugins/development/tables.md
+++ b/docs/plugins/development/tables.md
@@ -51,6 +51,10 @@ This will automatically apply any user-specific preferences for the table. (If u
The table column classes listed below are supported for use in plugins. These classes can be imported from `netbox.tables.columns`.
+::: netbox.tables.ArrayColumn
+ options:
+ members: false
+
::: netbox.tables.BooleanColumn
options:
members: false
diff --git a/docs/plugins/development/user-interface.md b/docs/plugins/development/user-interface.md
new file mode 100644
index 0000000000..a918eb185a
--- /dev/null
+++ b/docs/plugins/development/user-interface.md
@@ -0,0 +1,14 @@
+# User Interface
+
+## Light & Dark Mode
+
+The NetBox user interface supports toggling between light and dark versions of the theme. If needed, a plugin can determine the currently active color theme by inspecting `window.localStorage['netbox-color-mode']`, which will indicate either `light` or `dark`.
+
+Additionally, when the color scheme is toggled by the user, a custom event `netbox.colorModeChanged` indicating the new scheme is dispatched. A plugin can listen for this event if needed to react to the change:
+
+```typescript
+window.addEventListener('netbox.colorModeChanged', e => {
+ const customEvent = e as CustomEvent0?Q:-1);R+=C){var G=X.children[R];if(G.className.indexOf("hidden")===-1&&oe(G.dateObj)&&Math.abs(f.$i-R)>=Math.abs(h))return L(G)}t.changeMonth(C),Y(H(C),0)}function Y(f,h){var g=o(),b=bt(g||document.body),C=f!==void 0?f:b?g:t.selectedDateElem!==void 0&&bt(t.selectedDateElem)?t.selectedDateElem:t.todayDateElem!==void 0&&bt(t.todayDateElem)?t.todayDateElem:H(h>0?1:-1);C===void 0?t._input.focus():b?N(C,h):L(C)}function $(f,h){for(var g=(new Date(f,h,1).getDay()-t.l10n.firstDayOfWeek+7)%7,b=t.utils.getDaysInMonth((h-1+12)%12,f),C=t.utils.getDaysInMonth(h,f),k=window.document.createDocumentFragment(),X=t.config.showMonths>1,P=X?"prevMonthDay hidden":"prevMonthDay",Q=X?"nextMonthDay hidden":"nextMonthDay",R=b+1-g,G=0;R<=b;R++,G++)k.appendChild(z("flatpickr-day "+P,new Date(f,h-1,R),R,G));for(R=1;R<=C;R++,G++)k.appendChild(z("flatpickr-day",new Date(f,h,R),R,G));for(var re=C+1;re<=42-g&&(t.config.showMonths===1||G%7!==0);re++,G++)k.appendChild(z("flatpickr-day "+Q,new Date(f,h+1,re%C),re,G));var it=te("div","dayContainer");return it.appendChild(k),it}function ie(){if(t.daysContainer!==void 0){yi(t.daysContainer),t.weekNumbers&&yi(t.weekNumbers);for(var f=document.createDocumentFragment(),h=0;h1||t.config.monthSelectorType!=="dropdown")){var f=function(b){return t.config.minDate!==void 0&&t.currentYear===t.config.minDate.getFullYear()&&b t.config.maxDate.getMonth())};t.monthsDropdownContainer.tabIndex=-1,t.monthsDropdownContainer.innerHTML="";for(var h=0;h<12;h++)if(f(h)){var g=te("option","flatpickr-monthDropdown-month");g.value=new Date(t.currentYear,h).getMonth().toString(),g.textContent=bi(h,t.config.shorthandCurrentMonth,t.l10n),g.tabIndex=-1,t.currentMonth===h&&(g.selected=!0),t.monthsDropdownContainer.appendChild(g)}}}function Te(){var f=te("div","flatpickr-month"),h=window.document.createDocumentFragment(),g;t.config.showMonths>1||t.config.monthSelectorType==="static"?g=te("span","cur-month"):(t.monthsDropdownContainer=te("select","flatpickr-monthDropdown-months"),t.monthsDropdownContainer.setAttribute("aria-label",t.l10n.monthAriaLabel),v(t.monthsDropdownContainer,"change",function(X){var P=$e(X),Q=parseInt(P.value,10);t.changeMonth(Q-t.currentMonth),ue("onMonthChange")}),J(),g=t.monthsDropdownContainer);var b=Ei("cur-year",{tabindex:"-1"}),C=b.getElementsByTagName("input")[0];C.setAttribute("aria-label",t.l10n.yearAriaLabel),t.config.minDate&&C.setAttribute("min",t.config.minDate.getFullYear().toString()),t.config.maxDate&&(C.setAttribute("max",t.config.maxDate.getFullYear().toString()),C.disabled=!!t.config.minDate&&t.config.minDate.getFullYear()===t.config.maxDate.getFullYear());var k=te("div","flatpickr-current-month");return k.appendChild(g),k.appendChild(b),h.appendChild(k),f.appendChild(h),{container:f,yearElement:C,monthElement:g}}function Ce(){yi(t.monthNav),t.monthNav.appendChild(t.prevMonthNav),t.config.showMonths&&(t.yearElements=[],t.monthElements=[]);for(var f=t.config.showMonths;f--;){var h=Te();t.yearElements.push(h.yearElement),t.monthElements.push(h.monthElement),t.monthNav.appendChild(h.container)}t.monthNav.appendChild(t.nextMonthNav)}function se(){return t.monthNav=te("div","flatpickr-months"),t.yearElements=[],t.monthElements=[],t.prevMonthNav=te("span","flatpickr-prev-month"),t.prevMonthNav.innerHTML=t.config.prevArrow,t.nextMonthNav=te("span","flatpickr-next-month"),t.nextMonthNav.innerHTML=t.config.nextArrow,Ce(),Object.defineProperty(t,"_hidePrevMonthArrow",{get:function(){return t.__hidePrevMonthArrow},set:function(f){t.__hidePrevMonthArrow!==f&&(Oe(t.prevMonthNav,"flatpickr-disabled",f),t.__hidePrevMonthArrow=f)}}),Object.defineProperty(t,"_hideNextMonthArrow",{get:function(){return t.__hideNextMonthArrow},set:function(f){t.__hideNextMonthArrow!==f&&(Oe(t.nextMonthNav,"flatpickr-disabled",f),t.__hideNextMonthArrow=f)}}),t.currentYearElement=t.yearElements[0],Li(),t.monthNav}function ne(){t.calendarContainer.classList.add("hasTime"),t.config.noCalendar&&t.calendarContainer.classList.add("noCalendar");var f=Nr(t.config);t.timeContainer=te("div","flatpickr-time"),t.timeContainer.tabIndex=-1;var h=te("span","flatpickr-time-separator",":"),g=Ei("flatpickr-hour",{"aria-label":t.l10n.hourAriaLabel});t.hourElement=g.getElementsByTagName("input")[0];var b=Ei("flatpickr-minute",{"aria-label":t.l10n.minuteAriaLabel});if(t.minuteElement=b.getElementsByTagName("input")[0],t.hourElement.tabIndex=t.minuteElement.tabIndex=-1,t.hourElement.value=De(t.latestSelectedDateObj?t.latestSelectedDateObj.getHours():t.config.time_24hr?f.hours:u(f.hours)),t.minuteElement.value=De(t.latestSelectedDateObj?t.latestSelectedDateObj.getMinutes():f.minutes),t.hourElement.setAttribute("step",t.config.hourIncrement.toString()),t.minuteElement.setAttribute("step",t.config.minuteIncrement.toString()),t.hourElement.setAttribute("min",t.config.time_24hr?"0":"1"),t.hourElement.setAttribute("max",t.config.time_24hr?"23":"12"),t.hourElement.setAttribute("maxlength","2"),t.minuteElement.setAttribute("min","0"),t.minuteElement.setAttribute("max","59"),t.minuteElement.setAttribute("maxlength","2"),t.timeContainer.appendChild(g),t.timeContainer.appendChild(h),t.timeContainer.appendChild(b),t.config.time_24hr&&t.timeContainer.classList.add("time24hr"),t.config.enableSeconds){t.timeContainer.classList.add("hasSeconds");var C=Ei("flatpickr-second");t.secondElement=C.getElementsByTagName("input")[0],t.secondElement.value=De(t.latestSelectedDateObj?t.latestSelectedDateObj.getSeconds():f.seconds),t.secondElement.setAttribute("step",t.minuteElement.getAttribute("step")),t.secondElement.setAttribute("min","0"),t.secondElement.setAttribute("max","59"),t.secondElement.setAttribute("maxlength","2"),t.timeContainer.appendChild(te("span","flatpickr-time-separator",":")),t.timeContainer.appendChild(C)}return t.config.time_24hr||(t.amPM=te("span","flatpickr-am-pm",t.l10n.amPM[Fe((t.latestSelectedDateObj?t.hourElement.value:t.config.defaultHour)>11)]),t.amPM.title=t.l10n.toggleTitle,t.amPM.tabIndex=-1,t.timeContainer.appendChild(t.amPM)),t.timeContainer}function qe(){t.weekdayContainer?yi(t.weekdayContainer):t.weekdayContainer=te("div","flatpickr-weekdays");for(var f=t.config.showMonths;f--;){var h=te("div","flatpickr-weekdaycontainer");t.weekdayContainer.appendChild(h)}return Re(),t.weekdayContainer}function Re(){if(t.weekdayContainer){var f=t.l10n.firstDayOfWeek,h=wc(t.l10n.weekdays.shorthand);f>0&&f {var tu=Object.create;var Mi=Object.defineProperty,nu=Object.defineProperties,iu=Object.getOwnPropertyDescriptor,ru=Object.getOwnPropertyDescriptors,ou=Object.getOwnPropertyNames,ps=Object.getOwnPropertySymbols,su=Object.getPrototypeOf,ms=Object.prototype.hasOwnProperty,au=Object.prototype.propertyIsEnumerable;var qr=(n,e,t)=>e in n?Mi(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,O=(n,e)=>{for(var t in e||(e={}))ms.call(e,t)&&qr(n,t,e[t]);if(ps)for(var t of ps(e))au.call(e,t)&&qr(n,t,e[t]);return n},ae=(n,e)=>nu(n,ru(e));var lu=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),gs=(n,e)=>{for(var t in e)Mi(n,t,{get:e[t],enumerable:!0})},cu=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ou(e))!ms.call(n,r)&&r!==t&&Mi(n,r,{get:()=>e[r],enumerable:!(i=iu(e,r))||i.enumerable});return n};var uu=(n,e,t)=>(t=n!=null?tu(su(n)):{},cu(e||!n||!n.__esModule?Mi(t,"default",{value:n,enumerable:!0}):t,n));var ee=(n,e,t)=>qr(n,typeof e!="symbol"?e+"":e,t);var at=(n,e,t)=>new Promise((i,r)=>{var o=l=>{try{a(t.next(l))}catch(c){r(c)}},s=l=>{try{a(t.throw(l))}catch(c){r(c)}},a=l=>l.done?i(l.value):Promise.resolve(l.value).then(o,s);a((t=t.apply(n,e)).next())});var gc=lu((vi,ts)=>{(function(e,t){typeof vi=="object"&&typeof ts=="object"?ts.exports=t():typeof define=="function"&&define.amd?define([],t):typeof vi=="object"?vi.ClipboardJS=t():e.ClipboardJS=t()})(vi,function(){return function(){var n={686:function(i,r,o){"use strict";o.d(r,{default:function(){return Re}});var s=o(279),a=o.n(s),l=o(370),c=o.n(l),u=o(817),d=o.n(u);function p(W){try{return document.execCommand(W)}catch(M){return!1}}var y=function(M){var D=d()(M);return p("cut"),D},m=y;function v(W){var M=document.documentElement.getAttribute("dir")==="rtl",D=document.createElement("textarea");D.style.fontSize="12pt",D.style.border="0",D.style.padding="0",D.style.margin="0",D.style.position="absolute",D.style[M?"right":"left"]="-9999px";var $=window.pageYOffset||document.documentElement.scrollTop;return D.style.top="".concat($,"px"),D.setAttribute("readonly",""),D.value=W,D}var w=function(M,D){var $=v(M);D.container.appendChild($);var V=d()($);return p("copy"),$.remove(),V},T=function(M){var D=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},$="";return typeof M=="string"?$=w(M,D):M instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(M==null?void 0:M.type)?$=w(M.value,D):($=d()(M),p("copy")),$},_=T;function S(W){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?S=function(D){return typeof D}:S=function(D){return D&&typeof Symbol=="function"&&D.constructor===Symbol&&D!==Symbol.prototype?"symbol":typeof D},S(W)}var A=function(){var M=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},D=M.action,$=D===void 0?"copy":D,V=M.container,q=M.target,U=M.text;if($!=="copy"&&$!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&S(q)==="object"&&q.nodeType===1){if($==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if($==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(U)return _(U,{container:V});if(q)return $==="cut"?m(q):_(q,{container:V})},K=A;function z(W){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?z=function(D){return typeof D}:z=function(D){return D&&typeof Symbol=="function"&&D.constructor===Symbol&&D!==Symbol.prototype?"symbol":typeof D},z(W)}function L(W,M){if(!(W instanceof M))throw new TypeError("Cannot call a class as a function")}function H(W,M){for(var D=0;D 0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof V.action=="function"?V.action:this.defaultAction,this.target=typeof V.target=="function"?V.target:this.defaultTarget,this.text=typeof V.text=="function"?V.text:this.defaultText,this.container=z(V.container)==="object"?V.container:document.body}},{key:"listenClick",value:function(V){var q=this;this.listener=c()(V,"click",function(U){return q.onClick(U)})}},{key:"onClick",value:function(V){var q=V.delegateTarget||V.currentTarget,U=this.action(q)||"copy",Z=K({action:U,container:this.container,target:this.target(q),text:this.text(q)});this.emit(Z?"success":"error",{action:U,text:Z,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(V){return ne("action",V)}},{key:"defaultTarget",value:function(V){var q=ne("target",V);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(V){return ne("text",V)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(V){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return _(V,q)}},{key:"cut",value:function(V){return m(V)}},{key:"isSupported",value:function(){var V=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof V=="string"?[V]:V,U=!!document.queryCommandSupported;return q.forEach(function(Z){U=U&&!!document.queryCommandSupported(Z)}),U}}]),D}(a()),Re=qe},828:function(i){var r=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var o=Element.prototype;o.matches=o.matchesSelector||o.mozMatchesSelector||o.msMatchesSelector||o.oMatchesSelector||o.webkitMatchesSelector}function s(a,l){for(;a&&a.nodeType!==r;){if(typeof a.matches=="function"&&a.matches(l))return a;a=a.parentNode}}i.exports=s},438:function(i,r,o){var s=o(828);function a(u,d,p,y,m){var v=c.apply(this,arguments);return u.addEventListener(p,v,m),{destroy:function(){u.removeEventListener(p,v,m)}}}function l(u,d,p,y,m){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof p=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return a(v,d,p,y,m)}))}function c(u,d,p,y){return function(m){m.delegateTarget=s(m.target,d),m.delegateTarget&&y.call(u,m)}}i.exports=l},879:function(i,r){r.node=function(o){return o!==void 0&&o instanceof HTMLElement&&o.nodeType===1},r.nodeList=function(o){var s=Object.prototype.toString.call(o);return o!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in o&&(o.length===0||r.node(o[0]))},r.string=function(o){return typeof o=="string"||o instanceof String},r.fn=function(o){var s=Object.prototype.toString.call(o);return s==="[object Function]"}},370:function(i,r,o){var s=o(879),a=o(438);function l(p,y,m){if(!p&&!y&&!m)throw new Error("Missing required arguments");if(!s.string(y))throw new TypeError("Second argument must be a String");if(!s.fn(m))throw new TypeError("Third argument must be a Function");if(s.node(p))return c(p,y,m);if(s.nodeList(p))return u(p,y,m);if(s.string(p))return d(p,y,m);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(p,y,m){return p.addEventListener(y,m),{destroy:function(){p.removeEventListener(y,m)}}}function u(p,y,m){return Array.prototype.forEach.call(p,function(v){v.addEventListener(y,m)}),{destroy:function(){Array.prototype.forEach.call(p,function(v){v.removeEventListener(y,m)})}}}function d(p,y,m){return a(document.body,p,y,m)}i.exports=l},817:function(i){function r(o){var s;if(o.nodeName==="SELECT")o.focus(),s=o.value;else if(o.nodeName==="INPUT"||o.nodeName==="TEXTAREA"){var a=o.hasAttribute("readonly");a||o.setAttribute("readonly",""),o.select(),o.setSelectionRange(0,o.value.length),a||o.removeAttribute("readonly"),s=o.value}else{o.hasAttribute("contenteditable")&&o.focus();var l=window.getSelection(),c=document.createRange();c.selectNodeContents(o),l.removeAllRanges(),l.addRange(c),s=l.toString()}return s}i.exports=r},279:function(i){function r(){}r.prototype={on:function(o,s,a){var l=this.e||(this.e={});return(l[o]||(l[o]=[])).push({fn:s,ctx:a}),this},once:function(o,s,a){var l=this;function c(){l.off(o,c),s.apply(a,arguments)}return c._=s,this.on(o,c,a)},emit:function(o){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[o]||[]).slice(),l=0,c=a.length;for(l;l ws,afterRead:()=>Es,afterWrite:()=>Cs,applyStyles:()=>hn,arrow:()=>Ni,auto:()=>jn,basePlacements:()=>lt,beforeMain:()=>bs,beforeRead:()=>vs,beforeWrite:()=>xs,bottom:()=>ge,clippingParents:()=>Ur,computeStyles:()=>mn,createPopper:()=>Jn,createPopperBase:()=>Is,createPopperLite:()=>Rs,detectOverflow:()=>ke,end:()=>_t,eventListeners:()=>gn,flip:()=>Pi,hide:()=>Fi,left:()=>he,main:()=>_s,modifierPhases:()=>Gr,offset:()=>Bi,placements:()=>qn,popper:()=>$t,popperGenerator:()=>Gt,popperOffsets:()=>En,preventOverflow:()=>$i,read:()=>ys,reference:()=>Yr,right:()=>me,start:()=>rt,top:()=>de,variationPlacements:()=>ki,viewport:()=>Wn,write:()=>Ts});var de="top",ge="bottom",me="right",he="left",jn="auto",lt=[de,ge,me,he],rt="start",_t="end",Ur="clippingParents",Wn="viewport",$t="popper",Yr="reference",ki=lt.reduce(function(n,e){return n.concat([e+"-"+rt,e+"-"+_t])},[]),qn=[].concat(lt,[jn]).reduce(function(n,e){return n.concat([e,e+"-"+rt,e+"-"+_t])},[]),vs="beforeRead",ys="read",Es="afterRead",bs="beforeMain",_s="main",ws="afterMain",xs="beforeWrite",Ts="write",Cs="afterWrite",Gr=[vs,ys,Es,bs,_s,ws,xs,Ts,Cs];function we(n){return n?(n.nodeName||"").toLowerCase():null}function ce(n){if(n==null)return window;if(n.toString()!=="[object Window]"){var e=n.ownerDocument;return e&&e.defaultView||window}return n}function Ue(n){var e=ce(n).Element;return n instanceof e||n instanceof Element}function be(n){var e=ce(n).HTMLElement;return n instanceof e||n instanceof HTMLElement}function fn(n){if(typeof ShadowRoot=="undefined")return!1;var e=ce(n).ShadowRoot;return n instanceof e||n instanceof ShadowRoot}function du(n){var e=n.state;Object.keys(e.elements).forEach(function(t){var i=e.styles[t]||{},r=e.attributes[t]||{},o=e.elements[t];!be(o)||!we(o)||(Object.assign(o.style,i),Object.keys(r).forEach(function(s){var a=r[s];a===!1?o.removeAttribute(s):o.setAttribute(s,a===!0?"":a)}))})}function fu(n){var e=n.state,t={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,t.popper),e.styles=t,e.elements.arrow&&Object.assign(e.elements.arrow.style,t.arrow),function(){Object.keys(e.elements).forEach(function(i){var r=e.elements[i],o=e.attributes[i]||{},s=Object.keys(e.styles.hasOwnProperty(i)?e.styles[i]:t[i]),a=s.reduce(function(l,c){return l[c]="",l},{});!be(r)||!we(r)||(Object.assign(r.style,a),Object.keys(o).forEach(function(l){r.removeAttribute(l)}))})}}var hn={name:"applyStyles",enabled:!0,phase:"write",fn:du,effect:fu,requires:["computeStyles"]};function xe(n){return n.split("-")[0]}var Ze=Math.max,Vt=Math.min,ct=Math.round;function pn(){var n=navigator.userAgentData;return n!=null&&n.brands&&Array.isArray(n.brands)?n.brands.map(function(e){return e.brand+"/"+e.version}).join(" "):navigator.userAgent}function Un(){return!/^((?!chrome|android).)*safari/i.test(pn())}function Ye(n,e,t){e===void 0&&(e=!1),t===void 0&&(t=!1);var i=n.getBoundingClientRect(),r=1,o=1;e&&be(n)&&(r=n.offsetWidth>0&&ct(i.width)/n.offsetWidth||1,o=n.offsetHeight>0&&ct(i.height)/n.offsetHeight||1);var s=Ue(n)?ce(n):window,a=s.visualViewport,l=!Un()&&t,c=(i.left+(l&&a?a.offsetLeft:0))/r,u=(i.top+(l&&a?a.offsetTop:0))/o,d=i.width/r,p=i.height/o;return{width:d,height:p,top:u,right:c+d,bottom:u+p,left:c,x:c,y:u}}function zt(n){var e=Ye(n),t=n.offsetWidth,i=n.offsetHeight;return Math.abs(e.width-t)<=1&&(t=e.width),Math.abs(e.height-i)<=1&&(i=e.height),{x:n.offsetLeft,y:n.offsetTop,width:t,height:i}}function Yn(n,e){var t=e.getRootNode&&e.getRootNode();if(n.contains(e))return!0;if(t&&fn(t)){var i=e;do{if(i&&n.isSameNode(i))return!0;i=i.parentNode||i.host}while(i)}return!1}function Me(n){return ce(n).getComputedStyle(n)}function Kr(n){return["table","td","th"].indexOf(we(n))>=0}function Ae(n){return((Ue(n)?n.ownerDocument:n.document)||window.document).documentElement}function ut(n){return we(n)==="html"?n:n.assignedSlot||n.parentNode||(fn(n)?n.host:null)||Ae(n)}function As(n){return!be(n)||Me(n).position==="fixed"?null:n.offsetParent}function hu(n){var e=/firefox/i.test(pn()),t=/Trident/i.test(pn());if(t&&be(n)){var i=Me(n);if(i.position==="fixed")return null}var r=ut(n);for(fn(r)&&(r=r.host);be(r)&&["html","body"].indexOf(we(r))<0;){var o=Me(r);if(o.transform!=="none"||o.perspective!=="none"||o.contain==="paint"||["transform","perspective"].indexOf(o.willChange)!==-1||e&&o.willChange==="filter"||e&&o.filter&&o.filter!=="none")return r;r=r.parentNode}return null}function et(n){for(var e=ce(n),t=As(n);t&&Kr(t)&&Me(t).position==="static";)t=As(t);return t&&(we(t)==="html"||we(t)==="body"&&Me(t).position==="static")?e:t||hu(n)||e}function jt(n){return["top","bottom"].indexOf(n)>=0?"x":"y"}function Wt(n,e,t){return Ze(n,Vt(e,t))}function Ss(n,e,t){var i=Wt(n,e,t);return i>t?t:i}function Gn(){return{top:0,right:0,bottom:0,left:0}}function Kn(n){return Object.assign({},Gn(),n)}function Xn(n,e){return e.reduce(function(t,i){return t[i]=n,t},{})}var pu=function(e,t){return e=typeof e=="function"?e(Object.assign({},t.rects,{placement:t.placement})):e,Kn(typeof e!="number"?e:Xn(e,lt))};function mu(n){var e,t=n.state,i=n.name,r=n.options,o=t.elements.arrow,s=t.modifiersData.popperOffsets,a=xe(t.placement),l=jt(a),c=[he,me].indexOf(a)>=0,u=c?"height":"width";if(!(!o||!s)){var d=pu(r.padding,t),p=zt(o),y=l==="y"?de:he,m=l==="y"?ge:me,v=t.rects.reference[u]+t.rects.reference[l]-s[l]-t.rects.popper[u],w=s[l]-t.rects.reference[l],T=et(o),_=T?l==="y"?T.clientHeight||0:T.clientWidth||0:0,S=v/2-w/2,A=d[y],K=_-p[u]-d[m],z=_/2-p[u]/2+S,L=Wt(A,z,K),H=l;t.modifiersData[i]=(e={},e[H]=L,e.centerOffset=L-z,e)}}function gu(n){var e=n.state,t=n.options,i=t.element,r=i===void 0?"[data-popper-arrow]":i;r!=null&&(typeof r=="string"&&(r=e.elements.popper.querySelector(r),!r)||Yn(e.elements.popper,r)&&(e.elements.arrow=r))}var Ni={name:"arrow",enabled:!0,phase:"main",fn:mu,effect:gu,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Ge(n){return n.split("-")[1]}var vu={top:"auto",right:"auto",bottom:"auto",left:"auto"};function yu(n,e){var t=n.x,i=n.y,r=e.devicePixelRatio||1;return{x:ct(t*r)/r||0,y:ct(i*r)/r||0}}function Ds(n){var e,t=n.popper,i=n.popperRect,r=n.placement,o=n.variation,s=n.offsets,a=n.position,l=n.gpuAcceleration,c=n.adaptive,u=n.roundOffsets,d=n.isFixed,p=s.x,y=p===void 0?0:p,m=s.y,v=m===void 0?0:m,w=typeof u=="function"?u({x:y,y:v}):{x:y,y:v};y=w.x,v=w.y;var T=s.hasOwnProperty("x"),_=s.hasOwnProperty("y"),S=he,A=de,K=window;if(c){var z=et(t),L="clientHeight",H="clientWidth";if(z===ce(t)&&(z=Ae(t),Me(z).position!=="static"&&a==="absolute"&&(L="scrollHeight",H="scrollWidth")),z=z,r===de||(r===he||r===me)&&o===_t){A=ge;var N=d&&z===K&&K.visualViewport?K.visualViewport.height:z[L];v-=N-i.height,v*=l?1:-1}if(r===he||(r===de||r===ge)&&o===_t){S=me;var Y=d&&z===K&&K.visualViewport?K.visualViewport.width:z[H];y-=Y-i.width,y*=l?1:-1}}var B=Object.assign({position:a},c&&vu),ie=u===!0?yu({x:y,y:v},ce(t)):{x:y,y:v};if(y=ie.x,v=ie.y,l){var J;return Object.assign({},B,(J={},J[A]=_?"0":"",J[S]=T?"0":"",J.transform=(K.devicePixelRatio||1)<=1?"translate("+y+"px, "+v+"px)":"translate3d("+y+"px, "+v+"px, 0)",J))}return Object.assign({},B,(e={},e[A]=_?v+"px":"",e[S]=T?y+"px":"",e.transform="",e))}function Eu(n){var e=n.state,t=n.options,i=t.gpuAcceleration,r=i===void 0?!0:i,o=t.adaptive,s=o===void 0?!0:o,a=t.roundOffsets,l=a===void 0?!0:a,c={placement:xe(e.placement),variation:Ge(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:r,isFixed:e.options.strategy==="fixed"};e.modifiersData.popperOffsets!=null&&(e.styles.popper=Object.assign({},e.styles.popper,Ds(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:s,roundOffsets:l})))),e.modifiersData.arrow!=null&&(e.styles.arrow=Object.assign({},e.styles.arrow,Ds(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})}var mn={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:Eu,data:{}};var Ii={passive:!0};function bu(n){var e=n.state,t=n.instance,i=n.options,r=i.scroll,o=r===void 0?!0:r,s=i.resize,a=s===void 0?!0:s,l=ce(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach(function(u){u.addEventListener("scroll",t.update,Ii)}),a&&l.addEventListener("resize",t.update,Ii),function(){o&&c.forEach(function(u){u.removeEventListener("scroll",t.update,Ii)}),a&&l.removeEventListener("resize",t.update,Ii)}}var gn={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:bu,data:{}};var _u={left:"right",right:"left",bottom:"top",top:"bottom"};function vn(n){return n.replace(/left|right|bottom|top/g,function(e){return _u[e]})}var wu={start:"end",end:"start"};function Ri(n){return n.replace(/start|end/g,function(e){return wu[e]})}function qt(n){var e=ce(n),t=e.pageXOffset,i=e.pageYOffset;return{scrollLeft:t,scrollTop:i}}function Ut(n){return Ye(Ae(n)).left+qt(n).scrollLeft}function Xr(n,e){var t=ce(n),i=Ae(n),r=t.visualViewport,o=i.clientWidth,s=i.clientHeight,a=0,l=0;if(r){o=r.width,s=r.height;var c=Un();(c||!c&&e==="fixed")&&(a=r.offsetLeft,l=r.offsetTop)}return{width:o,height:s,x:a+Ut(n),y:l}}function Qr(n){var e,t=Ae(n),i=qt(n),r=(e=n.ownerDocument)==null?void 0:e.body,o=Ze(t.scrollWidth,t.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),s=Ze(t.scrollHeight,t.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),a=-i.scrollLeft+Ut(n),l=-i.scrollTop;return Me(r||t).direction==="rtl"&&(a+=Ze(t.clientWidth,r?r.clientWidth:0)-o),{width:o,height:s,x:a,y:l}}function Yt(n){var e=Me(n),t=e.overflow,i=e.overflowX,r=e.overflowY;return/auto|scroll|overlay|hidden/.test(t+r+i)}function Hi(n){return["html","body","#document"].indexOf(we(n))>=0?n.ownerDocument.body:be(n)&&Yt(n)?n:Hi(ut(n))}function wt(n,e){var t;e===void 0&&(e=[]);var i=Hi(n),r=i===((t=n.ownerDocument)==null?void 0:t.body),o=ce(i),s=r?[o].concat(o.visualViewport||[],Yt(i)?i:[]):i,a=e.concat(s);return r?a:a.concat(wt(ut(s)))}function yn(n){return Object.assign({},n,{left:n.x,top:n.y,right:n.x+n.width,bottom:n.y+n.height})}function xu(n,e){var t=Ye(n,!1,e==="fixed");return t.top=t.top+n.clientTop,t.left=t.left+n.clientLeft,t.bottom=t.top+n.clientHeight,t.right=t.left+n.clientWidth,t.width=n.clientWidth,t.height=n.clientHeight,t.x=t.left,t.y=t.top,t}function Os(n,e,t){return e===Wn?yn(Xr(n,t)):Ue(e)?xu(e,t):yn(Qr(Ae(n)))}function Tu(n){var e=wt(ut(n)),t=["absolute","fixed"].indexOf(Me(n).position)>=0,i=t&&be(n)?et(n):n;return Ue(i)?e.filter(function(r){return Ue(r)&&Yn(r,i)&&we(r)!=="body"}):[]}function Jr(n,e,t,i){var r=e==="clippingParents"?Tu(n):[].concat(e),o=[].concat(r,[t]),s=o[0],a=o.reduce(function(l,c){var u=Os(n,c,i);return l.top=Ze(u.top,l.top),l.right=Vt(u.right,l.right),l.bottom=Vt(u.bottom,l.bottom),l.left=Ze(u.left,l.left),l},Os(n,s,i));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}function Qn(n){var e=n.reference,t=n.element,i=n.placement,r=i?xe(i):null,o=i?Ge(i):null,s=e.x+e.width/2-t.width/2,a=e.y+e.height/2-t.height/2,l;switch(r){case de:l={x:s,y:e.y-t.height};break;case ge:l={x:s,y:e.y+e.height};break;case me:l={x:e.x+e.width,y:a};break;case he:l={x:e.x-t.width,y:a};break;default:l={x:e.x,y:e.y}}var c=r?jt(r):null;if(c!=null){var u=c==="y"?"height":"width";switch(o){case rt:l[c]=l[c]-(e[u]/2-t[u]/2);break;case _t:l[c]=l[c]+(e[u]/2-t[u]/2);break;default:}}return l}function ke(n,e){e===void 0&&(e={});var t=e,i=t.placement,r=i===void 0?n.placement:i,o=t.strategy,s=o===void 0?n.strategy:o,a=t.boundary,l=a===void 0?Ur:a,c=t.rootBoundary,u=c===void 0?Wn:c,d=t.elementContext,p=d===void 0?$t:d,y=t.altBoundary,m=y===void 0?!1:y,v=t.padding,w=v===void 0?0:v,T=Kn(typeof w!="number"?w:Xn(w,lt)),_=p===$t?Yr:$t,S=n.rects.popper,A=n.elements[m?_:p],K=Jr(Ue(A)?A:A.contextElement||Ae(n.elements.popper),l,u,s),z=Ye(n.elements.reference),L=Qn({reference:z,element:S,strategy:"absolute",placement:r}),H=yn(Object.assign({},S,L)),N=p===$t?H:z,Y={top:K.top-N.top+T.top,bottom:N.bottom-K.bottom+T.bottom,left:K.left-N.left+T.left,right:N.right-K.right+T.right},B=n.modifiersData.offset;if(p===$t&&B){var ie=B[r];Object.keys(Y).forEach(function(J){var Te=[me,ge].indexOf(J)>=0?1:-1,Ce=[de,ge].indexOf(J)>=0?"y":"x";Y[J]+=ie[Ce]*Te})}return Y}function Zr(n,e){e===void 0&&(e={});var t=e,i=t.placement,r=t.boundary,o=t.rootBoundary,s=t.padding,a=t.flipVariations,l=t.allowedAutoPlacements,c=l===void 0?qn:l,u=Ge(i),d=u?a?ki:ki.filter(function(m){return Ge(m)===u}):lt,p=d.filter(function(m){return c.indexOf(m)>=0});p.length===0&&(p=d);var y=p.reduce(function(m,v){return m[v]=ke(n,{placement:v,boundary:r,rootBoundary:o,padding:s})[xe(v)],m},{});return Object.keys(y).sort(function(m,v){return y[m]-y[v]})}function Cu(n){if(xe(n)===jn)return[];var e=vn(n);return[Ri(n),e,Ri(e)]}function Au(n){var e=n.state,t=n.options,i=n.name;if(!e.modifiersData[i]._skip){for(var r=t.mainAxis,o=r===void 0?!0:r,s=t.altAxis,a=s===void 0?!0:s,l=t.fallbackPlacements,c=t.padding,u=t.boundary,d=t.rootBoundary,p=t.altBoundary,y=t.flipVariations,m=y===void 0?!0:y,v=t.allowedAutoPlacements,w=e.options.placement,T=xe(w),_=T===w,S=l||(_||!m?[vn(w)]:Cu(w)),A=[w].concat(S).reduce(function(V,q){return V.concat(xe(q)===jn?Zr(e,{placement:q,boundary:u,rootBoundary:d,padding:c,flipVariations:m,allowedAutoPlacements:v}):q)},[]),K=e.rects.reference,z=e.rects.popper,L=new Map,H=!0,N=A[0],Y=0;Y =0,Ce=Te?"width":"height",se=ke(e,{placement:B,boundary:u,rootBoundary:d,altBoundary:p,padding:c}),ne=Te?J?me:he:J?ge:de;K[Ce]>z[Ce]&&(ne=vn(ne));var qe=vn(ne),Re=[];if(o&&Re.push(se[ie]<=0),a&&Re.push(se[ne]<=0,se[qe]<=0),Re.every(function(V){return V})){N=B,H=!1;break}L.set(B,Re)}if(H)for(var W=m?3:1,M=function(q){var U=A.find(function(Z){var oe=L.get(Z);if(oe)return oe.slice(0,q).every(function(bt){return bt})});if(U)return N=U,"break"},D=W;D>0;D--){var $=M(D);if($==="break")break}e.placement!==N&&(e.modifiersData[i]._skip=!0,e.placement=N,e.reset=!0)}}var Pi={name:"flip",enabled:!0,phase:"main",fn:Au,requiresIfExists:["offset"],data:{_skip:!1}};function Ls(n,e,t){return t===void 0&&(t={x:0,y:0}),{top:n.top-e.height-t.y,right:n.right-e.width+t.x,bottom:n.bottom-e.height+t.y,left:n.left-e.width-t.x}}function Ms(n){return[de,me,ge,he].some(function(e){return n[e]>=0})}function Su(n){var e=n.state,t=n.name,i=e.rects.reference,r=e.rects.popper,o=e.modifiersData.preventOverflow,s=ke(e,{elementContext:"reference"}),a=ke(e,{altBoundary:!0}),l=Ls(s,i),c=Ls(a,r,o),u=Ms(l),d=Ms(c);e.modifiersData[t]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":d})}var Fi={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:Su};function Du(n,e,t){var i=xe(n),r=[he,de].indexOf(i)>=0?-1:1,o=typeof t=="function"?t(Object.assign({},e,{placement:n})):t,s=o[0],a=o[1];return s=s||0,a=(a||0)*r,[he,me].indexOf(i)>=0?{x:a,y:s}:{x:s,y:a}}function Ou(n){var e=n.state,t=n.options,i=n.name,r=t.offset,o=r===void 0?[0,0]:r,s=qn.reduce(function(u,d){return u[d]=Du(d,e.rects,o),u},{}),a=s[e.placement],l=a.x,c=a.y;e.modifiersData.popperOffsets!=null&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[i]=s}var Bi={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:Ou};function Lu(n){var e=n.state,t=n.name;e.modifiersData[t]=Qn({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})}var En={name:"popperOffsets",enabled:!0,phase:"read",fn:Lu,data:{}};function eo(n){return n==="x"?"y":"x"}function Mu(n){var e=n.state,t=n.options,i=n.name,r=t.mainAxis,o=r===void 0?!0:r,s=t.altAxis,a=s===void 0?!1:s,l=t.boundary,c=t.rootBoundary,u=t.altBoundary,d=t.padding,p=t.tether,y=p===void 0?!0:p,m=t.tetherOffset,v=m===void 0?0:m,w=ke(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:u}),T=xe(e.placement),_=Ge(e.placement),S=!_,A=jt(T),K=eo(A),z=e.modifiersData.popperOffsets,L=e.rects.reference,H=e.rects.popper,N=typeof v=="function"?v(Object.assign({},e.rects,{placement:e.placement})):v,Y=typeof N=="number"?{mainAxis:N,altAxis:N}:Object.assign({mainAxis:0,altAxis:0},N),B=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,ie={x:0,y:0};if(z){if(o){var J,Te=A==="y"?de:he,Ce=A==="y"?ge:me,se=A==="y"?"height":"width",ne=z[A],qe=ne+w[Te],Re=ne-w[Ce],W=y?-H[se]/2:0,M=_===rt?L[se]:H[se],D=_===rt?-H[se]:-L[se],$=e.elements.arrow,V=y&&$?zt($):{width:0,height:0},q=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:Gn(),U=q[Te],Z=q[Ce],oe=Wt(0,L[se],V[se]),bt=S?L[se]/2-W-oe-U-Y.mainAxis:M-oe-U-Y.mainAxis,Br=S?-L[se]/2+W+oe+Z+Y.mainAxis:D+oe+Z+Y.mainAxis,on=e.elements.arrow&&et(e.elements.arrow),sn=on?A==="y"?on.clientTop||0:on.clientLeft||0:0,Ti=(J=B==null?void 0:B[A])!=null?J:0,$r=ne+bt-Ti-sn,Ci=ne+Br-Ti,Ai=Wt(y?Vt(qe,$r):qe,ne,y?Ze(Re,Ci):Re);z[A]=Ai,ie[A]=Ai-ne}if(a){var Bn,Si=A==="x"?de:he,an=A==="x"?ge:me,ot=z[K],ln=K==="y"?"height":"width",$n=ot+w[Si],cn=ot-w[an],un=[de,he].indexOf(T)!==-1,Bt=(Bn=B==null?void 0:B[K])!=null?Bn:0,Di=un?$n:ot-L[ln]-H[ln]-Bt+Y.altAxis,Vn=un?ot+L[ln]+H[ln]-Bt-Y.altAxis:cn,Oi=y&&un?Ss(Di,ot,Vn):Wt(y?Di:$n,ot,y?Vn:cn);z[K]=Oi,ie[K]=Oi-ot}e.modifiersData[i]=ie}}var $i={name:"preventOverflow",enabled:!0,phase:"main",fn:Mu,requiresIfExists:["offset"]};function to(n){return{scrollLeft:n.scrollLeft,scrollTop:n.scrollTop}}function no(n){return n===ce(n)||!be(n)?qt(n):to(n)}function ku(n){var e=n.getBoundingClientRect(),t=ct(e.width)/n.offsetWidth||1,i=ct(e.height)/n.offsetHeight||1;return t!==1||i!==1}function io(n,e,t){t===void 0&&(t=!1);var i=be(e),r=be(e)&&ku(e),o=Ae(e),s=Ye(n,r,t),a={scrollLeft:0,scrollTop:0},l={x:0,y:0};return(i||!i&&!t)&&((we(e)!=="body"||Yt(o))&&(a=no(e)),be(e)?(l=Ye(e,!0),l.x+=e.clientLeft,l.y+=e.clientTop):o&&(l.x=Ut(o))),{x:s.left+a.scrollLeft-l.x,y:s.top+a.scrollTop-l.y,width:s.width,height:s.height}}function Nu(n){var e=new Map,t=new Set,i=[];n.forEach(function(o){e.set(o.name,o)});function r(o){t.add(o.name);var s=[].concat(o.requires||[],o.requiresIfExists||[]);s.forEach(function(a){if(!t.has(a)){var l=e.get(a);l&&r(l)}}),i.push(o)}return n.forEach(function(o){t.has(o.name)||r(o)}),i}function ro(n){var e=Nu(n);return Gr.reduce(function(t,i){return t.concat(e.filter(function(r){return r.phase===i}))},[])}function oo(n){var e;return function(){return e||(e=new Promise(function(t){Promise.resolve().then(function(){e=void 0,t(n())})})),e}}function so(n){var e=n.reduce(function(t,i){var r=t[i.name];return t[i.name]=r?Object.assign({},r,i,{options:Object.assign({},r.options,i.options),data:Object.assign({},r.data,i.data)}):i,t},{});return Object.keys(e).map(function(t){return e[t]})}var ks={placement:"bottom",modifiers:[],strategy:"absolute"};function Ns(){for(var n=arguments.length,e=new Array(n),t=0;t (n&&window.CSS&&window.CSS.escape&&(n=n.replace(/#([^\s"#']+)/g,(e,t)=>`#${CSS.escape(t)}`)),n),Fu=n=>n==null?`${n}`:Object.prototype.toString.call(n).match(/\s([a-z]+)/i)[1].toLowerCase(),Bu=n=>{do n+=Math.floor(Math.random()*Hu);while(document.getElementById(n));return n},$u=n=>{if(!n)return 0;let{transitionDuration:e,transitionDelay:t}=window.getComputedStyle(n),i=Number.parseFloat(e),r=Number.parseFloat(t);return!i&&!r?0:(e=e.split(",")[0],t=t.split(",")[0],(Number.parseFloat(e)+Number.parseFloat(t))*Pu)},da=n=>{n.dispatchEvent(new Event(To))},dt=n=>!n||typeof n!="object"?!1:(typeof n.jquery!="undefined"&&(n=n[0]),typeof n.nodeType!="undefined"),Tt=n=>dt(n)?n.jquery?n[0]:n:typeof n=="string"&&n.length>0?document.querySelector(ua(n)):null,An=n=>{if(!dt(n)||n.getClientRects().length===0)return!1;let e=getComputedStyle(n).getPropertyValue("visibility")==="visible",t=n.closest("details:not([open])");if(!t)return e;if(t!==n){let i=n.closest("summary");if(i&&i.parentNode!==t||i===null)return!1}return e},Ct=n=>!n||n.nodeType!==Node.ELEMENT_NODE||n.classList.contains("disabled")?!0:typeof n.disabled!="undefined"?n.disabled:n.hasAttribute("disabled")&&n.getAttribute("disabled")!=="false",fa=n=>{if(!document.documentElement.attachShadow)return null;if(typeof n.getRootNode=="function"){let e=n.getRootNode();return e instanceof ShadowRoot?e:null}return n instanceof ShadowRoot?n:n.parentNode?fa(n.parentNode):null},Xi=()=>{},ii=n=>{n.offsetHeight},ha=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,lo=[],Vu=n=>{document.readyState==="loading"?(lo.length||document.addEventListener("DOMContentLoaded",()=>{for(let e of lo)e()}),lo.push(n)):n()},Ke=()=>document.documentElement.dir==="rtl",Qe=n=>{Vu(()=>{let e=ha();if(e){let t=n.NAME,i=e.fn[t];e.fn[t]=n.jQueryInterface,e.fn[t].Constructor=n,e.fn[t].noConflict=()=>(e.fn[t]=i,n.jQueryInterface)}})},He=(n,e=[],t=n)=>typeof n=="function"?n.call(...e):t,pa=(n,e,t=!0)=>{if(!t){He(n);return}let r=$u(e)+5,o=!1,s=({target:a})=>{a===e&&(o=!0,e.removeEventListener(To,s),He(n))};e.addEventListener(To,s),setTimeout(()=>{o||da(e)},r)},Do=(n,e,t,i)=>{let r=n.length,o=n.indexOf(e);return o===-1?!t&&i?n[r-1]:n[0]:(o+=t?1:-1,i&&(o=(o+r)%r),n[Math.max(0,Math.min(o,r-1))])},zu=/[^.]*(?=\..*)\.|.*/,ju=/\..*/,Wu=/::\d+$/,co={},Hs=1,ma={mouseenter:"mouseover",mouseleave:"mouseout"},qu=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function ga(n,e){return e&&`${e}::${Hs++}`||n.uidEvent||Hs++}function va(n){let e=ga(n);return n.uidEvent=e,co[e]=co[e]||{},co[e]}function Uu(n,e){return function t(i){return Oo(i,{delegateTarget:n}),t.oneOff&&x.off(n,i.type,e),e.apply(n,[i])}}function Yu(n,e,t){return function i(r){let o=n.querySelectorAll(e);for(let{target:s}=r;s&&s!==this;s=s.parentNode)for(let a of o)if(a===s)return Oo(r,{delegateTarget:s}),i.oneOff&&x.off(n,r.type,e,t),t.apply(s,[r])}}function ya(n,e,t=null){return Object.values(n).find(i=>i.callable===e&&i.delegationSelector===t)}function Ea(n,e,t){let i=typeof e=="string",r=i?t:e||t,o=ba(n);return qu.has(o)||(o=n),[i,r,o]}function Ps(n,e,t,i,r){if(typeof e!="string"||!n)return;let[o,s,a]=Ea(e,t,i);e in ma&&(s=(m=>function(v){if(!v.relatedTarget||v.relatedTarget!==v.delegateTarget&&!v.delegateTarget.contains(v.relatedTarget))return m.call(this,v)})(s));let l=va(n),c=l[a]||(l[a]={}),u=ya(c,s,o?t:null);if(u){u.oneOff=u.oneOff&&r;return}let d=ga(s,e.replace(zu,"")),p=o?Yu(n,t,s):Uu(n,s);p.delegationSelector=o?t:null,p.callable=s,p.oneOff=r,p.uidEvent=d,c[d]=p,n.addEventListener(a,p,o)}function Co(n,e,t,i,r){let o=ya(e[t],i,r);o&&(n.removeEventListener(t,o,!!r),delete e[t][o.uidEvent])}function Gu(n,e,t,i){let r=e[t]||{};for(let[o,s]of Object.entries(r))o.includes(i)&&Co(n,e,t,s.callable,s.delegationSelector)}function ba(n){return n=n.replace(ju,""),ma[n]||n}var x={on(n,e,t,i){Ps(n,e,t,i,!1)},one(n,e,t,i){Ps(n,e,t,i,!0)},off(n,e,t,i){if(typeof e!="string"||!n)return;let[r,o,s]=Ea(e,t,i),a=s!==e,l=va(n),c=l[s]||{},u=e.startsWith(".");if(typeof o!="undefined"){if(!Object.keys(c).length)return;Co(n,l,s,o,r?t:null);return}if(u)for(let d of Object.keys(l))Gu(n,l,d,e.slice(1));for(let[d,p]of Object.entries(c)){let y=d.replace(Wu,"");(!a||e.includes(y))&&Co(n,l,s,p.callable,p.delegationSelector)}},trigger(n,e,t){if(typeof e!="string"||!n)return null;let i=ha(),r=ba(e),o=e!==r,s=null,a=!0,l=!0,c=!1;o&&i&&(s=i.Event(e,t),i(n).trigger(s),a=!s.isPropagationStopped(),l=!s.isImmediatePropagationStopped(),c=s.isDefaultPrevented());let u=Oo(new Event(e,{bubbles:a,cancelable:!0}),t);return c&&u.preventDefault(),l&&n.dispatchEvent(u),u.defaultPrevented&&s&&s.preventDefault(),u}};function Oo(n,e={}){for(let[t,i]of Object.entries(e))try{n[t]=i}catch(r){Object.defineProperty(n,t,{configurable:!0,get(){return i}})}return n}function Fs(n){if(n==="true")return!0;if(n==="false")return!1;if(n===Number(n).toString())return Number(n);if(n===""||n==="null")return null;if(typeof n!="string")return n;try{return JSON.parse(decodeURIComponent(n))}catch(e){return n}}function uo(n){return n.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}var ft={setDataAttribute(n,e,t){n.setAttribute(`data-bs-${uo(e)}`,t)},removeDataAttribute(n,e){n.removeAttribute(`data-bs-${uo(e)}`)},getDataAttributes(n){if(!n)return{};let e={},t=Object.keys(n.dataset).filter(i=>i.startsWith("bs")&&!i.startsWith("bsConfig"));for(let i of t){let r=i.replace(/^bs/,"");r=r.charAt(0).toLowerCase()+r.slice(1),e[r]=Fs(n.dataset[i])}return e},getDataAttribute(n,e){return Fs(n.getAttribute(`data-bs-${uo(e)}`))}},Qt=class{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(e){return e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e}_mergeConfigObj(e,t){let i=dt(t)?ft.getDataAttribute(t,"config"):{};return O(O(O(O({},this.constructor.Default),typeof i=="object"?i:{}),dt(t)?ft.getDataAttributes(t):{}),typeof e=="object"?e:{})}_typeCheckConfig(e,t=this.constructor.DefaultType){for(let[i,r]of Object.entries(t)){let o=e[i],s=dt(o)?"element":Fu(o);if(!new RegExp(r).test(s))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${i}" provided type "${s}" but expected type "${r}".`)}}},Ku="5.3.8",je=class extends Qt{constructor(e,t){super(),e=Tt(e),e&&(this._element=e,this._config=this._getConfig(t),ao.set(this._element,this.constructor.DATA_KEY,this))}dispose(){ao.remove(this._element,this.constructor.DATA_KEY),x.off(this._element,this.constructor.EVENT_KEY);for(let e of Object.getOwnPropertyNames(this))this[e]=null}_queueCallback(e,t,i=!0){pa(e,t,i)}_getConfig(e){return e=this._mergeConfigObj(e,this._element),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}static getInstance(e){return ao.get(Tt(e),this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,typeof t=="object"?t:null)}static get VERSION(){return Ku}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(e){return`${e}${this.EVENT_KEY}`}},fo=n=>{let e=n.getAttribute("data-bs-target");if(!e||e==="#"){let t=n.getAttribute("href");if(!t||!t.includes("#")&&!t.startsWith("."))return null;t.includes("#")&&!t.startsWith("#")&&(t=`#${t.split("#")[1]}`),e=t&&t!=="#"?t.trim():null}return e?e.split(",").map(t=>ua(t)).join(","):null},j={find(n,e=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(e,n))},findOne(n,e=document.documentElement){return Element.prototype.querySelector.call(e,n)},children(n,e){return[].concat(...n.children).filter(t=>t.matches(e))},parents(n,e){let t=[],i=n.parentNode.closest(e);for(;i;)t.push(i),i=i.parentNode.closest(e);return t},prev(n,e){let t=n.previousElementSibling;for(;t;){if(t.matches(e))return[t];t=t.previousElementSibling}return[]},next(n,e){let t=n.nextElementSibling;for(;t;){if(t.matches(e))return[t];t=t.nextElementSibling}return[]},focusableChildren(n){let e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(t=>`${t}:not([tabindex^="-"])`).join(",");return this.find(e,n).filter(t=>!Ct(t)&&An(t))},getSelectorFromElement(n){let e=fo(n);return e&&j.findOne(e)?e:null},getElementFromSelector(n){let e=fo(n);return e?j.findOne(e):null},getMultipleElementsFromSelector(n){let e=fo(n);return e?j.find(e):[]}},rr=(n,e="hide")=>{let t=`click.dismiss${n.EVENT_KEY}`,i=n.NAME;x.on(document,t,`[data-bs-dismiss="${i}"]`,function(r){if(["A","AREA"].includes(this.tagName)&&r.preventDefault(),Ct(this))return;let o=j.getElementFromSelector(this)||this.closest(`.${i}`);n.getOrCreateInstance(o)[e]()})},Xu="alert",Qu="bs.alert",_a=`.${Qu}`,Ju=`close${_a}`,Zu=`closed${_a}`,ed="fade",td="show",Qi=class n extends je{static get NAME(){return Xu}close(){if(x.trigger(this._element,Ju).defaultPrevented)return;this._element.classList.remove(td);let t=this._element.classList.contains(ed);this._queueCallback(()=>this._destroyElement(),this._element,t)}_destroyElement(){this._element.remove(),x.trigger(this._element,Zu),this.dispose()}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)}})}};rr(Qi,"close");Qe(Qi);var nd="button",id="bs.button",rd=`.${id}`,od=".data-api",sd="active",Bs='[data-bs-toggle="button"]',ad=`click${rd}${od}`,Ji=class n extends je{static get NAME(){return nd}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(sd))}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this);e==="toggle"&&t[e]()})}};x.on(document,ad,Bs,n=>{n.preventDefault();let e=n.target.closest(Bs);Ji.getOrCreateInstance(e).toggle()});Qe(Ji);var ld="swipe",Sn=".bs.swipe",cd=`touchstart${Sn}`,ud=`touchmove${Sn}`,dd=`touchend${Sn}`,fd=`pointerdown${Sn}`,hd=`pointerup${Sn}`,pd="touch",md="pen",gd="pointer-event",vd=40,yd={endCallback:null,leftCallback:null,rightCallback:null},Ed={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"},Zi=class n extends Qt{constructor(e,t){super(),this._element=e,!(!e||!n.isSupported())&&(this._config=this._getConfig(t),this._deltaX=0,this._supportPointerEvents=!!window.PointerEvent,this._initEvents())}static get Default(){return yd}static get DefaultType(){return Ed}static get NAME(){return ld}dispose(){x.off(this._element,Sn)}_start(e){if(!this._supportPointerEvents){this._deltaX=e.touches[0].clientX;return}this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX)}_end(e){this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX-this._deltaX),this._handleSwipe(),He(this._config.endCallback)}_move(e){this._deltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this._deltaX}_handleSwipe(){let e=Math.abs(this._deltaX);if(e<=vd)return;let t=e/this._deltaX;this._deltaX=0,t&&He(t>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(x.on(this._element,fd,e=>this._start(e)),x.on(this._element,hd,e=>this._end(e)),this._element.classList.add(gd)):(x.on(this._element,cd,e=>this._start(e)),x.on(this._element,ud,e=>this._move(e)),x.on(this._element,dd,e=>this._end(e)))}_eventIsPointerPenTouch(e){return this._supportPointerEvents&&(e.pointerType===md||e.pointerType===pd)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}},bd="carousel",_d="bs.carousel",Ot=`.${_d}`,wa=".data-api",wd="ArrowLeft",xd="ArrowRight",Td=500,Zn="next",bn="prev",wn="left",Gi="right",Cd=`slide${Ot}`,ho=`slid${Ot}`,Ad=`keydown${Ot}`,Sd=`mouseenter${Ot}`,Dd=`mouseleave${Ot}`,Od=`dragstart${Ot}`,Ld=`load${Ot}${wa}`,Md=`click${Ot}${wa}`,xa="carousel",zi="active",kd="slide",Nd="carousel-item-end",Id="carousel-item-start",Rd="carousel-item-next",Hd="carousel-item-prev",Ta=".active",Ca=".carousel-item",Pd=Ta+Ca,Fd=".carousel-item img",Bd=".carousel-indicators",$d="[data-bs-slide], [data-bs-slide-to]",Vd='[data-bs-ride="carousel"]',zd={[wd]:Gi,[xd]:wn},jd={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Wd={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"},ti=class n extends je{constructor(e,t){super(e,t),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=j.findOne(Bd,this._element),this._addEventListeners(),this._config.ride===xa&&this.cycle()}static get Default(){return jd}static get DefaultType(){return Wd}static get NAME(){return bd}next(){this._slide(Zn)}nextWhenVisible(){!document.hidden&&An(this._element)&&this.next()}prev(){this._slide(bn)}pause(){this._isSliding&&da(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){if(this._config.ride){if(this._isSliding){x.one(this._element,ho,()=>this.cycle());return}this.cycle()}}to(e){let t=this._getItems();if(e>t.length-1||e<0)return;if(this._isSliding){x.one(this._element,ho,()=>this.to(e));return}let i=this._getItemIndex(this._getActive());if(i===e)return;let r=e>i?Zn:bn;this._slide(r,t[e])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(e){return e.defaultInterval=e.interval,e}_addEventListeners(){this._config.keyboard&&x.on(this._element,Ad,e=>this._keydown(e)),this._config.pause==="hover"&&(x.on(this._element,Sd,()=>this.pause()),x.on(this._element,Dd,()=>this._maybeEnableCycle())),this._config.touch&&Zi.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(let i of j.find(Fd,this._element))x.on(i,Od,r=>r.preventDefault());let t={leftCallback:()=>this._slide(this._directionToOrder(wn)),rightCallback:()=>this._slide(this._directionToOrder(Gi)),endCallback:()=>{this._config.pause==="hover"&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),Td+this._config.interval))}};this._swipeHelper=new Zi(this._element,t)}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;let t=zd[e.key];t&&(e.preventDefault(),this._slide(this._directionToOrder(t)))}_getItemIndex(e){return this._getItems().indexOf(e)}_setActiveIndicatorElement(e){if(!this._indicatorsElement)return;let t=j.findOne(Ta,this._indicatorsElement);t.classList.remove(zi),t.removeAttribute("aria-current");let i=j.findOne(`[data-bs-slide-to="${e}"]`,this._indicatorsElement);i&&(i.classList.add(zi),i.setAttribute("aria-current","true"))}_updateInterval(){let e=this._activeElement||this._getActive();if(!e)return;let t=Number.parseInt(e.getAttribute("data-bs-interval"),10);this._config.interval=t||this._config.defaultInterval}_slide(e,t=null){if(this._isSliding)return;let i=this._getActive(),r=e===Zn,o=t||Do(this._getItems(),i,r,this._config.wrap);if(o===i)return;let s=this._getItemIndex(o),a=y=>x.trigger(this._element,y,{relatedTarget:o,direction:this._orderToDirection(e),from:this._getItemIndex(i),to:s});if(a(Cd).defaultPrevented||!i||!o)return;let c=!!this._interval;this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(s),this._activeElement=o;let u=r?Id:Nd,d=r?Rd:Hd;o.classList.add(d),ii(o),i.classList.add(u),o.classList.add(u);let p=()=>{o.classList.remove(u,d),o.classList.add(zi),i.classList.remove(zi,d,u),this._isSliding=!1,a(ho)};this._queueCallback(p,i,this._isAnimated()),c&&this.cycle()}_isAnimated(){return this._element.classList.contains(kd)}_getActive(){return j.findOne(Pd,this._element)}_getItems(){return j.find(Ca,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(e){return Ke()?e===wn?bn:Zn:e===wn?Zn:bn}_orderToDirection(e){return Ke()?e===bn?wn:Gi:e===bn?Gi:wn}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="number"){t.to(e);return}if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}};x.on(document,Md,$d,function(n){let e=j.getElementFromSelector(this);if(!e||!e.classList.contains(xa))return;n.preventDefault();let t=ti.getOrCreateInstance(e),i=this.getAttribute("data-bs-slide-to");if(i){t.to(i),t._maybeEnableCycle();return}if(ft.getDataAttribute(this,"slide")==="next"){t.next(),t._maybeEnableCycle();return}t.prev(),t._maybeEnableCycle()});x.on(window,Ld,()=>{let n=j.find(Vd);for(let e of n)ti.getOrCreateInstance(e)});Qe(ti);var qd="collapse",Ud="bs.collapse",ri=`.${Ud}`,Yd=".data-api",Gd=`show${ri}`,Kd=`shown${ri}`,Xd=`hide${ri}`,Qd=`hidden${ri}`,Jd=`click${ri}${Yd}`,po="show",Tn="collapse",ji="collapsing",Zd="collapsed",ef=`:scope .${Tn} .${Tn}`,tf="collapse-horizontal",nf="width",rf="height",of=".collapse.show, .collapse.collapsing",Ao='[data-bs-toggle="collapse"]',sf={parent:null,toggle:!0},af={parent:"(null|element)",toggle:"boolean"},At=class n extends je{constructor(e,t){super(e,t),this._isTransitioning=!1,this._triggerArray=[];let i=j.find(Ao);for(let r of i){let o=j.getSelectorFromElement(r),s=j.find(o).filter(a=>a===this._element);o!==null&&s.length&&this._triggerArray.push(r)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return sf}static get DefaultType(){return af}static get NAME(){return qd}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let e=[];if(this._config.parent&&(e=this._getFirstLevelChildren(of).filter(a=>a!==this._element).map(a=>n.getOrCreateInstance(a,{toggle:!1}))),e.length&&e[0]._isTransitioning||x.trigger(this._element,Gd).defaultPrevented)return;for(let a of e)a.hide();let i=this._getDimension();this._element.classList.remove(Tn),this._element.classList.add(ji),this._element.style[i]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;let r=()=>{this._isTransitioning=!1,this._element.classList.remove(ji),this._element.classList.add(Tn,po),this._element.style[i]="",x.trigger(this._element,Kd)},s=`scroll${i[0].toUpperCase()+i.slice(1)}`;this._queueCallback(r,this._element,!0),this._element.style[i]=`${this._element[s]}px`}hide(){if(this._isTransitioning||!this._isShown()||x.trigger(this._element,Xd).defaultPrevented)return;let t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,ii(this._element),this._element.classList.add(ji),this._element.classList.remove(Tn,po);for(let r of this._triggerArray){let o=j.getElementFromSelector(r);o&&!this._isShown(o)&&this._addAriaAndCollapsedClass([r],!1)}this._isTransitioning=!0;let i=()=>{this._isTransitioning=!1,this._element.classList.remove(ji),this._element.classList.add(Tn),x.trigger(this._element,Qd)};this._element.style[t]="",this._queueCallback(i,this._element,!0)}_isShown(e=this._element){return e.classList.contains(po)}_configAfterMerge(e){return e.toggle=!!e.toggle,e.parent=Tt(e.parent),e}_getDimension(){return this._element.classList.contains(tf)?nf:rf}_initializeChildren(){if(!this._config.parent)return;let e=this._getFirstLevelChildren(Ao);for(let t of e){let i=j.getElementFromSelector(t);i&&this._addAriaAndCollapsedClass([t],this._isShown(i))}}_getFirstLevelChildren(e){let t=j.find(ef,this._config.parent);return j.find(e,this._config.parent).filter(i=>!t.includes(i))}_addAriaAndCollapsedClass(e,t){if(e.length)for(let i of e)i.classList.toggle(Zd,!t),i.setAttribute("aria-expanded",t)}static jQueryInterface(e){let t={};return typeof e=="string"&&/show|hide/.test(e)&&(t.toggle=!1),this.each(function(){let i=n.getOrCreateInstance(this,t);if(typeof e=="string"){if(typeof i[e]=="undefined")throw new TypeError(`No method named "${e}"`);i[e]()}})}};x.on(document,Jd,Ao,function(n){(n.target.tagName==="A"||n.delegateTarget&&n.delegateTarget.tagName==="A")&&n.preventDefault();for(let e of j.getMultipleElementsFromSelector(this))At.getOrCreateInstance(e,{toggle:!1}).toggle()});Qe(At);var $s="dropdown",lf="bs.dropdown",Zt=`.${lf}`,Lo=".data-api",cf="Escape",Vs="Tab",uf="ArrowUp",zs="ArrowDown",df=2,ff=`hide${Zt}`,hf=`hidden${Zt}`,pf=`show${Zt}`,mf=`shown${Zt}`,Aa=`click${Zt}${Lo}`,Sa=`keydown${Zt}${Lo}`,gf=`keyup${Zt}${Lo}`,xn="show",vf="dropup",yf="dropend",Ef="dropstart",bf="dropup-center",_f="dropdown-center",Kt='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',wf=`${Kt}.${xn}`,Ki=".dropdown-menu",xf=".navbar",Tf=".navbar-nav",Cf=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",Af=Ke()?"top-end":"top-start",Sf=Ke()?"top-start":"top-end",Df=Ke()?"bottom-end":"bottom-start",Of=Ke()?"bottom-start":"bottom-end",Lf=Ke()?"left-start":"right-start",Mf=Ke()?"right-start":"left-start",kf="top",Nf="bottom",If={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Rf={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"},St=class n extends je{constructor(e,t){super(e,t),this._popper=null,this._parent=this._element.parentNode,this._menu=j.next(this._element,Ki)[0]||j.prev(this._element,Ki)[0]||j.findOne(Ki,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return If}static get DefaultType(){return Rf}static get NAME(){return $s}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Ct(this._element)||this._isShown())return;let e={relatedTarget:this._element};if(!x.trigger(this._element,pf,e).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(Tf))for(let i of[].concat(...document.body.children))x.on(i,"mouseover",Xi);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(xn),this._element.classList.add(xn),x.trigger(this._element,mf,e)}}hide(){if(Ct(this._element)||!this._isShown())return;let e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(e){if(!x.trigger(this._element,ff,e).defaultPrevented){if("ontouchstart"in document.documentElement)for(let i of[].concat(...document.body.children))x.off(i,"mouseover",Xi);this._popper&&this._popper.destroy(),this._menu.classList.remove(xn),this._element.classList.remove(xn),this._element.setAttribute("aria-expanded","false"),ft.removeDataAttribute(this._menu,"popper"),x.trigger(this._element,hf,e)}}_getConfig(e){if(e=super._getConfig(e),typeof e.reference=="object"&&!dt(e.reference)&&typeof e.reference.getBoundingClientRect!="function")throw new TypeError(`${$s.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return e}_createPopper(){if(typeof Vi=="undefined")throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org/docs/v2/)");let e=this._element;this._config.reference==="parent"?e=this._parent:dt(this._config.reference)?e=Tt(this._config.reference):typeof this._config.reference=="object"&&(e=this._config.reference);let t=this._getPopperConfig();this._popper=Jn(e,this._menu,t)}_isShown(){return this._menu.classList.contains(xn)}_getPlacement(){let e=this._parent;if(e.classList.contains(yf))return Lf;if(e.classList.contains(Ef))return Mf;if(e.classList.contains(bf))return kf;if(e.classList.contains(_f))return Nf;let t=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";return e.classList.contains(vf)?t?Sf:Af:t?Of:Df}_detectNavbar(){return this._element.closest(xf)!==null}_getOffset(){let{offset:e}=this._config;return typeof e=="string"?e.split(",").map(t=>Number.parseInt(t,10)):typeof e=="function"?t=>e(t,this._element):e}_getPopperConfig(){let e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display==="static")&&(ft.setDataAttribute(this._menu,"popper","static"),e.modifiers=[{name:"applyStyles",enabled:!1}]),O(O({},e),He(this._config.popperConfig,[void 0,e]))}_selectMenuItem({key:e,target:t}){let i=j.find(Cf,this._menu).filter(r=>An(r));i.length&&Do(i,t,e===zs,!i.includes(t)).focus()}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e]()}})}static clearMenus(e){if(e.button===df||e.type==="keyup"&&e.key!==Vs)return;let t=j.find(wf);for(let i of t){let r=n.getInstance(i);if(!r||r._config.autoClose===!1)continue;let o=e.composedPath(),s=o.includes(r._menu);if(o.includes(r._element)||r._config.autoClose==="inside"&&!s||r._config.autoClose==="outside"&&s||r._menu.contains(e.target)&&(e.type==="keyup"&&e.key===Vs||/input|select|option|textarea|form/i.test(e.target.tagName)))continue;let a={relatedTarget:r._element};e.type==="click"&&(a.clickEvent=e),r._completeHide(a)}}static dataApiKeydownHandler(e){let t=/input|textarea/i.test(e.target.tagName),i=e.key===cf,r=[uf,zs].includes(e.key);if(!r&&!i||t&&!i)return;e.preventDefault();let o=this.matches(Kt)?this:j.prev(this,Kt)[0]||j.next(this,Kt)[0]||j.findOne(Kt,e.delegateTarget.parentNode),s=n.getOrCreateInstance(o);if(r){e.stopPropagation(),s.show(),s._selectMenuItem(e);return}s._isShown()&&(e.stopPropagation(),s.hide(),o.focus())}};x.on(document,Sa,Kt,St.dataApiKeydownHandler);x.on(document,Sa,Ki,St.dataApiKeydownHandler);x.on(document,Aa,St.clearMenus);x.on(document,gf,St.clearMenus);x.on(document,Aa,Kt,function(n){n.preventDefault(),St.getOrCreateInstance(this).toggle()});Qe(St);var Da="backdrop",Hf="fade",js="show",Ws=`mousedown.bs.${Da}`,Pf={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ff={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"},er=class extends Qt{constructor(e){super(),this._config=this._getConfig(e),this._isAppended=!1,this._element=null}static get Default(){return Pf}static get DefaultType(){return Ff}static get NAME(){return Da}show(e){if(!this._config.isVisible){He(e);return}this._append();let t=this._getElement();this._config.isAnimated&&ii(t),t.classList.add(js),this._emulateAnimation(()=>{He(e)})}hide(e){if(!this._config.isVisible){He(e);return}this._getElement().classList.remove(js),this._emulateAnimation(()=>{this.dispose(),He(e)})}dispose(){this._isAppended&&(x.off(this._element,Ws),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){let e=document.createElement("div");e.className=this._config.className,this._config.isAnimated&&e.classList.add(Hf),this._element=e}return this._element}_configAfterMerge(e){return e.rootElement=Tt(e.rootElement),e}_append(){if(this._isAppended)return;let e=this._getElement();this._config.rootElement.append(e),x.on(e,Ws,()=>{He(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(e){pa(e,this._getElement(),this._config.isAnimated)}},Bf="focustrap",$f="bs.focustrap",tr=`.${$f}`,Vf=`focusin${tr}`,zf=`keydown.tab${tr}`,jf="Tab",Wf="forward",qs="backward",qf={autofocus:!0,trapElement:null},Uf={autofocus:"boolean",trapElement:"element"},nr=class extends Qt{constructor(e){super(),this._config=this._getConfig(e),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return qf}static get DefaultType(){return Uf}static get NAME(){return Bf}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),x.off(document,tr),x.on(document,Vf,e=>this._handleFocusin(e)),x.on(document,zf,e=>this._handleKeydown(e)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,x.off(document,tr))}_handleFocusin(e){let{trapElement:t}=this._config;if(e.target===document||e.target===t||t.contains(e.target))return;let i=j.focusableChildren(t);i.length===0?t.focus():this._lastTabNavDirection===qs?i[i.length-1].focus():i[0].focus()}_handleKeydown(e){e.key===jf&&(this._lastTabNavDirection=e.shiftKey?qs:Wf)}},Us=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Ys=".sticky-top",Wi="padding-right",Gs="margin-right",ni=class{constructor(){this._element=document.body}getWidth(){let e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){let e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Wi,t=>t+e),this._setElementAttributes(Us,Wi,t=>t+e),this._setElementAttributes(Ys,Gs,t=>t-e)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,Wi),this._resetElementAttributes(Us,Wi),this._resetElementAttributes(Ys,Gs)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,i){let r=this.getWidth(),o=s=>{if(s!==this._element&&window.innerWidth>s.clientWidth+r)return;this._saveInitialAttribute(s,t);let a=window.getComputedStyle(s).getPropertyValue(t);s.style.setProperty(t,`${i(Number.parseFloat(a))}px`)};this._applyManipulationCallback(e,o)}_saveInitialAttribute(e,t){let i=e.style.getPropertyValue(t);i&&ft.setDataAttribute(e,t,i)}_resetElementAttributes(e,t){let i=r=>{let o=ft.getDataAttribute(r,t);if(o===null){r.style.removeProperty(t);return}ft.removeDataAttribute(r,t),r.style.setProperty(t,o)};this._applyManipulationCallback(e,i)}_applyManipulationCallback(e,t){if(dt(e)){t(e);return}for(let i of j.find(e,this._element))t(i)}},Yf="modal",Gf="bs.modal",Xe=`.${Gf}`,Kf=".data-api",Xf="Escape",Qf=`hide${Xe}`,Jf=`hidePrevented${Xe}`,Oa=`hidden${Xe}`,La=`show${Xe}`,Zf=`shown${Xe}`,eh=`resize${Xe}`,th=`click.dismiss${Xe}`,nh=`mousedown.dismiss${Xe}`,ih=`keydown.dismiss${Xe}`,rh=`click${Xe}${Kf}`,Ks="modal-open",oh="fade",Xs="show",mo="modal-static",sh=".modal.show",ah=".modal-dialog",lh=".modal-body",ch='[data-bs-toggle="modal"]',uh={backdrop:!0,focus:!0,keyboard:!0},dh={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"},tt=class n extends je{constructor(e,t){super(e,t),this._dialog=j.findOne(ah,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new ni,this._addEventListeners()}static get Default(){return uh}static get DefaultType(){return dh}static get NAME(){return Yf}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||x.trigger(this._element,La,{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Ks),this._adjustDialog(),this._backdrop.show(()=>this._showElement(e)))}hide(){!this._isShown||this._isTransitioning||x.trigger(this._element,Qf).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Xs),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated()))}dispose(){x.off(window,Xe),x.off(this._dialog,Xe),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new er({isVisible:!!this._config.backdrop,isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new nr({trapElement:this._element})}_showElement(e){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;let t=j.findOne(lh,this._dialog);t&&(t.scrollTop=0),ii(this._element),this._element.classList.add(Xs);let i=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,x.trigger(this._element,Zf,{relatedTarget:e})};this._queueCallback(i,this._dialog,this._isAnimated())}_addEventListeners(){x.on(this._element,ih,e=>{if(e.key===Xf){if(this._config.keyboard){this.hide();return}this._triggerBackdropTransition()}}),x.on(window,eh,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),x.on(this._element,nh,e=>{x.one(this._element,th,t=>{if(!(this._element!==e.target||this._element!==t.target)){if(this._config.backdrop==="static"){this._triggerBackdropTransition();return}this._config.backdrop&&this.hide()}})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(Ks),this._resetAdjustments(),this._scrollBar.reset(),x.trigger(this._element,Oa)})}_isAnimated(){return this._element.classList.contains(oh)}_triggerBackdropTransition(){if(x.trigger(this._element,Jf).defaultPrevented)return;let t=this._element.scrollHeight>document.documentElement.clientHeight,i=this._element.style.overflowY;i==="hidden"||this._element.classList.contains(mo)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(mo),this._queueCallback(()=>{this._element.classList.remove(mo),this._queueCallback(()=>{this._element.style.overflowY=i},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){let e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._scrollBar.getWidth(),i=t>0;if(i&&!e){let r=Ke()?"paddingLeft":"paddingRight";this._element.style[r]=`${t}px`}if(!i&&e){let r=Ke()?"paddingRight":"paddingLeft";this._element.style[r]=`${t}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,t){return this.each(function(){let i=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof i[e]=="undefined")throw new TypeError(`No method named "${e}"`);i[e](t)}})}};x.on(document,rh,ch,function(n){let e=j.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&n.preventDefault(),x.one(e,La,r=>{r.defaultPrevented||x.one(e,Oa,()=>{An(this)&&this.focus()})});let t=j.findOne(sh);t&&tt.getInstance(t).hide(),tt.getOrCreateInstance(e).toggle(this)});rr(tt);Qe(tt);var fh="offcanvas",hh="bs.offcanvas",mt=`.${hh}`,Ma=".data-api",ph=`load${mt}${Ma}`,mh="Escape",Qs="show",Js="showing",Zs="hiding",gh="offcanvas-backdrop",ka=".offcanvas.show",vh=`show${mt}`,yh=`shown${mt}`,Eh=`hide${mt}`,ea=`hidePrevented${mt}`,Na=`hidden${mt}`,bh=`resize${mt}`,_h=`click${mt}${Ma}`,wh=`keydown.dismiss${mt}`,xh='[data-bs-toggle="offcanvas"]',Th={backdrop:!0,keyboard:!0,scroll:!1},Ch={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"},Dt=class n extends je{constructor(e,t){super(e,t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Th}static get DefaultType(){return Ch}static get NAME(){return fh}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){if(this._isShown||x.trigger(this._element,vh,{relatedTarget:e}).defaultPrevented)return;this._isShown=!0,this._backdrop.show(),this._config.scroll||new ni().hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Js);let i=()=>{(!this._config.scroll||this._config.backdrop)&&this._focustrap.activate(),this._element.classList.add(Qs),this._element.classList.remove(Js),x.trigger(this._element,yh,{relatedTarget:e})};this._queueCallback(i,this._element,!0)}hide(){if(!this._isShown||x.trigger(this._element,Eh).defaultPrevented)return;this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Zs),this._backdrop.hide();let t=()=>{this._element.classList.remove(Qs,Zs),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||new ni().reset(),x.trigger(this._element,Na)};this._queueCallback(t,this._element,!0)}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){let e=()=>{if(this._config.backdrop==="static"){x.trigger(this._element,ea);return}this.hide()},t=!!this._config.backdrop;return new er({className:gh,isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?e:null})}_initializeFocusTrap(){return new nr({trapElement:this._element})}_addEventListeners(){x.on(this._element,wh,e=>{if(e.key===mh){if(this._config.keyboard){this.hide();return}x.trigger(this._element,ea)}})}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e](this)}})}};x.on(document,_h,xh,function(n){let e=j.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&n.preventDefault(),Ct(this))return;x.one(e,Na,()=>{An(this)&&this.focus()});let t=j.findOne(ka);t&&t!==e&&Dt.getInstance(t).hide(),Dt.getOrCreateInstance(e).toggle(this)});x.on(window,ph,()=>{for(let n of j.find(ka))Dt.getOrCreateInstance(n).show()});x.on(window,bh,()=>{for(let n of j.find("[aria-modal][class*=show][class*=offcanvas-]"))getComputedStyle(n).position!=="fixed"&&Dt.getOrCreateInstance(n).hide()});rr(Dt);Qe(Dt);var Ah=/^aria-[\w-]*$/i,Ia={"*":["class","dir","id","lang","role",Ah],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Sh=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Dh=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Oh=(n,e)=>{let t=n.nodeName.toLowerCase();return e.includes(t)?Sh.has(t)?!!Dh.test(n.nodeValue):!0:e.filter(i=>i instanceof RegExp).some(i=>i.test(t))};function Lh(n,e,t){if(!n.length)return n;if(t&&typeof t=="function")return t(n);let r=new window.DOMParser().parseFromString(n,"text/html"),o=[].concat(...r.body.querySelectorAll("*"));for(let s of o){let a=s.nodeName.toLowerCase();if(!Object.keys(e).includes(a)){s.remove();continue}let l=[].concat(...s.attributes),c=[].concat(e["*"]||[],e[a]||[]);for(let u of l)Oh(u,c)||s.removeAttribute(u.nodeName)}return r.body.innerHTML}var Mh="TemplateFactory",kh={allowList:Ia,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:""},Nh={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Ih={entry:"(string|element|function|null)",selector:"(string|element)"},So=class extends Qt{constructor(e){super(),this._config=this._getConfig(e)}static get Default(){return kh}static get DefaultType(){return Nh}static get NAME(){return Mh}getContent(){return Object.values(this._config.content).map(e=>this._resolvePossibleFunction(e)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(e){return this._checkContent(e),this._config.content=O(O({},this._config.content),e),this}toHtml(){let e=document.createElement("div");e.innerHTML=this._maybeSanitize(this._config.template);for(let[r,o]of Object.entries(this._config.content))this._setContent(e,o,r);let t=e.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&t.classList.add(...i.split(" ")),t}_typeCheckConfig(e){super._typeCheckConfig(e),this._checkContent(e.content)}_checkContent(e){for(let[t,i]of Object.entries(e))super._typeCheckConfig({selector:t,entry:i},Ih)}_setContent(e,t,i){let r=j.findOne(i,e);if(r){if(t=this._resolvePossibleFunction(t),!t){r.remove();return}if(dt(t)){this._putElementInTemplate(Tt(t),r);return}if(this._config.html){r.innerHTML=this._maybeSanitize(t);return}r.textContent=t}}_maybeSanitize(e){return this._config.sanitize?Lh(e,this._config.allowList,this._config.sanitizeFn):e}_resolvePossibleFunction(e){return He(e,[void 0,this])}_putElementInTemplate(e,t){if(this._config.html){t.innerHTML="",t.append(e);return}t.textContent=e.textContent}},Rh="tooltip",Hh=new Set(["sanitize","allowList","sanitizeFn"]),go="fade",Ph="modal",qi="show",Fh=".tooltip-inner",ta=`.${Ph}`,na="hide.bs.modal",ei="hover",vo="focus",yo="click",Bh="manual",$h="hide",Vh="hidden",zh="show",jh="shown",Wh="inserted",qh="click",Uh="focusin",Yh="focusout",Gh="mouseenter",Kh="mouseleave",Xh={AUTO:"auto",TOP:"top",RIGHT:Ke()?"left":"right",BOTTOM:"bottom",LEFT:Ke()?"right":"left"},Qh={allowList:Ia,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:' ',title:"",trigger:"hover focus"},Jh={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"},ht=class n extends je{constructor(e,t){if(typeof Vi=="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org/docs/v2/)");super(e,t),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Qh}static get DefaultType(){return Jh}static get NAME(){return Rh}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(this._isEnabled){if(this._isShown()){this._leave();return}this._enter()}}dispose(){clearTimeout(this._timeout),x.off(this._element.closest(ta),na,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!(this._isWithContent()&&this._isEnabled))return;let e=x.trigger(this._element,this.constructor.eventName(zh)),i=(fa(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(e.defaultPrevented||!i)return;this._disposePopper();let r=this._getTipElement();this._element.setAttribute("aria-describedby",r.getAttribute("id"));let{container:o}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(o.append(r),x.trigger(this._element,this.constructor.eventName(Wh))),this._popper=this._createPopper(r),r.classList.add(qi),"ontouchstart"in document.documentElement)for(let a of[].concat(...document.body.children))x.on(a,"mouseover",Xi);let s=()=>{x.trigger(this._element,this.constructor.eventName(jh)),this._isHovered===!1&&this._leave(),this._isHovered=!1};this._queueCallback(s,this.tip,this._isAnimated())}hide(){if(!this._isShown()||x.trigger(this._element,this.constructor.eventName($h)).defaultPrevented)return;if(this._getTipElement().classList.remove(qi),"ontouchstart"in document.documentElement)for(let r of[].concat(...document.body.children))x.off(r,"mouseover",Xi);this._activeTrigger[yo]=!1,this._activeTrigger[vo]=!1,this._activeTrigger[ei]=!1,this._isHovered=null;let i=()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),x.trigger(this._element,this.constructor.eventName(Vh)))};this._queueCallback(i,this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return!!this._getTitle()}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(e){let t=this._getTemplateFactory(e).toHtml();if(!t)return null;t.classList.remove(go,qi),t.classList.add(`bs-${this.constructor.NAME}-auto`);let i=Bu(this.constructor.NAME).toString();return t.setAttribute("id",i),this._isAnimated()&&t.classList.add(go),t}setContent(e){this._newContent=e,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(e){return this._templateFactory?this._templateFactory.changeContent(e):this._templateFactory=new So(ae(O({},this._config),{content:e,extraClass:this._resolvePossibleFunction(this._config.customClass)})),this._templateFactory}_getContentForTemplate(){return{[Fh]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(e){return this.constructor.getOrCreateInstance(e.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(go)}_isShown(){return this.tip&&this.tip.classList.contains(qi)}_createPopper(e){let t=He(this._config.placement,[this,e,this._element]),i=Xh[t.toUpperCase()];return Jn(this._element,e,this._getPopperConfig(i))}_getOffset(){let{offset:e}=this._config;return typeof e=="string"?e.split(",").map(t=>Number.parseInt(t,10)):typeof e=="function"?t=>e(t,this._element):e}_resolvePossibleFunction(e){return He(e,[this._element,this._element])}_getPopperConfig(e){let t={placement:e,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:i=>{this._getTipElement().setAttribute("data-popper-placement",i.state.placement)}}]};return O(O({},t),He(this._config.popperConfig,[void 0,t]))}_setListeners(){let e=this._config.trigger.split(" ");for(let t of e)if(t==="click")x.on(this._element,this.constructor.eventName(qh),this._config.selector,i=>{let r=this._initializeOnDelegatedTarget(i);r._activeTrigger[yo]=!(r._isShown()&&r._activeTrigger[yo]),r.toggle()});else if(t!==Bh){let i=t===ei?this.constructor.eventName(Gh):this.constructor.eventName(Uh),r=t===ei?this.constructor.eventName(Kh):this.constructor.eventName(Yh);x.on(this._element,i,this._config.selector,o=>{let s=this._initializeOnDelegatedTarget(o);s._activeTrigger[o.type==="focusin"?vo:ei]=!0,s._enter()}),x.on(this._element,r,this._config.selector,o=>{let s=this._initializeOnDelegatedTarget(o);s._activeTrigger[o.type==="focusout"?vo:ei]=s._element.contains(o.relatedTarget),s._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},x.on(this._element.closest(ta),na,this._hideModalHandler)}_fixTitle(){let e=this._element.getAttribute("title");e&&(!this._element.getAttribute("aria-label")&&!this._element.textContent.trim()&&this._element.setAttribute("aria-label",e),this._element.setAttribute("data-bs-original-title",e),this._element.removeAttribute("title"))}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide))}_setTimeout(e,t){clearTimeout(this._timeout),this._timeout=setTimeout(e,t)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(e){let t=ft.getDataAttributes(this._element);for(let i of Object.keys(t))Hh.has(i)&&delete t[i];return e=O(O({},t),typeof e=="object"&&e?e:{}),e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e.container=e.container===!1?document.body:Tt(e.container),typeof e.delay=="number"&&(e.delay={show:e.delay,hide:e.delay}),typeof e.title=="number"&&(e.title=e.title.toString()),typeof e.content=="number"&&(e.content=e.content.toString()),e}_getDelegateConfig(){let e={};for(let[t,i]of Object.entries(this._config))this.constructor.Default[t]!==i&&(e[t]=i);return e.selector=!1,e.trigger="manual",e}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e]()}})}};Qe(ht);var Zh="popover",ep=".popover-header",tp=".popover-body",np=ae(O({},ht.Default),{content:"",offset:[0,8],placement:"right",template:'',trigger:"click"}),ip=ae(O({},ht.DefaultType),{content:"(null|string|element|function)"}),Cn=class n extends ht{static get Default(){return np}static get DefaultType(){return ip}static get NAME(){return Zh}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[ep]:this._getTitle(),[tp]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e]()}})}};Qe(Cn);var rp="scrollspy",op="bs.scrollspy",Mo=`.${op}`,sp=".data-api",ap=`activate${Mo}`,ia=`click${Mo}`,lp=`load${Mo}${sp}`,cp="dropdown-item",_n="active",up='[data-bs-spy="scroll"]',Eo="[href]",dp=".nav, .list-group",ra=".nav-link",fp=".nav-item",hp=".list-group-item",pp=`${ra}, ${fp} > ${ra}, ${hp}`,mp=".dropdown",gp=".dropdown-toggle",vp={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},yp={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"},ir=class n extends je{constructor(e,t){super(e,t),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return vp}static get DefaultType(){return yp}static get NAME(){return rp}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(let e of this._observableSections.values())this._observer.observe(e)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(e){return e.target=Tt(e.target)||document.body,e.rootMargin=e.offset?`${e.offset}px 0px -30%`:e.rootMargin,typeof e.threshold=="string"&&(e.threshold=e.threshold.split(",").map(t=>Number.parseFloat(t))),e}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(x.off(this._config.target,ia),x.on(this._config.target,ia,Eo,e=>{let t=this._observableSections.get(e.target.hash);if(t){e.preventDefault();let i=this._rootElement||window,r=t.offsetTop-this._element.offsetTop;if(i.scrollTo){i.scrollTo({top:r,behavior:"smooth"});return}i.scrollTop=r}}))}_getNewObserver(){let e={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(t=>this._observerCallback(t),e)}_observerCallback(e){let t=s=>this._targetLinks.get(`#${s.target.id}`),i=s=>{this._previousScrollData.visibleEntryTop=s.target.offsetTop,this._process(t(s))},r=(this._rootElement||document.documentElement).scrollTop,o=r>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=r;for(let s of e){if(!s.isIntersecting){this._activeTarget=null,this._clearActiveClass(t(s));continue}let a=s.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(o&&a){if(i(s),!r)return;continue}!o&&!a&&i(s)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;let e=j.find(Eo,this._config.target);for(let t of e){if(!t.hash||Ct(t))continue;let i=j.findOne(decodeURI(t.hash),this._element);An(i)&&(this._targetLinks.set(decodeURI(t.hash),t),this._observableSections.set(t.hash,i))}}_process(e){this._activeTarget!==e&&(this._clearActiveClass(this._config.target),this._activeTarget=e,e.classList.add(_n),this._activateParents(e),x.trigger(this._element,ap,{relatedTarget:e}))}_activateParents(e){if(e.classList.contains(cp)){j.findOne(gp,e.closest(mp)).classList.add(_n);return}for(let t of j.parents(e,dp))for(let i of j.prev(t,pp))i.classList.add(_n)}_clearActiveClass(e){e.classList.remove(_n);let t=j.find(`${Eo}.${_n}`,e);for(let i of t)i.classList.remove(_n)}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}};x.on(window,lp,()=>{for(let n of j.find(up))ir.getOrCreateInstance(n)});Qe(ir);var Ep="tab",bp="bs.tab",en=`.${bp}`,_p=`hide${en}`,wp=`hidden${en}`,xp=`show${en}`,Tp=`shown${en}`,Cp=`click${en}`,Ap=`keydown${en}`,Sp=`load${en}`,Dp="ArrowLeft",oa="ArrowRight",Op="ArrowUp",sa="ArrowDown",bo="Home",aa="End",Xt="active",la="fade",_o="show",Lp="dropdown",Ra=".dropdown-toggle",Mp=".dropdown-menu",wo=`:not(${Ra})`,kp='.list-group, .nav, [role="tablist"]',Np=".nav-item, .list-group-item",Ip=`.nav-link${wo}, .list-group-item${wo}, [role="tab"]${wo}`,Ha='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',xo=`${Ip}, ${Ha}`,Rp=`.${Xt}[data-bs-toggle="tab"], .${Xt}[data-bs-toggle="pill"], .${Xt}[data-bs-toggle="list"]`,Jt=class n extends je{constructor(e){super(e),this._parent=this._element.closest(kp),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),x.on(this._element,Ap,t=>this._keydown(t)))}static get NAME(){return Ep}show(){let e=this._element;if(this._elemIsActive(e))return;let t=this._getActiveElem(),i=t?x.trigger(t,_p,{relatedTarget:e}):null;x.trigger(e,xp,{relatedTarget:t}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(t,e),this._activate(e,t))}_activate(e,t){if(!e)return;e.classList.add(Xt),this._activate(j.getElementFromSelector(e));let i=()=>{if(e.getAttribute("role")!=="tab"){e.classList.add(_o);return}e.removeAttribute("tabindex"),e.setAttribute("aria-selected",!0),this._toggleDropDown(e,!0),x.trigger(e,Tp,{relatedTarget:t})};this._queueCallback(i,e,e.classList.contains(la))}_deactivate(e,t){if(!e)return;e.classList.remove(Xt),e.blur(),this._deactivate(j.getElementFromSelector(e));let i=()=>{if(e.getAttribute("role")!=="tab"){e.classList.remove(_o);return}e.setAttribute("aria-selected",!1),e.setAttribute("tabindex","-1"),this._toggleDropDown(e,!1),x.trigger(e,wp,{relatedTarget:t})};this._queueCallback(i,e,e.classList.contains(la))}_keydown(e){if(![Dp,oa,Op,sa,bo,aa].includes(e.key))return;e.stopPropagation(),e.preventDefault();let t=this._getChildren().filter(r=>!Ct(r)),i;if([bo,aa].includes(e.key))i=t[e.key===bo?0:t.length-1];else{let r=[oa,sa].includes(e.key);i=Do(t,e.target,r,!0)}i&&(i.focus({preventScroll:!0}),n.getOrCreateInstance(i).show())}_getChildren(){return j.find(xo,this._parent)}_getActiveElem(){return this._getChildren().find(e=>this._elemIsActive(e))||null}_setInitialAttributes(e,t){this._setAttributeIfNotExists(e,"role","tablist");for(let i of t)this._setInitialAttributesOnChild(i)}_setInitialAttributesOnChild(e){e=this._getInnerElement(e);let t=this._elemIsActive(e),i=this._getOuterElement(e);e.setAttribute("aria-selected",t),i!==e&&this._setAttributeIfNotExists(i,"role","presentation"),t||e.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(e,"role","tab"),this._setInitialAttributesOnTargetPanel(e)}_setInitialAttributesOnTargetPanel(e){let t=j.getElementFromSelector(e);t&&(this._setAttributeIfNotExists(t,"role","tabpanel"),e.id&&this._setAttributeIfNotExists(t,"aria-labelledby",`${e.id}`))}_toggleDropDown(e,t){let i=this._getOuterElement(e);if(!i.classList.contains(Lp))return;let r=(o,s)=>{let a=j.findOne(o,i);a&&a.classList.toggle(s,t)};r(Ra,Xt),r(Mp,_o),i.setAttribute("aria-expanded",t)}_setAttributeIfNotExists(e,t,i){e.hasAttribute(t)||e.setAttribute(t,i)}_elemIsActive(e){return e.classList.contains(Xt)}_getInnerElement(e){return e.matches(xo)?e:j.findOne(xo,e)}_getOuterElement(e){return e.closest(Np)||e}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this);if(typeof e=="string"){if(t[e]===void 0||e.startsWith("_")||e==="constructor")throw new TypeError(`No method named "${e}"`);t[e]()}})}};x.on(document,Cp,Ha,function(n){["A","AREA"].includes(this.tagName)&&n.preventDefault(),!Ct(this)&&Jt.getOrCreateInstance(this).show()});x.on(window,Sp,()=>{for(let n of j.find(Rp))Jt.getOrCreateInstance(n)});Qe(Jt);var Hp="toast",Pp="bs.toast",Lt=`.${Pp}`,Fp=`mouseover${Lt}`,Bp=`mouseout${Lt}`,$p=`focusin${Lt}`,Vp=`focusout${Lt}`,zp=`hide${Lt}`,jp=`hidden${Lt}`,Wp=`show${Lt}`,qp=`shown${Lt}`,Up="fade",ca="hide",Ui="show",Yi="showing",Yp={animation:"boolean",autohide:"boolean",delay:"number"},Gp={animation:!0,autohide:!0,delay:5e3},pt=class n extends je{constructor(e,t){super(e,t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Gp}static get DefaultType(){return Yp}static get NAME(){return Hp}show(){if(x.trigger(this._element,Wp).defaultPrevented)return;this._clearTimeout(),this._config.animation&&this._element.classList.add(Up);let t=()=>{this._element.classList.remove(Yi),x.trigger(this._element,qp),this._maybeScheduleHide()};this._element.classList.remove(ca),ii(this._element),this._element.classList.add(Ui,Yi),this._queueCallback(t,this._element,this._config.animation)}hide(){if(!this.isShown()||x.trigger(this._element,zp).defaultPrevented)return;let t=()=>{this._element.classList.add(ca),this._element.classList.remove(Yi,Ui),x.trigger(this._element,jp)};this._element.classList.add(Yi),this._queueCallback(t,this._element,this._config.animation)}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(Ui),super.dispose()}isShown(){return this._element.classList.contains(Ui)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,t){switch(e.type){case"mouseover":case"mouseout":{this._hasMouseInteraction=t;break}case"focusin":case"focusout":{this._hasKeyboardInteraction=t;break}}if(t){this._clearTimeout();return}let i=e.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){x.on(this._element,Fp,e=>this._onInteraction(e,!0)),x.on(this._element,Bp,e=>this._onInteraction(e,!1)),x.on(this._element,$p,e=>this._onInteraction(e,!0)),x.on(this._element,Vp,e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){let t=n.getOrCreateInstance(this,e);if(typeof e=="string"){if(typeof t[e]=="undefined")throw new TypeError(`No method named "${e}"`);t[e](this)}})}};rr(pt);Qe(pt);var Kp=function(){"use strict";let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(n,e){return getInputValues(n,e||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0,historyRestoreAsHxRequest:!0},parseInterval:null,location,_:null,version:"2.0.6"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(n){return"[hx-"+n+"], [data-hx-"+n+"]"}).join(", ");function parseInterval(n){if(n==null)return;let e=NaN;return n.slice(-2)=="ms"?e=parseFloat(n.slice(0,-2)):n.slice(-1)=="s"?e=parseFloat(n.slice(0,-1))*1e3:n.slice(-1)=="m"?e=parseFloat(n.slice(0,-1))*1e3*60:e=parseFloat(n),isNaN(e)?void 0:e}function getRawAttribute(n,e){return n instanceof Element&&n.getAttribute(e)}function hasAttribute(n,e){return!!n.hasAttribute&&(n.hasAttribute(e)||n.hasAttribute("data-"+e))}function getAttributeValue(n,e){return getRawAttribute(n,e)||getRawAttribute(n,"data-"+e)}function parentElt(n){let e=n.parentElement;return!e&&n.parentNode instanceof ShadowRoot?n.parentNode:e}function getDocument(){return document}function getRootNode(n,e){return n.getRootNode?n.getRootNode({composed:e}):getDocument()}function getClosestMatch(n,e){for(;n&&!e(n);)n=parentElt(n);return n||null}function getAttributeValueWithDisinheritance(n,e,t){let i=getAttributeValue(e,t),r=getAttributeValue(e,"hx-disinherit");var o=getAttributeValue(e,"hx-inherit");if(n!==e){if(htmx.config.disableInheritance)return o&&(o==="*"||o.split(" ").indexOf(t)>=0)?i:null;if(r&&(r==="*"||r.split(" ").indexOf(t)>=0))return"unset"}return i}function getClosestAttributeValue(n,e){let t=null;if(getClosestMatch(n,function(i){return!!(t=getAttributeValueWithDisinheritance(n,asElement(i),e))}),t!=="unset")return t}function matches(n,e){return n instanceof Element&&n.matches(e)}function getStartTag(n){let t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(n);return t?t[1].toLowerCase():""}function parseHTML(n){return new DOMParser().parseFromString(n,"text/html")}function takeChildrenFor(n,e){for(;e.childNodes.length>0;)n.append(e.childNodes[0])}function duplicateScript(n){let e=getDocument().createElement("script");return forEach(n.attributes,function(t){e.setAttribute(t.name,t.value)}),e.textContent=n.textContent,e.async=!1,htmx.config.inlineScriptNonce&&(e.nonce=htmx.config.inlineScriptNonce),e}function isJavaScriptScriptNode(n){return n.matches("script")&&(n.type==="text/javascript"||n.type==="module"||n.type==="")}function normalizeScriptTags(n){Array.from(n.querySelectorAll("script")).forEach(e=>{if(isJavaScriptScriptNode(e)){let t=duplicateScript(e),i=e.parentNode;try{i.insertBefore(t,e)}catch(r){logError(r)}finally{e.remove()}}})}function makeFragment(n){let e=n.replace(/]*)?>[\s\S]*?<\/head>/i,""),t=getStartTag(e),i;if(t==="html"){i=new DocumentFragment;let o=parseHTML(n);takeChildrenFor(i,o.body),i.title=o.title}else if(t==="body"){i=new DocumentFragment;let o=parseHTML(e);takeChildrenFor(i,o.body),i.title=o.title}else{let o=parseHTML(''+e+"");i=o.querySelector("template").content,i.title=o.title;var r=i.querySelector("title");r&&r.parentNode===i&&(r.remove(),i.title=r.innerText)}return i&&(htmx.config.allowScriptTags?normalizeScriptTags(i):i.querySelectorAll("script").forEach(o=>o.remove())),i}function maybeCall(n){n&&n()}function isType(n,e){return Object.prototype.toString.call(n)==="[object "+e+"]"}function isFunction(n){return typeof n=="function"}function isRawObject(n){return isType(n,"Object")}function getInternalData(n){let e="htmx-internal-data",t=n[e];return t||(t=n[e]={}),t}function toArray(n){let e=[];if(n)for(let t=0;t=0}function bodyContains(n){return n.getRootNode({composed:!0})===document}function splitOnWhitespace(n){return n.trim().split(/\s+/)}function mergeObjects(n,e){for(let t in e)e.hasOwnProperty(t)&&(n[t]=e[t]);return n}function parseJSON(n){try{return JSON.parse(n)}catch(e){return logError(e),null}}function canAccessLocalStorage(){let n="htmx:sessionStorageTest";try{return sessionStorage.setItem(n,n),sessionStorage.removeItem(n),!0}catch(e){return!1}}function normalizePath(n){let e=new URL(n,"http://x");return e&&(n=e.pathname+e.search),n!="/"&&(n=n.replace(/\/+$/,"")),n}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(n){return htmx.on("htmx:load",function(t){n(t.detail.elt)})}function logAll(){htmx.logger=function(n,e,t){console&&console.log(e,n,t)}}function logNone(){htmx.logger=null}function find(n,e){return typeof n!="string"?n.querySelector(e):find(getDocument(),n)}function findAll(n,e){return typeof n!="string"?n.querySelectorAll(e):findAll(getDocument(),n)}function getWindow(){return window}function removeElement(n,e){n=resolveTarget(n),e?getWindow().setTimeout(function(){removeElement(n),n=null},e):parentElt(n).removeChild(n)}function asElement(n){return n instanceof Element?n:null}function asHtmlElement(n){return n instanceof HTMLElement?n:null}function asString(n){return typeof n=="string"?n:null}function asParentNode(n){return n instanceof Element||n instanceof Document||n instanceof DocumentFragment?n:null}function addClassToElement(n,e,t){n=asElement(resolveTarget(n)),n&&(t?getWindow().setTimeout(function(){addClassToElement(n,e),n=null},t):n.classList&&n.classList.add(e))}function removeClassFromElement(n,e,t){let i=asElement(resolveTarget(n));i&&(t?getWindow().setTimeout(function(){removeClassFromElement(i,e),i=null},t):i.classList&&(i.classList.remove(e),i.classList.length===0&&i.removeAttribute("class")))}function toggleClassOnElement(n,e){n=resolveTarget(n),n.classList.toggle(e)}function takeClassForElement(n,e){n=resolveTarget(n),forEach(n.parentElement.children,function(t){removeClassFromElement(t,e)}),addClassToElement(asElement(n),e)}function closest(n,e){return n=asElement(resolveTarget(n)),n?n.closest(e):null}function startsWith(n,e){return n.substring(0,e.length)===e}function endsWith(n,e){return n.substring(n.length-e.length)===e}function normalizeSelector(n){let e=n.trim();return startsWith(e,"<")&&endsWith(e,"/>")?e.substring(1,e.length-2):e}function querySelectorAllExt(n,e,t){if(e.indexOf("global ")===0)return querySelectorAllExt(n,e.slice(7),!0);n=resolveTarget(n);let i=[];{let s=0,a=0;for(let l=0;l "&&s--}a 0;){let s=normalizeSelector(i.shift()),a;s.indexOf("closest ")===0?a=closest(asElement(n),normalizeSelector(s.slice(8))):s.indexOf("find ")===0?a=find(asParentNode(n),normalizeSelector(s.slice(5))):s==="next"||s==="nextElementSibling"?a=asElement(n).nextElementSibling:s.indexOf("next ")===0?a=scanForwardQuery(n,normalizeSelector(s.slice(5)),!!t):s==="previous"||s==="previousElementSibling"?a=asElement(n).previousElementSibling:s.indexOf("previous ")===0?a=scanBackwardsQuery(n,normalizeSelector(s.slice(9)),!!t):s==="document"?a=document:s==="window"?a=window:s==="body"?a=document.body:s==="root"?a=getRootNode(n,!!t):s==="host"?a=n.getRootNode().host:o.push(s),a&&r.push(a)}if(o.length>0){let s=o.join(","),a=asParentNode(getRootNode(n,!!t));r.push(...toArray(a.querySelectorAll(s)))}return r}var scanForwardQuery=function(n,e,t){let i=asParentNode(getRootNode(n,t)).querySelectorAll(e);for(let r=0;r =0;r--){let o=i[r];if(o.compareDocumentPosition(n)===Node.DOCUMENT_POSITION_FOLLOWING)return o}};function querySelectorExt(n,e){return typeof n!="string"?querySelectorAllExt(n,e)[0]:querySelectorAllExt(getDocument().body,n)[0]}function resolveTarget(n,e){return typeof n=="string"?find(asParentNode(e)||document,n):n}function processEventArgs(n,e,t,i){return isFunction(e)?{target:getDocument().body,event:asString(n),listener:e,options:t}:{target:resolveTarget(n),event:asString(e),listener:t,options:i}}function addEventListenerImpl(n,e,t,i){return ready(function(){let o=processEventArgs(n,e,t,i);o.target.addEventListener(o.event,o.listener,o.options)}),isFunction(e)?e:t}function removeEventListenerImpl(n,e,t){return ready(function(){let i=processEventArgs(n,e,t);i.target.removeEventListener(i.event,i.listener)}),isFunction(e)?e:t}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(n,e){let t=getClosestAttributeValue(n,e);if(t){if(t==="this")return[findThisElement(n,e)];{let i=querySelectorAllExt(n,t);if(/(^|,)(\s*)inherit(\s*)($|,)/.test(t)){let o=asElement(getClosestMatch(n,function(s){return s!==n&&hasAttribute(asElement(s),e)}));o&&i.push(...findAttributeTargets(o,e))}return i.length===0?(logError('The selector "'+t+'" on '+e+" returned no matches!"),[DUMMY_ELT]):i}}}function findThisElement(n,e){return asElement(getClosestMatch(n,function(t){return getAttributeValue(asElement(t),e)!=null}))}function getTarget(n){let e=getClosestAttributeValue(n,"hx-target");return e?e==="this"?findThisElement(n,"hx-target"):querySelectorExt(n,e):getInternalData(n).boosted?getDocument().body:n}function shouldSettleAttribute(n){return htmx.config.attributesToSettle.includes(n)}function cloneAttributes(n,e){forEach(n.attributes,function(t){!e.hasAttribute(t.name)&&shouldSettleAttribute(t.name)&&n.removeAttribute(t.name)}),forEach(e.attributes,function(t){shouldSettleAttribute(t.name)&&n.setAttribute(t.name,t.value)})}function isInlineSwap(n,e){let t=getExtensions(e);for(let i=0;i 0?(o=n.substring(0,n.indexOf(":")),r=n.substring(n.indexOf(":")+1)):o=n),e.removeAttribute("hx-swap-oob"),e.removeAttribute("data-hx-swap-oob");let s=querySelectorAllExt(i,r,!1);return s.length?(forEach(s,function(a){let l,c=e.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(c),isInlineSwap(o,a)||(l=asParentNode(c));let u={shouldSwap:!0,target:a,fragment:l};triggerEvent(a,"htmx:oobBeforeSwap",u)&&(a=u.target,u.shouldSwap&&(handlePreservedElements(l),swapWithStyle(o,a,a,l,t),restorePreservedElements()),forEach(t.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u)}))}),e.parentNode.removeChild(e)):(e.parentNode.removeChild(e),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:e})),n}function restorePreservedElements(){let n=find("#--htmx-preserve-pantry--");if(n){for(let e of[...n.children]){let t=find("#"+e.id);t.parentNode.moveBefore(e,t),t.remove()}n.remove()}}function handlePreservedElements(n){forEach(findAll(n,"[hx-preserve], [data-hx-preserve]"),function(e){let t=getAttributeValue(e,"id"),i=getDocument().getElementById(t);if(i!=null)if(e.moveBefore){let r=find("#--htmx-preserve-pantry--");r==null&&(getDocument().body.insertAdjacentHTML("afterend",""),r=find("#--htmx-preserve-pantry--")),r.moveBefore(i,null)}else e.parentNode.replaceChild(i,e)})}function handleAttributes(n,e,t){forEach(e.querySelectorAll("[id]"),function(i){let r=getRawAttribute(i,"id");if(r&&r.length>0){let o=r.replace("'","\\'"),s=i.tagName.replace(":","\\:"),a=asParentNode(n),l=a&&a.querySelector(s+"[id='"+o+"']");if(l&&l!==a){let c=i.cloneNode();cloneAttributes(i,l),t.tasks.push(function(){cloneAttributes(i,c)})}}})}function makeAjaxLoadTask(n){return function(){removeClassFromElement(n,htmx.config.addedClass),processNode(asElement(n)),processFocus(asParentNode(n)),triggerEvent(n,"htmx:load")}}function processFocus(n){let e="[autofocus]",t=asHtmlElement(matches(n,e)?n:n.querySelector(e));t!=null&&t.focus()}function insertNodesBefore(n,e,t,i){for(handleAttributes(n,t,i);t.childNodes.length>0;){let r=t.firstChild;addClassToElement(asElement(r),htmx.config.addedClass),n.insertBefore(r,e),r.nodeType!==Node.TEXT_NODE&&r.nodeType!==Node.COMMENT_NODE&&i.tasks.push(makeAjaxLoadTask(r))}}function stringHash(n,e){let t=0;for(;t 0}function swap(n,e,t,i){i||(i={});let r=null,o=null,s=function(){maybeCall(i.beforeSwapCallback),n=resolveTarget(n);let c=i.contextElement?getRootNode(i.contextElement,!1):getDocument(),u=document.activeElement,d={};d={elt:u,start:u?u.selectionStart:null,end:u?u.selectionEnd:null};let p=makeSettleInfo(n);if(t.swapStyle==="textContent")n.textContent=e;else{let m=makeFragment(e);if(p.title=i.title||m.title,i.historyRequest&&(m=m.querySelector("[hx-history-elt],[data-hx-history-elt]")||m),i.selectOOB){let v=i.selectOOB.split(",");for(let w=0;w 0?getWindow().setTimeout(y,t.settleDelay):y()},a=htmx.config.globalViewTransitions;t.hasOwnProperty("transition")&&(a=t.transition);let l=i.contextElement||getDocument();if(a&&triggerEvent(l,"htmx:beforeTransition",i.eventInfo)&&typeof Promise!="undefined"&&document.startViewTransition){let c=new Promise(function(d,p){r=d,o=p}),u=s;s=function(){document.startViewTransition(function(){return u(),c})}}try{t!=null&&t.swapDelay&&t.swapDelay>0?getWindow().setTimeout(s,t.swapDelay):s()}catch(c){throw triggerErrorEvent(l,"htmx:swapError",i.eventInfo),maybeCall(o),c}}function handleTriggerHeader(n,e,t){let i=n.getResponseHeader(e);if(i.indexOf("{")===0){let r=parseJSON(i);for(let o in r)if(r.hasOwnProperty(o)){let s=r[o];isRawObject(s)?t=s.target!==void 0?s.target:t:s={value:s},triggerEvent(t,o,s)}}else{let r=i.split(",");for(let o=0;o 0;){let s=e[0];if(s==="]"){if(i--,i===0){o===null&&(r=r+"true"),e.shift(),r+=")})";try{let a=maybeEval(n,function(){return Function(r)()},function(){return!0});return a.source=r,a}catch(a){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:a,source:r}),null}}}else s==="["&&i++;isPossibleRelativeReference(s,o,t)?r+="(("+t+"."+s+") ? ("+t+"."+s+") : (window."+s+"))":r=r+s,o=e.shift()}}}function consumeUntil(n,e){let t="";for(;n.length>0&&!e.test(n[0]);)t+=n.shift();return t}function consumeCSSSelector(n){let e;return n.length>0&&COMBINED_SELECTOR_START.test(n[0])?(n.shift(),e=consumeUntil(n,COMBINED_SELECTOR_END).trim(),n.shift()):e=consumeUntil(n,WHITESPACE_OR_COMMA),e}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(n,e,t){let i=[],r=tokenizeString(e);do{consumeUntil(r,NOT_WHITESPACE);let a=r.length,l=consumeUntil(r,/[,\[\s]/);if(l!=="")if(l==="every"){let c={trigger:"every"};consumeUntil(r,NOT_WHITESPACE),c.pollInterval=parseInterval(consumeUntil(r,/[,\[\s]/)),consumeUntil(r,NOT_WHITESPACE);var o=maybeGenerateConditional(n,r,"event");o&&(c.eventFilter=o),i.push(c)}else{let c={trigger:l};var o=maybeGenerateConditional(n,r,"event");for(o&&(c.eventFilter=o),consumeUntil(r,NOT_WHITESPACE);r.length>0&&r[0]!==",";){let d=r.shift();if(d==="changed")c.changed=!0;else if(d==="once")c.once=!0;else if(d==="consume")c.consume=!0;else if(d==="delay"&&r[0]===":")r.shift(),c.delay=parseInterval(consumeUntil(r,WHITESPACE_OR_COMMA));else if(d==="from"&&r[0]===":"){if(r.shift(),COMBINED_SELECTOR_START.test(r[0]))var s=consumeCSSSelector(r);else{var s=consumeUntil(r,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){r.shift();let y=consumeCSSSelector(r);y.length>0&&(s+=" "+y)}}c.from=s}else d==="target"&&r[0]===":"?(r.shift(),c.target=consumeCSSSelector(r)):d==="throttle"&&r[0]===":"?(r.shift(),c.throttle=parseInterval(consumeUntil(r,WHITESPACE_OR_COMMA))):d==="queue"&&r[0]===":"?(r.shift(),c.queue=consumeUntil(r,WHITESPACE_OR_COMMA)):d==="root"&&r[0]===":"?(r.shift(),c[d]=consumeCSSSelector(r)):d==="threshold"&&r[0]===":"?(r.shift(),c[d]=consumeUntil(r,WHITESPACE_OR_COMMA)):triggerErrorEvent(n,"htmx:syntax:error",{token:r.shift()});consumeUntil(r,NOT_WHITESPACE)}i.push(c)}r.length===a&&triggerErrorEvent(n,"htmx:syntax:error",{token:r.shift()}),consumeUntil(r,NOT_WHITESPACE)}while(r[0]===","&&r.shift());return t&&(t[e]=i),i}function getTriggerSpecs(n){let e=getAttributeValue(n,"hx-trigger"),t=[];if(e){let i=htmx.config.triggerSpecsCache;t=i&&i[e]||parseAndCacheTrigger(n,e,i)}return t.length>0?t:matches(n,"form")?[{trigger:"submit"}]:matches(n,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(n,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(n){getInternalData(n).cancelled=!0}function processPolling(n,e,t){let i=getInternalData(n);i.timeout=getWindow().setTimeout(function(){bodyContains(n)&&i.cancelled!==!0&&(maybeFilterEvent(t,n,makeEvent("hx:poll:trigger",{triggerSpec:t,target:n}))||e(n),processPolling(n,e,t))},t.pollInterval)}function isLocalLink(n){return location.hostname===n.hostname&&getRawAttribute(n,"href")&&getRawAttribute(n,"href").indexOf("#")!==0}function eltIsDisabled(n){return closest(n,htmx.config.disableSelector)}function boostElement(n,e,t){if(n instanceof HTMLAnchorElement&&isLocalLink(n)&&(n.target===""||n.target==="_self")||n.tagName==="FORM"&&String(getRawAttribute(n,"method")).toLowerCase()!=="dialog"){e.boosted=!0;let i,r;if(n.tagName==="A")i="get",r=getRawAttribute(n,"href");else{let o=getRawAttribute(n,"method");i=o?o.toLowerCase():"get",r=getRawAttribute(n,"action"),(r==null||r==="")&&(r=location.href),i==="get"&&r.includes("?")&&(r=r.replace(/\?[^#]+/,""))}t.forEach(function(o){addEventListener(n,function(s,a){let l=asElement(s);if(eltIsDisabled(l)){cleanUpElement(l);return}issueAjaxRequest(i,r,l,a)},e,o,!0)})}}function shouldCancel(n,e){return!!((n.type==="submit"||n.type==="click")&&(e=asElement(n.target)||e,e.tagName==="FORM"||e.form&&e.type==="submit"||(e=e.closest("a"),e&&e.href&&(e.getAttribute("href")==="#"||e.getAttribute("href").indexOf("#")!==0))))}function ignoreBoostedAnchorCtrlClick(n,e){return getInternalData(n).boosted&&n instanceof HTMLAnchorElement&&e.type==="click"&&(e.ctrlKey||e.metaKey)}function maybeFilterEvent(n,e,t){let i=n.eventFilter;if(i)try{return i.call(e,t)!==!0}catch(r){let o=i.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:r,source:o}),!0}return!1}function addEventListener(n,e,t,i,r){let o=getInternalData(n),s;i.from?s=querySelectorAllExt(n,i.from):s=[n],i.changed&&("lastValue"in o||(o.lastValue=new WeakMap),s.forEach(function(a){o.lastValue.has(i)||o.lastValue.set(i,new WeakMap),o.lastValue.get(i).set(a,a.value)})),forEach(s,function(a){let l=function(c){if(!bodyContains(n)){a.removeEventListener(i.trigger,l);return}if(ignoreBoostedAnchorCtrlClick(n,c)||((r||shouldCancel(c,n))&&c.preventDefault(),maybeFilterEvent(i,n,c)))return;let u=getInternalData(c);if(u.triggerSpec=i,u.handledFor==null&&(u.handledFor=[]),u.handledFor.indexOf(n)<0){if(u.handledFor.push(n),i.consume&&c.stopPropagation(),i.target&&c.target&&!matches(asElement(c.target),i.target))return;if(i.once){if(o.triggeredOnce)return;o.triggeredOnce=!0}if(i.changed){let d=c.target,p=d.value,y=o.lastValue.get(i);if(y.has(d)&&y.get(d)===p)return;y.set(d,p)}if(o.delayed&&clearTimeout(o.delayed),o.throttle)return;i.throttle>0?o.throttle||(triggerEvent(n,"htmx:trigger"),e(n,c),o.throttle=getWindow().setTimeout(function(){o.throttle=null},i.throttle)):i.delay>0?o.delayed=getWindow().setTimeout(function(){triggerEvent(n,"htmx:trigger"),e(n,c)},i.delay):(triggerEvent(n,"htmx:trigger"),e(n,c))}};t.listenerInfos==null&&(t.listenerInfos=[]),t.listenerInfos.push({trigger:i.trigger,listener:l,on:a}),a.addEventListener(i.trigger,l)})}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0},window.addEventListener("scroll",scrollHandler),window.addEventListener("resize",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(n){maybeReveal(n)}))},200))}function maybeReveal(n){!hasAttribute(n,"data-hx-revealed")&&isScrolledIntoView(n)&&(n.setAttribute("data-hx-revealed","true"),getInternalData(n).initHash?triggerEvent(n,"revealed"):n.addEventListener("htmx:afterProcessNode",function(){triggerEvent(n,"revealed")},{once:!0}))}function loadImmediately(n,e,t,i){let r=function(){t.loaded||(t.loaded=!0,triggerEvent(n,"htmx:trigger"),e(n))};i>0?getWindow().setTimeout(r,i):r()}function processVerbs(n,e,t){let i=!1;return forEach(VERBS,function(r){if(hasAttribute(n,"hx-"+r)){let o=getAttributeValue(n,"hx-"+r);i=!0,e.path=o,e.verb=r,t.forEach(function(s){addTriggerHandler(n,s,e,function(a,l){let c=asElement(a);if(eltIsDisabled(c)){cleanUpElement(c);return}issueAjaxRequest(r,o,c,l)})})}}),i}function addTriggerHandler(n,e,t,i){if(e.trigger==="revealed")initScrollHandler(),addEventListener(n,i,t,e),maybeReveal(asElement(n));else if(e.trigger==="intersect"){let r={};e.root&&(r.root=querySelectorExt(n,e.root)),e.threshold&&(r.threshold=parseFloat(e.threshold)),new IntersectionObserver(function(s){for(let a=0;a 0?(t.polling=!0,processPolling(asElement(n),i,e)):addEventListener(n,i,t,e)}function shouldProcessHxOn(n){let e=asElement(n);if(!e)return!1;let t=e.attributes;for(let i=0;i ", "+o).join(""))}else return[]}function maybeSetLastButtonClicked(n){let e=getTargetButton(n.target),t=getRelatedFormData(n);t&&(t.lastButtonClicked=e)}function maybeUnsetLastButtonClicked(n){let e=getRelatedFormData(n);e&&(e.lastButtonClicked=null)}function getTargetButton(n){return closest(asElement(n),"button, input[type='submit']")}function getRelatedForm(n){return n.form||closest(n,"form")}function getRelatedFormData(n){let e=getTargetButton(n.target);if(!e)return;let t=getRelatedForm(e);return getInternalData(t)}function initButtonTracking(n){n.addEventListener("click",maybeSetLastButtonClicked),n.addEventListener("focusin",maybeSetLastButtonClicked),n.addEventListener("focusout",maybeUnsetLastButtonClicked)}function addHxOnEventHandler(n,e,t){let i=getInternalData(n);Array.isArray(i.onHandlers)||(i.onHandlers=[]);let r,o=function(s){maybeEval(n,function(){eltIsDisabled(n)||(r||(r=new Function("event",t)),r.call(n,s))})};n.addEventListener(e,o),i.onHandlers.push({event:e,listener:o})}function processHxOnWildcard(n){deInitOnHandlers(n);for(let e=0;e htmx.config.historyCacheSize;)o.shift();for(;o.length>0;)try{sessionStorage.setItem("htmx-history-cache",JSON.stringify(o));break}catch(a){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:a,cache:o}),o.shift()}}function getCachedHistory(n){if(!canAccessLocalStorage())return null;n=normalizePath(n);let e=parseJSON(sessionStorage.getItem("htmx-history-cache"))||[];for(let t=0;t =200&&this.status<400?(i.response=this.response,triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",i),swap(i.historyElt,i.response,t,{contextElement:i.historyElt,historyRequest:!0}),setCurrentPathForHistory(i.path),triggerEvent(getDocument().body,"htmx:historyRestore",{path:n,cacheMiss:!0,serverResponse:i.response})):triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",i)},triggerEvent(getDocument().body,"htmx:historyCacheMiss",i)&&e.send()}function restoreHistory(n){saveCurrentPageToHistory(),n=n||location.pathname+location.search;let e=getCachedHistory(n);if(e){let t={swapStyle:"innerHTML",swapDelay:0,settleDelay:0,scroll:e.scroll},i={path:n,item:e,historyElt:getHistoryElement(),swapSpec:t};triggerEvent(getDocument().body,"htmx:historyCacheHit",i)&&(swap(i.historyElt,e.content,t,{contextElement:i.historyElt,title:e.title}),setCurrentPathForHistory(i.path),triggerEvent(getDocument().body,"htmx:historyRestore",i))}else htmx.config.refreshOnHistoryMiss?htmx.location.reload(!0):loadHistoryFromServer(n)}function addRequestIndicatorClasses(n){let e=findAttributeTargets(n,"hx-indicator");return e==null&&(e=[n]),forEach(e,function(t){let i=getInternalData(t);i.requestCount=(i.requestCount||0)+1,t.classList.add.call(t.classList,htmx.config.requestClass)}),e}function disableElements(n){let e=findAttributeTargets(n,"hx-disabled-elt");return e==null&&(e=[]),forEach(e,function(t){let i=getInternalData(t);i.requestCount=(i.requestCount||0)+1,t.setAttribute("disabled",""),t.setAttribute("data-disabled-by-htmx","")}),e}function removeRequestIndicators(n,e){forEach(n.concat(e),function(t){let i=getInternalData(t);i.requestCount=(i.requestCount||1)-1}),forEach(n,function(t){getInternalData(t).requestCount===0&&t.classList.remove.call(t.classList,htmx.config.requestClass)}),forEach(e,function(t){getInternalData(t).requestCount===0&&(t.removeAttribute("disabled"),t.removeAttribute("data-disabled-by-htmx"))})}function haveSeenNode(n,e){for(let t=0;t e.indexOf(r)<0):i=i.filter(r=>r!==e),t.delete(n),forEach(i,r=>t.append(n,r))}}function getValueFromInput(n){return n instanceof HTMLSelectElement&&n.multiple?toArray(n.querySelectorAll("option:checked")).map(function(e){return e.value}):n instanceof HTMLInputElement&&n.files?toArray(n.files):n.value}function processInputValue(n,e,t,i,r){if(!(i==null||haveSeenNode(n,i))){if(n.push(i),shouldInclude(i)){let o=getRawAttribute(i,"name");addValueToFormData(o,getValueFromInput(i),e),r&&validateElement(i,t)}i instanceof HTMLFormElement&&(forEach(i.elements,function(o){n.indexOf(o)>=0?removeValueFromFormData(o.name,getValueFromInput(o),e):n.push(o),r&&validateElement(o,t)}),new FormData(i).forEach(function(o,s){o instanceof File&&o.name===""||addValueToFormData(s,o,e)}))}}function validateElement(n,e){let t=n;t.willValidate&&(triggerEvent(t,"htmx:validation:validate"),t.checkValidity()||(e.push({elt:t,message:t.validationMessage,validity:t.validity}),triggerEvent(t,"htmx:validation:failed",{message:t.validationMessage,validity:t.validity})))}function overrideFormData(n,e){for(let t of e.keys())n.delete(t);return e.forEach(function(t,i){n.append(i,t)}),n}function getInputValues(n,e){let t=[],i=new FormData,r=new FormData,o=[],s=getInternalData(n);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let a=n instanceof HTMLFormElement&&n.noValidate!==!0||getAttributeValue(n,"hx-validate")==="true";if(s.lastButtonClicked&&(a=a&&s.lastButtonClicked.formNoValidate!==!0),e!=="get"&&processInputValue(t,r,o,getRelatedForm(n),a),processInputValue(t,i,o,n,a),s.lastButtonClicked||n.tagName==="BUTTON"||n.tagName==="INPUT"&&getRawAttribute(n,"type")==="submit"){let c=s.lastButtonClicked||n,u=getRawAttribute(c,"name");addValueToFormData(u,c.value,r)}let l=findAttributeTargets(n,"hx-include");return forEach(l,function(c){processInputValue(t,i,o,asElement(c),a),matches(c,"form")||forEach(asParentNode(c).querySelectorAll(INPUT_SELECTOR),function(u){processInputValue(t,i,o,u,a)})}),overrideFormData(i,r),{errors:o,formData:i,values:formDataProxy(i)}}function appendParam(n,e,t){n!==""&&(n+="&"),String(t)==="[object Object]"&&(t=JSON.stringify(t));let i=encodeURIComponent(t);return n+=encodeURIComponent(e)+"="+i,n}function urlEncode(n){n=formDataFromObject(n);let e="";return n.forEach(function(t,i){e=appendParam(e,i,t)}),e}function getHeaders(n,e,t){let i={"HX-Request":"true","HX-Trigger":getRawAttribute(n,"id"),"HX-Trigger-Name":getRawAttribute(n,"name"),"HX-Target":getAttributeValue(e,"id"),"HX-Current-URL":location.href};return getValuesForElement(n,"hx-headers",!1,i),t!==void 0&&(i["HX-Prompt"]=t),getInternalData(n).boosted&&(i["HX-Boosted"]="true"),i}function filterValues(n,e){let t=getClosestAttributeValue(e,"hx-params");if(t){if(t==="none")return new FormData;if(t==="*")return n;if(t.indexOf("not ")===0)return forEach(t.slice(4).split(","),function(i){i=i.trim(),n.delete(i)}),n;{let i=new FormData;return forEach(t.split(","),function(r){r=r.trim(),n.has(r)&&n.getAll(r).forEach(function(o){i.append(r,o)})}),i}}else return n}function isAnchorLink(n){return!!getRawAttribute(n,"href")&&getRawAttribute(n,"href").indexOf("#")>=0}function getSwapSpecification(n,e){let t=e||getClosestAttributeValue(n,"hx-swap"),i={swapStyle:getInternalData(n).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(n).boosted&&!isAnchorLink(n)&&(i.show="top"),t){let s=splitOnWhitespace(t);if(s.length>0)for(let a=0;a 0?r.join(":"):null;i.scroll=u,i.scrollTarget=o}else if(l.indexOf("show:")===0){var r=l.slice(5).split(":");let d=r.pop();var o=r.length>0?r.join(":"):null;i.show=d,i.showTarget=o}else if(l.indexOf("focus-scroll:")===0){let c=l.slice(13);i.focusScroll=c=="true"}else a==0?i.swapStyle=l:logError("Unknown modifier in hx-swap: "+l)}}return i}function usesFormData(n){return getClosestAttributeValue(n,"hx-encoding")==="multipart/form-data"||matches(n,"form")&&getRawAttribute(n,"enctype")==="multipart/form-data"}function encodeParamsForBody(n,e,t){let i=null;return withExtensions(e,function(r){i==null&&(i=r.encodeParameters(n,t,e))}),i!=null?i:usesFormData(e)?overrideFormData(new FormData,formDataFromObject(t)):urlEncode(t)}function makeSettleInfo(n){return{tasks:[],elts:[n]}}function updateScrollState(n,e){let t=n[0],i=n[n.length-1];if(e.scroll){var r=null;e.scrollTarget&&(r=asElement(querySelectorExt(t,e.scrollTarget))),e.scroll==="top"&&(t||r)&&(r=r||t,r.scrollTop=0),e.scroll==="bottom"&&(i||r)&&(r=r||i,r.scrollTop=r.scrollHeight),typeof e.scroll=="number"&&getWindow().setTimeout(function(){window.scrollTo(0,e.scroll)},0)}if(e.show){var r=null;if(e.showTarget){let s=e.showTarget;e.showTarget==="window"&&(s="body"),r=asElement(querySelectorExt(t,s))}e.show==="top"&&(t||r)&&(r=r||t,r.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),e.show==="bottom"&&(i||r)&&(r=r||i,r.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}))}}function getValuesForElement(n,e,t,i,r){if(i==null&&(i={}),n==null)return i;let o=getAttributeValue(n,e);if(o){let s=o.trim(),a=t;if(s==="unset")return null;s.indexOf("javascript:")===0?(s=s.slice(11),a=!0):s.indexOf("js:")===0&&(s=s.slice(3),a=!0),s.indexOf("{")!==0&&(s="{"+s+"}");let l;a?l=maybeEval(n,function(){return r?Function("event","return ("+s+")").call(n,r):Function("return ("+s+")").call(n)},{}):l=parseJSON(s);for(let c in l)l.hasOwnProperty(c)&&i[c]==null&&(i[c]=l[c])}return getValuesForElement(asElement(parentElt(n)),e,t,i,r)}function maybeEval(n,e,t){return htmx.config.allowEval?e():(triggerErrorEvent(n,"htmx:evalDisallowedError"),t)}function getHXVarsForElement(n,e,t){return getValuesForElement(n,"hx-vars",!0,t,e)}function getHXValsForElement(n,e,t){return getValuesForElement(n,"hx-vals",!1,t,e)}function getExpressionVars(n,e){return mergeObjects(getHXVarsForElement(n,e),getHXValsForElement(n,e))}function safelySetHeaderValue(n,e,t){if(t!==null)try{n.setRequestHeader(e,t)}catch(i){n.setRequestHeader(e,encodeURIComponent(t)),n.setRequestHeader(e+"-URI-AutoEncoded","true")}}function getPathFromResponse(n){if(n.responseURL)try{let e=new URL(n.responseURL);return e.pathname+e.search}catch(e){triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:n.responseURL})}}function hasHeader(n,e){return e.test(n.getAllResponseHeaders())}function ajaxHelper(n,e,t){if(n=n.toLowerCase(),t){if(t instanceof Element||typeof t=="string")return issueAjaxRequest(n,e,null,null,{targetOverride:resolveTarget(t)||DUMMY_ELT,returnPromise:!0});{let i=resolveTarget(t.target);return(t.target&&!i||t.source&&!i&&!resolveTarget(t.source))&&(i=DUMMY_ELT),issueAjaxRequest(n,e,resolveTarget(t.source),t.event,{handler:t.handler,headers:t.headers,values:t.values,targetOverride:i,swapOverride:t.swap,select:t.select,returnPromise:!0})}}else return issueAjaxRequest(n,e,null,null,{returnPromise:!0})}function hierarchyForElt(n){let e=[];for(;n;)e.push(n),n=n.parentElement;return e}function verifyPath(n,e,t){let i=new URL(e,location.protocol!=="about:"?location.href:window.origin),o=(location.protocol!=="about:"?location.origin:window.origin)===i.origin;return htmx.config.selfRequestsOnly&&!o?!1:triggerEvent(n,"htmx:validateUrl",mergeObjects({url:i,sameHost:o},t))}function formDataFromObject(n){if(n instanceof FormData)return n;let e=new FormData;for(let t in n)n.hasOwnProperty(t)&&(n[t]&&typeof n[t].forEach=="function"?n[t].forEach(function(i){e.append(t,i)}):typeof n[t]=="object"&&!(n[t]instanceof Blob)?e.append(t,JSON.stringify(n[t])):e.append(t,n[t]));return e}function formDataArrayProxy(n,e,t){return new Proxy(t,{get:function(i,r){return typeof r=="number"?i[r]:r==="length"?i.length:r==="push"?function(o){i.push(o),n.append(e,o)}:typeof i[r]=="function"?function(){i[r].apply(i,arguments),n.delete(e),i.forEach(function(o){n.append(e,o)})}:i[r]&&i[r].length===1?i[r][0]:i[r]},set:function(i,r,o){return i[r]=o,n.delete(e),i.forEach(function(s){n.append(e,s)}),!0}})}function formDataProxy(n){return new Proxy(n,{get:function(e,t){if(typeof t=="symbol"){let r=Reflect.get(e,t);return typeof r=="function"?function(){return r.apply(n,arguments)}:r}if(t==="toJSON")return()=>Object.fromEntries(n);if(t in e&&typeof e[t]=="function")return function(){return n[t].apply(n,arguments)};let i=n.getAll(t);if(i.length!==0)return i.length===1?i[0]:formDataArrayProxy(e,t,i)},set:function(e,t,i){return typeof t!="string"?!1:(e.delete(t),i&&typeof i.forEach=="function"?i.forEach(function(r){e.append(t,r)}):typeof i=="object"&&!(i instanceof Blob)?e.append(t,JSON.stringify(i)):e.append(t,i),!0)},deleteProperty:function(e,t){return typeof t=="string"&&e.delete(t),!0},ownKeys:function(e){return Reflect.ownKeys(Object.fromEntries(e))},getOwnPropertyDescriptor:function(e,t){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(e),t)}})}function issueAjaxRequest(n,e,t,i,r,o){let s=null,a=null;if(r=r!=null?r:{},r.returnPromise&&typeof Promise!="undefined")var l=new Promise(function(U,Z){s=U,a=Z});t==null&&(t=getDocument().body);let c=r.handler||handleAjaxResponse,u=r.select||null;if(!bodyContains(t))return maybeCall(s),l;let d=r.targetOverride||asElement(getTarget(t));if(d==null||d==DUMMY_ELT)return triggerErrorEvent(t,"htmx:targetError",{target:getClosestAttributeValue(t,"hx-target")}),maybeCall(a),l;let p=getInternalData(t),y=p.lastButtonClicked;if(y){let U=getRawAttribute(y,"formaction");U!=null&&(e=U);let Z=getRawAttribute(y,"formmethod");if(Z!=null)if(VERBS.includes(Z.toLowerCase()))n=Z;else return maybeCall(s),l}let m=getClosestAttributeValue(t,"hx-confirm");if(o===void 0&&triggerEvent(t,"htmx:confirm",{target:d,elt:t,path:e,verb:n,triggeringEvent:i,etc:r,issueRequest:function(oe){return issueAjaxRequest(n,e,t,i,r,!!oe)},question:m})===!1)return maybeCall(s),l;let v=t,w=getClosestAttributeValue(t,"hx-sync"),T=null,_=!1;if(w){let U=w.split(":"),Z=U[0].trim();if(Z==="this"?v=findThisElement(t,"hx-sync"):v=asElement(querySelectorExt(t,Z)),w=(U[1]||"drop").trim(),p=getInternalData(v),w==="drop"&&p.xhr&&p.abortable!==!0)return maybeCall(s),l;if(w==="abort"){if(p.xhr)return maybeCall(s),l;_=!0}else w==="replace"?triggerEvent(v,"htmx:abort"):w.indexOf("queue")===0&&(T=(w.split(" ")[1]||"last").trim())}if(p.xhr)if(p.abortable)triggerEvent(v,"htmx:abort");else{if(T==null){if(i){let U=getInternalData(i);U&&U.triggerSpec&&U.triggerSpec.queue&&(T=U.triggerSpec.queue)}T==null&&(T="last")}return p.queuedRequests==null&&(p.queuedRequests=[]),T==="first"&&p.queuedRequests.length===0?p.queuedRequests.push(function(){issueAjaxRequest(n,e,t,i,r)}):T==="all"?p.queuedRequests.push(function(){issueAjaxRequest(n,e,t,i,r)}):T==="last"&&(p.queuedRequests=[],p.queuedRequests.push(function(){issueAjaxRequest(n,e,t,i,r)})),maybeCall(s),l}let S=new XMLHttpRequest;p.xhr=S,p.abortable=_;let A=function(){p.xhr=null,p.abortable=!1,p.queuedRequests!=null&&p.queuedRequests.length>0&&p.queuedRequests.shift()()},K=getClosestAttributeValue(t,"hx-prompt");if(K){var z=prompt(K);if(z===null||!triggerEvent(t,"htmx:prompt",{prompt:z,target:d}))return maybeCall(s),A(),l}if(m&&!o&&!confirm(m))return maybeCall(s),A(),l;let L=getHeaders(t,d,z);n!=="get"&&!usesFormData(t)&&(L["Content-Type"]="application/x-www-form-urlencoded"),r.headers&&(L=mergeObjects(L,r.headers));let H=getInputValues(t,n),N=H.errors,Y=H.formData;r.values&&overrideFormData(Y,formDataFromObject(r.values));let B=formDataFromObject(getExpressionVars(t,i)),ie=overrideFormData(Y,B),J=filterValues(ie,t);htmx.config.getCacheBusterParam&&n==="get"&&J.set("org.htmx.cache-buster",getRawAttribute(d,"id")||"true"),(e==null||e==="")&&(e=location.href);let Te=getValuesForElement(t,"hx-request"),Ce=getInternalData(t).boosted,se=htmx.config.methodsThatUseUrlParams.indexOf(n)>=0,ne={boosted:Ce,useUrlParams:se,formData:J,parameters:formDataProxy(J),unfilteredFormData:ie,unfilteredParameters:formDataProxy(ie),headers:L,elt:t,target:d,verb:n,errors:N,withCredentials:r.credentials||Te.credentials||htmx.config.withCredentials,timeout:r.timeout||Te.timeout||htmx.config.timeout,path:e,triggeringEvent:i};if(!triggerEvent(t,"htmx:configRequest",ne))return maybeCall(s),A(),l;if(e=ne.path,n=ne.verb,L=ne.headers,J=formDataFromObject(ne.parameters),N=ne.errors,se=ne.useUrlParams,N&&N.length>0)return triggerEvent(t,"htmx:validation:halted",ne),maybeCall(s),A(),l;let qe=e.split("#"),Re=qe[0],W=qe[1],M=e;if(se&&(M=Re,!J.keys().next().done&&(M.indexOf("?")<0?M+="?":M+="&",M+=urlEncode(J),W&&(M+="#"+W))),!verifyPath(t,M,ne))return triggerErrorEvent(t,"htmx:invalidPath",ne),maybeCall(a),A(),l;if(S.open(n.toUpperCase(),M,!0),S.overrideMimeType("text/html"),S.withCredentials=ne.withCredentials,S.timeout=ne.timeout,!Te.noHeaders){for(let U in L)if(L.hasOwnProperty(U)){let Z=L[U];safelySetHeaderValue(S,U,Z)}}let D={xhr:S,target:d,requestConfig:ne,etc:r,boosted:Ce,select:u,pathInfo:{requestPath:e,finalRequestPath:M,responsePath:null,anchor:W}};if(S.onload=function(){try{let U=hierarchyForElt(t);if(D.pathInfo.responsePath=getPathFromResponse(S),c(t,D),D.keepIndicators!==!0&&removeRequestIndicators($,V),triggerEvent(t,"htmx:afterRequest",D),triggerEvent(t,"htmx:afterOnLoad",D),!bodyContains(t)){let Z=null;for(;U.length>0&&Z==null;){let oe=U.shift();bodyContains(oe)&&(Z=oe)}Z&&(triggerEvent(Z,"htmx:afterRequest",D),triggerEvent(Z,"htmx:afterOnLoad",D))}maybeCall(s)}catch(U){throw triggerErrorEvent(t,"htmx:onLoadError",mergeObjects({error:U},D)),U}finally{A()}},S.onerror=function(){removeRequestIndicators($,V),triggerErrorEvent(t,"htmx:afterRequest",D),triggerErrorEvent(t,"htmx:sendError",D),maybeCall(a),A()},S.onabort=function(){removeRequestIndicators($,V),triggerErrorEvent(t,"htmx:afterRequest",D),triggerErrorEvent(t,"htmx:sendAbort",D),maybeCall(a),A()},S.ontimeout=function(){removeRequestIndicators($,V),triggerErrorEvent(t,"htmx:afterRequest",D),triggerErrorEvent(t,"htmx:timeout",D),maybeCall(a),A()},!triggerEvent(t,"htmx:beforeRequest",D))return maybeCall(s),A(),l;var $=addRequestIndicatorClasses(t),V=disableElements(t);forEach(["loadstart","loadend","progress","abort"],function(U){forEach([S,S.upload],function(Z){Z.addEventListener(U,function(oe){triggerEvent(t,"htmx:xhr:"+U,{lengthComputable:oe.lengthComputable,loaded:oe.loaded,total:oe.total})})})}),triggerEvent(t,"htmx:beforeSend",D);let q=se?null:encodeParamsForBody(S,t,J);return S.send(q),l}function determineHistoryUpdates(n,e){let t=e.xhr,i=null,r=null;if(hasHeader(t,/HX-Push:/i)?(i=t.getResponseHeader("HX-Push"),r="push"):hasHeader(t,/HX-Push-Url:/i)?(i=t.getResponseHeader("HX-Push-Url"),r="push"):hasHeader(t,/HX-Replace-Url:/i)&&(i=t.getResponseHeader("HX-Replace-Url"),r="replace"),i)return i==="false"?{}:{type:r,path:i};let o=e.pathInfo.finalRequestPath,s=e.pathInfo.responsePath,a=getClosestAttributeValue(n,"hx-push-url"),l=getClosestAttributeValue(n,"hx-replace-url"),c=getInternalData(n).boosted,u=null,d=null;return a?(u="push",d=a):l?(u="replace",d=l):c&&(u="push",d=s||o),d?d==="false"?{}:(d==="true"&&(d=s||o),e.pathInfo.anchor&&d.indexOf("#")===-1&&(d=d+"#"+e.pathInfo.anchor),{type:u,path:d}):{}}function codeMatches(n,e){var t=new RegExp(n.code);return t.test(e.toString(10))}function resolveResponseHandling(n){for(var e=0;e ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ")}}function getMetaConfig(){let n=getDocument().querySelector('meta[name="htmx-config"]');return n?parseJSON(n.content):null}function mergeMetaConfig(){let n=getMetaConfig();n&&(htmx.config=mergeObjects(htmx.config,n))}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let n=getDocument().body;processNode(n);let e=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");n.addEventListener("htmx:abort",function(i){let r=i.target,o=getInternalData(r);o&&o.xhr&&o.xhr.abort()});let t=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(i){i.state&&i.state.htmx?(restoreHistory(),forEach(e,function(r){triggerEvent(r,"htmx:restored",{document:getDocument(),triggerEvent})})):t&&t(i)},getWindow().setTimeout(function(){triggerEvent(n,"htmx:load",{}),n=null},0)}),htmx}(),b_=Kp;function ko(n,e){n.split(/\s+/).forEach(t=>{e(t)})}var oi=class{constructor(){this._events={}}on(e,t){ko(e,i=>{let r=this._events[i]||[];r.push(t),this._events[i]=r})}off(e,t){var i=arguments.length;if(i===0){this._events={};return}ko(e,r=>{if(i===1){delete this._events[r];return}let o=this._events[r];o!==void 0&&(o.splice(o.indexOf(t),1),this._events[r]=o)})}trigger(e,...t){var i=this;ko(e,r=>{let o=i._events[r];o!==void 0&&o.forEach(s=>{s.apply(i,t)})})}};function No(n){return n.plugins={},class extends n{constructor(){super(...arguments),this.plugins={names:[],settings:{},requested:{},loaded:{}}}static define(e,t){n.plugins[e]={name:e,fn:t}}initializePlugins(e){var t,i;let r=this,o=[];if(Array.isArray(e))e.forEach(s=>{typeof s=="string"?o.push(s):(r.plugins.settings[s.name]=s.options,o.push(s.name))});else if(e)for(t in e)e.hasOwnProperty(t)&&(r.plugins.settings[t]=e[t],o.push(t));for(;i=o.shift();)r.require(i)}loadPlugin(e){var t=this,i=t.plugins,r=n.plugins[e];if(!n.plugins.hasOwnProperty(e))throw new Error('Unable to find "'+e+'" plugin');i.requested[e]=!0,i.loaded[e]=r.fn.apply(t,[t.plugins.settings[e]||{}]),i.names.push(e)}require(e){var t=this,i=t.plugins;if(!t.plugins.loaded.hasOwnProperty(e)){if(i.requested[e])throw new Error('Plugin has circular dependency ("'+e+'")');t.loadPlugin(e)}return i.loaded[e]}}}var si=n=>(n=n.filter(Boolean),n.length<2?n[0]||"":Qp(n)==1?"["+n.join("")+"]":"(?:"+n.join("|")+")"),Io=n=>{if(!Xp(n))return n.join("");let e="",t=0,i=()=>{t>1&&(e+="{"+t+"}")};return n.forEach((r,o)=>{if(r===n[o-1]){t++;return}i(),e+=r,t=1}),i(),e},Ro=n=>{let e=Array.from(n);return si(e)},Xp=n=>new Set(n).size!==n.length,Mt=n=>(n+"").replace(/([\$\(\)\*\+\.\?\[\]\^\{\|\}\\])/gu,"\\$1"),Qp=n=>n.reduce((e,t)=>Math.max(e,Jp(t)),0),Jp=n=>Array.from(n).length;var Ho=n=>{if(n.length===1)return[[n]];let e=[],t=n.substring(1);return Ho(t).forEach(function(r){let o=r.slice(0);o[0]=n.charAt(0)+o[0],e.push(o),o=r.slice(0),o.unshift(n.charAt(0)),e.push(o)}),e};var Zp=[[0,65535]],em="[\u0300-\u036F\xB7\u02BE\u02BC]",or,$a,tm=3,Po={},Pa={"/":"\u2044\u2215",0:"\u07C0",a:"\u2C65\u0250\u0251",aa:"\uA733",ae:"\xE6\u01FD\u01E3",ao:"\uA735",au:"\uA737",av:"\uA739\uA73B",ay:"\uA73D",b:"\u0180\u0253\u0183",c:"\uA73F\u0188\u023C\u2184",d:"\u0111\u0257\u0256\u1D05\u018C\uABB7\u0501\u0266",e:"\u025B\u01DD\u1D07\u0247",f:"\uA77C\u0192",g:"\u01E5\u0260\uA7A1\u1D79\uA77F\u0262",h:"\u0127\u2C68\u2C76\u0265",i:"\u0268\u0131",j:"\u0249\u0237",k:"\u0199\u2C6A\uA741\uA743\uA745\uA7A3",l:"\u0142\u019A\u026B\u2C61\uA749\uA747\uA781\u026D",m:"\u0271\u026F\u03FB",n:"\uA7A5\u019E\u0272\uA791\u1D0E\u043B\u0509",o:"\xF8\u01FF\u0254\u0275\uA74B\uA74D\u1D11",oe:"\u0153",oi:"\u01A3",oo:"\uA74F",ou:"\u0223",p:"\u01A5\u1D7D\uA751\uA753\uA755\u03C1",q:"\uA757\uA759\u024B",r:"\u024D\u027D\uA75B\uA7A7\uA783",s:"\xDF\u023F\uA7A9\uA785\u0282",t:"\u0167\u01AD\u0288\u2C66\uA787",th:"\xFE",tz:"\uA729",u:"\u0289",v:"\u028B\uA75F\u028C",vy:"\uA761",w:"\u2C73",y:"\u01B4\u024F\u1EFF",z:"\u01B6\u0225\u0240\u2C6C\uA763",hv:"\u0195"};for(let n in Pa){let e=Pa[n]||"";for(let t=0;t {or===void 0&&(or=am(n||Zp))},Fa=(n,e="NFKD")=>n.normalize(e),ai=n=>Array.from(n).reduce((e,t)=>e+rm(t),""),rm=n=>(n=Fa(n).toLowerCase().replace(nm,e=>Po[e]||""),Fa(n,"NFC"));function*om(n){for(let[e,t]of n)for(let i=e;i<=t;i++){let r=String.fromCharCode(i),o=ai(r);o!=r.toLowerCase()&&(o.length>tm||o.length!=0&&(yield{folded:o,composed:r,code_point:i}))}}var sm=n=>{let e={},t=(i,r)=>{let o=e[i]||new Set,s=new RegExp("^"+Ro(o)+"$","iu");r.match(s)||(o.add(Mt(r)),e[i]=o)};for(let i of om(n))t(i.folded,i.folded),t(i.folded,i.composed);return e},am=n=>{let e=sm(n),t={},i=[];for(let o in e){let s=e[o];s&&(t[o]=Ro(s)),o.length>1&&i.push(Mt(o))}i.sort((o,s)=>s.length-o.length);let r=si(i);return $a=new RegExp("^"+r,"u"),t},lm=(n,e=1)=>{let t=0;return n=n.map(i=>(or[i]&&(t+=i.length),or[i]||i)),t>=e?Io(n):""},cm=(n,e=1)=>(e=Math.max(e,n.length-1),si(Ho(n).map(t=>lm(t,e)))),Ba=(n,e=!0)=>{let t=n.length>1?1:0;return si(n.map(i=>{let r=[],o=e?i.length():i.length()-1;for(let s=0;s {for(let t of e){if(t.start!=n.start||t.end!=n.end||t.substrs.join("")!==n.substrs.join(""))continue;let i=n.parts,r=s=>{for(let a of i){if(a.start===s.start&&a.substr===s.substr)return!1;if(!(s.length==1||a.length==1)&&(s.start a.start||a.start s.start))return!0}return!1};if(!(t.parts.filter(r).length>0))return!0}return!1},sr=class n{constructor(){ee(this,"parts");ee(this,"substrs");ee(this,"start");ee(this,"end");this.parts=[],this.substrs=[],this.start=0,this.end=0}add(e){e&&(this.parts.push(e),this.substrs.push(e.substr),this.start=Math.min(e.start,this.start),this.end=Math.max(e.end,this.end))}last(){return this.parts[this.parts.length-1]}length(){return this.parts.length}clone(e,t){let i=new n,r=JSON.parse(JSON.stringify(this.parts)),o=r.pop();for(let l of r)i.add(l);let s=t.substr.substring(0,e-o.start),a=s.length;return i.add({start:o.start,end:o.start+a,length:a,substr:s}),i}},Va=n=>{im(),n=ai(n);let e="",t=[new sr];for(let i=0;i 0){l=l.sort((u,d)=>u.length()-d.length());for(let u of l)um(u,t)||t.push(u);continue}if(i>0&&c.size==1&&!c.has("3")){e+=Ba(t,!1);let u=new sr,d=t[0];d&&u.add(d.last()),t=[u]}}return e+=Ba(t,!0),e};var za=(n,e)=>{if(n)return n[e]},ja=(n,e)=>{if(n){for(var t,i=e.split(".");(t=i.shift())&&(n=n[t]););return n}},ar=(n,e,t)=>{var i,r;return!n||(n=n+"",e.regex==null)||(r=n.search(e.regex),r===-1)?0:(i=e.string.length/n.length,r===0&&(i+=.5),i*t)},lr=(n,e)=>{var t=n[e];if(typeof t=="function")return t;t&&!Array.isArray(t)&&(n[e]=[t])},li=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)},Wa=(n,e)=>typeof n=="number"&&typeof e=="number"?n>e?1:n e?1:e>n?-1:0);var cr=class{constructor(e,t){ee(this,"items");ee(this,"settings");this.items=e,this.settings=t||{diacritics:!0}}tokenize(e,t,i){if(!e||!e.length)return[];let r=[],o=e.split(/\s+/);var s;return i&&(s=new RegExp("^("+Object.keys(i).map(Mt).join("|")+"):(.*)$")),o.forEach(a=>{let l,c=null,u=null;s&&(l=a.match(s))&&(c=l[1],a=l[2]),a.length>0&&(this.settings.diacritics?u=Va(a)||null:u=Mt(a),u&&t&&(u="\\b"+u)),r.push({string:a,regex:u?new RegExp(u,"iu"):null,field:c})}),r}getScoreFunction(e,t){var i=this.prepareSearch(e,t);return this._getScoreFunction(i)}_getScoreFunction(e){let t=e.tokens,i=t.length;if(!i)return function(){return 0};let r=e.options.fields,o=e.weights,s=r.length,a=e.getAttrFn;if(!s)return function(){return 1};let l=function(){return s===1?function(c,u){let d=r[0].field;return ar(a(u,d),c,o[d]||1)}:function(c,u){var d=0;if(c.field){let p=a(u,c.field);!c.regex&&p?d+=1/s:d+=ar(p,c,1)}else li(o,(p,y)=>{d+=ar(a(u,y),c,p)});return d/s}}();return i===1?function(c){return l(t[0],c)}:e.options.conjunction==="and"?function(c){var u,d=0;for(let p of t){if(u=l(p,c),u<=0)return 0;d+=u}return d/i}:function(c){var u=0;return li(t,d=>{u+=l(d,c)}),u/i}}getSortFunction(e,t){var i=this.prepareSearch(e,t);return this._getSortFunction(i)}_getSortFunction(e){var t,i=[];let r=this,o=e.options,s=!e.query&&o.sort_empty?o.sort_empty:o.sort;if(typeof s=="function")return s.bind(this);let a=function(c,u){return c==="$score"?u.score:e.getAttrFn(r.items[u.id],c)};if(s)for(let c of s)(e.query||c.field!=="$score")&&i.push(c);if(e.query){t=!0;for(let c of i)if(c.field==="$score"){t=!1;break}t&&i.unshift({field:"$score",direction:"desc"})}else i=i.filter(c=>c.field!=="$score");return i.length?function(c,u){var d,p;for(let y of i)if(p=y.field,d=(y.direction==="desc"?-1:1)*Wa(a(p,c),a(p,u)),d)return d;return 0}:null}prepareSearch(e,t){let i={};var r=Object.assign({},t);if(lr(r,"sort"),lr(r,"sort_empty"),r.fields){lr(r,"fields");let o=[];r.fields.forEach(s=>{typeof s=="string"&&(s={field:s,weight:1}),o.push(s),i[s.field]="weight"in s?s.weight:1}),r.fields=o}return{options:r,query:e.toLowerCase().trim(),tokens:this.tokenize(e,r.respect_word_boundaries,i),total:0,items:[],weights:i,getAttrFn:r.nesting?ja:za}}search(e,t){var i=this,r,o;o=this.prepareSearch(e,t),t=o.options,e=o.query;let s=t.score||i._getScoreFunction(o);e.length?li(i.items,(l,c)=>{r=s(l),(t.filter===!1||r>0)&&o.items.push({score:r,id:c})}):li(i.items,(l,c)=>{o.items.push({score:1,id:c})});let a=i._getSortFunction(o);return a&&o.items.sort(a),o.total=o.items.length,typeof t.limit=="number"&&(o.items=o.items.slice(0,t.limit)),o}};var We=n=>typeof n=="undefined"||n===null?null:ci(n),ci=n=>typeof n=="boolean"?n?"1":"0":n+"",ur=n=>(n+"").replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),qa=(n,e)=>e>0?window.setTimeout(n,e):(n.call(null),null),Ua=(n,e)=>{var t;return function(i,r){var o=this;t&&(o.loading=Math.max(o.loading-1,0),clearTimeout(t)),t=setTimeout(function(){t=null,o.loadedSearches[i]=!0,n.call(o,i,r)},e)}},Fo=(n,e,t)=>{var i,r=n.trigger,o={};n.trigger=function(){var s=arguments[0];if(e.indexOf(s)!==-1)o[s]=arguments;else return r.apply(n,arguments)},t.apply(n,[]),n.trigger=r;for(i of e)i in o&&r.apply(n,o[i])},Ya=n=>({start:n.selectionStart||0,length:(n.selectionEnd||0)-(n.selectionStart||0)}),fe=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},Se=(n,e,t,i)=>{n.addEventListener(e,t,i)},kt=(n,e)=>{if(!e||!e[n])return!1;var t=(e.altKey?1:0)+(e.ctrlKey?1:0)+(e.shiftKey?1:0)+(e.metaKey?1:0);return t===1},dr=(n,e)=>{let t=n.getAttribute("id");return t||(n.setAttribute("id",e),e)},Bo=n=>n.replace(/[\\"']/g,"\\$&"),Nt=(n,e)=>{e&&n.append(e)},ve=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)};var nt=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if($o(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},$o=n=>typeof n=="string"&&n.indexOf("<")>-1,Ga=n=>n.replace(/['"\\]/g,"\\$&"),fr=(n,e)=>{var t=document.createEvent("HTMLEvents");t.initEvent(e,!0,!1),n.dispatchEvent(t)},ui=(n,e)=>{Object.assign(n.style,e)},Pe=(n,...e)=>{var t=Ka(e);n=Xa(n),n.map(i=>{t.map(r=>{i.classList.add(r)})})},gt=(n,...e)=>{var t=Ka(e);n=Xa(n),n.map(i=>{t.map(r=>{i.classList.remove(r)})})},Ka=n=>{var e=[];return ve(n,t=>{typeof t=="string"&&(t=t.trim().split(/[\t\n\f\r\s]/)),Array.isArray(t)&&(e=e.concat(t))}),e.filter(Boolean)},Xa=n=>(Array.isArray(n)||(n=[n]),n),hr=(n,e,t)=>{if(!(t&&!t.contains(n)))for(;n&&n.matches;){if(n.matches(e))return n;n=n.parentNode}},Vo=(n,e=0)=>e>0?n[n.length-1]:n[0],Qa=n=>Object.keys(n).length===0,zo=(n,e)=>{if(!n)return-1;e=e||n.nodeName;for(var t=0;n=n.previousElementSibling;)n.matches(e)&&t++;return t},le=(n,e)=>{ve(e,(t,i)=>{t==null?n.removeAttribute(i):n.setAttribute(i,""+t)})},di=(n,e)=>{n.parentNode&&n.parentNode.replaceChild(e,n)};var Ja=(n,e)=>{if(e===null)return;if(typeof e=="string"){if(!e.length)return;e=new RegExp(e,"i")}let t=o=>{var s=o.data.match(e);if(s&&o.data.length>0){var a=document.createElement("span");a.className="highlight";var l=o.splitText(s.index);l.splitText(s[0].length);var c=l.cloneNode(!0);return a.appendChild(c),di(l,a),1}return 0},i=o=>{o.nodeType===1&&o.childNodes&&!/(script|style)/i.test(o.tagName)&&(o.className!=="highlight"||o.tagName!=="SPAN")&&Array.from(o.childNodes).forEach(s=>{r(s)})},r=o=>o.nodeType===3?t(o):(i(o),0);r(n)},Za=n=>{var e=n.querySelectorAll("span.highlight");Array.prototype.forEach.call(e,function(t){var i=t.parentNode;i.replaceChild(t.firstChild,t),i.normalize()})};var dm=typeof navigator=="undefined"?!1:/Mac/.test(navigator.userAgent),fi=dm?"metaKey":"ctrlKey";var jo={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(n){return n.length>0},render:{}};function pr(n,e){var t=Object.assign({},jo,e),i=t.dataAttr,r=t.labelField,o=t.valueField,s=t.disabledField,a=t.optgroupField,l=t.optgroupLabelField,c=t.optgroupValueField,u=n.tagName.toLowerCase(),d=n.getAttribute("placeholder")||n.getAttribute("data-placeholder");if(!d&&!t.allowEmptyOption){let v=n.querySelector('option[value=""]');v&&(d=v.textContent)}var p={placeholder:d,options:[],optgroups:[],items:[],maxItems:null},y=()=>{var v,w=p.options,T={},_=1;let S=0;var A=L=>{var H=Object.assign({},L.dataset),N=i&&H[i];return typeof N=="string"&&N.length&&(H=Object.assign(H,JSON.parse(N))),H},K=(L,H)=>{var N=We(L.value);if(N!=null&&!(!N&&!t.allowEmptyOption)){if(T.hasOwnProperty(N)){if(H){var Y=T[N][a];Y?Array.isArray(Y)?Y.push(H):T[N][a]=[Y,H]:T[N][a]=H}}else{var B=A(L);B[r]=B[r]||L.textContent,B[o]=B[o]||N,B[s]=B[s]||L.disabled,B[a]=B[a]||H,B.$option=L,B.$order=B.$order||++S,T[N]=B,w.push(B)}L.selected&&p.items.push(N)}},z=L=>{var H,N;N=A(L),N[l]=N[l]||L.getAttribute("label")||"",N[c]=N[c]||_++,N[s]=N[s]||L.disabled,N.$order=N.$order||++S,p.optgroups.push(N),H=N[c],ve(L.children,Y=>{K(Y,H)})};p.maxItems=n.hasAttribute("multiple")?null:1,ve(n.children,L=>{v=L.tagName.toLowerCase(),v==="optgroup"?z(L):v==="option"&&K(L)})},m=()=>{let v=n.getAttribute(i);if(v)p.options=JSON.parse(v),ve(p.options,T=>{p.items.push(T[o])});else{var w=n.value.trim()||"";if(!t.allowEmptyOption&&!w.length)return;let T=w.split(t.delimiter);ve(T,_=>{let S={};S[r]=_,S[o]=_,p.options.push(S)}),p.items=T}};return u==="select"?y():m(),Object.assign({},jo,p,e)}var nl=0,_e=class extends No(oi){constructor(e,t){super(),this.order=0,this.isOpen=!1,this.isDisabled=!1,this.isReadOnly=!1,this.isInvalid=!1,this.isValid=!0,this.isLocked=!1,this.isFocused=!1,this.isInputHidden=!1,this.isSetup=!1,this.ignoreFocus=!1,this.ignoreHover=!1,this.hasOptions=!1,this.lastValue="",this.caretPos=0,this.loading=0,this.loadedSearches={},this.activeOption=null,this.activeItems=[],this.optgroups={},this.options={},this.userOptions={},this.items=[],this.refreshTimeout=null,nl++;var i,r=nt(e);if(r.tomselect)throw new Error("Tom Select already initialized on this element");r.tomselect=this;var o=window.getComputedStyle&&window.getComputedStyle(r,null);i=o.getPropertyValue("direction");let s=pr(r,t);this.settings=s,this.input=r,this.tabIndex=r.tabIndex||0,this.is_select_tag=r.tagName.toLowerCase()==="select",this.rtl=/rtl/i.test(i),this.inputId=dr(r,"tomselect-"+nl),this.isRequired=r.required,this.sifter=new cr(this.options,{diacritics:s.diacritics}),s.mode=s.mode||(s.maxItems===1?"single":"multi"),typeof s.hideSelected!="boolean"&&(s.hideSelected=s.mode==="multi"),typeof s.hidePlaceholder!="boolean"&&(s.hidePlaceholder=s.mode!=="multi");var a=s.createFilter;typeof a!="function"&&(typeof a=="string"&&(a=new RegExp(a)),a instanceof RegExp?s.createFilter=w=>a.test(w):s.createFilter=w=>this.settings.duplicates||!this.options[w]),this.initializePlugins(s.plugins),this.setupCallbacks(),this.setupTemplates();let l=nt(" "),c=nt(""),u=this._render("dropdown"),d=nt(''),p=this.input.getAttribute("class")||"",y=s.mode;var m;if(Pe(l,s.wrapperClass,p,y),Pe(c,s.controlClass),Nt(l,c),Pe(u,s.dropdownClass,y),s.copyClassesToDropdown&&Pe(u,p),Pe(d,s.dropdownContentClass),Nt(u,d),nt(s.dropdownParent||l).appendChild(u),$o(s.controlInput)){m=nt(s.controlInput);var v=["autocorrect","autocapitalize","autocomplete","spellcheck"];ve(v,w=>{r.getAttribute(w)&&le(m,{[w]:r.getAttribute(w)})}),m.tabIndex=-1,c.appendChild(m),this.focus_node=m}else s.controlInput?(m=nt(s.controlInput),this.focus_node=m):(m=nt(""),this.focus_node=c);this.wrapper=l,this.dropdown=u,this.dropdown_content=d,this.control=c,this.control_input=m,this.setup()}setup(){let e=this,t=e.settings,i=e.control_input,r=e.dropdown,o=e.dropdown_content,s=e.wrapper,a=e.control,l=e.input,c=e.focus_node,u={passive:!0},d=e.inputId+"-ts-dropdown";le(o,{id:d}),le(c,{role:"combobox","aria-haspopup":"listbox","aria-expanded":"false","aria-controls":d});let p=dr(c,e.inputId+"-ts-control"),y="label[for='"+Ga(e.inputId)+"']",m=document.querySelector(y),v=e.focus.bind(e);if(m){Se(m,"click",v),le(m,{for:p});let _=dr(m,e.inputId+"-ts-label");le(c,{"aria-labelledby":_}),le(o,{"aria-labelledby":_})}if(s.style.width=l.style.width,e.plugins.names.length){let _="plugin-"+e.plugins.names.join(" plugin-");Pe([s,r],_)}(t.maxItems===null||t.maxItems>1)&&e.is_select_tag&&le(l,{multiple:"multiple"}),t.placeholder&&le(i,{placeholder:t.placeholder}),!t.splitOn&&t.delimiter&&(t.splitOn=new RegExp("\\s*"+Mt(t.delimiter)+"+\\s*")),t.load&&t.loadThrottle&&(t.load=Ua(t.load,t.loadThrottle)),Se(r,"mousemove",()=>{e.ignoreHover=!1}),Se(r,"mouseenter",_=>{var S=hr(_.target,"[data-selectable]",r);S&&e.onOptionHover(_,S)},{capture:!0}),Se(r,"click",_=>{let S=hr(_.target,"[data-selectable]");S&&(e.onOptionSelect(_,S),fe(_,!0))}),Se(a,"click",_=>{var S=hr(_.target,"[data-ts-item]",a);if(S&&e.onItemSelect(_,S)){fe(_,!0);return}i.value==""&&(e.onClick(),fe(_,!0))}),Se(c,"keydown",_=>e.onKeyDown(_)),Se(i,"keypress",_=>e.onKeyPress(_)),Se(i,"input",_=>e.onInput(_)),Se(c,"blur",_=>e.onBlur(_)),Se(c,"focus",_=>e.onFocus(_)),Se(i,"paste",_=>e.onPaste(_));let w=_=>{let S=_.composedPath()[0];if(!s.contains(S)&&!r.contains(S)){e.isFocused&&e.blur(),e.inputState();return}S==i&&e.isOpen?_.stopPropagation():fe(_,!0)},T=()=>{e.isOpen&&e.positionDropdown()};Se(document,"mousedown",w),Se(window,"scroll",T,u),Se(window,"resize",T,u),this._destroy=()=>{document.removeEventListener("mousedown",w),window.removeEventListener("scroll",T),window.removeEventListener("resize",T),m&&m.removeEventListener("click",v)},this.revertSettings={innerHTML:l.innerHTML,tabIndex:l.tabIndex},l.tabIndex=-1,l.insertAdjacentElement("afterend",e.wrapper),e.sync(!1),t.items=[],delete t.optgroups,delete t.options,Se(l,"invalid",()=>{e.isValid&&(e.isValid=!1,e.isInvalid=!0,e.refreshState())}),e.updateOriginalInput(),e.refreshItems(),e.close(!1),e.inputState(),e.isSetup=!0,l.disabled?e.disable():l.readOnly?e.setReadOnly(!0):e.enable(),e.on("change",this.onChange),Pe(l,"tomselected","ts-hidden-accessible"),e.trigger("initialize"),t.preload===!0&&e.preload()}setupOptions(e=[],t=[]){this.addOptions(e),ve(t,i=>{this.registerOptionGroup(i)})}setupTemplates(){var e=this,t=e.settings.labelField,i=e.settings.optgroupLabelField,r={optgroup:o=>{let s=document.createElement("div");return s.className="optgroup",s.appendChild(o.options),s},optgroup_header:(o,s)=>''+s(o[i])+"",option:(o,s)=>""+s(o[t])+"",item:(o,s)=>""+s(o[t])+"",option_create:(o,s)=>'Add '+s(o.input)+"…",no_results:()=>'No results found',loading:()=>'',not_loading:()=>{},dropdown:()=>""};e.settings.render=Object.assign({},r,e.settings.render)}setupCallbacks(){var e,t,i={initialize:"onInitialize",change:"onChange",item_add:"onItemAdd",item_remove:"onItemRemove",item_select:"onItemSelect",clear:"onClear",option_add:"onOptionAdd",option_remove:"onOptionRemove",option_clear:"onOptionClear",optgroup_add:"onOptionGroupAdd",optgroup_remove:"onOptionGroupRemove",optgroup_clear:"onOptionGroupClear",dropdown_open:"onDropdownOpen",dropdown_close:"onDropdownClose",type:"onType",load:"onLoad",focus:"onFocus",blur:"onBlur"};for(e in i)t=this.settings[i[e]],t&&this.on(e,t)}sync(e=!0){let t=this,i=e?pr(t.input,{delimiter:t.settings.delimiter}):t.settings;t.setupOptions(i.options,i.optgroups),t.setValue(i.items||[],!0),t.lastQuery=null}onClick(){var e=this;if(e.activeItems.length>0){e.clearActiveItems(),e.focus();return}e.isFocused&&e.isOpen?e.blur():e.focus()}onMouseDown(){}onChange(){fr(this.input,"input"),fr(this.input,"change")}onPaste(e){var t=this;if(t.isInputHidden||t.isLocked){fe(e);return}t.settings.splitOn&&setTimeout(()=>{var i=t.inputValue();if(i.match(t.settings.splitOn)){var r=i.trim().split(t.settings.splitOn);ve(r,o=>{We(o)&&(this.options[o]?t.addItem(o):t.createItem(o))})}},0)}onKeyPress(e){var t=this;if(t.isLocked){fe(e);return}var i=String.fromCharCode(e.keyCode||e.which);if(t.settings.create&&t.settings.mode==="multi"&&i===t.settings.delimiter){t.createItem(),fe(e);return}}onKeyDown(e){var t=this;if(t.ignoreHover=!0,t.isLocked){e.keyCode!==9&&fe(e);return}switch(e.keyCode){case 65:if(kt(fi,e)&&t.control_input.value==""){fe(e),t.selectAll();return}break;case 27:t.isOpen&&(fe(e,!0),t.close()),t.clearActiveItems();return;case 40:if(!t.isOpen&&t.hasOptions)t.open();else if(t.activeOption){let i=t.getAdjacent(t.activeOption,1);i&&t.setActiveOption(i)}fe(e);return;case 38:if(t.activeOption){let i=t.getAdjacent(t.activeOption,-1);i&&t.setActiveOption(i)}fe(e);return;case 13:t.canSelect(t.activeOption)?(t.onOptionSelect(e,t.activeOption),fe(e)):t.settings.create&&t.createItem()?fe(e):document.activeElement==t.control_input&&t.isOpen&&fe(e);return;case 37:t.advanceSelection(-1,e);return;case 39:t.advanceSelection(1,e);return;case 9:t.settings.selectOnTab&&(t.canSelect(t.activeOption)&&(t.onOptionSelect(e,t.activeOption),fe(e)),t.settings.create&&t.createItem()&&fe(e));return;case 8:case 46:t.deleteSelection(e);return}t.isInputHidden&&!kt(fi,e)&&fe(e)}onInput(e){if(this.isLocked)return;let t=this.inputValue();if(this.lastValue!==t){if(this.lastValue=t,t==""){this._onInput();return}this.refreshTimeout&&window.clearTimeout(this.refreshTimeout),this.refreshTimeout=qa(()=>{this.refreshTimeout=null,this._onInput()},this.settings.refreshThrottle)}}_onInput(){let e=this.lastValue;this.settings.shouldLoad.call(this,e)&&this.load(e),this.refreshOptions(),this.trigger("type",e)}onOptionHover(e,t){this.ignoreHover||this.setActiveOption(t,!1)}onFocus(e){var t=this,i=t.isFocused;if(t.isDisabled||t.isReadOnly){t.blur(),fe(e);return}t.ignoreFocus||(t.isFocused=!0,t.settings.preload==="focus"&&t.preload(),i||t.trigger("focus"),t.activeItems.length||(t.inputState(),t.refreshOptions(!!t.settings.openOnFocus)),t.refreshState())}onBlur(e){if(document.hasFocus()!==!1){var t=this;if(t.isFocused){t.isFocused=!1,t.ignoreFocus=!1;var i=()=>{t.close(),t.setActiveItem(),t.setCaret(t.items.length),t.trigger("blur")};t.settings.create&&t.settings.createOnBlur?t.createItem(null,i):i()}}}onOptionSelect(e,t){var i,r=this;t.parentElement&&t.parentElement.matches("[data-disabled]")||(t.classList.contains("create")?r.createItem(null,()=>{r.settings.closeAfterSelect&&r.close()}):(i=t.dataset.value,typeof i!="undefined"&&(r.lastQuery=null,r.addItem(i),r.settings.closeAfterSelect&&r.close(),!r.settings.hideSelected&&e.type&&/click/.test(e.type)&&r.setActiveOption(t))))}canSelect(e){return!!(this.isOpen&&e&&this.dropdown_content.contains(e))}onItemSelect(e,t){var i=this;return!i.isLocked&&i.settings.mode==="multi"?(fe(e),i.setActiveItem(t,e),!0):!1}canLoad(e){return!(!this.settings.load||this.loadedSearches.hasOwnProperty(e))}load(e){let t=this;if(!t.canLoad(e))return;Pe(t.wrapper,t.settings.loadingClass),t.loading++;let i=t.loadCallback.bind(t);t.settings.load.call(t,e,i)}loadCallback(e,t){let i=this;i.loading=Math.max(i.loading-1,0),i.lastQuery=null,i.clearActiveOption(),i.setupOptions(e,t),i.refreshOptions(i.isFocused&&!i.isInputHidden),i.loading||gt(i.wrapper,i.settings.loadingClass),i.trigger("load",e,t)}preload(){var e=this.wrapper.classList;e.contains("preloaded")||(e.add("preloaded"),this.load(""))}setTextboxValue(e=""){var t=this.control_input,i=t.value!==e;i&&(t.value=e,fr(t,"update"),this.lastValue=e)}getValue(){return this.is_select_tag&&this.input.hasAttribute("multiple")?this.items:this.items.join(this.settings.delimiter)}setValue(e,t){var i=t?[]:["change"];Fo(this,i,()=>{this.clear(t),this.addItems(e,t)})}setMaxItems(e){e===0&&(e=null),this.settings.maxItems=e,this.refreshState()}setActiveItem(e,t){var i=this,r,o,s,a,l,c;if(i.settings.mode!=="single"){if(!e){i.clearActiveItems(),i.isFocused&&i.inputState();return}if(r=t&&t.type.toLowerCase(),r==="click"&&kt("shiftKey",t)&&i.activeItems.length){for(c=i.getLastActive(),s=Array.prototype.indexOf.call(i.control.children,c),a=Array.prototype.indexOf.call(i.control.children,e),s>a&&(l=s,s=a,a=l),o=s;o<=a;o++)e=i.control.children[o],i.activeItems.indexOf(e)===-1&&i.setActiveItemClass(e);fe(t)}else r==="click"&&kt(fi,t)||r==="keydown"&&kt("shiftKey",t)?e.classList.contains("active")?i.removeActiveItem(e):i.setActiveItemClass(e):(i.clearActiveItems(),i.setActiveItemClass(e));i.inputState(),i.isFocused||i.focus()}}setActiveItemClass(e){let t=this,i=t.control.querySelector(".last-active");i&>(i,"last-active"),Pe(e,"active last-active"),t.trigger("item_select",e),t.activeItems.indexOf(e)==-1&&t.activeItems.push(e)}removeActiveItem(e){var t=this.activeItems.indexOf(e);this.activeItems.splice(t,1),gt(e,"active")}clearActiveItems(){gt(this.activeItems,"active"),this.activeItems=[]}setActiveOption(e,t=!0){e!==this.activeOption&&(this.clearActiveOption(),e&&(this.activeOption=e,le(this.focus_node,{"aria-activedescendant":e.getAttribute("id")}),le(e,{"aria-selected":"true"}),Pe(e,"active"),t&&this.scrollToOption(e)))}scrollToOption(e,t){if(!e)return;let i=this.dropdown_content,r=i.clientHeight,o=i.scrollTop||0,s=e.offsetHeight,a=e.getBoundingClientRect().top-i.getBoundingClientRect().top+o;a+s>r+o?this.scroll(a-r+s,t):a{e.setActiveItemClass(i)}))}inputState(){var e=this;e.control.contains(e.control_input)&&(le(e.control_input,{placeholder:e.settings.placeholder}),e.activeItems.length>0||!e.isFocused&&e.settings.hidePlaceholder&&e.items.length>0?(e.setTextboxValue(),e.isInputHidden=!0):(e.settings.hidePlaceholder&&e.items.length>0&&le(e.control_input,{placeholder:""}),e.isInputHidden=!1),e.wrapper.classList.toggle("input-hidden",e.isInputHidden))}inputValue(){return this.control_input.value.trim()}focus(){var e=this;e.isDisabled||e.isReadOnly||(e.ignoreFocus=!0,e.control_input.offsetWidth?e.control_input.focus():e.focus_node.focus(),setTimeout(()=>{e.ignoreFocus=!1,e.onFocus()},0))}blur(){this.focus_node.blur(),this.onBlur()}getScoreFunction(e){return this.sifter.getScoreFunction(e,this.getSearchOptions())}getSearchOptions(){var e=this.settings,t=e.sortField;return typeof e.sortField=="string"&&(t=[{field:e.sortField}]),{fields:e.searchField,conjunction:e.searchConjunction,sort:t,nesting:e.nesting}}search(e){var t,i,r=this,o=this.getSearchOptions();if(r.settings.score&&(i=r.settings.score.call(r,e),typeof i!="function"))throw new Error('Tom Select "score" setting must be a function that returns a function');return e!==r.lastQuery?(r.lastQuery=e,t=r.sifter.search(e,Object.assign(o,{score:i})),r.currentResults=t):t=Object.assign({},r.currentResults),r.settings.hideSelected&&(t.items=t.items.filter(s=>{let a=We(s.id);return!(a&&r.items.indexOf(a)!==-1)})),t}refreshOptions(e=!0){var t,i,r,o,s,a,l,c,u,d;let p={},y=[];var m=this,v=m.inputValue();let w=v===m.lastQuery||v==""&&m.lastQuery==null;var T=m.search(v),_=null,S=m.settings.shouldOpen||!1,A=m.dropdown_content;w&&(_=m.activeOption,_&&(u=_.closest("[data-group]"))),o=T.items.length,typeof m.settings.maxOptions=="number"&&(o=Math.min(o,m.settings.maxOptions)),o>0&&(S=!0);let K=(L,H)=>{let N=p[L];if(N!==void 0){let B=y[N];if(B!==void 0)return[N,B.fragment]}let Y=document.createDocumentFragment();return N=y.length,y.push({fragment:Y,order:H,optgroup:L}),[N,Y]};for(t=0;t 0&&(B=B.cloneNode(!0),le(B,{id:N.$id+"-clone-"+i,"aria-selected":null}),B.classList.add("ts-cloned"),gt(B,"active"),m.activeOption&&m.activeOption.dataset.value==H&&u&&u.dataset.group===s.toString()&&(_=B)),Ce.appendChild(B),s!=""&&(p[s]=Te)}}m.settings.lockOptgroupOrder&&y.sort((L,H)=>L.order-H.order),l=document.createDocumentFragment(),ve(y,L=>{let H=L.fragment,N=L.optgroup;if(!H||!H.children.length)return;let Y=m.optgroups[N];if(Y!==void 0){let B=document.createDocumentFragment(),ie=m.render("optgroup_header",Y);Nt(B,ie),Nt(B,H);let J=m.render("optgroup",{group:Y,options:B});Nt(l,J)}else Nt(l,H)}),A.innerHTML="",Nt(A,l),m.settings.highlight&&(Za(A),T.query.length&&T.tokens.length&&ve(T.tokens,L=>{Ja(A,L.regex)}));var z=L=>{let H=m.render(L,{input:v});return H&&(S=!0,A.insertBefore(H,A.firstChild)),H};if(m.loading?z("loading"):m.settings.shouldLoad.call(m,v)?T.items.length===0&&z("no_results"):z("not_loading"),c=m.canCreate(v),c&&(d=z("option_create")),m.hasOptions=T.items.length>0||c,S){if(T.items.length>0){if(!_&&m.settings.mode==="single"&&m.items[0]!=null&&(_=m.getOption(m.items[0])),!A.contains(_)){let L=0;d&&!m.settings.addPrecedence&&(L=1),_=m.selectable()[L]}}else d&&(_=d);e&&!m.isOpen&&(m.open(),m.scrollToOption(_,"auto")),m.setActiveOption(_)}else m.clearActiveOption(),e&&m.isOpen&&m.close(!1)}selectable(){return this.dropdown_content.querySelectorAll("[data-selectable]")}addOption(e,t=!1){let i=this;if(Array.isArray(e))return i.addOptions(e,t),!1;let r=We(e[i.settings.valueField]);return r===null||i.options.hasOwnProperty(r)?!1:(e.$order=e.$order||++i.order,e.$id=i.inputId+"-opt-"+e.$order,i.options[r]=e,i.lastQuery=null,t&&(i.userOptions[r]=t,i.trigger("option_add",r,e)),r)}addOptions(e,t=!1){ve(e,i=>{this.addOption(i,t)})}registerOption(e){return this.addOption(e)}registerOptionGroup(e){var t=We(e[this.settings.optgroupValueField]);return t===null?!1:(e.$order=e.$order||++this.order,this.optgroups[t]=e,t)}addOptionGroup(e,t){var i;t[this.settings.optgroupValueField]=e,(i=this.registerOptionGroup(t))&&this.trigger("optgroup_add",i,t)}removeOptionGroup(e){this.optgroups.hasOwnProperty(e)&&(delete this.optgroups[e],this.clearCache(),this.trigger("optgroup_remove",e))}clearOptionGroups(){this.optgroups={},this.clearCache(),this.trigger("optgroup_clear")}updateOption(e,t){let i=this;var r,o;let s=We(e),a=We(t[i.settings.valueField]);if(s===null)return;let l=i.options[s];if(l==null)return;if(typeof a!="string")throw new Error("Value must be set in option data");let c=i.getOption(s),u=i.getItem(s);if(t.$order=t.$order||l.$order,delete i.options[s],i.uncacheValue(a),i.options[a]=t,c){if(i.dropdown_content.contains(c)){let d=i._render("option",t);di(c,d),i.activeOption===c&&i.setActiveOption(d)}c.remove()}u&&(o=i.items.indexOf(s),o!==-1&&i.items.splice(o,1,a),r=i._render("item",t),u.classList.contains("active")&&Pe(r,"active"),di(u,r)),i.lastQuery=null}removeOption(e,t){let i=this;e=ci(e),i.uncacheValue(e),delete i.userOptions[e],delete i.options[e],i.lastQuery=null,i.trigger("option_remove",e),i.removeItem(e,t)}clearOptions(e){let t=(e||this.clearFilter).bind(this);this.loadedSearches={},this.userOptions={},this.clearCache();let i={};ve(this.options,(r,o)=>{t(r,o)&&(i[o]=r)}),this.options=this.sifter.items=i,this.lastQuery=null,this.trigger("option_clear")}clearFilter(e,t){return this.items.indexOf(t)>=0}getOption(e,t=!1){let i=We(e);if(i===null)return null;let r=this.options[i];if(r!=null){if(r.$div)return r.$div;if(t)return this._render("option",r)}return null}getAdjacent(e,t,i="option"){var r=this,o;if(!e)return null;i=="item"?o=r.controlChildren():o=r.dropdown_content.querySelectorAll("[data-selectable]");for(let s=0;s 0?o[s+1]:o[s-1];return null}getItem(e){if(typeof e=="object")return e;var t=We(e);return t!==null?this.control.querySelector(`[data-value="${Bo(t)}"]`):null}addItems(e,t){var i=this,r=Array.isArray(e)?e:[e];r=r.filter(s=>i.items.indexOf(s)===-1);let o=r[r.length-1];r.forEach(s=>{i.isPending=s!==o,i.addItem(s,t)})}addItem(e,t){var i=t?[]:["change","dropdown_close"];Fo(this,i,()=>{var r,o;let s=this,a=s.settings.mode,l=We(e);if(!(l&&s.items.indexOf(l)!==-1&&(a==="single"&&s.close(),a==="single"||!s.settings.duplicates))&&!(l===null||!s.options.hasOwnProperty(l))&&(a==="single"&&s.clear(t),!(a==="multi"&&s.isFull()))){if(r=s._render("item",s.options[l]),s.control.contains(r)&&(r=r.cloneNode(!0)),o=s.isFull(),s.items.splice(s.caretPos,0,l),s.insertAtCaret(r),s.isSetup){if(!s.isPending&&s.settings.hideSelected){let c=s.getOption(l),u=s.getAdjacent(c,1);u&&s.setActiveOption(u)}!s.isPending&&!s.settings.closeAfterSelect&&s.refreshOptions(s.isFocused&&a!=="single"),s.settings.closeAfterSelect!=!1&&s.isFull()?s.close():s.isPending||s.positionDropdown(),s.trigger("item_add",l,r),s.isPending||s.updateOriginalInput({silent:t})}(!s.isPending||!o&&s.isFull())&&(s.inputState(),s.refreshState())}})}removeItem(e=null,t){let i=this;if(e=i.getItem(e),!e)return;var r,o;let s=e.dataset.value;r=zo(e),e.remove(),e.classList.contains("active")&&(o=i.activeItems.indexOf(e),i.activeItems.splice(o,1),gt(e,"active")),i.items.splice(r,1),i.lastQuery=null,!i.settings.persist&&i.userOptions.hasOwnProperty(s)&&i.removeOption(s,t),r {}){arguments.length===3&&(t=arguments[2]),typeof t!="function"&&(t=()=>{});var i=this,r=i.caretPos,o;if(e=e||i.inputValue(),!i.canCreate(e))return t(),!1;i.lock();var s=!1,a=l=>{if(i.unlock(),!l||typeof l!="object")return t();var c=We(l[i.settings.valueField]);if(typeof c!="string")return t();i.setTextboxValue(),i.addOption(l,!0),i.setCaret(r),i.addItem(c),t(l),s=!0};return typeof i.settings.create=="function"?o=i.settings.create.call(this,e,a):o={[i.settings.labelField]:e,[i.settings.valueField]:e},s||a(o),!0}refreshItems(){var e=this;e.lastQuery=null,e.isSetup&&e.addItems(e.items),e.updateOriginalInput(),e.refreshState()}refreshState(){let e=this;e.refreshValidityState();let t=e.isFull(),i=e.isLocked;e.wrapper.classList.toggle("rtl",e.rtl);let r=e.wrapper.classList;r.toggle("focus",e.isFocused),r.toggle("disabled",e.isDisabled),r.toggle("readonly",e.isReadOnly),r.toggle("required",e.isRequired),r.toggle("invalid",!e.isValid),r.toggle("locked",i),r.toggle("full",t),r.toggle("input-active",e.isFocused&&!e.isInputHidden),r.toggle("dropdown-active",e.isOpen),r.toggle("has-options",Qa(e.options)),r.toggle("has-items",e.items.length>0)}refreshValidityState(){var e=this;e.input.validity&&(e.isValid=e.input.validity.valid,e.isInvalid=!e.isValid)}isFull(){return this.settings.maxItems!==null&&this.items.length>=this.settings.maxItems}updateOriginalInput(e={}){let t=this;var i,r;let o=t.input.querySelector('option[value=""]');if(t.is_select_tag){let l=function(c,u,d){return c||(c=nt('")),c!=o&&t.input.append(c),s.push(c),(c!=o||a>0)&&(c.selected=!0),c},s=[],a=t.input.querySelectorAll("option:checked").length;t.input.querySelectorAll("option:checked").forEach(c=>{c.selected=!1}),t.items.length==0&&t.settings.mode=="single"?l(o,"",""):t.items.forEach(c=>{if(i=t.options[c],r=i[t.settings.labelField]||"",s.includes(i.$option)){let u=t.input.querySelector(`option[value="${Bo(c)}"]:not(:checked)`);l(u,c,r)}else i.$option=l(i.$option,c,r)})}else t.input.value=t.getValue();t.isSetup&&(e.silent||t.trigger("change",t.getValue()))}open(){var e=this;e.isLocked||e.isOpen||e.settings.mode==="multi"&&e.isFull()||(e.isOpen=!0,le(e.focus_node,{"aria-expanded":"true"}),e.refreshState(),ui(e.dropdown,{visibility:"hidden",display:"block"}),e.positionDropdown(),ui(e.dropdown,{visibility:"visible",display:"block"}),e.focus(),e.trigger("dropdown_open",e.dropdown))}close(e=!0){var t=this,i=t.isOpen;e&&(t.setTextboxValue(),t.settings.mode==="single"&&t.items.length&&t.inputState()),t.isOpen=!1,le(t.focus_node,{"aria-expanded":"false"}),ui(t.dropdown,{display:"none"}),t.settings.hideSelected&&t.clearActiveOption(),t.refreshState(),i&&t.trigger("dropdown_close",t.dropdown)}positionDropdown(){if(this.settings.dropdownParent==="body"){var e=this.control,t=e.getBoundingClientRect(),i=e.offsetHeight+t.top+window.scrollY,r=t.left+window.scrollX;ui(this.dropdown,{width:t.width+"px",top:i+"px",left:r+"px"})}}clear(e){var t=this;if(t.items.length){var i=t.controlChildren();ve(i,r=>{t.removeItem(r,!0)}),t.inputState(),e||t.updateOriginalInput(),t.trigger("clear")}}insertAtCaret(e){let t=this,i=t.caretPos,r=t.control;r.insertBefore(e,r.children[i]||null),t.setCaret(i+1)}deleteSelection(e){var t,i,r,o,s=this;t=e&&e.keyCode===8?-1:1,i=Ya(s.control_input);let a=[];if(s.activeItems.length)o=Vo(s.activeItems,t),r=zo(o),t>0&&r++,ve(s.activeItems,l=>a.push(l));else if((s.isFocused||s.settings.mode==="single")&&s.items.length){let l=s.controlChildren(),c;t<0&&i.start===0&&i.length===0?c=l[s.caretPos-1]:t>0&&i.start===s.inputValue().length&&(c=l[s.caretPos]),c!==void 0&&a.push(c)}if(!s.shouldDelete(a,e))return!1;for(fe(e,!0),typeof r!="undefined"&&s.setCaret(r);a.length;)s.removeItem(a.pop());return s.inputState(),s.positionDropdown(),s.refreshOptions(!1),!0}shouldDelete(e,t){let i=e.map(r=>r.dataset.value);return!(!i.length||typeof this.settings.onDelete=="function"&&this.settings.onDelete(i,t)===!1)}advanceSelection(e,t){var i,r,o=this;o.rtl&&(e*=-1),!o.inputValue().length&&(kt(fi,t)||kt("shiftKey",t)?(i=o.getLastActive(e),i?i.classList.contains("active")?r=o.getAdjacent(i,e,"item"):r=i:e>0?r=o.control_input.nextElementSibling:r=o.control_input.previousElementSibling,r&&(r.classList.contains("active")&&o.removeActiveItem(i),o.setActiveItemClass(r))):o.moveCaret(e))}moveCaret(e){}getLastActive(e){let t=this.control.querySelector(".last-active");if(t)return t;var i=this.control.querySelectorAll(".active");if(i)return Vo(i,e)}setCaret(e){this.caretPos=this.items.length}controlChildren(){return Array.from(this.control.querySelectorAll("[data-ts-item]"))}lock(){this.setLocked(!0)}unlock(){this.setLocked(!1)}setLocked(e=this.isReadOnly||this.isDisabled){this.isLocked=e,this.refreshState()}disable(){this.setDisabled(!0),this.close()}enable(){this.setDisabled(!1)}setDisabled(e){this.focus_node.tabIndex=e?-1:this.tabIndex,this.isDisabled=e,this.input.disabled=e,this.control_input.disabled=e,this.setLocked()}setReadOnly(e){this.isReadOnly=e,this.input.readOnly=e,this.control_input.readOnly=e,this.setLocked()}destroy(){var e=this,t=e.revertSettings;e.trigger("destroy"),e.off(),e.wrapper.remove(),e.dropdown.remove(),e.input.innerHTML=t.innerHTML,e.input.tabIndex=t.tabIndex,gt(e.input,"tomselected","ts-hidden-accessible"),e._destroy(),delete e.input.tomselect}render(e,t){var i,r;let o=this;if(typeof this.settings.render[e]!="function"||(r=o.settings.render[e].call(this,t,ur),!r))return null;if(r=nt(r),e==="option"||e==="option_create"?t[o.settings.disabledField]?le(r,{"aria-disabled":"true"}):le(r,{"data-selectable":""}):e==="optgroup"&&(i=t.group[o.settings.optgroupValueField],le(r,{"data-group":i}),t.group[o.settings.disabledField]&&le(r,{"data-disabled":""})),e==="option"||e==="item"){let s=ci(t[o.settings.valueField]);le(r,{"data-value":s}),e==="item"?(Pe(r,o.settings.itemClass),le(r,{"data-ts-item":""})):(Pe(r,o.settings.optionClass),le(r,{role:"option",id:t.$id}),t.$div=r,o.options[s]=t)}return r}_render(e,t){let i=this.render(e,t);if(i==null)throw"HTMLElement expected";return i}clearCache(){ve(this.options,e=>{e.$div&&(e.$div.remove(),delete e.$div)})}uncacheValue(e){let t=this.getOption(e);t&&t.remove()}canCreate(e){return this.settings.create&&e.length>0&&this.settings.createFilter.call(this,e)}hook(e,t,i){var r=this,o=r[t];r[t]=function(){var s,a;return e==="after"&&(s=o.apply(r,arguments)),a=i.apply(r,arguments),e==="instead"?a:(e==="before"&&(s=o.apply(r,arguments)),s)}}};var _m=(n,e,t,i)=>{n.addEventListener(e,t,i)};function il(){_m(this.input,"change",()=>{this.sync()})}var wm=n=>typeof n=="undefined"||n===null?null:xm(n),xm=n=>typeof n=="boolean"?n?"1":"0":n+"",rl=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},Tm=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(Cm(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},Cm=n=>typeof n=="string"&&n.indexOf("<")>-1;function ol(n){var e=this,t=e.onOptionSelect;e.settings.hideSelected=!1;let i=Object.assign({className:"tomselect-checkbox",checkedClassNames:void 0,uncheckedClassNames:void 0},n);var r=function(a,l){l?(a.checked=!0,i.uncheckedClassNames&&a.classList.remove(...i.uncheckedClassNames),i.checkedClassNames&&a.classList.add(...i.checkedClassNames)):(a.checked=!1,i.checkedClassNames&&a.classList.remove(...i.checkedClassNames),i.uncheckedClassNames&&a.classList.add(...i.uncheckedClassNames))},o=function(a){setTimeout(()=>{var l=a.querySelector("input."+i.className);l instanceof HTMLInputElement&&r(l,a.classList.contains("selected"))},1)};e.hook("after","setupTemplates",()=>{var s=e.settings.render.option;e.settings.render.option=(a,l)=>{var c=Tm(s.call(e,a,l)),u=document.createElement("input");i.className&&u.classList.add(i.className),u.addEventListener("click",function(p){rl(p)}),u.type="checkbox";let d=wm(a[e.settings.valueField]);return r(u,!!(d&&e.items.indexOf(d)>-1)),c.prepend(u),c}}),e.on("item_remove",s=>{var a=e.getOption(s);a&&(a.classList.remove("selected"),o(a))}),e.on("item_add",s=>{var a=e.getOption(s);a&&o(a)}),e.hook("instead","onOptionSelect",(s,a)=>{if(a.classList.contains("selected")){a.classList.remove("selected"),e.removeItem(a.dataset.value),e.refreshOptions(),rl(s,!0);return}t.call(e,s,a),o(a)})}var Am=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(Sm(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},Sm=n=>typeof n=="string"&&n.indexOf("<")>-1;function sl(n){let e=this,t=Object.assign({className:"clear-button",title:"Clear All",html:i=>` ⨯`},n);e.on("initialize",()=>{var i=Am(t.html(t));i.addEventListener("click",r=>{e.isLocked||(e.clear(),e.settings.mode==="single"&&e.settings.allowEmptyOption&&e.addItem(""),r.preventDefault(),r.stopPropagation())}),e.control.appendChild(i)})}var Dm=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},Dn=(n,e,t,i)=>{n.addEventListener(e,t,i)},Om=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)},Lm=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(Mm(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},Mm=n=>typeof n=="string"&&n.indexOf("<")>-1,km=(n,e)=>{Om(e,(t,i)=>{t==null?n.removeAttribute(i):n.setAttribute(i,""+t)})},Nm=(n,e)=>{var t;(t=n.parentNode)==null||t.insertBefore(e,n.nextSibling)},Im=(n,e)=>{var t;(t=n.parentNode)==null||t.insertBefore(e,n)},Rm=(n,e)=>{do{var t;if(e=(t=e)==null?void 0:t.previousElementSibling,n==e)return!0}while(e&&e.previousElementSibling);return!1};function al(){var n=this;if(n.settings.mode!=="multi")return;var e=n.lock,t=n.unlock;let i=!0,r;n.hook("after","setupTemplates",()=>{var o=n.settings.render.item;n.settings.render.item=(s,a)=>{let l=Lm(o.call(n,s,a));km(l,{draggable:"true"});let c=v=>{i||Dm(v),v.stopPropagation()},u=v=>{r=l,setTimeout(()=>{l.classList.add("ts-dragging")},0)},d=v=>{v.preventDefault(),l.classList.add("ts-drag-over"),y(l,r)},p=()=>{l.classList.remove("ts-drag-over")},y=(v,w)=>{w!==void 0&&(Rm(w,l)?Nm(v,w):Im(v,w))},m=()=>{var v;document.querySelectorAll(".ts-drag-over").forEach(T=>T.classList.remove("ts-drag-over")),(v=r)==null||v.classList.remove("ts-dragging"),r=void 0;var w=[];n.control.querySelectorAll("[data-value]").forEach(T=>{if(T.dataset.value){let _=T.dataset.value;_&&w.push(_)}}),n.setValue(w)};return Dn(l,"mousedown",c),Dn(l,"dragstart",u),Dn(l,"dragenter",d),Dn(l,"dragover",d),Dn(l,"dragleave",p),Dn(l,"dragend",m),l}}),n.hook("instead","lock",()=>(i=!1,e.call(n))),n.hook("instead","unlock",()=>(i=!0,t.call(n)))}var Hm=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},Pm=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(Fm(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},Fm=n=>typeof n=="string"&&n.indexOf("<")>-1;function ll(n){let e=this,t=Object.assign({title:"Untitled",headerClass:"dropdown-header",titleRowClass:"dropdown-header-title",labelClass:"dropdown-header-label",closeClass:"dropdown-header-close",html:i=>''},n);e.on("initialize",()=>{var i=Pm(t.html(t)),r=i.querySelector("."+t.closeClass);r&&r.addEventListener("click",o=>{Hm(o,!0),e.close()}),e.dropdown.insertBefore(i,e.dropdown.firstChild)})}var Bm=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)},$m=(n,...e)=>{var t=Vm(e);n=zm(n),n.map(i=>{t.map(r=>{i.classList.remove(r)})})},Vm=n=>{var e=[];return Bm(n,t=>{typeof t=="string"&&(t=t.trim().split(/[\t\n\f\r\s]/)),Array.isArray(t)&&(e=e.concat(t))}),e.filter(Boolean)},zm=n=>(Array.isArray(n)||(n=[n]),n),jm=(n,e)=>{if(!n)return-1;e=e||n.nodeName;for(var t=0;n=n.previousElementSibling;)n.matches(e)&&t++;return t};function cl(){var n=this;n.hook("instead","setCaret",e=>{n.settings.mode==="single"||!n.control.contains(n.control_input)?e=n.items.length:(e=Math.max(0,Math.min(n.items.length,e)),e!=n.caretPos&&!n.isPending&&n.controlChildren().forEach((t,i)=>{i'+i.title+'×{if(!n.isFocused)return;let t=n.getLastActive(e);if(t){let i=jm(t);n.setCaret(e>0?i+1:i),n.setActiveItem(),$m(t,"last-active")}else n.setCaret(n.caretPos+e)})}var Wm=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},qm=(n,e,t,i)=>{n.addEventListener(e,t,i)},Um=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)},ul=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(Ym(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},Ym=n=>typeof n=="string"&&n.indexOf("<")>-1,Gm=(n,...e)=>{var t=Km(e);n=Xm(n),n.map(i=>{t.map(r=>{i.classList.add(r)})})},Km=n=>{var e=[];return Um(n,t=>{typeof t=="string"&&(t=t.trim().split(/[\t\n\f\r\s]/)),Array.isArray(t)&&(e=e.concat(t))}),e.filter(Boolean)},Xm=n=>(Array.isArray(n)||(n=[n]),n);function dl(){let n=this;n.settings.shouldOpen=!0,n.hook("before","setup",()=>{n.focus_node=n.control,Gm(n.control_input,"dropdown-input");let e=ul(' ');e.append(n.control_input),n.dropdown.insertBefore(e,n.dropdown.firstChild);let t=ul('');t.placeholder=n.settings.placeholder||"",n.control.append(t)}),n.on("initialize",()=>{n.control_input.addEventListener("keydown",t=>{switch(t.keyCode){case 27:n.isOpen&&(Wm(t,!0),n.close()),n.clearActiveItems();return;case 9:n.focus_node.tabIndex=-1;break}return n.onKeyDown.call(n,t)}),n.on("blur",()=>{n.focus_node.tabIndex=n.isDisabled?-1:n.tabIndex}),n.on("dropdown_open",()=>{n.control_input.focus()});let e=n.onBlur;n.hook("instead","onBlur",t=>{if(!(t&&t.relatedTarget==n.control_input))return e.call(n)}),qm(n.control_input,"blur",()=>n.onBlur()),n.hook("before","close",()=>{n.isOpen&&n.focus_node.focus({preventScroll:!0})})})}var mr=(n,e,t,i)=>{n.addEventListener(e,t,i)};function fl(){var n=this;n.on("initialize",()=>{var e=document.createElement("span"),t=n.control_input;e.style.cssText="position:absolute; top:-99999px; left:-99999px; width:auto; padding:0; white-space:pre; ",n.wrapper.appendChild(e);var i=["letterSpacing","fontSize","fontFamily","fontWeight","textTransform"];for(let o of i)e.style[o]=t.style[o];var r=()=>{e.textContent=t.value,t.style.width=e.clientWidth+"px"};r(),n.on("update item_add item_remove",r),mr(t,"input",r),mr(t,"keyup",r),mr(t,"blur",r),mr(t,"update",r)})}function hl(){var n=this,e=n.deleteSelection;this.hook("instead","deleteSelection",t=>n.activeItems.length?e.call(n,t):!1)}function pl(){this.hook("instead","setActiveItem",()=>{}),this.hook("instead","selectAll",()=>{})}var Qm=(n,e,t)=>{for(;n&&n.matches;){if(n.matches(e))return n;n=n.parentNode}},Jm=(n,e)=>{if(!n)return-1;e=e||n.nodeName;for(var t=0;n=n.previousElementSibling;)n.matches(e)&&t++;return t};function ml(){var n=this,e=n.onKeyDown;n.hook("instead","onKeyDown",t=>{var i,r,o,s;if(!n.isOpen||!(t.keyCode===37||t.keyCode===39))return e.call(n,t);n.ignoreHover=!0,s=Qm(n.activeOption,"[data-group]"),i=Jm(n.activeOption,"[data-selectable]"),s&&(t.keyCode===37?s=s.previousSibling:s=s.nextSibling,s&&(o=s.querySelectorAll("[data-selectable]"),r=o[Math.min(o.length-1,i)],r&&n.setActiveOption(r)))})}var Zm=n=>(n+"").replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),gl=(n,e=!1)=>{n&&(n.preventDefault(),e&&n.stopPropagation())},vl=(n,e,t,i)=>{n.addEventListener(e,t,i)},yl=n=>{if(n.jquery)return n[0];if(n instanceof HTMLElement)return n;if(eg(n)){var e=document.createElement("template");return e.innerHTML=n.trim(),e.content.firstChild}return document.querySelector(n)},eg=n=>typeof n=="string"&&n.indexOf("<")>-1;function El(n){let e=Object.assign({label:"×",title:"Remove",className:"remove",append:!0},n);var t=this;if(e.append){var i=''+e.label+"";t.hook("after","setupTemplates",()=>{var r=t.settings.render.item;t.settings.render.item=(o,s)=>{var a=yl(r.call(t,o,s)),l=yl(i);return a.appendChild(l),vl(l,"mousedown",c=>{gl(c,!0)}),vl(l,"click",c=>{t.isLocked||(gl(c,!0),!t.isLocked&&t.shouldDelete([a],c)&&(t.removeItem(a),t.refreshOptions(!1),t.inputState()))}),a}})}}function bl(n){let e=this,t=Object.assign({text:i=>i[e.settings.labelField]},n);e.on("item_remove",function(i){if(e.isFocused&&e.control_input.value.trim()===""){var r=e.options[i];r&&e.setTextboxValue(t.text.call(e,r))}})}var tg=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)},ng=(n,...e)=>{var t=ig(e);n=rg(n),n.map(i=>{t.map(r=>{i.classList.add(r)})})},ig=n=>{var e=[];return tg(n,t=>{typeof t=="string"&&(t=t.trim().split(/[\t\n\f\r\s]/)),Array.isArray(t)&&(e=e.concat(t))}),e.filter(Boolean)},rg=n=>(Array.isArray(n)||(n=[n]),n);function _l(){let n=this,e=n.canLoad,t=n.clearActiveOption,i=n.loadCallback;var r={},o,s=!1,a,l=[];if(n.settings.shouldLoadMore||(n.settings.shouldLoadMore=()=>{if(o.clientHeight/(o.scrollHeight-o.scrollTop)>.9)return!0;if(n.activeOption){var p=n.selectable(),y=Array.from(p).indexOf(n.activeOption);if(y>=p.length-2)return!0}return!1}),!n.settings.firstUrl)throw"virtual_scroll plugin requires a firstUrl() method";n.settings.sortField=[{field:"$order"},{field:"$score"}];let c=d=>typeof n.settings.maxOptions=="number"&&o.children.length>=n.settings.maxOptions?!1:!!(d in r&&r[d]),u=(d,p)=>n.items.indexOf(p)>=0||l.indexOf(p)>=0;n.setNextUrl=(d,p)=>{r[d]=p},n.getUrl=d=>{if(d in r){let p=r[d];return r[d]=!1,p}return n.clearPagination(),n.settings.firstUrl.call(n,d)},n.clearPagination=()=>{r={}},n.hook("instead","clearActiveOption",()=>{if(!s)return t.call(n)}),n.hook("instead","canLoad",d=>d in r?c(d):e.call(n,d)),n.hook("instead","loadCallback",(d,p)=>{if(!s)n.clearOptions(u);else if(a){let y=d[0];y!==void 0&&(a.dataset.value=y[n.settings.valueField])}i.call(n,d,p),s=!1}),n.hook("after","refreshOptions",()=>{let d=n.lastValue;var p;c(d)?(p=n.render("loading_more",{query:d}),p&&(p.setAttribute("data-selectable",""),a=p)):d in r&&!o.querySelector(".no-results")&&(p=n.render("no_more_results",{query:d})),p&&(ng(p,n.settings.optionClass),o.append(p))}),n.on("initialize",()=>{l=Object.keys(n.options),o=n.dropdown_content,n.settings.render=Object.assign({},{loading_more:()=>'Loading more results ...',no_more_results:()=>'No more results'},n.settings.render),o.addEventListener("scroll",()=>{n.settings.shouldLoadMore.call(n)&&c(n.lastValue)&&(s||(s=!0,n.load.call(n,n.lastValue)))})})}_e.define("change_listener",il);_e.define("checkbox_options",ol);_e.define("clear_button",sl);_e.define("drag_drop",al);_e.define("dropdown_header",ll);_e.define("caret_position",cl);_e.define("dropdown_input",dl);_e.define("input_autogrow",fl);_e.define("no_backspace_delete",hl);_e.define("no_active_items",pl);_e.define("optgroup_columns",ml);_e.define("remove_button",El);_e.define("restore_on_backspace",bl);_e.define("virtual_scroll",_l);var hi=_e;function tn(n){return"error"in n}function pe(n){let e=["","null","undefined"];return Array.isArray(n)?n.length>0:typeof n=="string"&&!e.includes(n)||typeof n=="number"||typeof n=="boolean"?!0:typeof n=="object"&&n!==null}function gr(n){return typeof n!==null&&typeof n!="undefined"}function og(n,e,t){return at(this,null,function*(){let i=window.CSRF_TOKEN,r=new Headers({"X-CSRFToken":i}),o;typeof t!="undefined"&&(o=JSON.stringify(t),r.set("content-type","application/json"));let s=yield fetch(n,{method:e,body:o,headers:r,credentials:"same-origin"}),a=s.headers.get("Content-Type");if(typeof a=="string"&&a.includes("text"))return{error:yield s.text()};let l=yield s.json();return!s.ok&&Array.isArray(l)?{error:l.join(` +`)}:!s.ok&&"detail"in l?{error:l.detail}:l})}function On(n,e){return at(this,null,function*(){return yield og(n,"PATCH",e)})}function*I(...n){for(let e of n)for(let t of document.querySelectorAll(e))t!==null&&(yield t)}function pi(n){return document.getElementById(n)}function wl(n,e=0){let t=e,i=document.getElementById("content-title");i!==null&&(t+=i.getBoundingClientRect().bottom);let r=n.getBoundingClientRect().top+window.pageYOffset+t;window.scrollTo({top:r,behavior:"smooth"})}function xl(n,e="select"){let t=[];for(let i of n.querySelectorAll(e))if(i!==null){let r={name:i.name,options:[]};for(let o of i.options)o.selected&&r.options.push(o.value);t=[...t,r]}return t}function nn(n,e,t){function i(o){return!!(typeof t=="string"&&o!==null&&o.matches(t))}function r(o){if(o!==null&&o.parentElement!==null&&!i(o)){for(let s of o.parentElement.querySelectorAll(e))if(s!==null)return s;return r(o.parentElement.parentElement)}return null}return r(n)}function Wo(n,e,t=null,i=[]){let r=document.createElement(n);if(e!==null)for(let o of Object.keys(e)){let s=o,a=e[s];s in r&&(r[s]=a)}t!==null&&t.length>0&&r.classList.add(...t);for(let o of i)r.appendChild(o);return r}function Ln(n,e,t){if(typeof n!="string")throw new TypeError("replaceAll 'input' argument must be a string");if(typeof e!="string"&&!(e instanceof RegExp))throw new TypeError("replaceAll 'pattern' argument must be a string or RegExp instance");switch(typeof t){case"boolean":t=String(t);break;case"number":t=String(t);break;case"string":break;default:throw new TypeError("replaceAll 'replacement' argument must be stringifyable")}if(e instanceof RegExp){let i=Array.from(new Set([...e.flags.split(""),"g"])).join("");e=new RegExp(e.source,i)}else e=new RegExp(e,"g");return n.replace(e,t)}function sg(n,e){for(let i of I("select.select-all option"))i.selected=!0;let t=new Set;for(let i of e.querySelectorAll("*[name]"))i.validity.valid?i.classList.contains("is-invalid")&&i.classList.remove("is-invalid"):(t.add(i.name),i.classList.contains("is-invalid")||i.classList.add("is-invalid"));if(t.size!==0){let i=e.elements.namedItem(Array.from(t)[0]);wl(i),n.preventDefault()}}function Tl(){for(let n of I("form")){let e=n.querySelectorAll("button[type=submit]");for(let i of e)i.addEventListener("click",r=>sg(r,n));let t=document.querySelector("button[data-reset-select]");t!==null&&t.addEventListener("click",()=>{window.location.assign(window.location.origin+window.location.pathname)})}}function Cl(){for(let e of I("a.set_field_value"))if(e!==null){let t=function(i){i.preventDefault();let r=e.getAttribute("data"),o=document.getElementById(e.target);o!==null&&r!==null&&(o.value=r)};var n=t;e.addEventListener("click",t)}}function vr(){for(let n of[Tl,Cl])n()}window.Collapse=At;window.Modal=tt;window.Popover=Cn;window.Toast=pt;window.Tooltip=ht;function ag(){for(let n of I('[data-bs-toggle="tooltip"]'))new ht(n,{container:"body"})}function lg(){for(let n of I('[data-bs-toggle="modal"]'))new tt(n)}function It(n,e,t,i){let r="mdi-alert";switch(n){case"warning":r="mdi-alert";break;case"success":r="mdi-check-circle";break;case"info":r="mdi-information";break;case"danger":r="mdi-alert";break}let o=document.createElement("div");o.setAttribute("class","toast-container position-fixed bottom-0 end-0 m-3");let s=document.createElement("div");s.setAttribute("class",`toast bg-${n}`),s.setAttribute("role","alert"),s.setAttribute("aria-live","assertive"),s.setAttribute("aria-atomic","true");let a=document.createElement("div");a.setAttribute("class",`toast-header bg-${n} text-body`);let l=document.createElement("i");l.setAttribute("class",`mdi ${r}`);let c=document.createElement("strong");c.setAttribute("class","me-auto ms-1"),c.innerText=e;let u=document.createElement("button");u.setAttribute("type","button"),u.setAttribute("class","btn-close"),u.setAttribute("data-bs-dismiss","toast"),u.setAttribute("aria-label","Close");let d=document.createElement("div");if(d.setAttribute("class","toast-body"),a.appendChild(l),a.appendChild(c),typeof i!="undefined"){let y=document.createElement("small");y.setAttribute("class","text-muted"),a.appendChild(y)}return a.appendChild(u),d.innerText=t.trim(),s.appendChild(a),s.appendChild(d),o.appendChild(s),document.body.appendChild(o),new pt(s)}function cg(){let{hash:n}=location;if(n&&n.match(/^#tab_.+$/)){let e=n.replace("tab_","");for(let t of I(`ul.nav.nav-tabs .nav-link[data-bs-target="${e}"]`))new Jt(t).show()}}function ug(){let n=document.querySelectorAll(".sidebar .accordion-item");function e(t){for(let i of n)i!==t?i.classList.remove("is-open"):i.classList.toggle("is-open")}for(let t of n)for(let i of t.querySelectorAll(".accordion-button"))i.addEventListener("click",()=>{e(t)})}function dg(){for(let n of I("a.image-preview")){let e=`${Math.round(window.innerWidth/4)}px`,t=Wo("img",{src:n.href});t.style.maxWidth=e;let i=Wo("div",null,null,[t]);new Cn(n,{customClass:"image-preview-popover",trigger:"hover",html:!0,content:i})}}function yr(){for(let n of[ag,lg,cg,dg,ug])n()}function Al(n){let e=n.currentTarget,t=document.getElementById("quicksearch_clear");pe(t)&&(e.value===""?t.classList.add("invisible"):t.classList.remove("invisible"))}function Sl(){let n=document.getElementById("export_current_view"),e=n==null?void 0:n.href.split("&")[0];n.setAttribute("href",e)}function fg(n){let e=n.currentTarget;if(Sl(),e!=null){let t=document.getElementById("export_current_view"),i=new URLSearchParams;i.set("q",e.value);let r=i.toString(),o=(t==null?void 0:t.href)+"&"+r;t.setAttribute("href",o)}}function Dl(){let n=document.getElementById("quicksearch"),e=document.getElementById("quicksearch_clear");pe(n)&&(n.addEventListener("keyup",Al,{passive:!0}),n.addEventListener("search",Al,{passive:!0}),n.addEventListener("change",fg,{passive:!0}),pe(e)&&e.addEventListener("click",()=>at(null,null,function*(){let t=new Event("search");n.value="",yield new Promise(i=>setTimeout(i,100)),n.dispatchEvent(t),Sl()}),{passive:!0}))}function mi(n){let e={};return n.required||(e.clear_button={html:t=>``}),n.hasAttribute("multiple")&&(e.remove_button={title:"Remove"}),{plugins:e}}function Ol(){for(let n of I("select:not(.tomselected):not(.no-ts):not([size]):not(.api-select):not(.color-select)"))new hi(n,ae(O({},mi(n)),{maxOptions:void 0}))}function Ll(){function n(e,t){return`${t(e.text)}`}for(let e of I("select.color-select:not(.tomselected)"))new hi(e,ae(O({},mi(e)),{maxOptions:void 0,render:{option:n,item:n}}))}var Ml=(n,e)=>{if(Array.isArray(n))n.forEach(e);else for(var t in n)n.hasOwnProperty(t)&&e(n[t],t)};var kl=(n,...e)=>{var t=hg(e);n=pg(n),n.map(i=>{t.map(r=>{i.classList.add(r)})})};var hg=n=>{var e=[];return Ml(n,t=>{typeof t=="string"&&(t=t.trim().split(/[\t\n\f\r\s]/)),Array.isArray(t)&&(e=e.concat(t))}),e.filter(Boolean)},pg=n=>(Array.isArray(n)||(n=[n]),n);var Xo={};gs(Xo,{exclude:()=>wg,extract:()=>Go,parse:()=>Ko,parseUrl:()=>zl,pick:()=>Wl,stringify:()=>Vl,stringifyUrl:()=>jl});var Rl="%[a-f0-9]{2}",Nl=new RegExp("("+Rl+")|([^%]+?)","gi"),Il=new RegExp("("+Rl+")+","gi");function qo(n,e){try{return[decodeURIComponent(n.join(""))]}catch(r){}if(n.length===1)return n;e=e||1;let t=n.slice(0,e),i=n.slice(e);return Array.prototype.concat.call([],qo(t),qo(i))}function mg(n){try{return decodeURIComponent(n)}catch(e){let t=n.match(Nl)||[];for(let i=1;in==null,yg=n=>encodeURIComponent(n).replaceAll(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`),Yo=Symbol("encodeFragmentIdentifier");function Eg(n){switch(n.arrayFormat){case"index":return e=>(t,i)=>{let r=t.length;return i===void 0||n.skipNull&&i===null||n.skipEmptyString&&i===""?t:i===null?[...t,[ye(e,n),"[",r,"]"].join("")]:[...t,[ye(e,n),"[",ye(r,n),"]=",ye(i,n)].join("")]};case"bracket":return e=>(t,i)=>i===void 0||n.skipNull&&i===null||n.skipEmptyString&&i===""?t:i===null?[...t,[ye(e,n),"[]"].join("")]:[...t,[ye(e,n),"[]=",ye(i,n)].join("")];case"colon-list-separator":return e=>(t,i)=>i===void 0||n.skipNull&&i===null||n.skipEmptyString&&i===""?t:i===null?[...t,[ye(e,n),":list="].join("")]:[...t,[ye(e,n),":list=",ye(i,n)].join("")];case"comma":case"separator":case"bracket-separator":{let e=n.arrayFormat==="bracket-separator"?"[]=":"=";return t=>(i,r)=>r===void 0||n.skipNull&&r===null||n.skipEmptyString&&r===""?i:(r=r===null?"":r,i.length===0?[[ye(t,n),e,ye(r,n)].join("")]:[[i,ye(r,n)].join(n.arrayFormatSeparator)])}default:return e=>(t,i)=>i===void 0||n.skipNull&&i===null||n.skipEmptyString&&i===""?t:i===null?[...t,ye(e,n)]:[...t,[ye(e,n),"=",ye(i,n)].join("")]}}function bg(n){let e;switch(n.arrayFormat){case"index":return(t,i,r)=>{if(e=/\[(\d*)]$/.exec(t),t=t.replace(/\[\d*]$/,""),!e){r[t]=i;return}r[t]===void 0&&(r[t]={}),r[t][e[1]]=i};case"bracket":return(t,i,r)=>{if(e=/(\[])$/.exec(t),t=t.replace(/\[]$/,""),!e){r[t]=i;return}if(r[t]===void 0){r[t]=[i];return}r[t]=[...r[t],i]};case"colon-list-separator":return(t,i,r)=>{if(e=/(:list)$/.exec(t),t=t.replace(/:list$/,""),!e){r[t]=i;return}if(r[t]===void 0){r[t]=[i];return}r[t]=[...r[t],i]};case"comma":case"separator":return(t,i,r)=>{let o=typeof i=="string"&&i.includes(n.arrayFormatSeparator),s=typeof i=="string"&&!o&&vt(i,n).includes(n.arrayFormatSeparator);i=s?vt(i,n):i;let a=o||s?i.split(n.arrayFormatSeparator).map(l=>vt(l,n)):i===null?i:vt(i,n);r[t]=a};case"bracket-separator":return(t,i,r)=>{let o=/(\[])$/.test(t);if(t=t.replace(/\[]$/,""),!o){r[t]=i&&vt(i,n);return}let s=i===null?[]:vt(i,n).split(n.arrayFormatSeparator);if(r[t]===void 0){r[t]=s;return}r[t]=[...r[t],...s]};default:return(t,i,r)=>{if(r[t]===void 0){r[t]=i;return}r[t]=[...[r[t]].flat(),i]}}}function Fl(n){if(typeof n!="string"||n.length!==1)throw new TypeError("arrayFormatSeparator must be single character string")}function ye(n,e){return e.encode?e.strict?yg(n):encodeURIComponent(n):n}function vt(n,e){return e.decode?Uo(n):n}function Bl(n){return Array.isArray(n)?n.sort():typeof n=="object"?Bl(Object.keys(n)).sort((e,t)=>Number(e)-Number(t)).map(e=>n[e]):n}function $l(n){let e=n.indexOf("#");return e!==-1&&(n=n.slice(0,e)),n}function _g(n){let e="",t=n.indexOf("#");return t!==-1&&(e=n.slice(t)),e}function Pl(n,e,t){return t==="string"&&typeof n=="string"?n:typeof t=="function"&&typeof n=="string"?t(n):t==="boolean"&&n===null?!0:t==="boolean"&&n!==null&&(n.toLowerCase()==="true"||n.toLowerCase()==="false")?n.toLowerCase()==="true":t==="boolean"&&n!==null&&(n.toLowerCase()==="1"||n.toLowerCase()==="0")?n.toLowerCase()==="1":t==="string[]"&&e.arrayFormat!=="none"&&typeof n=="string"?[n]:t==="number[]"&&e.arrayFormat!=="none"&&!Number.isNaN(Number(n))&&typeof n=="string"&&n.trim()!==""?[Number(n)]:t==="number"&&!Number.isNaN(Number(n))&&typeof n=="string"&&n.trim()!==""?Number(n):e.parseBooleans&&n!==null&&(n.toLowerCase()==="true"||n.toLowerCase()==="false")?n.toLowerCase()==="true":e.parseNumbers&&!Number.isNaN(Number(n))&&typeof n=="string"&&n.trim()!==""?Number(n):n}function Go(n){n=$l(n);let e=n.indexOf("?");return e===-1?"":n.slice(e+1)}function Ko(n,e){e=O({decode:!0,sort:!0,arrayFormat:"none",arrayFormatSeparator:",",parseNumbers:!1,parseBooleans:!1,types:Object.create(null)},e),Fl(e.arrayFormatSeparator);let t=bg(e),i=Object.create(null);if(typeof n!="string"||(n=n.trim().replace(/^[?#&]/,""),!n))return i;for(let r of n.split("&")){if(r==="")continue;let o=e.decode?r.replaceAll("+"," "):r,[s,a]=Er(o,"=");s===void 0&&(s=o),a=a===void 0?null:["comma","separator","bracket-separator"].includes(e.arrayFormat)?a:vt(a,e),t(vt(s,e),a,i)}for(let[r,o]of Object.entries(i))if(typeof o=="object"&&o!==null&&e.types[r]!=="string")for(let[s,a]of Object.entries(o)){let l=e.types[r]?e.types[r].replace("[]",""):void 0;o[s]=Pl(a,e,l)}else typeof o=="object"&&o!==null&&e.types[r]==="string"?i[r]=Object.values(o).join(e.arrayFormatSeparator):i[r]=Pl(o,e,e.types[r]);return e.sort===!1?i:(e.sort===!0?Object.keys(i).sort():Object.keys(i).sort(e.sort)).reduce((r,o)=>{let s=i[o];return r[o]=s&&typeof s=="object"&&!Array.isArray(s)?Bl(s):s,r},Object.create(null))}function Vl(n,e){if(!n)return"";e=O({encode:!0,strict:!0,arrayFormat:"none",arrayFormatSeparator:","},e),Fl(e.arrayFormatSeparator);let t=s=>e.skipNull&&vg(n[s])||e.skipEmptyString&&n[s]==="",i=Eg(e),r={};for(let[s,a]of Object.entries(n))t(s)||(r[s]=a);let o=Object.keys(r);return e.sort!==!1&&o.sort(e.sort),o.map(s=>{let a=n[s];return a===void 0?"":a===null?ye(s,e):Array.isArray(a)?a.length===0&&e.arrayFormat==="bracket-separator"?ye(s,e)+"[]":a.reduce(i(s),[]).join("&"):ye(s,e)+"="+ye(a,e)}).filter(s=>s.length>0).join("&")}function zl(n,e){var r,o;e=O({decode:!0},e);let[t,i]=Er(n,"#");return t===void 0&&(t=n),O({url:(o=(r=t==null?void 0:t.split("?"))==null?void 0:r[0])!=null?o:"",query:Ko(Go(n),e)},e&&e.parseFragmentIdentifier&&i?{fragmentIdentifier:vt(i,e)}:{})}function jl(n,e){e=O({encode:!0,strict:!0,[Yo]:!0},e);let t=$l(n.url).split("?")[0]||"",i=Go(n.url),r=O(O({},Ko(i,O({sort:!1},e))),n.query),o=Vl(r,e);o&&(o=`?${o}`);let s=_g(n.url);if(typeof n.fragmentIdentifier=="string"){let a=new URL(t);a.hash=n.fragmentIdentifier,s=e[Yo]?a.hash:`#${n.fragmentIdentifier}`}return`${t}${o}${s}`}function Wl(n,e,t){t=O({parseFragmentIdentifier:!0,[Yo]:!1},t);let{url:i,query:r,fragmentIdentifier:o}=zl(n,t);return jl({url:i,query:Hl(r,e),fragmentIdentifier:o},t)}function wg(n,e,t){let i=Array.isArray(e)?r=>!e.includes(r):(r,o)=>!e(r,o);return Wl(n,i,t)}var ql=Xo;function Ul(n){if(Array.isArray(n)){for(let e of n)if(typeof e=="object"&&e!==null&&"fieldName"in e&&"queryParam"in e)return typeof e.fieldName=="string"&&typeof e.queryParam=="string"}return!1}var br=class extends Map{queryParam(e){let t=this.get(e);return typeof t!="undefined"?t.queryParam:null}queryValue(e){let t=this.get(e);return typeof t!="undefined"?t.queryValue:[]}updateValue(e,t){let i=this.get(e);if(pe(i)){let{queryParam:r}=i;return this.set(e,{queryParam:r,queryValue:t}),!0}return!1}addFromJson(e){if(pe(e)){let t=JSON.parse(e);if(Ul(t))for(let{queryParam:i,fieldName:r}of t)this.set(r,{queryParam:i,queryValue:[]});else throw new Error(`Data from 'data-dynamic-params' attribute is improperly formatted: '${e}'`)}}};var _r=class extends hi{constructor(t,i){super(t,i);ee(this,"nullOption",null);ee(this,"queryParams",new Map);ee(this,"staticParams",new Map);ee(this,"dynamicParams",new br);ee(this,"pathValues",new Map);this.api_url=this.input.getAttribute("data-url"),this.valueField=this.input.getAttribute("ts-value-field")||this.settings.valueField,this.labelField=this.input.getAttribute("ts-label-field")||this.settings.labelField,this.disabledField=this.input.getAttribute("ts-disabled-field")||this.settings.disabledField,this.descriptionField=this.input.getAttribute("ts-description-field")||"description",this.depthField=this.input.getAttribute("ts-depth-field")||"_depth",this.parentField=this.input.getAttribute("ts-parent-field")||null,this.countField=this.input.getAttribute("ts-count-field")||null;let r=this.input.getAttribute("data-null-option");if(r){let o=this.settings.valueField,s=this.settings.labelField;this.nullOption={},this.nullOption[o]="null",this.nullOption[s]=r}this.getStaticParams();for(let[o,s]of this.staticParams.entries())this.queryParams.set(o,s);this.getDynamicParams();for(let o of this.dynamicParams.keys())this.updateQueryParams(o);this.getPathKeys();for(let o of this.pathValues.keys())this.updatePathValues(o);this.addEventListeners()}load(t){let i=this;i.clearOptions(),i.nullOption&&!t&&i.addOption(i.nullOption);let r=i.getRequestUrl(t);r&&(kl(i.wrapper,i.settings.loadingClass),i.loading++,fetch(r).then(o=>o.json()).then(o=>{let s=o.results,a=[];for(let l of s){let c=i.getOptionFromData(l);a.push(c)}return a}).then(o=>{i.loadCallback(o,[])}).catch(()=>{i.loadCallback([],[])}))}getRequestUrl(t){let i=this.api_url,r={};for(let[o,s]of this.queryParams.entries())r[o]=s;for(let[o,s]of this.pathValues.entries())for(let a of this.api_url.matchAll(new RegExp(`({{${o}}})`,"g")))if(s)i=Ln(i,a[1],s.toString());else return"";return t&&(r.q=[t]),r.brief=[!0],r.limit=[this.settings.maxOptions],ql.stringifyUrl({url:i,query:r})}getOptionFromData(t){let i={id:t[this.valueField],display:t[this.labelField],depth:t[this.depthField]||null,description:t[this.descriptionField]||null};if(t[this.parentField]){let r=t[this.parentField];i.parent=r[this.labelField]}return t[this.countField]&&(i.count=t[this.countField]),t[this.disabledField]&&(i.disabled=t[this.disabledField]),i}getStaticParams(){let t=this.input.getAttribute("data-static-params");try{if(t){let i=JSON.parse(t);if(i)for(let{queryParam:r,queryValue:o}of i)Array.isArray(o)?this.staticParams.set(r,o):this.staticParams.set(r,[o])}}catch(i){console.group(`Unable to determine static query parameters for select field '${this.name}'`),console.warn(i),console.groupEnd()}}getDynamicParams(){let t=this.input.getAttribute("data-dynamic-params");try{this.dynamicParams.addFromJson(t)}catch(i){console.group(`Unable to determine dynamic query parameters for select field '${this.name}'`),console.warn(i),console.groupEnd()}}getPathKeys(){for(let t of this.api_url.matchAll(new RegExp("{{(.+)}}","g")))this.pathValues.set(t[1],"")}updateQueryParams(t){let i=document.querySelector(`[name="${t}"]`);if(i!==null){let r=[];if(i.multiple?r=Array.from(i.options).filter(o=>o.selected).map(o=>o.value):i.value!==""&&(r=[i.value]),r.length>0){this.dynamicParams.updateValue(t,r);let o=this.dynamicParams.get(t);if(typeof o!="undefined"){let{queryParam:s,queryValue:a}=o,l=[];if(this.staticParams.has(s)){let c=this.staticParams.get(s);typeof c!="undefined"&&(l=[...c,...a])}else l=a;l.length>0?this.queryParams.set(s,l):this.queryParams.delete(s)}}else{let o=this.dynamicParams.queryParam(t);o!==null&&this.queryParams.delete(o)}}}updatePathValues(t){let i=Ln(t,/^id_/i,""),r=pi(`id_${i}`);r!==null&&this.api_url.includes("{{")&&this.api_url.match(new RegExp(`({{(${t})}})`,"g"))&&(r.value?this.pathValues.set(t,r.value):this.pathValues.set(t,""))}addEventListeners(){let t=new Set([...this.dynamicParams.keys(),...this.pathValues.keys()]);for(let i of t){let r=document.querySelector(`[name="${i}"]`);r!==null&&r.addEventListener("change",o=>this.handleEvent(o)),this.input.addEventListener(`netbox.select.onload.${i}`,o=>this.handleEvent(o))}}handleEvent(t){let i=t.target;this.updateQueryParams(i.name),this.updatePathValues(i.name),this.clear(),this.load(this.lastValue)}};var xg="id",wr="display",Tg=100;function Cg(n,e){let t=" ";return typeof n.depth=="number"&&n.depth>0&&(t=`${t}${"\u2500".repeat(n.depth)} `),t=`${t}${e(n[wr])}`,n.parent&&(t=`${t} ${e(n.parent)}`),n.count&&(t=`${t} ${e(n.count)}`),n.description&&(t=`${t}`,t}function Ag(n,e){return n.parent?`
${e(n.description)}`),t=`${t}${e(n.parent)} > ${e(n[wr])}`:`${e(n[wr])}`}function Yl(){for(let n of I("select.api-select:not(.tomselected)"))new _r(n,ae(O({},mi(n)),{valueField:xg,labelField:wr,maxOptions:Tg,searchField:[],preload:"focus",render:{option:Cg,item:Ag},shouldLoad:function(){return!0}}))}function xr(){Ol(),Yl(),Ll()}function Gl(n,e){var r;let t=(r=n.parentElement)==null?void 0:r.parentElement,i=n.getAttribute("data-url");pe(i)&&On(i,{status:e}).then(o=>{if(tn(o)){It("danger","Error",o.error).show();return}else t.setAttribute("data-cable-status",e)})}function Kl(){for(let n of I("button.mark-planned"))n.addEventListener("click",()=>Gl(n,"planned"));for(let n of I("button.mark-installed"))n.addEventListener("click",()=>Gl(n,"connected"))}var Qo=class{set(e,t,i){return e[t]=i,!0}get(e,t){return e[t]}has(e,t){return t in e}},gi=class{constructor(e,t){ee(this,"handlers");ee(this,"proxy");ee(this,"options");ee(this,"key","");if(this.options=t,typeof this.options.key=="string"?this.key=this.options.key:this.key=this.generateStateKey(e),this.options.persist){let i=this.retrieve();i!==null&&(e=O(O({},e),i))}this.handlers=new Qo,this.proxy=new Proxy(e,this.handlers),this.options.persist&&this.save()}generateStateKey(e){return`netbox-${window.btoa(Object.keys(e).join("---"))}`}get(e){return this.handlers.get(this.proxy,e)}set(e,t){this.handlers.set(this.proxy,e,t),this.options.persist&&this.save()}all(){return this.proxy}keys(){return Object.keys(this.proxy)}values(){return Object.values(this.proxy)}save(){let e=JSON.stringify(this.proxy);localStorage.setItem(this.key,e)}retrieve(){let e=localStorage.getItem(this.key);return e!==null?JSON.parse(e):null}};function Rt(n,e={}){return new gi(n,e)}var Jo=Rt({hidden:!1},{persist:!0,key:"netbox-object-depth"});var Zo=Rt({view:"images-and-labels"},{persist:!0});var Xl=Rt({element:null},{persist:!1});var Ql=Rt({hidden:!0},{persist:!0,key:"netbox-secret"});function Jl(n,e){e.setAttribute("data-depth-indicators",n?"hidden":"shown"),e.innerText=n?"Show Depth Indicators":"Hide Depth Indicators"}function Zl(){for(let n of I(".record-depth"))n.style.display=""}function ec(){for(let n of I(".record-depth"))n.style.display="none"}function Sg(n,e){let t=n.get("hidden");n.set("hidden",!t);let i=n.get("hidden");i?ec():Zl(),Jl(i,e)}function tc(){let n=Jo.get("hidden");for(let e of I("button.toggle-depth"))Jl(n,e),e.addEventListener("click",t=>{Sg(Jo,t.currentTarget)},!1);n?ec():n||Zl()}function Dg(n,e){for(let t of Array.from(n.options))t.selected&&(e.appendChild(t.cloneNode(!0)),t.remove())}function Og(n){let e=Array.from(n.options);for(let t=1;t=0;t--){let i=e[t];if(i.selected){let r=n.options[t+1];i=n.removeChild(i),r=n.replaceChild(i,r),n.insertBefore(r,i)}}}function nc(){for(let n of I(".move-option")){let e=n.getAttribute("data-source"),t=n.getAttribute("data-target"),i=document.getElementById(`id_${e}`),r=document.getElementById(`id_${t}`);i!==null&&r!==null&&n.addEventListener("click",()=>Dg(i,r))}for(let n of I(".move-option-up")){let e=n.getAttribute("data-target"),t=document.getElementById(`id_${e}`);t!==null&&n.addEventListener("click",()=>Og(t))}for(let n of I(".move-option-down")){let e=n.getAttribute("data-target"),t=document.getElementById(`id_${e}`);t!==null&&n.addEventListener("click",()=>Lg(t))}}function ic(n,e){return n.replace(/[^\-.\w\s]/g,"").replace(/^[\s.]+|[\s.]+$/g,"").replace(/[-.\s]+/g,"-").toLowerCase().substring(0,e)}function rc(){for(let n of I("button#reslug")){let e=n.form;if(e==null)continue;let t=e.querySelector("#id_slug");if(t==null)continue;let i=t.getAttribute("slug-source"),r=e.querySelector(`#id_${i}`),o=t.getAttribute("maxlength"),s=50;o&&(s=Number(o)),r.addEventListener("blur",()=>{t.value||(t.value=ic(r.value,s))}),n.addEventListener("click",()=>{t.value=ic(r.value,s)})}}function Mg(n){if(!n.currentTarget.checked)for(let t of I('input[type="checkbox"].toggle',"input#select-all"))t.checked=!1}function kg(n){let e=n.currentTarget,t=nn(e,"table"),i=document.getElementById("select-all-box"),r=document.getElementById("select-all");if(t!==null){for(let o of t.querySelectorAll('tr:not(.d-none) input[type="checkbox"][name="pk"]'))e.checked?o.checked=!0:o.checked=!1;i!==null&&(e.checked?i.classList.remove("d-none"):(i.classList.add("d-none"),r!==null&&(r.checked=!1)))}}function oc(){for(let n of I('table tr th > input[type="checkbox"].toggle'))n.addEventListener("change",kg);for(let n of I('input[type="checkbox"][name="pk"]'))n.addEventListener("change",Mg)}function sc(){let n=document.querySelector('input[type="checkbox"][name="pk"]:checked'),e=document.querySelector("div.form.form-horizontal div.btn-list");if(!e)return;let t=e.classList.contains("btn-float-group-left");n!==null&&!t?e.classList.add("btn-float-group-left"):n===null&&t&&e.classList.remove("btn-float-group-left")}function ac(){for(let n of I('input[type="checkbox"][name="pk"]'))n.addEventListener("change",()=>{sc()});for(let n of I('table tr th > input[type="checkbox"].toggle'))n.addEventListener("change",()=>{sc()})}function cc(){var n;(n=window.getSelection())==null||n.removeAllRanges()}function lc(n,e){e.set("element",n)}function Ng(n,e,t){var r,o;let i=!1;for(let s of t){let a=s;if(i===!0&&((r=a.closest("tr"))!=null&&r.classList.contains("d-none")||(a.checked=n.checked)),s===e){if(i===!0){i=!1;return}i=!0,(o=a.closest("tr"))!=null&&o.classList.contains("d-none")||(a.checked=n.checked)}if(s===n){if(i===!0){i=!1;return}i=!0}}}function Ig(n,e){let t=n.target,i=e.get("element");if(lc(t,e),!n.shiftKey)return;if(cc(),i===null)return lc(t,e);let r=I('input[type="checkbox"][name="pk"]');Ng(t,i,r)}function uc(){let n=I('input[type="checkbox"][name="pk"]');for(let e of n)e.addEventListener("click",t=>{cc(),t.stopPropagation(),Ig(t,Xl)})}function Rg(n){let e=n.querySelector("button.preview-button"),t=n.querySelector("textarea"),i=n.querySelector("div.preview");if(!pe(t.style.height)){let{height:r}=t.getBoundingClientRect();t.style.height=`${r}px`}e.addEventListener("htmx:configRequest",r=>{r.detail.parameters={text:t.value||""},r.detail.headers["X-CSRFToken"]=window.CSRF_TOKEN,i.style.minHeight=t.style.height,i.innerHTML=""})}function dc(){for(let n of document.querySelectorAll(".markdown-widget"))Rg(n)}function Hg(n,e){e.setAttribute("data-secret-visibility",n?"hidden":"shown"),e.innerText=n?"Show Secret":"Hide Secret"}function Pg(){let n=pi("secret");if(pe(n)){let e=n.getAttribute("data-secret");pe(e)&&(n.innerText=e)}}function hc(){let n=pi("secret");if(pe(n)){let e=n.getAttribute("data-secret");pe(e)&&(n.innerText="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022")}}function Fg(n,e){n.set("hidden",!n.get("hidden"));let t=n.get("hidden");t?hc():Pg(),Hg(t,e)}function fc(n){Fg(Ql,n.currentTarget)}function pc(){hc();for(let n of I("button.toggle-secret"))n.removeEventListener("click",fc),n.addEventListener("click",fc)}function Tr(){for(let n of[tc,Kl,rc,oc,uc,ac,nc,dc,pc])n()}var es="netbox-color-mode";function Bg(n){return n==="dark"||n==="light"}function $g(n){return localStorage.setItem(es,n)}function Vg(n){var t,i;let e=document.querySelector("body");e&&n=="dark"?e.setAttribute("data-bs-theme","dark"):e&&e.setAttribute("data-bs-theme","light");for(let r of I(".rack_elevation")){let o=(i=(t=r.contentDocument)==null?void 0:t.querySelector("svg"))!=null?i:null;o!==null&&o.setAttribute("data-bs-theme",n)}}function Ht(n){$g(n),Vg(n),window.dispatchEvent(new CustomEvent("netbox.colorModeChanged",{detail:{netboxColorMode:n}}))}function zg(){let n=localStorage.getItem(es);n==="light"?Ht("dark"):n==="dark"?Ht("light"):console.warn("Unable to determine the current color mode")}function jg(){let n=localStorage.getItem(es);if(pe(n))return Ht(n);let e="none";for(let t of["dark","light"])if(window.matchMedia(`(prefers-color-scheme: ${t})`).matches){e=t;break}if(pe(n)&&Bg(n))return Ht(n);switch(e){case"dark":return Ht("dark");case"light":return Ht("light");case"none":return Ht("light");default:return Ht("light")}}function Wg(){for(let n of I("button.color-mode-toggle"))n.addEventListener("click",zg)}function mc(){window.addEventListener("load",jg);for(let n of[Wg])n()}function Cr(){let n=document.querySelectorAll("body > div#django-messages > div.toast");for(let e of n)if(e!==null){let t=new pt(e);t.isShown()||t.show()}}var vc=uu(gc());function Ar(){for(let n of I(".copy-content"))new vc.default(n)}var Sr=["onChange","onClose","onDayCreate","onDestroy","onKeyDown","onMonthChange","onOpen","onParseConfig","onReady","onValueUpdate","onYearChange","onPreCalendarPosition"],Pt={_disable:[],allowInput:!1,allowInvalidPreload:!1,altFormat:"F j, Y",altInput:!1,altInputClass:"form-control input",animate:typeof window=="object"&&window.navigator.userAgent.indexOf("MSIE")===-1,ariaDateFormat:"F j, Y",autoFillDefaultTime:!0,clickOpens:!0,closeOnSelect:!0,conjunction:", ",dateFormat:"Y-m-d",defaultHour:12,defaultMinute:0,defaultSeconds:0,disable:[],disableMobile:!1,enableSeconds:!1,enableTime:!1,errorHandler:function(n){return typeof console!="undefined"&&console.warn(n)},getWeek:function(n){var e=new Date(n.getTime());e.setHours(0,0,0,0),e.setDate(e.getDate()+3-(e.getDay()+6)%7);var t=new Date(e.getFullYear(),0,4);return 1+Math.round(((e.getTime()-t.getTime())/864e5-3+(t.getDay()+6)%7)/7)},hourIncrement:1,ignoredFocusElements:[],inline:!1,locale:"default",minuteIncrement:5,mode:"single",monthSelectorType:"dropdown",nextArrow:"",noCalendar:!1,now:new Date,onChange:[],onClose:[],onDayCreate:[],onDestroy:[],onKeyDown:[],onMonthChange:[],onOpen:[],onParseConfig:[],onReady:[],onValueUpdate:[],onYearChange:[],onPreCalendarPosition:[],plugins:[],position:"auto",positionElement:void 0,prevArrow:"",shorthandCurrentMonth:!1,showMonths:1,static:!1,time_24hr:!1,weekNumbers:!1,wrap:!1};var Dr={weekdays:{shorthand:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],longhand:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},months:{shorthand:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],longhand:["January","February","March","April","May","June","July","August","September","October","November","December"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:function(n){var e=n%100;if(e>3&&e<21)return"th";switch(e%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}},rangeSeparator:" to ",weekAbbreviation:"Wk",scrollTitle:"Scroll to increment",toggleTitle:"Click to toggle",amPM:["AM","PM"],yearAriaLabel:"Year",monthAriaLabel:"Month",hourAriaLabel:"Hour",minuteAriaLabel:"Minute",time_24hr:!1},Or=Dr;var De=function(n,e){return e===void 0&&(e=2),("000"+n).slice(e*-1)},Fe=function(n){return n===!0?1:0};function ns(n,e){var t;return function(){var i=this,r=arguments;clearTimeout(t),t=setTimeout(function(){return n.apply(i,r)},e)}}var Lr=function(n){return n instanceof Array?n:[n]};function Oe(n,e,t){if(t===!0)return n.classList.add(e);n.classList.remove(e)}function te(n,e,t){var i=window.document.createElement(n);return e=e||"",t=t||"",i.className=e,t!==void 0&&(i.textContent=t),i}function yi(n){for(;n.firstChild;)n.removeChild(n.firstChild)}function is(n,e){if(e(n))return n;if(n.parentNode)return is(n.parentNode,e)}function Ei(n,e){var t=te("div","numInputWrapper"),i=te("input","numInput "+n),r=te("span","arrowUp"),o=te("span","arrowDown");if(navigator.userAgent.indexOf("MSIE 9.0")===-1?i.type="number":(i.type="text",i.pattern="\\d*"),e!==void 0)for(var s in e)i.setAttribute(s,e[s]);return t.appendChild(i),t.appendChild(r),t.appendChild(o),t}function Be(n){try{if(typeof n.composedPath=="function"){var e=n.composedPath();return e[0]}return n.target}catch(t){return n.target}}var rs=function(){},bi=function(n,e,t){return t.months[e?"shorthand":"longhand"][n]},yc={D:rs,F:function(n,e,t){n.setMonth(t.months.longhand.indexOf(e))},G:function(n,e){n.setHours((n.getHours()>=12?12:0)+parseFloat(e))},H:function(n,e){n.setHours(parseFloat(e))},J:function(n,e){n.setDate(parseFloat(e))},K:function(n,e,t){n.setHours(n.getHours()%12+12*Fe(new RegExp(t.amPM[1],"i").test(e)))},M:function(n,e,t){n.setMonth(t.months.shorthand.indexOf(e))},S:function(n,e){n.setSeconds(parseFloat(e))},U:function(n,e){return new Date(parseFloat(e)*1e3)},W:function(n,e,t){var i=parseInt(e),r=new Date(n.getFullYear(),0,2+(i-1)*7,0,0,0,0);return r.setDate(r.getDate()-r.getDay()+t.firstDayOfWeek),r},Y:function(n,e){n.setFullYear(parseFloat(e))},Z:function(n,e){return new Date(e)},d:function(n,e){n.setDate(parseFloat(e))},h:function(n,e){n.setHours((n.getHours()>=12?12:0)+parseFloat(e))},i:function(n,e){n.setMinutes(parseFloat(e))},j:function(n,e){n.setDate(parseFloat(e))},l:rs,m:function(n,e){n.setMonth(parseFloat(e)-1)},n:function(n,e){n.setMonth(parseFloat(e)-1)},s:function(n,e){n.setSeconds(parseFloat(e))},u:function(n,e){return new Date(parseFloat(e))},w:rs,y:function(n,e){n.setFullYear(2e3+parseFloat(e))}},yt={D:"",F:"",G:"(\\d\\d|\\d)",H:"(\\d\\d|\\d)",J:"(\\d\\d|\\d)\\w+",K:"",M:"",S:"(\\d\\d|\\d)",U:"(.+)",W:"(\\d\\d|\\d)",Y:"(\\d{4})",Z:"(.+)",d:"(\\d\\d|\\d)",h:"(\\d\\d|\\d)",i:"(\\d\\d|\\d)",j:"(\\d\\d|\\d)",l:"",m:"(\\d\\d|\\d)",n:"(\\d\\d|\\d)",s:"(\\d\\d|\\d)",u:"(.+)",w:"(\\d\\d|\\d)",y:"(\\d{2})"},Mn={Z:function(n){return n.toISOString()},D:function(n,e,t){return e.weekdays.shorthand[Mn.w(n,e,t)]},F:function(n,e,t){return bi(Mn.n(n,e,t)-1,!1,e)},G:function(n,e,t){return De(Mn.h(n,e,t))},H:function(n){return De(n.getHours())},J:function(n,e){return e.ordinal!==void 0?n.getDate()+e.ordinal(n.getDate()):n.getDate()},K:function(n,e){return e.amPM[Fe(n.getHours()>11)]},M:function(n,e){return bi(n.getMonth(),!0,e)},S:function(n){return De(n.getSeconds())},U:function(n){return n.getTime()/1e3},W:function(n,e,t){return t.getWeek(n)},Y:function(n){return De(n.getFullYear(),4)},d:function(n){return De(n.getDate())},h:function(n){return n.getHours()%12?n.getHours()%12:12},i:function(n){return De(n.getMinutes())},j:function(n){return n.getDate()},l:function(n,e){return e.weekdays.longhand[n.getDay()]},m:function(n){return De(n.getMonth()+1)},n:function(n){return n.getMonth()+1},s:function(n){return n.getSeconds()},u:function(n){return n.getTime()},w:function(n){return n.getDay()},y:function(n){return String(n.getFullYear()).substring(2)}};var os=function(n){var e=n.config,t=e===void 0?Pt:e,i=n.l10n,r=i===void 0?Dr:i,o=n.isMobile,s=o===void 0?!1:o;return function(a,l,c){var u=c||r;return t.formatDate!==void 0&&!s?t.formatDate(a,l,u):l.split("").map(function(d,p,y){return Mn[d]&&y[p-1]!=="\\"?Mn[d](a,u,t):d!=="\\"?d:""}).join("")}},Mr=function(n){var e=n.config,t=e===void 0?Pt:e,i=n.l10n,r=i===void 0?Dr:i;return function(o,s,a,l){if(!(o!==0&&!o)){var c=l||r,u,d=o;if(o instanceof Date)u=new Date(o.getTime());else if(typeof o!="string"&&o.toFixed!==void 0)u=new Date(o);else if(typeof o=="string"){var p=s||(t||Pt).dateFormat,y=String(o).trim();if(y==="today")u=new Date,a=!0;else if(t&&t.parseDate)u=t.parseDate(o,p);else if(/Z$/.test(y)||/GMT$/.test(y))u=new Date(o);else{for(var m=void 0,v=[],w=0,T=0,_="";w Math.min(e,t)&&n =0?new Date:new Date(t.config.minDate.getTime()),g=Nr(t.config);h.setHours(g.hours,g.minutes,g.seconds,h.getMilliseconds()),t.selectedDates=[h],t.latestSelectedDateObj=h}f!==void 0&&f.type!=="blur"&&qc(f);var b=t._input.value;d(),st(),t._input.value!==b&&t._debouncedChange()}function c(f,h){return f%12+12*Fe(h===t.l10n.amPM[1])}function u(f){switch(f%24){case 0:case 12:return 12;default:return f%12}}function d(){if(!(t.hourElement===void 0||t.minuteElement===void 0)){var f=(parseInt(t.hourElement.value.slice(-2),10)||0)%24,h=(parseInt(t.minuteElement.value,10)||0)%60,g=t.secondElement!==void 0?(parseInt(t.secondElement.value,10)||0)%60:0;t.amPM!==void 0&&(f=c(f,t.amPM.textContent));var b=t.config.minTime!==void 0||t.config.minDate&&t.minDateHasTime&&t.latestSelectedDateObj&&$e(t.latestSelectedDateObj,t.config.minDate,!0)===0,C=t.config.maxTime!==void 0||t.config.maxDate&&t.maxDateHasTime&&t.latestSelectedDateObj&&$e(t.latestSelectedDateObj,t.config.maxDate,!0)===0;if(t.config.maxTime!==void 0&&t.config.minTime!==void 0&&t.config.minTime>t.config.maxTime){var k=kr(t.config.minTime.getHours(),t.config.minTime.getMinutes(),t.config.minTime.getSeconds()),X=kr(t.config.maxTime.getHours(),t.config.maxTime.getMinutes(),t.config.maxTime.getSeconds()),P=kr(f,h,g);if(P>X&&P =12)]),t.secondElement!==void 0&&(t.secondElement.value=De(g)))}function m(f){var h=Be(f),g=parseInt(h.value)+(f.delta||0);(g/1e3>1||f.key==="Enter"&&!/[^\d]/.test(g.toString()))&&Z(g)}function v(f,h,g,b){if(h instanceof Array)return h.forEach(function(C){return v(f,C,g,b)});if(f instanceof Array)return f.forEach(function(C){return v(C,h,g,b)});f.addEventListener(h,g,b),t._handlers.push({remove:function(){return f.removeEventListener(h,g,b)}})}function w(){ue("onChange")}function T(){if(t.config.wrap&&["open","close","toggle","clear"].forEach(function(g){Array.prototype.forEach.call(t.element.querySelectorAll("[data-"+g+"]"),function(b){return v(b,"click",t[g])})}),t.isMobile){Vc();return}var f=ns(Ti,50);if(t._debouncedChange=ns(w,qg),t.daysContainer&&!/iPhone|iPad|iPod/i.test(navigator.userAgent)&&v(t.daysContainer,"mouseover",function(g){t.config.mode==="range"&&sn(Be(g))}),v(t._input,"keydown",on),t.calendarContainer!==void 0&&v(t.calendarContainer,"keydown",on),!t.config.inline&&!t.config.static&&v(window,"resize",f),window.ontouchstart!==void 0?v(window.document,"touchstart",U):v(window.document,"mousedown",U),v(window.document,"focus",U,{capture:!0}),t.config.clickOpens===!0&&(v(t._input,"focus",t.open),v(t._input,"click",t.open)),t.daysContainer!==void 0&&(v(t.monthNav,"click",Wc),v(t.monthNav,["keyup","increment"],m),v(t.daysContainer,"click",un)),t.timeContainer!==void 0&&t.minuteElement!==void 0&&t.hourElement!==void 0){var h=function(g){return Be(g).select()};v(t.timeContainer,["increment"],l),v(t.timeContainer,"blur",l,{capture:!0}),v(t.timeContainer,"click",S),v([t.hourElement,t.minuteElement],["focus","click"],h),t.secondElement!==void 0&&v(t.secondElement,"focus",function(){return t.secondElement&&t.secondElement.select()}),t.amPM!==void 0&&v(t.amPM,"click",function(g){l(g)})}t.config.allowInput&&v(t._input,"blur",Br)}function _(f,h){var g=f!==void 0?t.parseDate(f):t.latestSelectedDateObj||(t.config.minDate&&t.config.minDate>t.now?t.config.minDate:t.config.maxDate&&t.config.maxDate 1),t.calendarContainer.appendChild(f);var C=t.config.appendTo!==void 0&&t.config.appendTo.nodeType!==void 0;if((t.config.inline||t.config.static)&&(t.calendarContainer.classList.add(t.config.inline?"inline":"static"),t.config.inline&&(!C&&t.element.parentNode?t.element.parentNode.insertBefore(t.calendarContainer,t._input.nextSibling):t.config.appendTo!==void 0&&t.config.appendTo.appendChild(t.calendarContainer)),t.config.static)){var k=te("div","flatpickr-wrapper");t.element.parentNode&&t.element.parentNode.insertBefore(k,t.element),k.appendChild(t.element),t.altInput&&k.appendChild(t.altInput),k.appendChild(t.calendarContainer)}!t.config.static&&!t.config.inline&&(t.config.appendTo!==void 0?t.config.appendTo:window.document.body).appendChild(t.calendarContainer)}function z(f,h,g,b){var C=oe(h,!0),k=te("span",f,h.getDate().toString());return k.dateObj=h,k.$i=b,k.setAttribute("aria-label",t.formatDate(h,t.config.ariaDateFormat)),f.indexOf("hidden")===-1&&$e(h,t.now)===0&&(t.todayDateElem=k,k.classList.add("today"),k.setAttribute("aria-current","date")),C?(k.tabIndex=-1,zr(h)&&(k.classList.add("selected"),t.selectedDateElem=k,t.config.mode==="range"&&(Oe(k,"startRange",t.selectedDates[0]&&$e(h,t.selectedDates[0],!0)===0),Oe(k,"endRange",t.selectedDates[1]&&$e(h,t.selectedDates[1],!0)===0),f==="nextMonthDay"&&k.classList.add("inRange")))):k.classList.add("flatpickr-disabled"),t.config.mode==="range"&&jc(h)&&!zr(h)&&k.classList.add("inRange"),t.weekNumbers&&t.config.showMonths===1&&f!=="prevMonthDay"&&b%7===6&&t.weekNumbers.insertAdjacentHTML("beforeend",""+t.config.getWeek(h)+""),ue("onDayCreate",k),k}function L(f){f.focus(),t.config.mode==="range"&&sn(f)}function H(f){for(var h=f>0?0:t.config.showMonths-1,g=f>0?t.config.showMonths:-1,b=h;b!=g;b+=f)for(var C=t.daysContainer.children[b],k=f>0?0:C.children.length-1,X=f>0?C.children.length:-1,P=k;P!=X;P+=f){var Q=C.children[P];if(Q.className.indexOf("hidden")===-1&&oe(Q.dateObj))return Q}}function N(f,h){for(var g=f.className.indexOf("Month")===-1?f.dateObj.getMonth():t.currentMonth,b=h>0?t.config.showMonths:-1,C=h>0?1:-1,k=g-t.currentMonth;k!=b;k+=C)for(var X=t.daysContainer.children[k],P=g-t.currentMonth===k?f.$i+h:h<0?X.children.length-1:0,Q=X.children.length,R=P;R>=0&&R 0?Q:-1);R+=C){var G=X.children[R];if(G.className.indexOf("hidden")===-1&&oe(G.dateObj)&&Math.abs(f.$i-R)>=Math.abs(h))return L(G)}t.changeMonth(C),Y(H(C),0)}function Y(f,h){var g=o(),b=bt(g||document.body),C=f!==void 0?f:b?g:t.selectedDateElem!==void 0&&bt(t.selectedDateElem)?t.selectedDateElem:t.todayDateElem!==void 0&&bt(t.todayDateElem)?t.todayDateElem:H(h>0?1:-1);C===void 0?t._input.focus():b?N(C,h):L(C)}function B(f,h){for(var g=(new Date(f,h,1).getDay()-t.l10n.firstDayOfWeek+7)%7,b=t.utils.getDaysInMonth((h-1+12)%12,f),C=t.utils.getDaysInMonth(h,f),k=window.document.createDocumentFragment(),X=t.config.showMonths>1,P=X?"prevMonthDay hidden":"prevMonthDay",Q=X?"nextMonthDay hidden":"nextMonthDay",R=b+1-g,G=0;R<=b;R++,G++)k.appendChild(z("flatpickr-day "+P,new Date(f,h-1,R),R,G));for(R=1;R<=C;R++,G++)k.appendChild(z("flatpickr-day",new Date(f,h,R),R,G));for(var re=C+1;re<=42-g&&(t.config.showMonths===1||G%7!==0);re++,G++)k.appendChild(z("flatpickr-day "+Q,new Date(f,h+1,re%C),re,G));var it=te("div","dayContainer");return it.appendChild(k),it}function ie(){if(t.daysContainer!==void 0){yi(t.daysContainer),t.weekNumbers&&yi(t.weekNumbers);for(var f=document.createDocumentFragment(),h=0;h1||t.config.monthSelectorType!=="dropdown")){var f=function(b){return t.config.minDate!==void 0&&t.currentYear===t.config.minDate.getFullYear()&&b t.config.maxDate.getMonth())};t.monthsDropdownContainer.tabIndex=-1,t.monthsDropdownContainer.innerHTML="";for(var h=0;h<12;h++)if(f(h)){var g=te("option","flatpickr-monthDropdown-month");g.value=new Date(t.currentYear,h).getMonth().toString(),g.textContent=bi(h,t.config.shorthandCurrentMonth,t.l10n),g.tabIndex=-1,t.currentMonth===h&&(g.selected=!0),t.monthsDropdownContainer.appendChild(g)}}}function Te(){var f=te("div","flatpickr-month"),h=window.document.createDocumentFragment(),g;t.config.showMonths>1||t.config.monthSelectorType==="static"?g=te("span","cur-month"):(t.monthsDropdownContainer=te("select","flatpickr-monthDropdown-months"),t.monthsDropdownContainer.setAttribute("aria-label",t.l10n.monthAriaLabel),v(t.monthsDropdownContainer,"change",function(X){var P=Be(X),Q=parseInt(P.value,10);t.changeMonth(Q-t.currentMonth),ue("onMonthChange")}),J(),g=t.monthsDropdownContainer);var b=Ei("cur-year",{tabindex:"-1"}),C=b.getElementsByTagName("input")[0];C.setAttribute("aria-label",t.l10n.yearAriaLabel),t.config.minDate&&C.setAttribute("min",t.config.minDate.getFullYear().toString()),t.config.maxDate&&(C.setAttribute("max",t.config.maxDate.getFullYear().toString()),C.disabled=!!t.config.minDate&&t.config.minDate.getFullYear()===t.config.maxDate.getFullYear());var k=te("div","flatpickr-current-month");return k.appendChild(g),k.appendChild(b),h.appendChild(k),f.appendChild(h),{container:f,yearElement:C,monthElement:g}}function Ce(){yi(t.monthNav),t.monthNav.appendChild(t.prevMonthNav),t.config.showMonths&&(t.yearElements=[],t.monthElements=[]);for(var f=t.config.showMonths;f--;){var h=Te();t.yearElements.push(h.yearElement),t.monthElements.push(h.monthElement),t.monthNav.appendChild(h.container)}t.monthNav.appendChild(t.nextMonthNav)}function se(){return t.monthNav=te("div","flatpickr-months"),t.yearElements=[],t.monthElements=[],t.prevMonthNav=te("span","flatpickr-prev-month"),t.prevMonthNav.innerHTML=t.config.prevArrow,t.nextMonthNav=te("span","flatpickr-next-month"),t.nextMonthNav.innerHTML=t.config.nextArrow,Ce(),Object.defineProperty(t,"_hidePrevMonthArrow",{get:function(){return t.__hidePrevMonthArrow},set:function(f){t.__hidePrevMonthArrow!==f&&(Oe(t.prevMonthNav,"flatpickr-disabled",f),t.__hidePrevMonthArrow=f)}}),Object.defineProperty(t,"_hideNextMonthArrow",{get:function(){return t.__hideNextMonthArrow},set:function(f){t.__hideNextMonthArrow!==f&&(Oe(t.nextMonthNav,"flatpickr-disabled",f),t.__hideNextMonthArrow=f)}}),t.currentYearElement=t.yearElements[0],Li(),t.monthNav}function ne(){t.calendarContainer.classList.add("hasTime"),t.config.noCalendar&&t.calendarContainer.classList.add("noCalendar");var f=Nr(t.config);t.timeContainer=te("div","flatpickr-time"),t.timeContainer.tabIndex=-1;var h=te("span","flatpickr-time-separator",":"),g=Ei("flatpickr-hour",{"aria-label":t.l10n.hourAriaLabel});t.hourElement=g.getElementsByTagName("input")[0];var b=Ei("flatpickr-minute",{"aria-label":t.l10n.minuteAriaLabel});if(t.minuteElement=b.getElementsByTagName("input")[0],t.hourElement.tabIndex=t.minuteElement.tabIndex=-1,t.hourElement.value=De(t.latestSelectedDateObj?t.latestSelectedDateObj.getHours():t.config.time_24hr?f.hours:u(f.hours)),t.minuteElement.value=De(t.latestSelectedDateObj?t.latestSelectedDateObj.getMinutes():f.minutes),t.hourElement.setAttribute("step",t.config.hourIncrement.toString()),t.minuteElement.setAttribute("step",t.config.minuteIncrement.toString()),t.hourElement.setAttribute("min",t.config.time_24hr?"0":"1"),t.hourElement.setAttribute("max",t.config.time_24hr?"23":"12"),t.hourElement.setAttribute("maxlength","2"),t.minuteElement.setAttribute("min","0"),t.minuteElement.setAttribute("max","59"),t.minuteElement.setAttribute("maxlength","2"),t.timeContainer.appendChild(g),t.timeContainer.appendChild(h),t.timeContainer.appendChild(b),t.config.time_24hr&&t.timeContainer.classList.add("time24hr"),t.config.enableSeconds){t.timeContainer.classList.add("hasSeconds");var C=Ei("flatpickr-second");t.secondElement=C.getElementsByTagName("input")[0],t.secondElement.value=De(t.latestSelectedDateObj?t.latestSelectedDateObj.getSeconds():f.seconds),t.secondElement.setAttribute("step",t.minuteElement.getAttribute("step")),t.secondElement.setAttribute("min","0"),t.secondElement.setAttribute("max","59"),t.secondElement.setAttribute("maxlength","2"),t.timeContainer.appendChild(te("span","flatpickr-time-separator",":")),t.timeContainer.appendChild(C)}return t.config.time_24hr||(t.amPM=te("span","flatpickr-am-pm",t.l10n.amPM[Fe((t.latestSelectedDateObj?t.hourElement.value:t.config.defaultHour)>11)]),t.amPM.title=t.l10n.toggleTitle,t.amPM.tabIndex=-1,t.timeContainer.appendChild(t.amPM)),t.timeContainer}function qe(){t.weekdayContainer?yi(t.weekdayContainer):t.weekdayContainer=te("div","flatpickr-weekdays");for(var f=t.config.showMonths;f--;){var h=te("div","flatpickr-weekdaycontainer");t.weekdayContainer.appendChild(h)}return Re(),t.weekdayContainer}function Re(){if(t.weekdayContainer){var f=t.l10n.firstDayOfWeek,h=wc(t.l10n.weekdays.shorthand);f>0&&f `+h.join("")+` - `}}function W(){t.calendarContainer.classList.add("hasWeeks");var f=te("div","flatpickr-weekwrapper");f.appendChild(te("span","flatpickr-weekday",t.l10n.weekAbbreviation));var h=te("div","flatpickr-weeks");return f.appendChild(h),{weekWrapper:f,weekNumbers:h}}function M(f,h){h===void 0&&(h=!0);var g=h?f:f-t.currentMonth;g<0&&t._hidePrevMonthArrow===!0||g>0&&t._hideNextMonthArrow===!0||(t.currentMonth+=g,(t.currentMonth<0||t.currentMonth>11)&&(t.currentYear+=t.currentMonth>11?1:-1,t.currentMonth=(t.currentMonth+12)%12,ue("onYearChange"),J()),ie(),ue("onMonthChange"),Li())}function D(f,h){if(f===void 0&&(f=!0),h===void 0&&(h=!0),t.input.value="",t.altInput!==void 0&&(t.altInput.value=""),t.mobileInput!==void 0&&(t.mobileInput.value=""),t.selectedDates=[],t.latestSelectedDateObj=void 0,h===!0&&(t.currentYear=t._initialDate.getFullYear(),t.currentMonth=t._initialDate.getMonth()),t.config.enableTime===!0){var g=Nr(t.config),b=g.hours,C=g.minutes,k=g.seconds;y(b,C,k)}t.redraw(),f&&ue("onChange")}function B(){t.isOpen=!1,t.isMobile||(t.calendarContainer!==void 0&&t.calendarContainer.classList.remove("open"),t._input!==void 0&&t._input.classList.remove("active")),ue("onClose")}function V(){t.config!==void 0&&ue("onDestroy");for(var f=t._handlers.length;f--;)t._handlers[f].remove();if(t._handlers=[],t.mobileInput)t.mobileInput.parentNode&&t.mobileInput.parentNode.removeChild(t.mobileInput),t.mobileInput=void 0;else if(t.calendarContainer&&t.calendarContainer.parentNode)if(t.config.static&&t.calendarContainer.parentNode){var h=t.calendarContainer.parentNode;if(h.lastChild&&h.removeChild(h.lastChild),h.parentNode){for(;h.firstChild;)h.parentNode.insertBefore(h.firstChild,h);h.parentNode.removeChild(h)}}else t.calendarContainer.parentNode.removeChild(t.calendarContainer);t.altInput&&(t.input.type="text",t.altInput.parentNode&&t.altInput.parentNode.removeChild(t.altInput),delete t.altInput),t.input&&(t.input.type=t.input._type,t.input.classList.remove("flatpickr-input"),t.input.removeAttribute("readonly")),["_showTimeInput","latestSelectedDateObj","_hideNextMonthArrow","_hidePrevMonthArrow","__hideNextMonthArrow","__hidePrevMonthArrow","isMobile","isOpen","selectedDateElem","minDateHasTime","maxDateHasTime","days","daysContainer","_input","_positionElement","innerContainer","rContainer","monthNav","todayDateElem","calendarContainer","weekdayContainer","prevMonthNav","nextMonthNav","monthsDropdownContainer","currentMonthElement","currentYearElement","navigationCurrentMonth","selectedDateElem","config"].forEach(function(g){try{delete t[g]}catch(b){}})}function q(f){return t.calendarContainer.contains(f)}function U(f){if(t.isOpen&&!t.config.inline){var h=$e(f),g=q(h),b=h===t.input||h===t.altInput||t.element.contains(h)||f.path&&f.path.indexOf&&(~f.path.indexOf(t.input)||~f.path.indexOf(t.altInput)),C=!b&&!g&&!q(f.relatedTarget),k=!t.config.ignoredFocusElements.some(function(X){return X.contains(h)});C&&k&&(t.config.allowInput&&t.setDate(t._input.value,!1,t.config.altInput?t.config.altFormat:t.config.dateFormat),t.timeContainer!==void 0&&t.minuteElement!==void 0&&t.hourElement!==void 0&&t.input.value!==""&&t.input.value!==void 0&&l(),t.close(),t.config&&t.config.mode==="range"&&t.selectedDates.length===1&&t.clear(!1))}}function Z(f){if(!(!f||t.config.minDate&&f t.config.maxDate.getFullYear())){var h=f,g=t.currentYear!==h;t.currentYear=h||t.currentYear,t.config.maxDate&&t.currentYear===t.config.maxDate.getFullYear()?t.currentMonth=Math.min(t.config.maxDate.getMonth(),t.currentMonth):t.config.minDate&&t.currentYear===t.config.minDate.getFullYear()&&(t.currentMonth=Math.max(t.config.minDate.getMonth(),t.currentMonth)),g&&(t.redraw(),ue("onYearChange"),J())}}function oe(f,h){var g;h===void 0&&(h=!0);var b=t.parseDate(f,void 0,h);if(t.config.minDate&&b&&Be(b,t.config.minDate,h!==void 0?h:!t.minDateHasTime)<0||t.config.maxDate&&b&&Be(b,t.config.maxDate,h!==void 0?h:!t.maxDateHasTime)>0)return!1;if(!t.config.enable&&t.config.disable.length===0)return!0;if(b===void 0)return!1;for(var C=!!t.config.enable,k=(g=t.config.enable)!==null&&g!==void 0?g:t.config.disable,X=0,P=void 0;X =P.from.getTime()&&b.getTime()<=P.to.getTime())return C}return!C}function bt(f){return t.daysContainer!==void 0?f.className.indexOf("hidden")===-1&&f.className.indexOf("flatpickr-disabled")===-1&&t.daysContainer.contains(f):!1}function $r(f){var h=f.target===t._input,g=t._input.value.trimEnd()!==jr();h&&g&&!(f.relatedTarget&&q(f.relatedTarget))&&t.setDate(t._input.value,!0,f.target===t.altInput?t.config.altFormat:t.config.dateFormat)}function on(f){var h=$e(f),g=t.config.wrap?n.contains(h):h===t._input,b=t.config.allowInput,C=t.isOpen&&(!b||!g),k=t.config.inline&&g&&!b;if(f.keyCode===13&&g){if(b)return t.setDate(t._input.value,!0,h===t.altInput?t.config.altFormat:t.config.dateFormat),t.close(),h.blur();t.open()}else if(q(h)||C||k){var X=!!t.timeContainer&&t.timeContainer.contains(h);switch(f.keyCode){case 13:X?(f.preventDefault(),l(),cn()):un(f);break;case 27:f.preventDefault(),cn();break;case 8:case 46:g&&!t.config.allowInput&&(f.preventDefault(),t.clear());break;case 37:case 39:if(!X&&!g){f.preventDefault();var P=o();if(t.daysContainer!==void 0&&(b===!1||P&&bt(P))){var Q=f.keyCode===39?1:-1;f.ctrlKey?(f.stopPropagation(),M(Q),Y(H(1),0)):Y(void 0,Q)}}else t.hourElement&&t.hourElement.focus();break;case 38:case 40:f.preventDefault();var R=f.keyCode===40?1:-1;t.daysContainer&&h.$i!==void 0||h===t.input||h===t.altInput?f.ctrlKey?(f.stopPropagation(),Z(t.currentYear-R),Y(H(1),0)):X||Y(void 0,R*7):h===t.currentYearElement?Z(t.currentYear-R):t.config.enableTime&&(!X&&t.hourElement&&t.hourElement.focus(),l(f),t._debouncedChange());break;case 9:if(X){var G=[t.hourElement,t.minuteElement,t.secondElement,t.amPM].concat(t.pluginElements).filter(function(ze){return ze}),re=G.indexOf(h);if(re!==-1){var it=G[re+(f.shiftKey?-1:1)];f.preventDefault(),(it||t._input).focus()}}else!t.config.noCalendar&&t.daysContainer&&t.daysContainer.contains(h)&&f.shiftKey&&(f.preventDefault(),t._input.focus());break;default:break}}if(t.amPM!==void 0&&h===t.amPM)switch(f.key){case t.l10n.amPM[0].charAt(0):case t.l10n.amPM[0].charAt(0).toLowerCase():t.amPM.textContent=t.l10n.amPM[0],d(),st();break;case t.l10n.amPM[1].charAt(0):case t.l10n.amPM[1].charAt(0).toLowerCase():t.amPM.textContent=t.l10n.amPM[1],d(),st();break}(g||q(h))&&ue("onKeyDown",f)}function sn(f,h){if(h===void 0&&(h="flatpickr-day"),!(t.selectedDates.length!==1||f&&(!f.classList.contains(h)||f.classList.contains("flatpickr-disabled")))){for(var g=f?f.dateObj.getTime():t.days.firstElementChild.dateObj.getTime(),b=t.parseDate(t.selectedDates[0],void 0,!0).getTime(),C=Math.min(g,t.selectedDates[0].getTime()),k=Math.max(g,t.selectedDates[0].getTime()),X=!1,P=0,Q=0,R=C;R C&&R P)?P=R:R>b&&(!Q||R ."+h));G.forEach(function(re){var it=re.dateObj,ze=it.getTime(),zn=P>0&&ze0&&ze>Q;if(zn){re.classList.add("notAllowed"),["inRange","startRange","endRange"].forEach(function(dn){re.classList.remove(dn)});return}else if(X&&!zn)return;["startRange","inRange","endRange","notAllowed"].forEach(function(dn){re.classList.remove(dn)}),f!==void 0&&(f.classList.add(g<=t.selectedDates[0].getTime()?"startRange":"endRange"),b
g&&ze===b&&re.classList.add("endRange"),ze>=P&&(Q===0||ze<=Q)&&Ec(ze,b,g)&&re.classList.add("inRange"))})}}function Ti(){t.isOpen&&!t.config.static&&!t.config.inline&&an()}function Br(f,h){if(h===void 0&&(h=t._positionElement),t.isMobile===!0){if(f){f.preventDefault();var g=$e(f);g&&g.blur()}t.mobileInput!==void 0&&(t.mobileInput.focus(),t.mobileInput.click()),ue("onOpen");return}else if(t._input.disabled||t.config.inline)return;var b=t.isOpen;t.isOpen=!0,b||(t.calendarContainer.classList.add("open"),t._input.classList.add("active"),ue("onOpen"),an(h)),t.config.enableTime===!0&&t.config.noCalendar===!0&&t.config.allowInput===!1&&(f===void 0||!t.timeContainer.contains(f.relatedTarget))&&setTimeout(function(){return t.hourElement.select()},50)}function Ci(f){return function(h){var g=t.config["_"+f+"Date"]=t.parseDate(h,t.config.dateFormat),b=t.config["_"+(f==="min"?"max":"min")+"Date"];g!==void 0&&(t[f==="min"?"minDateHasTime":"maxDateHasTime"]=g.getHours()>0||g.getMinutes()>0||g.getSeconds()>0),t.selectedDates&&(t.selectedDates=t.selectedDates.filter(function(C){return oe(C)}),!t.selectedDates.length&&f==="min"&&p(g),st()),t.daysContainer&&(Bn(),g!==void 0?t.currentYearElement[f]=g.getFullYear().toString():t.currentYearElement.removeAttribute(f),t.currentYearElement.disabled=!!b&&g!==void 0&&b.getFullYear()===g.getFullYear())}}function Ai(){var f=["wrap","weekNumbers","allowInput","allowInvalidPreload","clickOpens","time_24hr","enableTime","noCalendar","altInput","shorthandCurrentMonth","inline","static","enableSeconds","disableMobile"],h=Le(Le({},JSON.parse(JSON.stringify(n.dataset||{}))),e),g={};t.config.parseDate=h.parseDate,t.config.formatDate=h.formatDate,Object.defineProperty(t.config,"enable",{get:function(){return t.config._enable},set:function(G){t.config._enable=fs(G)}}),Object.defineProperty(t.config,"disable",{get:function(){return t.config._disable},set:function(G){t.config._disable=fs(G)}});var b=h.mode==="time";if(!h.dateFormat&&(h.enableTime||b)){var C=Ee.defaultConfig.dateFormat||Pt.dateFormat;g.dateFormat=h.noCalendar||b?"H:i"+(h.enableSeconds?":S":""):C+" H:i"+(h.enableSeconds?":S":"")}if(h.altInput&&(h.enableTime||b)&&!h.altFormat){var k=Ee.defaultConfig.altFormat||Pt.altFormat;g.altFormat=h.noCalendar||b?"h:i"+(h.enableSeconds?":S K":" K"):k+(" h:i"+(h.enableSeconds?":S":"")+" K")}Object.defineProperty(t.config,"minDate",{get:function(){return t.config._minDate},set:Ci("min")}),Object.defineProperty(t.config,"maxDate",{get:function(){return t.config._maxDate},set:Ci("max")});var X=function(G){return function(re){t.config[G==="min"?"_minTime":"_maxTime"]=t.parseDate(re,"H:i:S")}};Object.defineProperty(t.config,"minTime",{get:function(){return t.config._minTime},set:X("min")}),Object.defineProperty(t.config,"maxTime",{get:function(){return t.config._maxTime},set:X("max")}),h.mode==="time"&&(t.config.noCalendar=!0,t.config.enableTime=!0),Object.assign(t.config,g,h);for(var P=0;P -1?t.config[R]=Lr(Q[R]).map(s).concat(t.config[R]):typeof h[R]=="undefined"&&(t.config[R]=Q[R])}h.altInputClass||(t.config.altInputClass=$n().className+" "+t.config.altInputClass),ue("onParseConfig")}function $n(){return t.config.wrap?n.querySelector("[data-input]"):n}function Si(){typeof t.config.locale!="object"&&typeof Ee.l10ns[t.config.locale]=="undefined"&&t.config.errorHandler(new Error("flatpickr: invalid locale "+t.config.locale)),t.l10n=Le(Le({},Ee.l10ns.default),typeof t.config.locale=="object"?t.config.locale:t.config.locale!=="default"?Ee.l10ns[t.config.locale]:void 0),yt.D="("+t.l10n.weekdays.shorthand.join("|")+")",yt.l="("+t.l10n.weekdays.longhand.join("|")+")",yt.M="("+t.l10n.months.shorthand.join("|")+")",yt.F="("+t.l10n.months.longhand.join("|")+")",yt.K="("+t.l10n.amPM[0]+"|"+t.l10n.amPM[1]+"|"+t.l10n.amPM[0].toLowerCase()+"|"+t.l10n.amPM[1].toLowerCase()+")";var f=Le(Le({},e),JSON.parse(JSON.stringify(n.dataset||{})));f.time_24hr===void 0&&Ee.defaultConfig.time_24hr===void 0&&(t.config.time_24hr=t.l10n.time_24hr),t.formatDate=os(t),t.parseDate=Mr({config:t.config,l10n:t.l10n})}function an(f){if(typeof t.config.position=="function")return void t.config.position(t,f);if(t.calendarContainer!==void 0){ue("onPreCalendarPosition");var h=f||t._positionElement,g=Array.prototype.reduce.call(t.calendarContainer.children,function(Zc,eu){return Zc+eu.offsetHeight},0),b=t.calendarContainer.offsetWidth,C=t.config.position.split(" "),k=C[0],X=C.length>1?C[1]:null,P=h.getBoundingClientRect(),Q=window.innerHeight-P.bottom,R=k==="above"||k!=="below"&&Q g,G=window.pageYOffset+P.top+(R?-g-2:h.offsetHeight+2);if(Oe(t.calendarContainer,"arrowTop",!R),Oe(t.calendarContainer,"arrowBottom",R),!t.config.inline){var re=window.pageXOffset+P.left,it=!1,ze=!1;X==="center"?(re-=(b-P.width)/2,it=!0):X==="right"&&(re-=b-P.width,ze=!0),Oe(t.calendarContainer,"arrowLeft",!it&&!ze),Oe(t.calendarContainer,"arrowCenter",it),Oe(t.calendarContainer,"arrowRight",ze);var zn=window.document.body.offsetWidth-(window.pageXOffset+P.right),dn=re+b>window.document.body.offsetWidth,Uc=zn+b>window.document.body.offsetWidth;if(Oe(t.calendarContainer,"rightMost",dn),!t.config.static)if(t.calendarContainer.style.top=G+"px",!dn)t.calendarContainer.style.left=re+"px",t.calendarContainer.style.right="auto";else if(!Uc)t.calendarContainer.style.left="auto",t.calendarContainer.style.right=zn+"px";else{var Wr=ot();if(Wr===void 0)return;var Yc=window.document.body.offsetWidth,Gc=Math.max(0,Yc/2-b/2),Kc=".flatpickr-calendar.centerMost:before",Xc=".flatpickr-calendar.centerMost:after",Qc=Wr.cssRules.length,Jc="{left:"+P.left+"px;right:auto;}";Oe(t.calendarContainer,"rightMost",!1),Oe(t.calendarContainer,"centerMost",!0),Wr.insertRule(Kc+","+Xc+Jc,Qc),t.calendarContainer.style.left=Gc+"px",t.calendarContainer.style.right="auto"}}}}function ot(){for(var f=null,h=0;h t.currentMonth+t.config.showMonths-1)&&t.config.mode!=="range";if(t.selectedDateElem=b,t.config.mode==="single")t.selectedDates=[C];else if(t.config.mode==="multiple"){var X=zr(C);X?t.selectedDates.splice(parseInt(X),1):t.selectedDates.push(C)}else t.config.mode==="range"&&(t.selectedDates.length===2&&t.clear(!1,!1),t.latestSelectedDateObj=C,t.selectedDates.push(C),Be(C,t.selectedDates[0],!0)!==0&&t.selectedDates.sort(function(G,re){return G.getTime()-re.getTime()}));if(d(),k){var P=t.currentYear!==C.getFullYear();t.currentYear=C.getFullYear(),t.currentMonth=C.getMonth(),P&&(ue("onYearChange"),J()),ue("onMonthChange")}if(Li(),ie(),st(),!k&&t.config.mode!=="range"&&t.config.showMonths===1?L(b):t.selectedDateElem!==void 0&&t.hourElement===void 0&&t.selectedDateElem&&t.selectedDateElem.focus(),t.hourElement!==void 0&&t.hourElement!==void 0&&t.hourElement.focus(),t.config.closeOnSelect){var Q=t.config.mode==="single"&&!t.config.enableTime,R=t.config.mode==="range"&&t.selectedDates.length===2&&!t.config.enableTime;(Q||R)&&cn()}w()}}var $t={locale:[Si,Re],showMonths:[Ce,a,qe],minDate:[_],maxDate:[_],positionElement:[hs],clickOpens:[function(){t.config.clickOpens===!0?(v(t._input,"focus",t.open),v(t._input,"click",t.open)):(t._input.removeEventListener("focus",t.open),t._input.removeEventListener("click",t.open))}]};function Di(f,h){if(f!==null&&typeof f=="object"){Object.assign(t.config,f);for(var g in f)$t[g]!==void 0&&$t[g].forEach(function(b){return b()})}else t.config[f]=h,$t[f]!==void 0?$t[f].forEach(function(b){return b()}):Sr.indexOf(f)>-1&&(t.config[f]=Lr(h));t.redraw(),st(!0)}function Vn(f,h){var g=[];if(f instanceof Array)g=f.map(function(b){return t.parseDate(b,h)});else if(f instanceof Date||typeof f=="number")g=[t.parseDate(f,h)];else if(typeof f=="string")switch(t.config.mode){case"single":case"time":g=[t.parseDate(f,h)];break;case"multiple":g=f.split(t.config.conjunction).map(function(b){return t.parseDate(b,h)});break;case"range":g=f.split(t.l10n.rangeSeparator).map(function(b){return t.parseDate(b,h)});break;default:break}else t.config.errorHandler(new Error("Invalid date supplied: "+JSON.stringify(f)));t.selectedDates=t.config.allowInvalidPreload?g:g.filter(function(b){return b instanceof Date&&oe(b,!1)}),t.config.mode==="range"&&t.selectedDates.sort(function(b,C){return b.getTime()-C.getTime()})}function Oi(f,h,g){if(h===void 0&&(h=!1),g===void 0&&(g=t.config.dateFormat),f!==0&&!f||f instanceof Array&&f.length===0)return t.clear(h);Vn(f,g),t.latestSelectedDateObj=t.selectedDates[t.selectedDates.length-1],t.redraw(),_(void 0,h),p(),t.selectedDates.length===0&&t.clear(!1),st(h),h&&ue("onChange")}function fs(f){return f.slice().map(function(h){return typeof h=="string"||typeof h=="number"||h instanceof Date?t.parseDate(h,void 0,!0):h&&typeof h=="object"&&h.from&&h.to?{from:t.parseDate(h.from,void 0),to:t.parseDate(h.to,void 0)}:h}).filter(function(h){return h})}function $c(){t.selectedDates=[],t.now=t.parseDate(t.config.now)||new Date;var f=t.config.defaultDate||((t.input.nodeName==="INPUT"||t.input.nodeName==="TEXTAREA")&&t.input.placeholder&&t.input.value===t.input.placeholder?null:t.input.value);f&&Vn(f,t.config.dateFormat),t._initialDate=t.selectedDates.length>0?t.selectedDates[0]:t.config.minDate&&t.config.minDate.getTime()>t.now.getTime()?t.config.minDate:t.config.maxDate&&t.config.maxDate.getTime() 0&&(t.latestSelectedDateObj=t.selectedDates[0]),t.config.minTime!==void 0&&(t.config.minTime=t.parseDate(t.config.minTime,"H:i")),t.config.maxTime!==void 0&&(t.config.maxTime=t.parseDate(t.config.maxTime,"H:i")),t.minDateHasTime=!!t.config.minDate&&(t.config.minDate.getHours()>0||t.config.minDate.getMinutes()>0||t.config.minDate.getSeconds()>0),t.maxDateHasTime=!!t.config.maxDate&&(t.config.maxDate.getHours()>0||t.config.maxDate.getMinutes()>0||t.config.maxDate.getSeconds()>0)}function Bc(){if(t.input=$n(),!t.input){t.config.errorHandler(new Error("Invalid input element specified"));return}t.input._type=t.input.type,t.input.type="text",t.input.classList.add("flatpickr-input"),t._input=t.input,t.config.altInput&&(t.altInput=te(t.input.nodeName,t.config.altInputClass),t._input=t.altInput,t.altInput.placeholder=t.input.placeholder,t.altInput.disabled=t.input.disabled,t.altInput.required=t.input.required,t.altInput.tabIndex=t.input.tabIndex,t.altInput.type="text",t.input.setAttribute("type","hidden"),!t.config.static&&t.input.parentNode&&t.input.parentNode.insertBefore(t.altInput,t.input.nextSibling)),t.config.allowInput||t._input.setAttribute("readonly","readonly"),hs()}function hs(){t._positionElement=t.config.positionElement||t._input}function Vc(){var f=t.config.enableTime?t.config.noCalendar?"time":"datetime-local":"date";t.mobileInput=te("input",t.input.className+" flatpickr-mobile"),t.mobileInput.tabIndex=1,t.mobileInput.type=f,t.mobileInput.disabled=t.input.disabled,t.mobileInput.required=t.input.required,t.mobileInput.placeholder=t.input.placeholder,t.mobileFormatStr=f==="datetime-local"?"Y-m-d\\TH:i:S":f==="date"?"Y-m-d":"H:i:S",t.selectedDates.length>0&&(t.mobileInput.defaultValue=t.mobileInput.value=t.formatDate(t.selectedDates[0],t.mobileFormatStr)),t.config.minDate&&(t.mobileInput.min=t.formatDate(t.config.minDate,"Y-m-d")),t.config.maxDate&&(t.mobileInput.max=t.formatDate(t.config.maxDate,"Y-m-d")),t.input.getAttribute("step")&&(t.mobileInput.step=String(t.input.getAttribute("step"))),t.input.type="hidden",t.altInput!==void 0&&(t.altInput.type="hidden");try{t.input.parentNode&&t.input.parentNode.insertBefore(t.mobileInput,t.input.nextSibling)}catch(h){}v(t.mobileInput,"change",function(h){t.setDate($e(h).value,!1,t.mobileFormatStr),ue("onChange"),ue("onClose")})}function zc(f){if(t.isOpen===!0)return t.close();t.open(f)}function ue(f,h){if(t.config!==void 0){var g=t.config[f];if(g!==void 0&&g.length>0)for(var b=0;g[b]&&b =0&&Be(f,t.selectedDates[1])<=0}function Li(){t.config.noCalendar||t.isMobile||!t.monthNav||(t.yearElements.forEach(function(f,h){var g=new Date(t.currentYear,t.currentMonth,1);g.setMonth(t.currentMonth+h),t.config.showMonths>1||t.config.monthSelectorType==="static"?t.monthElements[h].textContent=bi(g.getMonth(),t.config.shorthandCurrentMonth,t.l10n)+" ":t.monthsDropdownContainer.value=g.getMonth().toString(),f.value=g.getFullYear().toString()}),t._hidePrevMonthArrow=t.config.minDate!==void 0&&(t.currentYear===t.config.minDate.getFullYear()?t.currentMonth<=t.config.minDate.getMonth():t.currentYear t.config.maxDate.getMonth():t.currentYear>t.config.maxDate.getFullYear()))}function jr(f){var h=f||(t.config.altInput?t.config.altFormat:t.config.dateFormat);return t.selectedDates.map(function(g){return t.formatDate(g,h)}).filter(function(g,b,C){return t.config.mode!=="range"||t.config.enableTime||C.indexOf(g)===b}).join(t.config.mode!=="range"?t.config.conjunction:t.l10n.rangeSeparator)}function st(f){f===void 0&&(f=!0),t.mobileInput!==void 0&&t.mobileFormatStr&&(t.mobileInput.value=t.latestSelectedDateObj!==void 0?t.formatDate(t.latestSelectedDateObj,t.mobileFormatStr):""),t.input.value=jr(t.config.dateFormat),t.altInput!==void 0&&(t.altInput.value=jr(t.config.altFormat)),f!==!1&&ue("onValueUpdate")}function Wc(f){var h=$e(f),g=t.prevMonthNav.contains(h),b=t.nextMonthNav.contains(h);g||b?M(g?-1:1):t.yearElements.indexOf(h)>=0?h.select():h.classList.contains("arrowUp")?t.changeYear(t.currentYear+1):h.classList.contains("arrowDown")&&t.changeYear(t.currentYear-1)}function qc(f){f.preventDefault();var h=f.type==="keydown",g=$e(f),b=g;t.amPM!==void 0&&g===t.amPM&&(t.amPM.textContent=t.l10n.amPM[Fe(t.amPM.textContent===t.l10n.amPM[0])]);var C=parseFloat(b.getAttribute("min")),k=parseFloat(b.getAttribute("max")),X=parseFloat(b.getAttribute("step")),P=parseInt(b.value,10),Q=f.delta||(h?f.which===38?1:-1:0),R=P+X*Q;if(typeof b.value!="undefined"&&b.value.length===2){var G=b===t.hourElement,re=b===t.minuteElement;R k&&(R=b===t.hourElement?R-k-Fe(!t.amPM):C,re&&A(void 0,1,t.hourElement)),t.amPM&&G&&(X===1?R+P===23:Math.abs(R-P)>X)&&(t.amPM.textContent=t.l10n.amPM[Fe(t.amPM.textContent===t.l10n.amPM[0])]),b.value=De(R)}}return r(),t}function kn(n,e){for(var t=Array.prototype.slice.call(n).filter(function(s){return s instanceof HTMLElement}),i=[],r=0;r option"))if(e.selected){for(let t of I("#id_columns"))t.appendChild(e.cloneNode(!0));e.remove()}n.preventDefault()}function Gg(n){for(let e of I("#id_columns > option"))if(e.selected){for(let t of I("#id_available_columns"))t.appendChild(e.cloneNode(!0));e.remove()}n.preventDefault()}function Tc(n,e){return at(this,null,function*(){return yield On(n,e)})}function Kg(n){var l,c,u;n.preventDefault();let e=n.currentTarget,t=e.getAttribute("data-url");if(t==null){It("danger","Error Updating Table Configuration","No API path defined for configuration form.").show();return}let i=((l=document.activeElement)==null?void 0:l.getAttribute("value"))==="Reset",r=(u=(c=e.getAttribute("data-config-root"))==null?void 0:c.split("."))!=null?u:[];if(i){let d=r.reduceRight((p,y)=>({[y]:p}),{});Tc(t,d).then(p=>{tn(p)?It("danger","Error Resetting Table Configuration",p.error).show():window.location.href=window.location.origin+window.location.pathname});return}let o=xl(e,"select[name=columns]"),s=Object.assign({},...o.map(d=>({[d.name]:d.options}))),a=r.reduceRight((d,p)=>({[p]:d}),s);Tc(t,a).then(d=>{tn(d)?It("danger","Error Updating Table Configuration",d.error).show():window.location.href=window.location.origin+window.location.pathname})}function Cc(){for(let n of I("#add_columns"))n.addEventListener("click",Yg);for(let n of I("#remove_columns"))n.addEventListener("click",Gg);for(let n of I("form.userconfigform"))n.addEventListener("submit",Kg)}function Ac(n){return typeof n=="string"&&["show","hide"].includes(n)}var rn=class extends Error{constructor(t,i){super(t);ee(this,"table");this.table=i}},Nn=class{constructor(e,t){ee(this,"button");ee(this,"rows");this.button=e,this.rows=t}hideRows(){for(let e of this.rows)e.classList.add("d-none")}set buttonState(e){Ac(e)&&this.button.setAttribute("data-state",e)}get buttonState(){let e=this.button.getAttribute("data-state");return Ac(e)?e:null}toggleButton(){this.buttonState==="show"?this.button.innerText=Ln(this.button.innerText,"Show","Hide"):this.buttonState==="hide"&&(this.button.innerText=Ln(this.button.innerHTML,"Hide","Show"))}toggleState(){this.buttonState==="show"?this.buttonState="hide":this.buttonState==="hide"&&(this.buttonState="show")}toggle(){this.toggleState(),this.toggleButton()}handleClick(e){e.currentTarget.isEqualNode(this.button)&&this.toggle(),this.buttonState==="hide"&&this.hideRows()}},ss=class{constructor(e){ee(this,"table");ee(this,"enabledButton");ee(this,"disabledButton");ee(this,"virtualButton");ee(this,"disconnectedButton");ee(this,"rows");this.table=e,this.rows=this.table.querySelectorAll("tr");try{let t=nn(this.table,"button.toggle-enabled"),i=nn(this.table,"button.toggle-disabled"),r=nn(this.table,"button.toggle-virtual"),o=nn(this.table,"button.toggle-disconnected");if(t===null)throw new rn("Table is missing a 'toggle-enabled' button.",e);if(i===null)throw new rn("Table is missing a 'toggle-disabled' button.",e);if(r===null)throw new rn("Table is missing a 'toggle-virtual' button.",e);if(o===null)throw new rn("Table is missing a 'toggle-disconnected' button.",e);t.addEventListener("click",s=>this.handleClick(s,this)),i.addEventListener("click",s=>this.handleClick(s,this)),r.addEventListener("click",s=>this.handleClick(s,this)),o.addEventListener("click",s=>this.handleClick(s,this)),this.enabledButton=new Nn(t,e.querySelectorAll('tr[data-enabled="enabled"]')),this.disabledButton=new Nn(i,e.querySelectorAll('tr[data-enabled="disabled"]')),this.virtualButton=new Nn(r,e.querySelectorAll('tr[data-type="virtual"]')),this.disconnectedButton=new Nn(o,e.querySelectorAll('tr[data-connected="disconnected"]'))}catch(t){if(t instanceof rn){console.debug("Table does not contain enable/disable toggle buttons");return}else throw t}}handleClick(e,t){for(let i of this.rows)i.classList.remove("d-none");t.enabledButton.handleClick(e),t.disabledButton.handleClick(e),t.virtualButton.handleClick(e),t.disconnectedButton.handleClick(e)}};function Sc(){for(let n of I("table"))new ss(n)}var as=class{constructor(e){ee(this,"base");ee(this,"state");ee(this,"activeLink",null);ee(this,"sections",[]);this.base=e,this.state=new gi({pinned:!0},{persist:!0,key:"netbox-sidenav"}),this.init(),this.initSectionLinks(),this.initLinks()}bodyHas(e){return document.body.hasAttribute(`data-sidenav-${e}`)}bodyRemove(...e){for(let t of e)document.body.removeAttribute(`data-sidenav-${t}`)}bodyAdd(...e){for(let t of e)document.body.setAttribute(`data-sidenav-${t}`,"")}init(){for(let e of this.base.querySelectorAll(".sidenav-toggle"))e.addEventListener("click",t=>this.onToggle(t));for(let e of I(".sidenav-toggle-mobile"))e.addEventListener("click",t=>this.onMobileToggle(t));window.innerWidth>1200&&(this.state.get("pinned")&&this.pin(),this.state.get("pinned")||this.unpin(),window.addEventListener("resize",()=>this.onResize())),window.innerWidth<1200&&(this.bodyRemove("hide"),this.bodyAdd("hidden"),window.addEventListener("resize",()=>this.onResize())),this.base.addEventListener("mouseenter",()=>this.onEnter()),this.base.addEventListener("mouseleave",()=>this.onLeave())}initLinks(){for(let e of this.getActiveLinks())this.bodyHas("show")?this.activateLink(e,"expand"):this.bodyHas("hidden")&&this.activateLink(e,"collapse")}show(){this.bodyAdd("show"),this.bodyRemove("hidden","hide")}hide(){this.bodyAdd("hidden"),this.bodyRemove("pinned","show");for(let e of this.base.querySelectorAll(".collapse"))e.classList.remove("show")}pin(){this.bodyAdd("show","pinned"),this.bodyRemove("hidden"),this.state.set("pinned",!0)}unpin(){this.bodyRemove("pinned","show"),this.bodyAdd("hidden");for(let e of this.base.querySelectorAll(".collapse"))e.classList.remove("show");this.state.set("pinned",!1)}handleSectionClick(e){e.preventDefault();let t=e.target;this.activeLink=t,this.closeInactiveSections()}closeInactiveSections(){for(let[e,t]of this.sections)e!==this.activeLink&&(e.classList.add("collapsed"),e.setAttribute("aria-expanded","false"),t.hide())}initSectionLinks(){for(let e of I(".navbar-nav .nav-item .nav-link[data-bs-toggle]"))if(e.parentElement!==null){let t=e.parentElement.querySelector(".collapse");if(t!==null){let i=new At(t,{toggle:!1});this.sections.push([e,i]),e.addEventListener("click",r=>this.handleSectionClick(r))}}}activateLink(e,t){var r;let i=e.closest(".dropdown-menu");if(gr(i)){let o=i.parentElement,s=(r=i.parentElement)==null?void 0:r.querySelector(".nav-link");if(gr(s)&&gr(o))switch(t){case"expand":s.setAttribute("aria-expanded","true"),o.classList.add("active"),i.classList.add("show"),e.classList.add("active");break;case"collapse":s.setAttribute("aria-expanded","false"),o.classList.remove("active"),i.classList.remove("show"),e.classList.remove("active");break}}}*getActiveLinks(){for(let e of this.base.querySelectorAll("ul.navbar-nav .nav-item .dropdown-item")){let t=e.querySelector("a");if(t){let i=new RegExp(t.href,"gi");window.location.href.match(i)&&(yield e)}}}onEnter(){if(!this.bodyHas("pinned")){this.bodyRemove("hide","hidden"),this.bodyAdd("show");for(let e of this.getActiveLinks())this.activateLink(e,"expand")}}onLeave(){if(!this.bodyHas("pinned")){this.bodyRemove("show"),this.bodyAdd("hide");for(let e of this.getActiveLinks())this.activateLink(e,"collapse");this.bodyRemove("hide"),this.bodyAdd("hidden")}}onResize(){this.bodyHas("show")&&!this.bodyHas("pinned")&&(this.bodyRemove("show"),this.bodyAdd("hidden"))}onToggle(e){e.preventDefault(),this.state.get("pinned")?this.unpin():this.pin()}onMobileToggle(e){e.preventDefault(),this.bodyHas("hidden")?this.show():this.hide()}};function Dc(){for(let n of I(".navbar"))new as(n)}function Oc(n,e,t,i,r){let o=(...s)=>(console.warn("gridstack.js: Function `"+t+"` is deprecated in "+r+" and has been replaced with `"+i+"`. It will be **removed** in a future release"),e.apply(n,s));return o.prototype=e.prototype,o}var E=class n{static getElements(e,t=document){if(typeof e=="string"){let i="getElementById"in t?t:void 0;if(i&&!isNaN(+e[0])){let o=i.getElementById(e);return o?[o]:[]}let r=t.querySelectorAll(e);return!r.length&&e[0]!=="."&&e[0]!=="#"&&(r=t.querySelectorAll("."+e),r.length||(r=t.querySelectorAll("#"+e))),Array.from(r)}return[e]}static getElement(e,t=document){if(typeof e=="string"){let i="getElementById"in t?t:void 0;if(!e.length)return null;if(i&&e[0]==="#")return i.getElementById(e.substring(1));if(e[0]==="#"||e[0]==="."||e[0]==="[")return t.querySelector(e);if(i&&!isNaN(+e[0]))return i.getElementById(e);let r=t.querySelector(e);return i&&!r&&(r=i.getElementById(e)),r||(r=t.querySelector("."+e)),r}return e}static lazyLoad(e){var t,i;return e.lazyLoad||((i=(t=e.grid)==null?void 0:t.opts)==null?void 0:i.lazyLoad)&&e.lazyLoad!==!1}static createDiv(e,t){let i=document.createElement("div");return e.forEach(r=>{r&&i.classList.add(r)}),t==null||t.appendChild(i),i}static shouldSizeToContent(e,t=!1){return(e==null?void 0:e.grid)&&(t?e.sizeToContent===!0||e.grid.opts.sizeToContent===!0&&e.sizeToContent===void 0:!!e.sizeToContent||e.grid.opts.sizeToContent&&e.sizeToContent!==!1)}static isIntercepted(e,t){return!(e.y>=t.y+t.h||e.y+e.h<=t.y||e.x+e.w<=t.x||e.x>=t.x+t.w)}static isTouching(e,t){return n.isIntercepted(e,{x:t.x-.5,y:t.y-.5,w:t.w+1,h:t.h+1})}static areaIntercept(e,t){let i=e.x>t.x?e.x:t.x,r=e.x+e.w t.y?e.y:t.y,s=e.y+e.h {var a,l,c,u;let s=t*(((a=r.y)!=null?a:1e4)-((l=o.y)!=null?l:1e4));return s===0?t*(((c=r.x)!=null?c:1e4)-((u=o.x)!=null?u:1e4)):s})}static find(e,t){return t?e.find(i=>i.id===t):void 0}static toBool(e){return typeof e=="boolean"?e:typeof e=="string"?(e=e.toLowerCase(),!(e===""||e==="no"||e==="false"||e==="0")):!!e}static toNumber(e){return e===null||e.length===0?void 0:Number(e)}static parseHeight(e){let t,i="px";if(typeof e=="string")if(e==="auto"||e==="")t=0;else{let r=e.match(/^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%|cm|mm)?$/);if(!r)throw new Error(`Invalid height val = ${e}`);i=r[2]||"px",t=parseFloat(r[1])}else t=e;return{h:t,unit:i}}static defaults(e,...t){return t.forEach(i=>{for(let r in i){if(!i.hasOwnProperty(r))return;e[r]===null||e[r]===void 0?e[r]=i[r]:typeof i[r]=="object"&&typeof e[r]=="object"&&this.defaults(e[r],i[r])}}),e}static same(e,t){if(typeof e!="object")return e==t;if(typeof e!=typeof t||Object.keys(e).length!==Object.keys(t).length)return!1;for(let i in e)if(e[i]!==t[i])return!1;return!0}static copyPos(e,t,i=!1){return t.x!==void 0&&(e.x=t.x),t.y!==void 0&&(e.y=t.y),t.w!==void 0&&(e.w=t.w),t.h!==void 0&&(e.h=t.h),i&&(t.minW&&(e.minW=t.minW),t.minH&&(e.minH=t.minH),t.maxW&&(e.maxW=t.maxW),t.maxH&&(e.maxH=t.maxH)),e}static samePos(e,t){return e&&t&&e.x===t.x&&e.y===t.y&&(e.w||1)===(t.w||1)&&(e.h||1)===(t.h||1)}static sanitizeMinMax(e){e.minW||delete e.minW,e.minH||delete e.minH,e.maxW||delete e.maxW,e.maxH||delete e.maxH}static removeInternalAndSame(e,t){if(!(typeof e!="object"||typeof t!="object"))for(let i in e){let r=e[i],o=t[i];i[0]==="_"||r===o?delete e[i]:r&&typeof r=="object"&&o!==void 0&&(n.removeInternalAndSame(r,o),Object.keys(r).length||delete e[i])}}static removeInternalForSave(e,t=!0){for(let i in e)(i[0]==="_"||e[i]===null||e[i]===void 0)&&delete e[i];delete e.grid,t&&delete e.el,e.autoPosition||delete e.autoPosition,e.noResize||delete e.noResize,e.noMove||delete e.noMove,e.locked||delete e.locked,(e.w===1||e.w===e.minW)&&delete e.w,(e.h===1||e.h===e.minH)&&delete e.h}static throttle(e,t){let i=!1;return(...r)=>{i||(i=!0,setTimeout(()=>{e(...r),i=!1},t))}}static removePositioningStyles(e){let t=e.style;t.position&&t.removeProperty("position"),t.left&&t.removeProperty("left"),t.top&&t.removeProperty("top"),t.width&&t.removeProperty("width"),t.height&&t.removeProperty("height")}static getScrollElement(e){if(!e)return document.scrollingElement||document.documentElement;let t=getComputedStyle(e);return/(auto|scroll)/.test(t.overflow+t.overflowY)?e:this.getScrollElement(e.parentElement)}static updateScrollPosition(e,t,i){let r=e.getBoundingClientRect(),o=window.innerHeight||document.documentElement.clientHeight;if(r.top<0||r.bottom>o){let s=r.bottom-o,a=r.top,l=this.getScrollElement(e);if(l!==null){let c=l.scrollTop;r.top<0&&i<0?e.offsetHeight>o?l.scrollTop+=i:l.scrollTop+=Math.abs(a)>Math.abs(i)?i:a:i>0&&(e.offsetHeight>o?l.scrollTop+=i:l.scrollTop+=s>i?i:s),t.top+=l.scrollTop-c}}}static updateScrollResize(e,t,i){let r=this.getScrollElement(t),o=r.clientHeight,s=r===this.getScrollElement()?0:r.getBoundingClientRect().top,a=e.clientY-s,l=ao-i;l?r.scrollBy({behavior:"smooth",top:a-i}):c&&r.scrollBy({behavior:"smooth",top:i-(o-a)})}static clone(e){return e==null||typeof e!="object"?e:e instanceof Array?[...e]:O({},e)}static cloneDeep(e){let t=["parentGrid","el","grid","subGrid","engine"],i=n.clone(e);for(let r in i)i.hasOwnProperty(r)&&typeof i[r]=="object"&&r.substring(0,2)!=="__"&&!t.find(o=>o===r)&&(i[r]=n.cloneDeep(e[r]));return i}static cloneNode(e){let t=e.cloneNode(!0);return t.removeAttribute("id"),t}static appendTo(e,t){let i;typeof t=="string"?i=n.getElement(t):i=t,i&&i.appendChild(e)}static addElStyles(e,t){if(t instanceof Object)for(let i in t)t.hasOwnProperty(i)&&(Array.isArray(t[i])?t[i].forEach(r=>{e.style[i]=r}):e.style[i]=t[i])}static initEvent(e,t){let i={type:t.type},r={button:0,which:0,buttons:1,bubbles:!0,cancelable:!0,target:t.target?t.target:e.target};return["altKey","ctrlKey","metaKey","shiftKey"].forEach(o=>i[o]=e[o]),["pageX","pageY","clientX","clientY","screenX","screenY"].forEach(o=>i[o]=e[o]),O(O({},i),r)}static simulateMouseEvent(e,t,i){var s,a,l,c;let r=e,o=new MouseEvent(t,{bubbles:!0,composed:!0,cancelable:!0,view:window,detail:1,screenX:e.screenX,screenY:e.screenY,clientX:e.clientX,clientY:e.clientY,ctrlKey:(s=r.ctrlKey)!=null?s:!1,altKey:(a=r.altKey)!=null?a:!1,shiftKey:(l=r.shiftKey)!=null?l:!1,metaKey:(c=r.metaKey)!=null?c:!1,button:0,relatedTarget:e.target});(i||e.target).dispatchEvent(o)}static getValuesFromTransformedElement(e){let t=document.createElement("div");n.addElStyles(t,{opacity:"0",position:"fixed",top:"0px",left:"0px",width:"1px",height:"1px",zIndex:"-999999"}),e.appendChild(t);let i=t.getBoundingClientRect();return e.removeChild(t),t.remove(),{xScale:1/i.width,yScale:1/i.height,xOffset:i.left,yOffset:i.top}}static swap(e,t,i){if(!e)return;let r=e[t];e[t]=e[i],e[i]=r}static canBeRotated(e){var t;return!(!e||e.w===e.h||e.locked||e.noResize||(t=e.grid)!=null&&t.opts.disableResize||e.minW&&e.minW===e.maxW||e.minH&&e.minH===e.maxH)}};var In=class n{constructor(e={}){this.addedNodes=[],this.removedNodes=[],this.defaultColumn=12,this.column=e.column||this.defaultColumn,this.column>this.defaultColumn&&(this.defaultColumn=this.column),this.maxRow=e.maxRow,this._float=e.float,this.nodes=e.nodes||[],this.onChange=e.onChange}batchUpdate(e=!0,t=!0){return!!this.batchMode===e?this:(this.batchMode=e,e?(this._prevFloat=this._float,this._float=!0,this.cleanNodes(),this.saveInitial()):(this._float=this._prevFloat,delete this._prevFloat,t&&this._packNodes(),this._notify()),this)}_useEntireRowArea(e,t){return(!this.float||this.batchMode&&!this._prevFloat)&&!this._hasLocked&&(!e._moving||e._skipDown||t.y<=e.y)}_fixCollisions(e,t=e,i,r={}){if(this.sortNodes(-1),i=i||this.collide(e,t),!i)return!1;if(e._moving&&!r.nested&&!this.float&&this.swap(e,i))return!0;let o=t;!this._loading&&this._useEntireRowArea(e,t)&&(o={x:0,w:this.column,y:t.y,h:t.h},i=this.collide(e,o,r.skip));let s=!1,a={nested:!0,pack:!1},l=0;for(;i=i||this.collide(e,o,r.skip);){if(l++>this.nodes.length*2)throw new Error("Infinite collide check");let c;if(i.locked||this._loading||e._moving&&!e._skipDown&&t.y>e.y&&!this.float&&(!this.collide(i,ae(O({},i),{y:e.y}),e)||!this.collide(i,ae(O({},i),{y:t.y-i.h}),e))){e._skipDown=e._skipDown||t.y>e.y;let u=O(ae(O({},t),{y:i.y+i.h}),a);c=this._loading&&E.samePos(e,u)?!0:this.moveNode(e,u),(i.locked||this._loading)&&c?E.copyPos(t,e):!i.locked&&c&&r.pack&&(this._packNodes(),t.y=i.y+i.h,E.copyPos(e,t)),s=s||c}else c=this.moveNode(i,O(ae(O({},i),{y:t.y+t.h,skip:e}),a));if(!c)return s;i=void 0}return s}collide(e,t=e,i){let r=e._id,o=i==null?void 0:i._id;return this.nodes.find(s=>s._id!==r&&s._id!==o&&E.isIntercepted(s,t))}collideAll(e,t=e,i){let r=e._id,o=i==null?void 0:i._id;return this.nodes.filter(s=>s._id!==r&&s._id!==o&&E.isIntercepted(s,t))}directionCollideCoverage(e,t,i){if(!t.rect||!e._rect)return;let r=e._rect,o=O({},t.rect);o.y>r.y?(o.h+=o.y-r.y,o.y=r.y):o.h+=r.y-o.y,o.x>r.x?(o.w+=o.x-r.x,o.x=r.x):o.w+=r.x-o.x;let s,a=.5;for(let l of i){if(l.locked||!l._rect)break;let c=l._rect,u=Number.MAX_VALUE,d=Number.MAX_VALUE;r.y c.y+c.h&&(u=(c.y+c.h-o.y)/c.h),r.x c.x+c.w&&(d=(c.x+c.w-o.x)/c.w);let p=Math.min(d,u);p>a&&(a=p,s=l)}return t.collide=s,s}cacheRects(e,t,i,r,o,s){return this.nodes.forEach(a=>a._rect={y:a.y*t+i,x:a.x*e+s,w:a.w*e-s-r,h:a.h*t-i-o}),this}swap(e,t){if(!t||t.locked||!e||e.locked)return!1;function i(){let o=t.x,s=t.y;return t.x=e.x,t.y=e.y,e.h!=t.h?(e.x=o,e.y=t.y+t.h):e.w!=t.w?(e.x=t.x+t.w,e.y=s):(e.x=o,e.y=s),e._dirty=t._dirty=!0,!0}let r;if(e.w===t.w&&e.h===t.h&&(e.x===t.x||e.y===t.y)&&(r=E.isTouching(e,t)))return i();if(r!==!1){if(e.w===t.w&&e.x===t.x&&(r||(r=E.isTouching(e,t)))){if(t.y {let c;s.locked||(s.autoPosition=!0,e==="list"&&a&&(c=l[a-1])),this.addNode(s,!1,c)}),r||delete this._inColumnResize,i||this.batchUpdate(!1),this}set float(e){this._float!==e&&(this._float=e||!1,e||this._packNodes()._notify())}get float(){return this._float||!1}sortNodes(e=1){return this.nodes=E.sort(this.nodes,e),this}_packNodes(){return this.batchMode?this:(this.sortNodes(),this.float?this.nodes.forEach(e=>{if(e._updating||e._orig===void 0||e.y===e._orig.y)return;let t=e.y;for(;t>e._orig.y;)--t,this.collide(e,{x:e.x,y:t,w:e.w,h:e.h})||(e._dirty=!0,e.y=t)}):this.nodes.forEach((e,t)=>{if(!e.locked)for(;e.y>0;){let i=t===0?0:e.y-1;if(!(t===0||!this.collide(e,{x:e.x,y:i,w:e.w,h:e.h})))break;e._dirty=e.y!==i,e.y=i}}),this)}prepareNode(e,t){var o;e._id=(o=e._id)!=null?o:n._idSeq++;let i=e.id;if(i){let s=1;for(;this.nodes.find(a=>a.id===e.id&&a!==e);)e.id=i+"_"+s++}(e.x===void 0||e.y===void 0||e.x===null||e.y===null)&&(e.autoPosition=!0);let r={x:0,y:0,w:1,h:1};return E.defaults(e,r),e.autoPosition||delete e.autoPosition,e.noResize||delete e.noResize,e.noMove||delete e.noMove,E.sanitizeMinMax(e),typeof e.x=="string"&&(e.x=Number(e.x)),typeof e.y=="string"&&(e.y=Number(e.y)),typeof e.w=="string"&&(e.w=Number(e.w)),typeof e.h=="string"&&(e.h=Number(e.h)),isNaN(e.x)&&(e.x=r.x,e.autoPosition=!0),isNaN(e.y)&&(e.y=r.y,e.autoPosition=!0),isNaN(e.w)&&(e.w=r.w),isNaN(e.h)&&(e.h=r.h),this.nodeBoundFix(e,t),e}nodeBoundFix(e,t){let i=e._orig||E.copyPos({},e);if(e.maxW&&(e.w=Math.min(e.w||1,e.maxW)),e.maxH&&(e.h=Math.min(e.h||1,e.maxH)),e.minW&&(e.w=Math.max(e.w||1,e.minW)),e.minH&&(e.h=Math.max(e.h||1,e.minH)),(e.x||0)+(e.w||1)>this.column&&this.column this.column?e.w=this.column:e.w<1&&(e.w=1),this.maxRow&&e.h>this.maxRow?e.h=this.maxRow:e.h<1&&(e.h=1),e.x<0&&(e.x=0),e.y<0&&(e.y=0),e.x+e.w>this.column&&(t?e.w=this.column-e.x:e.x=this.column-e.w),this.maxRow&&e.y+e.h>this.maxRow&&(t?e.h=this.maxRow-e.y:e.y=this.maxRow-e.h),E.samePos(e,i)||(e._dirty=!0),this}getDirtyNodes(e){return e?this.nodes.filter(t=>t._dirty&&!E.samePos(t,t._orig)):this.nodes.filter(t=>t._dirty)}_notify(e){if(this.batchMode||!this.onChange)return this;let t=(e||[]).concat(this.getDirtyNodes());return this.onChange(t),this}cleanNodes(){return this.batchMode?this:(this.nodes.forEach(e=>{delete e._dirty,delete e._lastTried}),this)}saveInitial(){return this.nodes.forEach(e=>{e._orig=E.copyPos({},e),delete e._dirty}),this._hasLocked=this.nodes.some(e=>e.locked),this}restoreInitial(){return this.nodes.forEach(e=>{!e._orig||E.samePos(e,e._orig)||(E.copyPos(e,e._orig),e._dirty=!0)}),this._notify(),this}findEmptyPosition(e,t=this.nodes,i=this.column,r){let o=r?r.y*i+(r.x+r.w):0,s=!1;for(let a=o;!s;++a){let l=a%i,c=Math.floor(a/i);if(l+e.w>i)continue;let u={x:l,y:c,w:e.w,h:e.h};t.find(d=>E.isIntercepted(u,d))||((e.x!==l||e.y!==c)&&(e._dirty=!0),e.x=l,e.y=c,delete e.autoPosition,s=!0)}return s}addNode(e,t=!1,i){let r=this.nodes.find(s=>s._id===e._id);if(r)return r;this._inColumnResize?this.nodeBoundFix(e):this.prepareNode(e),delete e._temporaryRemoved,delete e._removeDOM;let o;return e.autoPosition&&this.findEmptyPosition(e,this.nodes,this.column,i)&&(delete e.autoPosition,o=!0),this.nodes.push(e),t&&this.addedNodes.push(e),o||this._fixCollisions(e),this.batchMode||this._packNodes()._notify(),e}removeNode(e,t=!0,i=!1){return this.nodes.find(r=>r._id===e._id)?(i&&this.removedNodes.push(e),t&&(e._removeDOM=!0),this.nodes=this.nodes.filter(r=>r._id!==e._id),e._isAboutToRemove||this._packNodes(),this._notify([e]),this):this}removeAll(e=!0,t=!0){if(delete this._layouts,!this.nodes.length)return this;e&&this.nodes.forEach(r=>r._removeDOM=!0);let i=this.nodes;return this.removedNodes=t?i:[],this.nodes=[],this._notify(i)}moveNodeCheck(e,t){if(!this.changedPosConstrain(e,t))return!1;if(t.pack=!0,!this.maxRow)return this.moveNode(e,t);let i,r=new n({column:this.column,float:this.float,nodes:this.nodes.map(s=>s._id===e._id?(i=O({},s),i):O({},s))});if(!i)return!1;let o=r.moveNode(i,t)&&r.getRow()<=Math.max(this.getRow(),this.maxRow);if(!o&&!t.resizing&&t.collide){let s=t.collide.el.gridstackNode;if(this.swap(e,s))return this._notify(),!0}return o?(r.nodes.filter(s=>s._dirty).forEach(s=>{let a=this.nodes.find(l=>l._id===s._id);a&&(E.copyPos(a,s),a._dirty=!0)}),this._notify(),!0):!1}willItFit(e){if(delete e._willFitPos,!this.maxRow)return!0;let t=new n({column:this.column,float:this.float,nodes:this.nodes.map(r=>O({},r))}),i=O({},e);return this.cleanupNode(i),delete i.el,delete i._id,delete i.content,delete i.grid,t.addNode(i),t.getRow()<=this.maxRow?(e._willFitPos=E.copyPos({},i),!0):!1}changedPosConstrain(e,t){return t.w=t.w||e.w,t.h=t.h||e.h,e.x!==t.x||e.y!==t.y?!0:(e.maxW&&(t.w=Math.min(t.w,e.maxW)),e.maxH&&(t.h=Math.min(t.h,e.maxH)),e.minW&&(t.w=Math.max(t.w,e.minW)),e.minH&&(t.h=Math.max(t.h,e.minH)),e.w!==t.w||e.h!==t.h)}moveNode(e,t){var c,u;if(!e||!t)return!1;let i;t.pack===void 0&&!this.batchMode&&(i=t.pack=!0),typeof t.x!="number"&&(t.x=e.x),typeof t.y!="number"&&(t.y=e.y),typeof t.w!="number"&&(t.w=e.w),typeof t.h!="number"&&(t.h=e.h);let r=e.w!==t.w||e.h!==t.h,o=E.copyPos({},e,!0);if(E.copyPos(o,t),this.nodeBoundFix(o,r),E.copyPos(t,o),!t.forceCollide&&E.samePos(e,t))return!1;let s=E.copyPos({},e),a=this.collideAll(e,o,t.skip),l=!0;if(a.length){let d=e._moving&&!t.nested,p=d?this.directionCollideCoverage(e,t,a):a[0];if(d&&p&&((u=(c=e.grid)==null?void 0:c.opts)!=null&&u.subGridDynamic)&&!e.grid._isTemp){let y=E.areaIntercept(t.rect,p._rect),m=E.area(t.rect),v=E.area(p._rect);y/(m .8&&(p.grid.makeSubGrid(p.el,void 0,e),p=void 0)}p?l=!this._fixCollisions(e,o,p,t):(l=!1,i&&delete t.pack)}return l&&!E.samePos(e,o)&&(e._dirty=!0,E.copyPos(e,o)),t.pack&&this._packNodes()._notify(),!E.samePos(e,s)}getRow(){return this.nodes.reduce((e,t)=>Math.max(e,t.y+t.h),0)}beginUpdate(e){return e._updating||(e._updating=!0,delete e._skipDown,this.batchMode||this.saveInitial()),this}endUpdate(){let e=this.nodes.find(t=>t._updating);return e&&(delete e._updating,delete e._skipDown),this}save(e=!0,t){var s;let i=(s=this._layouts)==null?void 0:s.length,r=i&&this.column!==i-1?this._layouts[i-1]:null,o=[];return this.sortNodes(),this.nodes.forEach(a=>{let l=r==null?void 0:r.find(u=>u._id===a._id),c=O(O({},a),l||{});E.removeInternalForSave(c,!e),t&&t(a,c),o.push(c)}),o}layoutsNodesChange(e){return!this._layouts||this._inColumnResize?this:(this._layouts.forEach((t,i)=>{if(!t||i===this.column)return this;if(i {if(!o._orig)return;let s=t.find(a=>a._id===o._id);s&&(s.y>=0&&o.y!==o._orig.y&&(s.y+=o.y-o._orig.y),o.x!==o._orig.x&&(s.x=Math.round(o.x*r)),o.w!==o._orig.w&&(s.w=Math.round(o.w*r)))})}}),this)}columnChanged(e,t,i="moveScale"){var a;if(!this.nodes.length||!t||e===t)return this;let r=i==="compact"||i==="list";r&&this.sortNodes(1),t e&&this._layouts){let l=this._layouts[t]||[],c=this._layouts.length-1;!l.length&&e!==c&&((a=this._layouts[c])!=null&&a.length)&&(e=c,this._layouts[c].forEach(u=>{var p,y,m;let d=s.find(v=>v._id===u._id);d&&(!r&&!u.autoPosition&&(d.x=(p=u.x)!=null?p:d.x,d.y=(y=u.y)!=null?y:d.y),d.w=(m=u.w)!=null?m:d.w,(u.x==null||u.y===void 0)&&(d.autoPosition=!0))})),l.forEach(u=>{var p,y,m;let d=s.findIndex(v=>v._id===u._id);if(d!==-1){let v=s[d];if(r){v.w=u.w;return}(u.autoPosition||isNaN(u.x)||isNaN(u.y))&&this.findEmptyPosition(u,o),u.autoPosition||(v.x=(p=u.x)!=null?p:v.x,v.y=(y=u.y)!=null?y:v.y,v.w=(m=u.w)!=null?m:v.w,o.push(v)),s.splice(d,1)}})}if(r)this.compact(i,!1);else{if(s.length)if(typeof i=="function")i(t,e,o,s);else{let l=r||i==="none"?1:t/e,c=i==="move"||i==="moveScale",u=i==="scale"||i==="moveScale";s.forEach(d=>{d.x=t===1?0:c?Math.round(d.x*l):Math.min(d.x,t-1),d.w=t===1||e===1?1:u?Math.round(d.w*l)||1:Math.min(d.w,t),o.push(d)}),s=[]}o=E.sort(o,-1),this._inColumnResize=!0,this.nodes=[],o.forEach(l=>{this.addNode(l,!1),delete l._orig})}return this.nodes.forEach(l=>delete l._orig),this.batchUpdate(!1,!r),delete this._inColumnResize,this}cacheLayout(e,t,i=!1){let r=[];return e.forEach((o,s)=>{var a;if(o._id===void 0){let l=o.id?this.nodes.find(c=>c.id===o.id):void 0;o._id=(a=l==null?void 0:l._id)!=null?a:n._idSeq++}r[s]={x:o.x,y:o.y,w:o.w,_id:o._id}}),this._layouts=i?[]:this._layouts||[],this._layouts[t]=r,this}cacheOneLayout(e,t){var o;e._id=(o=e._id)!=null?o:n._idSeq++;let i={x:e.x,y:e.y,w:e.w,_id:e._id};(e.autoPosition||e.x===void 0)&&(delete i.x,delete i.y,e.autoPosition&&(i.autoPosition=!0)),this._layouts=this._layouts||[],this._layouts[t]=this._layouts[t]||[];let r=this.findCacheLayout(e,t);return r===-1?this._layouts[t].push(i):this._layouts[t][r]=i,this}findCacheLayout(e,t){var i,r,o;return(o=(r=(i=this._layouts)==null?void 0:i[t])==null?void 0:r.findIndex(s=>s._id===e._id))!=null?o:-1}removeNodeFromLayoutCache(e){if(this._layouts)for(let t=0;t 0||navigator.msMaxTouchPoints>0),Je=class{};function Rr(n,e){n.touches.length>1||(n.cancelable&&n.preventDefault(),E.simulateMouseEvent(n.changedTouches[0],e))}function Lc(n,e){n.cancelable&&n.preventDefault(),E.simulateMouseEvent(n,e)}function Rn(n){Je.touchHandled||(Je.touchHandled=!0,Rr(n,"mousedown"))}function Hn(n){Je.touchHandled&&Rr(n,"mousemove")}function Pn(n){if(!Je.touchHandled)return;Je.pointerLeaveTimeout&&(window.clearTimeout(Je.pointerLeaveTimeout),delete Je.pointerLeaveTimeout);let e=!!F.dragElement;Rr(n,"mouseup"),e||Rr(n,"click"),Je.touchHandled=!1}function Fn(n){n.pointerType!=="mouse"&&n.target.releasePointerCapture(n.pointerId)}function ls(n){F.dragElement&&n.pointerType!=="mouse"&&Lc(n,"mouseenter")}function cs(n){F.dragElement&&n.pointerType!=="mouse"&&(Je.pointerLeaveTimeout=window.setTimeout(()=>{delete Je.pointerLeaveTimeout,Lc(n,"mouseleave")},10))}var _i=class n{constructor(e,t,i){this.host=e,this.dir=t,this.option=i,this.moving=!1,this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this._keyEvent=this._keyEvent.bind(this),this._init()}_init(){let e=this.el=document.createElement("div");return e.classList.add("ui-resizable-handle"),e.classList.add(`${n.prefix}${this.dir}`),e.style.zIndex="100",e.style.userSelect="none",this.host.appendChild(this.el),this.el.addEventListener("mousedown",this._mouseDown),Ne&&(this.el.addEventListener("touchstart",Rn),this.el.addEventListener("pointerdown",Fn)),this}destroy(){return this.moving&&this._mouseUp(this.mouseDownEvent),this.el.removeEventListener("mousedown",this._mouseDown),Ne&&(this.el.removeEventListener("touchstart",Rn),this.el.removeEventListener("pointerdown",Fn)),this.host.removeChild(this.el),delete this.el,delete this.host,this}_mouseDown(e){this.mouseDownEvent=e,document.addEventListener("mousemove",this._mouseMove,{capture:!0,passive:!0}),document.addEventListener("mouseup",this._mouseUp,!0),Ne&&(this.el.addEventListener("touchmove",Hn),this.el.addEventListener("touchend",Pn)),e.stopPropagation(),e.preventDefault()}_mouseMove(e){let t=this.mouseDownEvent;this.moving?this._triggerEvent("move",e):Math.abs(e.x-t.x)+Math.abs(e.y-t.y)>2&&(this.moving=!0,this._triggerEvent("start",this.mouseDownEvent),this._triggerEvent("move",e),document.addEventListener("keydown",this._keyEvent)),e.stopPropagation()}_mouseUp(e){this.moving&&(this._triggerEvent("stop",e),document.removeEventListener("keydown",this._keyEvent)),document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp,!0),Ne&&(this.el.removeEventListener("touchmove",Hn),this.el.removeEventListener("touchend",Pn)),delete this.moving,delete this.mouseDownEvent,e.stopPropagation(),e.preventDefault()}_keyEvent(e){var t,i;e.key==="Escape"&&((i=(t=this.host.gridstackNode)==null?void 0:t.grid)==null||i.engine.restoreInitial(),this._mouseUp(this.mouseDownEvent))}_triggerEvent(e,t){return this.option[e]&&this.option[e](t),this}};_i.prefix="ui-resizable-";var Ft=class{constructor(){this._eventRegister={}}get disabled(){return this._disabled}on(e,t){this._eventRegister[e]=t}off(e){delete this._eventRegister[e]}enable(){this._disabled=!1}disable(){this._disabled=!0}destroy(){delete this._eventRegister}triggerEvent(e,t){if(!this.disabled&&this._eventRegister&&this._eventRegister[e])return this._eventRegister[e](t)}};var wi=class n extends Ft{constructor(e,t={}){super(),this.el=e,this.option=t,this.rectScale={x:1,y:1},this._ui=()=>{let r=this.el.parentElement.getBoundingClientRect(),o={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},s=this.temporalRect||o;return{position:{left:(s.left-r.left)*this.rectScale.x,top:(s.top-r.top)*this.rectScale.y},size:{width:s.width*this.rectScale.x,height:s.height*this.rectScale.y}}},this._mouseOver=this._mouseOver.bind(this),this._mouseOut=this._mouseOut.bind(this),this.enable(),this._setupAutoHide(this.option.autoHide),this._setupHandlers()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){super.enable(),this.el.classList.remove("ui-resizable-disabled"),this._setupAutoHide(this.option.autoHide)}disable(){super.disable(),this.el.classList.add("ui-resizable-disabled"),this._setupAutoHide(!1)}destroy(){this._removeHandlers(),this._setupAutoHide(!1),delete this.el,super.destroy()}updateOption(e){let t=e.handles&&e.handles!==this.option.handles,i=e.autoHide&&e.autoHide!==this.option.autoHide;return Object.keys(e).forEach(r=>this.option[r]=e[r]),t&&(this._removeHandlers(),this._setupHandlers()),i&&this._setupAutoHide(this.option.autoHide),this}_setupAutoHide(e){return e?(this.el.classList.add("ui-resizable-autohide"),this.el.addEventListener("mouseover",this._mouseOver),this.el.addEventListener("mouseout",this._mouseOut)):(this.el.classList.remove("ui-resizable-autohide"),this.el.removeEventListener("mouseover",this._mouseOver),this.el.removeEventListener("mouseout",this._mouseOut),F.overResizeElement===this&&delete F.overResizeElement),this}_mouseOver(e){F.overResizeElement||F.dragElement||(F.overResizeElement=this,this.el.classList.remove("ui-resizable-autohide"))}_mouseOut(e){F.overResizeElement===this&&(delete F.overResizeElement,this.el.classList.add("ui-resizable-autohide"))}_setupHandlers(){return this.handlers=this.option.handles.split(",").map(e=>e.trim()).map(e=>new _i(this.el,e,{start:t=>{this._resizeStart(t)},stop:t=>{this._resizeStop(t)},move:t=>{this._resizing(t,e)}})),this}_resizeStart(e){this.sizeToContent=E.shouldSizeToContent(this.el.gridstackNode,!0),this.originalRect=this.el.getBoundingClientRect(),this.scrollEl=E.getScrollElement(this.el),this.scrollY=this.scrollEl.scrollTop,this.scrolled=0,this.startEvent=e,this._setupHelper(),this._applyChange();let t=E.initEvent(e,{type:"resizestart",target:this.el});return this.option.start&&this.option.start(t,this._ui()),this.el.classList.add("ui-resizable-resizing"),this.triggerEvent("resizestart",t),this}_resizing(e,t){this.scrolled=this.scrollEl.scrollTop-this.scrollY,this.temporalRect=this._getChange(e,t),this._applyChange();let i=E.initEvent(e,{type:"resize",target:this.el});return this.option.resize&&this.option.resize(i,this._ui()),this.triggerEvent("resize",i),this}_resizeStop(e){let t=E.initEvent(e,{type:"resizestop",target:this.el});return this._cleanHelper(),this.option.stop&&this.option.stop(t),this.el.classList.remove("ui-resizable-resizing"),this.triggerEvent("resizestop",t),delete this.startEvent,delete this.originalRect,delete this.temporalRect,delete this.scrollY,delete this.scrolled,this}_setupHelper(){this.elOriginStyleVal=n._originStyleProp.map(i=>this.el.style[i]),this.parentOriginStylePosition=this.el.parentElement.style.position;let e=this.el.parentElement,t=E.getValuesFromTransformedElement(e);return this.rectScale={x:t.xScale,y:t.yScale},getComputedStyle(this.el.parentElement).position.match(/static/)&&(this.el.parentElement.style.position="relative"),this.el.style.position="absolute",this.el.style.opacity="0.8",this}_cleanHelper(){return n._originStyleProp.forEach((e,t)=>{this.el.style[e]=this.elOriginStyleVal[t]||null}),this.el.parentElement.style.position=this.parentOriginStylePosition||null,this}_getChange(e,t){let i=this.startEvent,r={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},o=e.clientX-i.clientX,s=this.sizeToContent?0:e.clientY-i.clientY,a,l;t.indexOf("e")>-1?r.width+=o:t.indexOf("w")>-1&&(r.width-=o,r.left+=o,a=!0),t.indexOf("s")>-1?r.height+=s:t.indexOf("n")>-1&&(r.height-=s,r.top+=s,l=!0);let c=this._constrainSize(r.width,r.height,a,l);return Math.round(r.width)!==Math.round(c.width)&&(t.indexOf("w")>-1&&(r.left+=r.width-c.width),r.width=c.width),Math.round(r.height)!==Math.round(c.height)&&(t.indexOf("n")>-1&&(r.top+=r.height-c.height),r.height=c.height),r}_constrainSize(e,t,i,r){let o=this.option,s=(i?o.maxWidthMoveLeft:o.maxWidth)||Number.MAX_SAFE_INTEGER,a=o.minWidth/this.rectScale.x||e,l=(r?o.maxHeightMoveUp:o.maxHeight)||Number.MAX_SAFE_INTEGER,c=o.minHeight/this.rectScale.y||t,u=Math.min(s,Math.max(a,e)),d=Math.min(l,Math.max(c,t));return{width:u,height:d}}_applyChange(){let e={left:0,top:0,width:0,height:0};if(this.el.style.position==="absolute"){let t=this.el.parentElement,{left:i,top:r}=t.getBoundingClientRect();e={left:i,top:r,width:0,height:0}}return this.temporalRect?(Object.keys(this.temporalRect).forEach(t=>{let i=this.temporalRect[t],r=t==="width"||t==="left"?this.rectScale.x:t==="height"||t==="top"?this.rectScale.y:1;this.el.style[t]=(i-e[t])*r+"px"}),this):this}_removeHandlers(){return this.handlers.forEach(e=>e.destroy()),delete this.handlers,this}};wi._originStyleProp=["width","height","position","left","top","opacity","zIndex"];var Xg='input,textarea,button,select,option,[contenteditable="true"],.ui-resizable-handle',xi=class n extends Ft{constructor(e,t={}){var o;super(),this.el=e,this.option=t,this.dragTransform={xScale:1,yScale:1,xOffset:0,yOffset:0};let i=(o=t==null?void 0:t.handle)==null?void 0:o.substring(1),r=e.gridstackNode;this.dragEls=!i||e.classList.contains(i)?[e]:r!=null&&r.subGrid?[e.querySelector(t.handle)||e]:Array.from(e.querySelectorAll(t.handle)),this.dragEls.length===0&&(this.dragEls=[e]),this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this._keyEvent=this._keyEvent.bind(this),this.enable()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){this.disabled!==!1&&(super.enable(),this.dragEls.forEach(e=>{e.addEventListener("mousedown",this._mouseDown),Ne&&(e.addEventListener("touchstart",Rn),e.addEventListener("pointerdown",Fn))}),this.el.classList.remove("ui-draggable-disabled"))}disable(e=!1){this.disabled!==!0&&(super.disable(),this.dragEls.forEach(t=>{t.removeEventListener("mousedown",this._mouseDown),Ne&&(t.removeEventListener("touchstart",Rn),t.removeEventListener("pointerdown",Fn))}),e||this.el.classList.add("ui-draggable-disabled"))}destroy(){this.dragTimeout&&window.clearTimeout(this.dragTimeout),delete this.dragTimeout,this.mouseDownEvent&&this._mouseUp(this.mouseDownEvent),this.disable(!0),delete this.el,delete this.helper,delete this.option,super.destroy()}updateOption(e){return Object.keys(e).forEach(t=>this.option[t]=e[t]),this}_mouseDown(e){if(!F.mouseHandled)return e.button!==0||!this.dragEls.find(t=>t===e.target)&&e.target.closest(Xg)||this.option.cancel&&e.target.closest(this.option.cancel)||(this.mouseDownEvent=e,delete this.dragging,delete F.dragElement,delete F.dropElement,document.addEventListener("mousemove",this._mouseMove,{capture:!0,passive:!0}),document.addEventListener("mouseup",this._mouseUp,!0),Ne&&(e.currentTarget.addEventListener("touchmove",Hn),e.currentTarget.addEventListener("touchend",Pn)),e.preventDefault(),document.activeElement&&document.activeElement.blur(),F.mouseHandled=!0),!0}_callDrag(e){if(!this.dragging)return;let t=E.initEvent(e,{target:this.el,type:"drag"});this.option.drag&&this.option.drag(t,this.ui()),this.triggerEvent("drag",t)}_mouseMove(e){var i;let t=this.mouseDownEvent;if(this.lastDrag=e,this.dragging)if(this._dragFollow(e),F.pauseDrag){let r=Number.isInteger(F.pauseDrag)?F.pauseDrag:100;this.dragTimeout&&window.clearTimeout(this.dragTimeout),this.dragTimeout=window.setTimeout(()=>this._callDrag(e),r)}else this._callDrag(e);else if(Math.abs(e.x-t.x)+Math.abs(e.y-t.y)>3){this.dragging=!0,F.dragElement=this;let r=(i=this.el.gridstackNode)==null?void 0:i.grid;r?F.dropElement=r.el.ddElement.ddDroppable:delete F.dropElement,this.helper=this._createHelper(),this._setupHelperContainmentStyle(),this.dragTransform=E.getValuesFromTransformedElement(this.helperContainment),this.dragOffset=this._getDragOffset(e,this.el,this.helperContainment),this._setupHelperStyle(e);let o=E.initEvent(e,{target:this.el,type:"dragstart"});this.option.start&&this.option.start(o,this.ui()),this.triggerEvent("dragstart",o),document.addEventListener("keydown",this._keyEvent)}return!0}_mouseUp(e){var t,i;if(document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp,!0),Ne&&e.currentTarget&&(e.currentTarget.removeEventListener("touchmove",Hn,!0),e.currentTarget.removeEventListener("touchend",Pn,!0)),this.dragging){delete this.dragging,(t=this.el.gridstackNode)==null||delete t._origRotate,document.removeEventListener("keydown",this._keyEvent),((i=F.dropElement)==null?void 0:i.el)===this.el.parentElement&&delete F.dropElement,this.helperContainment.style.position=this.parentOriginStylePosition||null,this.helper!==this.el&&this.helper.remove(),this._removeHelperStyle();let r=E.initEvent(e,{target:this.el,type:"dragstop"});this.option.stop&&this.option.stop(r),this.triggerEvent("dragstop",r),F.dropElement&&F.dropElement.drop(e)}delete this.helper,delete this.mouseDownEvent,delete F.dragElement,delete F.dropElement,delete F.mouseHandled,e.preventDefault()}_keyEvent(e){var r,o;let t=this.el.gridstackNode,i=(t==null?void 0:t.grid)||((o=(r=F.dropElement)==null?void 0:r.el)==null?void 0:o.gridstack);if(e.key==="Escape")t&&t._origRotate&&(t._orig=t._origRotate,delete t._origRotate),i==null||i.cancelDrag(),this._mouseUp(this.mouseDownEvent);else if(t&&i&&(e.key==="r"||e.key==="R")){if(!E.canBeRotated(t))return;t._origRotate=t._origRotate||O({},t._orig),delete t._moving,i.setAnimation(!1).rotate(t.el,{top:-this.dragOffset.offsetTop,left:-this.dragOffset.offsetLeft}).setAnimation(),t._moving=!0,this.dragOffset=this._getDragOffset(this.lastDrag,t.el,this.helperContainment),this.helper.style.width=this.dragOffset.width+"px",this.helper.style.height=this.dragOffset.height+"px",E.swap(t._orig,"w","h"),delete t._rect,this._mouseMove(this.lastDrag)}}_createHelper(){let e=this.el;return typeof this.option.helper=="function"?e=this.option.helper(this.el):this.option.helper==="clone"&&(e=E.cloneNode(this.el)),e.parentElement||E.appendTo(e,this.option.appendTo==="parent"?this.el.parentElement:this.option.appendTo),this.dragElementOriginStyle=n.originStyleProp.map(t=>this.el.style[t]),e}_setupHelperStyle(e){this.helper.classList.add("ui-draggable-dragging");let t=this.helper.style;return t.pointerEvents="none",t.width=this.dragOffset.width+"px",t.height=this.dragOffset.height+"px",t.willChange="left, top",t.position="fixed",this._dragFollow(e),t.transition="none",setTimeout(()=>{this.helper&&(t.transition=null)},0),this}_removeHelperStyle(){var t;this.helper.classList.remove("ui-draggable-dragging");let e=(t=this.helper)==null?void 0:t.gridstackNode;if(!(e!=null&&e._isAboutToRemove)&&this.dragElementOriginStyle){let i=this.helper,r=this.dragElementOriginStyle.transition||null;i.style.transition=this.dragElementOriginStyle.transition="none",n.originStyleProp.forEach(o=>i.style[o]=this.dragElementOriginStyle[o]||null),setTimeout(()=>i.style.transition=r,50)}return delete this.dragElementOriginStyle,this}_dragFollow(e){let t={left:0,top:0},i=this.helper.style,r=this.dragOffset;i.left=(e.clientX+r.offsetLeft-t.left)*this.dragTransform.xScale+"px",i.top=(e.clientY+r.offsetTop-t.top)*this.dragTransform.yScale+"px"}_setupHelperContainmentStyle(){return this.helperContainment=this.helper.parentElement,this.helper.style.position!=="fixed"&&(this.parentOriginStylePosition=this.helperContainment.style.position,getComputedStyle(this.helperContainment).position.match(/static/)&&(this.helperContainment.style.position="relative")),this}_getDragOffset(e,t,i){let r=0,o=0;i&&(r=this.dragTransform.xOffset,o=this.dragTransform.yOffset);let s=t.getBoundingClientRect();return{left:s.left,top:s.top,offsetLeft:-e.clientX+s.left-r,offsetTop:-e.clientY+s.top-o,width:s.width*this.dragTransform.xScale,height:s.height*this.dragTransform.yScale}}ui(){let t=this.el.parentElement.getBoundingClientRect(),i=this.helper.getBoundingClientRect();return{position:{top:(i.top-t.top)*this.dragTransform.yScale,left:(i.left-t.left)*this.dragTransform.xScale}}}};xi.originStyleProp=["width","height","transform","transform-origin","transition","pointerEvents","position","left","top","minWidth","willChange"];var Hr=class extends Ft{constructor(e,t={}){super(),this.el=e,this.option=t,this._mouseEnter=this._mouseEnter.bind(this),this._mouseLeave=this._mouseLeave.bind(this),this.enable(),this._setupAccept()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){this.disabled!==!1&&(super.enable(),this.el.classList.add("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),this.el.addEventListener("mouseenter",this._mouseEnter),this.el.addEventListener("mouseleave",this._mouseLeave),Ne&&(this.el.addEventListener("pointerenter",ls),this.el.addEventListener("pointerleave",cs)))}disable(e=!1){this.disabled!==!0&&(super.disable(),this.el.classList.remove("ui-droppable"),e||this.el.classList.add("ui-droppable-disabled"),this.el.removeEventListener("mouseenter",this._mouseEnter),this.el.removeEventListener("mouseleave",this._mouseLeave),Ne&&(this.el.removeEventListener("pointerenter",ls),this.el.removeEventListener("pointerleave",cs)))}destroy(){this.disable(!0),this.el.classList.remove("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),super.destroy()}updateOption(e){return Object.keys(e).forEach(t=>this.option[t]=e[t]),this._setupAccept(),this}_mouseEnter(e){if(!F.dragElement||!this._canDrop(F.dragElement.el))return;e.preventDefault(),e.stopPropagation(),F.dropElement&&F.dropElement!==this&&F.dropElement._mouseLeave(e,!0),F.dropElement=this;let t=E.initEvent(e,{target:this.el,type:"dropover"});this.option.over&&this.option.over(t,this._ui(F.dragElement)),this.triggerEvent("dropover",t),this.el.classList.add("ui-droppable-over")}_mouseLeave(e,t=!1){var r;if(!F.dragElement||F.dropElement!==this)return;e.preventDefault(),e.stopPropagation();let i=E.initEvent(e,{target:this.el,type:"dropout"});if(this.option.out&&this.option.out(i,this._ui(F.dragElement)),this.triggerEvent("dropout",i),F.dropElement===this&&(delete F.dropElement,!t)){let o,s=this.el.parentElement;for(;!o&&s;)o=(r=s.ddElement)==null?void 0:r.ddDroppable,s=s.parentElement;o&&o._mouseEnter(e)}}drop(e){e.preventDefault();let t=E.initEvent(e,{target:this.el,type:"drop"});this.option.drop&&this.option.drop(t,this._ui(F.dragElement)),this.triggerEvent("drop",t)}_canDrop(e){return e&&(!this.accept||this.accept(e))}_setupAccept(){return this.option.accept?(typeof this.option.accept=="string"?this.accept=e=>e.classList.contains(this.option.accept)||e.matches(this.option.accept):this.accept=this.option.accept,this):this}_ui(e){return O({draggable:e.el},e.ui())}};var Pr=class n{static init(e){return e.ddElement||(e.ddElement=new n(e)),e.ddElement}constructor(e){this.el=e}on(e,t){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(e)>-1?this.ddDraggable.on(e,t):this.ddDroppable&&["drop","dropover","dropout"].indexOf(e)>-1?this.ddDroppable.on(e,t):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(e)>-1&&this.ddResizable.on(e,t),this}off(e){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(e)>-1?this.ddDraggable.off(e):this.ddDroppable&&["drop","dropover","dropout"].indexOf(e)>-1?this.ddDroppable.off(e):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(e)>-1&&this.ddResizable.off(e),this}setupDraggable(e){return this.ddDraggable?this.ddDraggable.updateOption(e):this.ddDraggable=new xi(this.el,e),this}cleanDraggable(){return this.ddDraggable&&(this.ddDraggable.destroy(),delete this.ddDraggable),this}setupResizable(e){return this.ddResizable?this.ddResizable.updateOption(e):this.ddResizable=new wi(this.el,e),this}cleanResizable(){return this.ddResizable&&(this.ddResizable.destroy(),delete this.ddResizable),this}setupDroppable(e){return this.ddDroppable?this.ddDroppable.updateOption(e):this.ddDroppable=new Hr(this.el,e),this}cleanDroppable(){return this.ddDroppable&&(this.ddDroppable.destroy(),delete this.ddDroppable),this}};var Fr=class{resizable(e,t,i,r){return this._getDDElements(e,t).forEach(o=>{if(t==="disable"||t==="enable")o.ddResizable&&o.ddResizable[t]();else if(t==="destroy")o.ddResizable&&o.cleanResizable();else if(t==="option")o.setupResizable({[i]:r});else{let a=o.el.gridstackNode.grid,l=o.el.getAttribute("gs-resize-handles")||a.opts.resizable.handles||"e,s,se";l==="all"&&(l="n,e,s,w,se,sw,ne,nw");let c=!a.opts.alwaysShowResizeHandle;o.setupResizable(ae(O({},a.opts.resizable),{handles:l,autoHide:c,start:t.start,stop:t.stop,resize:t.resize}))}}),this}draggable(e,t,i,r){return this._getDDElements(e,t).forEach(o=>{if(t==="disable"||t==="enable")o.ddDraggable&&o.ddDraggable[t]();else if(t==="destroy")o.ddDraggable&&o.cleanDraggable();else if(t==="option")o.setupDraggable({[i]:r});else{let s=o.el.gridstackNode.grid;o.setupDraggable(ae(O({},s.opts.draggable),{start:t.start,stop:t.stop,drag:t.drag}))}}),this}dragIn(e,t){return this._getDDElements(e).forEach(i=>i.setupDraggable(t)),this}droppable(e,t,i,r){return typeof t.accept=="function"&&!t._accept&&(t._accept=t.accept,t.accept=o=>t._accept(o)),this._getDDElements(e,t).forEach(o=>{t==="disable"||t==="enable"?o.ddDroppable&&o.ddDroppable[t]():t==="destroy"?o.ddDroppable&&o.cleanDroppable():t==="option"?o.setupDroppable({[i]:r}):o.setupDroppable(t)}),this}isDroppable(e){var t;return!!((t=e==null?void 0:e.ddElement)!=null&&t.ddDroppable&&!e.ddElement.ddDroppable.disabled)}isDraggable(e){var t;return!!((t=e==null?void 0:e.ddElement)!=null&&t.ddDraggable&&!e.ddElement.ddDraggable.disabled)}isResizable(e){var t;return!!((t=e==null?void 0:e.ddElement)!=null&&t.ddResizable&&!e.ddElement.ddResizable.disabled)}on(e,t,i){return this._getDDElements(e).forEach(r=>r.on(t,o=>{i(o,F.dragElement?F.dragElement.el:o.target,F.dragElement?F.dragElement.helper:null)})),this}off(e,t){return this._getDDElements(e).forEach(i=>i.off(t)),this}_getDDElements(e,t){let i=e.gridstack||t!=="destroy"&&t!=="disable",r=E.getElements(e);return r.length?r.map(s=>s.ddElement||(i?Pr.init(s):null)).filter(s=>s):[]}};var Ie=new Fr,Et=class n{static init(e={},t=".grid-stack"){if(typeof document=="undefined")return null;let i=n.getGridElement(t);return i?(i.gridstack||(i.gridstack=new n(i,E.cloneDeep(e))),i.gridstack):(console.error(typeof t=="string"?'GridStack.initAll() no grid was found with selector "'+t+`" - element missing or wrong selector ? + `}}function W(){t.calendarContainer.classList.add("hasWeeks");var f=te("div","flatpickr-weekwrapper");f.appendChild(te("span","flatpickr-weekday",t.l10n.weekAbbreviation));var h=te("div","flatpickr-weeks");return f.appendChild(h),{weekWrapper:f,weekNumbers:h}}function M(f,h){h===void 0&&(h=!0);var g=h?f:f-t.currentMonth;g<0&&t._hidePrevMonthArrow===!0||g>0&&t._hideNextMonthArrow===!0||(t.currentMonth+=g,(t.currentMonth<0||t.currentMonth>11)&&(t.currentYear+=t.currentMonth>11?1:-1,t.currentMonth=(t.currentMonth+12)%12,ue("onYearChange"),J()),ie(),ue("onMonthChange"),Li())}function D(f,h){if(f===void 0&&(f=!0),h===void 0&&(h=!0),t.input.value="",t.altInput!==void 0&&(t.altInput.value=""),t.mobileInput!==void 0&&(t.mobileInput.value=""),t.selectedDates=[],t.latestSelectedDateObj=void 0,h===!0&&(t.currentYear=t._initialDate.getFullYear(),t.currentMonth=t._initialDate.getMonth()),t.config.enableTime===!0){var g=Nr(t.config),b=g.hours,C=g.minutes,k=g.seconds;y(b,C,k)}t.redraw(),f&&ue("onChange")}function $(){t.isOpen=!1,t.isMobile||(t.calendarContainer!==void 0&&t.calendarContainer.classList.remove("open"),t._input!==void 0&&t._input.classList.remove("active")),ue("onClose")}function V(){t.config!==void 0&&ue("onDestroy");for(var f=t._handlers.length;f--;)t._handlers[f].remove();if(t._handlers=[],t.mobileInput)t.mobileInput.parentNode&&t.mobileInput.parentNode.removeChild(t.mobileInput),t.mobileInput=void 0;else if(t.calendarContainer&&t.calendarContainer.parentNode)if(t.config.static&&t.calendarContainer.parentNode){var h=t.calendarContainer.parentNode;if(h.lastChild&&h.removeChild(h.lastChild),h.parentNode){for(;h.firstChild;)h.parentNode.insertBefore(h.firstChild,h);h.parentNode.removeChild(h)}}else t.calendarContainer.parentNode.removeChild(t.calendarContainer);t.altInput&&(t.input.type="text",t.altInput.parentNode&&t.altInput.parentNode.removeChild(t.altInput),delete t.altInput),t.input&&(t.input.type=t.input._type,t.input.classList.remove("flatpickr-input"),t.input.removeAttribute("readonly")),["_showTimeInput","latestSelectedDateObj","_hideNextMonthArrow","_hidePrevMonthArrow","__hideNextMonthArrow","__hidePrevMonthArrow","isMobile","isOpen","selectedDateElem","minDateHasTime","maxDateHasTime","days","daysContainer","_input","_positionElement","innerContainer","rContainer","monthNav","todayDateElem","calendarContainer","weekdayContainer","prevMonthNav","nextMonthNav","monthsDropdownContainer","currentMonthElement","currentYearElement","navigationCurrentMonth","selectedDateElem","config"].forEach(function(g){try{delete t[g]}catch(b){}})}function q(f){return t.calendarContainer.contains(f)}function U(f){if(t.isOpen&&!t.config.inline){var h=Be(f),g=q(h),b=h===t.input||h===t.altInput||t.element.contains(h)||f.path&&f.path.indexOf&&(~f.path.indexOf(t.input)||~f.path.indexOf(t.altInput)),C=!b&&!g&&!q(f.relatedTarget),k=!t.config.ignoredFocusElements.some(function(X){return X.contains(h)});C&&k&&(t.config.allowInput&&t.setDate(t._input.value,!1,t.config.altInput?t.config.altFormat:t.config.dateFormat),t.timeContainer!==void 0&&t.minuteElement!==void 0&&t.hourElement!==void 0&&t.input.value!==""&&t.input.value!==void 0&&l(),t.close(),t.config&&t.config.mode==="range"&&t.selectedDates.length===1&&t.clear(!1))}}function Z(f){if(!(!f||t.config.minDate&&f t.config.maxDate.getFullYear())){var h=f,g=t.currentYear!==h;t.currentYear=h||t.currentYear,t.config.maxDate&&t.currentYear===t.config.maxDate.getFullYear()?t.currentMonth=Math.min(t.config.maxDate.getMonth(),t.currentMonth):t.config.minDate&&t.currentYear===t.config.minDate.getFullYear()&&(t.currentMonth=Math.max(t.config.minDate.getMonth(),t.currentMonth)),g&&(t.redraw(),ue("onYearChange"),J())}}function oe(f,h){var g;h===void 0&&(h=!0);var b=t.parseDate(f,void 0,h);if(t.config.minDate&&b&&$e(b,t.config.minDate,h!==void 0?h:!t.minDateHasTime)<0||t.config.maxDate&&b&&$e(b,t.config.maxDate,h!==void 0?h:!t.maxDateHasTime)>0)return!1;if(!t.config.enable&&t.config.disable.length===0)return!0;if(b===void 0)return!1;for(var C=!!t.config.enable,k=(g=t.config.enable)!==null&&g!==void 0?g:t.config.disable,X=0,P=void 0;X =P.from.getTime()&&b.getTime()<=P.to.getTime())return C}return!C}function bt(f){return t.daysContainer!==void 0?f.className.indexOf("hidden")===-1&&f.className.indexOf("flatpickr-disabled")===-1&&t.daysContainer.contains(f):!1}function Br(f){var h=f.target===t._input,g=t._input.value.trimEnd()!==jr();h&&g&&!(f.relatedTarget&&q(f.relatedTarget))&&t.setDate(t._input.value,!0,f.target===t.altInput?t.config.altFormat:t.config.dateFormat)}function on(f){var h=Be(f),g=t.config.wrap?n.contains(h):h===t._input,b=t.config.allowInput,C=t.isOpen&&(!b||!g),k=t.config.inline&&g&&!b;if(f.keyCode===13&&g){if(b)return t.setDate(t._input.value,!0,h===t.altInput?t.config.altFormat:t.config.dateFormat),t.close(),h.blur();t.open()}else if(q(h)||C||k){var X=!!t.timeContainer&&t.timeContainer.contains(h);switch(f.keyCode){case 13:X?(f.preventDefault(),l(),cn()):un(f);break;case 27:f.preventDefault(),cn();break;case 8:case 46:g&&!t.config.allowInput&&(f.preventDefault(),t.clear());break;case 37:case 39:if(!X&&!g){f.preventDefault();var P=o();if(t.daysContainer!==void 0&&(b===!1||P&&bt(P))){var Q=f.keyCode===39?1:-1;f.ctrlKey?(f.stopPropagation(),M(Q),Y(H(1),0)):Y(void 0,Q)}}else t.hourElement&&t.hourElement.focus();break;case 38:case 40:f.preventDefault();var R=f.keyCode===40?1:-1;t.daysContainer&&h.$i!==void 0||h===t.input||h===t.altInput?f.ctrlKey?(f.stopPropagation(),Z(t.currentYear-R),Y(H(1),0)):X||Y(void 0,R*7):h===t.currentYearElement?Z(t.currentYear-R):t.config.enableTime&&(!X&&t.hourElement&&t.hourElement.focus(),l(f),t._debouncedChange());break;case 9:if(X){var G=[t.hourElement,t.minuteElement,t.secondElement,t.amPM].concat(t.pluginElements).filter(function(ze){return ze}),re=G.indexOf(h);if(re!==-1){var it=G[re+(f.shiftKey?-1:1)];f.preventDefault(),(it||t._input).focus()}}else!t.config.noCalendar&&t.daysContainer&&t.daysContainer.contains(h)&&f.shiftKey&&(f.preventDefault(),t._input.focus());break;default:break}}if(t.amPM!==void 0&&h===t.amPM)switch(f.key){case t.l10n.amPM[0].charAt(0):case t.l10n.amPM[0].charAt(0).toLowerCase():t.amPM.textContent=t.l10n.amPM[0],d(),st();break;case t.l10n.amPM[1].charAt(0):case t.l10n.amPM[1].charAt(0).toLowerCase():t.amPM.textContent=t.l10n.amPM[1],d(),st();break}(g||q(h))&&ue("onKeyDown",f)}function sn(f,h){if(h===void 0&&(h="flatpickr-day"),!(t.selectedDates.length!==1||f&&(!f.classList.contains(h)||f.classList.contains("flatpickr-disabled")))){for(var g=f?f.dateObj.getTime():t.days.firstElementChild.dateObj.getTime(),b=t.parseDate(t.selectedDates[0],void 0,!0).getTime(),C=Math.min(g,t.selectedDates[0].getTime()),k=Math.max(g,t.selectedDates[0].getTime()),X=!1,P=0,Q=0,R=C;R C&&R P)?P=R:R>b&&(!Q||R ."+h));G.forEach(function(re){var it=re.dateObj,ze=it.getTime(),zn=P>0&&ze0&&ze>Q;if(zn){re.classList.add("notAllowed"),["inRange","startRange","endRange"].forEach(function(dn){re.classList.remove(dn)});return}else if(X&&!zn)return;["startRange","inRange","endRange","notAllowed"].forEach(function(dn){re.classList.remove(dn)}),f!==void 0&&(f.classList.add(g<=t.selectedDates[0].getTime()?"startRange":"endRange"),b
g&&ze===b&&re.classList.add("endRange"),ze>=P&&(Q===0||ze<=Q)&&Ec(ze,b,g)&&re.classList.add("inRange"))})}}function Ti(){t.isOpen&&!t.config.static&&!t.config.inline&&an()}function $r(f,h){if(h===void 0&&(h=t._positionElement),t.isMobile===!0){if(f){f.preventDefault();var g=Be(f);g&&g.blur()}t.mobileInput!==void 0&&(t.mobileInput.focus(),t.mobileInput.click()),ue("onOpen");return}else if(t._input.disabled||t.config.inline)return;var b=t.isOpen;t.isOpen=!0,b||(t.calendarContainer.classList.add("open"),t._input.classList.add("active"),ue("onOpen"),an(h)),t.config.enableTime===!0&&t.config.noCalendar===!0&&t.config.allowInput===!1&&(f===void 0||!t.timeContainer.contains(f.relatedTarget))&&setTimeout(function(){return t.hourElement.select()},50)}function Ci(f){return function(h){var g=t.config["_"+f+"Date"]=t.parseDate(h,t.config.dateFormat),b=t.config["_"+(f==="min"?"max":"min")+"Date"];g!==void 0&&(t[f==="min"?"minDateHasTime":"maxDateHasTime"]=g.getHours()>0||g.getMinutes()>0||g.getSeconds()>0),t.selectedDates&&(t.selectedDates=t.selectedDates.filter(function(C){return oe(C)}),!t.selectedDates.length&&f==="min"&&p(g),st()),t.daysContainer&&($n(),g!==void 0?t.currentYearElement[f]=g.getFullYear().toString():t.currentYearElement.removeAttribute(f),t.currentYearElement.disabled=!!b&&g!==void 0&&b.getFullYear()===g.getFullYear())}}function Ai(){var f=["wrap","weekNumbers","allowInput","allowInvalidPreload","clickOpens","time_24hr","enableTime","noCalendar","altInput","shorthandCurrentMonth","inline","static","enableSeconds","disableMobile"],h=Le(Le({},JSON.parse(JSON.stringify(n.dataset||{}))),e),g={};t.config.parseDate=h.parseDate,t.config.formatDate=h.formatDate,Object.defineProperty(t.config,"enable",{get:function(){return t.config._enable},set:function(G){t.config._enable=fs(G)}}),Object.defineProperty(t.config,"disable",{get:function(){return t.config._disable},set:function(G){t.config._disable=fs(G)}});var b=h.mode==="time";if(!h.dateFormat&&(h.enableTime||b)){var C=Ee.defaultConfig.dateFormat||Pt.dateFormat;g.dateFormat=h.noCalendar||b?"H:i"+(h.enableSeconds?":S":""):C+" H:i"+(h.enableSeconds?":S":"")}if(h.altInput&&(h.enableTime||b)&&!h.altFormat){var k=Ee.defaultConfig.altFormat||Pt.altFormat;g.altFormat=h.noCalendar||b?"h:i"+(h.enableSeconds?":S K":" K"):k+(" h:i"+(h.enableSeconds?":S":"")+" K")}Object.defineProperty(t.config,"minDate",{get:function(){return t.config._minDate},set:Ci("min")}),Object.defineProperty(t.config,"maxDate",{get:function(){return t.config._maxDate},set:Ci("max")});var X=function(G){return function(re){t.config[G==="min"?"_minTime":"_maxTime"]=t.parseDate(re,"H:i:S")}};Object.defineProperty(t.config,"minTime",{get:function(){return t.config._minTime},set:X("min")}),Object.defineProperty(t.config,"maxTime",{get:function(){return t.config._maxTime},set:X("max")}),h.mode==="time"&&(t.config.noCalendar=!0,t.config.enableTime=!0),Object.assign(t.config,g,h);for(var P=0;P -1?t.config[R]=Lr(Q[R]).map(s).concat(t.config[R]):typeof h[R]=="undefined"&&(t.config[R]=Q[R])}h.altInputClass||(t.config.altInputClass=Bn().className+" "+t.config.altInputClass),ue("onParseConfig")}function Bn(){return t.config.wrap?n.querySelector("[data-input]"):n}function Si(){typeof t.config.locale!="object"&&typeof Ee.l10ns[t.config.locale]=="undefined"&&t.config.errorHandler(new Error("flatpickr: invalid locale "+t.config.locale)),t.l10n=Le(Le({},Ee.l10ns.default),typeof t.config.locale=="object"?t.config.locale:t.config.locale!=="default"?Ee.l10ns[t.config.locale]:void 0),yt.D="("+t.l10n.weekdays.shorthand.join("|")+")",yt.l="("+t.l10n.weekdays.longhand.join("|")+")",yt.M="("+t.l10n.months.shorthand.join("|")+")",yt.F="("+t.l10n.months.longhand.join("|")+")",yt.K="("+t.l10n.amPM[0]+"|"+t.l10n.amPM[1]+"|"+t.l10n.amPM[0].toLowerCase()+"|"+t.l10n.amPM[1].toLowerCase()+")";var f=Le(Le({},e),JSON.parse(JSON.stringify(n.dataset||{})));f.time_24hr===void 0&&Ee.defaultConfig.time_24hr===void 0&&(t.config.time_24hr=t.l10n.time_24hr),t.formatDate=os(t),t.parseDate=Mr({config:t.config,l10n:t.l10n})}function an(f){if(typeof t.config.position=="function")return void t.config.position(t,f);if(t.calendarContainer!==void 0){ue("onPreCalendarPosition");var h=f||t._positionElement,g=Array.prototype.reduce.call(t.calendarContainer.children,function(Zc,eu){return Zc+eu.offsetHeight},0),b=t.calendarContainer.offsetWidth,C=t.config.position.split(" "),k=C[0],X=C.length>1?C[1]:null,P=h.getBoundingClientRect(),Q=window.innerHeight-P.bottom,R=k==="above"||k!=="below"&&Q g,G=window.pageYOffset+P.top+(R?-g-2:h.offsetHeight+2);if(Oe(t.calendarContainer,"arrowTop",!R),Oe(t.calendarContainer,"arrowBottom",R),!t.config.inline){var re=window.pageXOffset+P.left,it=!1,ze=!1;X==="center"?(re-=(b-P.width)/2,it=!0):X==="right"&&(re-=b-P.width,ze=!0),Oe(t.calendarContainer,"arrowLeft",!it&&!ze),Oe(t.calendarContainer,"arrowCenter",it),Oe(t.calendarContainer,"arrowRight",ze);var zn=window.document.body.offsetWidth-(window.pageXOffset+P.right),dn=re+b>window.document.body.offsetWidth,Uc=zn+b>window.document.body.offsetWidth;if(Oe(t.calendarContainer,"rightMost",dn),!t.config.static)if(t.calendarContainer.style.top=G+"px",!dn)t.calendarContainer.style.left=re+"px",t.calendarContainer.style.right="auto";else if(!Uc)t.calendarContainer.style.left="auto",t.calendarContainer.style.right=zn+"px";else{var Wr=ot();if(Wr===void 0)return;var Yc=window.document.body.offsetWidth,Gc=Math.max(0,Yc/2-b/2),Kc=".flatpickr-calendar.centerMost:before",Xc=".flatpickr-calendar.centerMost:after",Qc=Wr.cssRules.length,Jc="{left:"+P.left+"px;right:auto;}";Oe(t.calendarContainer,"rightMost",!1),Oe(t.calendarContainer,"centerMost",!0),Wr.insertRule(Kc+","+Xc+Jc,Qc),t.calendarContainer.style.left=Gc+"px",t.calendarContainer.style.right="auto"}}}}function ot(){for(var f=null,h=0;h /g, '>')\n\t\t.replace(/\"/g, '"');\n};\n\n\n/**\n * use setTimeout if timeout > 0 \n */\nexport const timeout = (fn:()=>void,timeout:number): number | null => {\n\tif( timeout > 0 ){\n\t\treturn window.setTimeout(fn,timeout);\n\t}\n\n\tfn.call(null);\n\treturn null;\n}\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnTypet.currentMonth+t.config.showMonths-1)&&t.config.mode!=="range";if(t.selectedDateElem=b,t.config.mode==="single")t.selectedDates=[C];else if(t.config.mode==="multiple"){var X=zr(C);X?t.selectedDates.splice(parseInt(X),1):t.selectedDates.push(C)}else t.config.mode==="range"&&(t.selectedDates.length===2&&t.clear(!1,!1),t.latestSelectedDateObj=C,t.selectedDates.push(C),$e(C,t.selectedDates[0],!0)!==0&&t.selectedDates.sort(function(G,re){return G.getTime()-re.getTime()}));if(d(),k){var P=t.currentYear!==C.getFullYear();t.currentYear=C.getFullYear(),t.currentMonth=C.getMonth(),P&&(ue("onYearChange"),J()),ue("onMonthChange")}if(Li(),ie(),st(),!k&&t.config.mode!=="range"&&t.config.showMonths===1?L(b):t.selectedDateElem!==void 0&&t.hourElement===void 0&&t.selectedDateElem&&t.selectedDateElem.focus(),t.hourElement!==void 0&&t.hourElement!==void 0&&t.hourElement.focus(),t.config.closeOnSelect){var Q=t.config.mode==="single"&&!t.config.enableTime,R=t.config.mode==="range"&&t.selectedDates.length===2&&!t.config.enableTime;(Q||R)&&cn()}w()}}var Bt={locale:[Si,Re],showMonths:[Ce,a,qe],minDate:[_],maxDate:[_],positionElement:[hs],clickOpens:[function(){t.config.clickOpens===!0?(v(t._input,"focus",t.open),v(t._input,"click",t.open)):(t._input.removeEventListener("focus",t.open),t._input.removeEventListener("click",t.open))}]};function Di(f,h){if(f!==null&&typeof f=="object"){Object.assign(t.config,f);for(var g in f)Bt[g]!==void 0&&Bt[g].forEach(function(b){return b()})}else t.config[f]=h,Bt[f]!==void 0?Bt[f].forEach(function(b){return b()}):Sr.indexOf(f)>-1&&(t.config[f]=Lr(h));t.redraw(),st(!0)}function Vn(f,h){var g=[];if(f instanceof Array)g=f.map(function(b){return t.parseDate(b,h)});else if(f instanceof Date||typeof f=="number")g=[t.parseDate(f,h)];else if(typeof f=="string")switch(t.config.mode){case"single":case"time":g=[t.parseDate(f,h)];break;case"multiple":g=f.split(t.config.conjunction).map(function(b){return t.parseDate(b,h)});break;case"range":g=f.split(t.l10n.rangeSeparator).map(function(b){return t.parseDate(b,h)});break;default:break}else t.config.errorHandler(new Error("Invalid date supplied: "+JSON.stringify(f)));t.selectedDates=t.config.allowInvalidPreload?g:g.filter(function(b){return b instanceof Date&&oe(b,!1)}),t.config.mode==="range"&&t.selectedDates.sort(function(b,C){return b.getTime()-C.getTime()})}function Oi(f,h,g){if(h===void 0&&(h=!1),g===void 0&&(g=t.config.dateFormat),f!==0&&!f||f instanceof Array&&f.length===0)return t.clear(h);Vn(f,g),t.latestSelectedDateObj=t.selectedDates[t.selectedDates.length-1],t.redraw(),_(void 0,h),p(),t.selectedDates.length===0&&t.clear(!1),st(h),h&&ue("onChange")}function fs(f){return f.slice().map(function(h){return typeof h=="string"||typeof h=="number"||h instanceof Date?t.parseDate(h,void 0,!0):h&&typeof h=="object"&&h.from&&h.to?{from:t.parseDate(h.from,void 0),to:t.parseDate(h.to,void 0)}:h}).filter(function(h){return h})}function Bc(){t.selectedDates=[],t.now=t.parseDate(t.config.now)||new Date;var f=t.config.defaultDate||((t.input.nodeName==="INPUT"||t.input.nodeName==="TEXTAREA")&&t.input.placeholder&&t.input.value===t.input.placeholder?null:t.input.value);f&&Vn(f,t.config.dateFormat),t._initialDate=t.selectedDates.length>0?t.selectedDates[0]:t.config.minDate&&t.config.minDate.getTime()>t.now.getTime()?t.config.minDate:t.config.maxDate&&t.config.maxDate.getTime() 0&&(t.latestSelectedDateObj=t.selectedDates[0]),t.config.minTime!==void 0&&(t.config.minTime=t.parseDate(t.config.minTime,"H:i")),t.config.maxTime!==void 0&&(t.config.maxTime=t.parseDate(t.config.maxTime,"H:i")),t.minDateHasTime=!!t.config.minDate&&(t.config.minDate.getHours()>0||t.config.minDate.getMinutes()>0||t.config.minDate.getSeconds()>0),t.maxDateHasTime=!!t.config.maxDate&&(t.config.maxDate.getHours()>0||t.config.maxDate.getMinutes()>0||t.config.maxDate.getSeconds()>0)}function $c(){if(t.input=Bn(),!t.input){t.config.errorHandler(new Error("Invalid input element specified"));return}t.input._type=t.input.type,t.input.type="text",t.input.classList.add("flatpickr-input"),t._input=t.input,t.config.altInput&&(t.altInput=te(t.input.nodeName,t.config.altInputClass),t._input=t.altInput,t.altInput.placeholder=t.input.placeholder,t.altInput.disabled=t.input.disabled,t.altInput.required=t.input.required,t.altInput.tabIndex=t.input.tabIndex,t.altInput.type="text",t.input.setAttribute("type","hidden"),!t.config.static&&t.input.parentNode&&t.input.parentNode.insertBefore(t.altInput,t.input.nextSibling)),t.config.allowInput||t._input.setAttribute("readonly","readonly"),hs()}function hs(){t._positionElement=t.config.positionElement||t._input}function Vc(){var f=t.config.enableTime?t.config.noCalendar?"time":"datetime-local":"date";t.mobileInput=te("input",t.input.className+" flatpickr-mobile"),t.mobileInput.tabIndex=1,t.mobileInput.type=f,t.mobileInput.disabled=t.input.disabled,t.mobileInput.required=t.input.required,t.mobileInput.placeholder=t.input.placeholder,t.mobileFormatStr=f==="datetime-local"?"Y-m-d\\TH:i:S":f==="date"?"Y-m-d":"H:i:S",t.selectedDates.length>0&&(t.mobileInput.defaultValue=t.mobileInput.value=t.formatDate(t.selectedDates[0],t.mobileFormatStr)),t.config.minDate&&(t.mobileInput.min=t.formatDate(t.config.minDate,"Y-m-d")),t.config.maxDate&&(t.mobileInput.max=t.formatDate(t.config.maxDate,"Y-m-d")),t.input.getAttribute("step")&&(t.mobileInput.step=String(t.input.getAttribute("step"))),t.input.type="hidden",t.altInput!==void 0&&(t.altInput.type="hidden");try{t.input.parentNode&&t.input.parentNode.insertBefore(t.mobileInput,t.input.nextSibling)}catch(h){}v(t.mobileInput,"change",function(h){t.setDate(Be(h).value,!1,t.mobileFormatStr),ue("onChange"),ue("onClose")})}function zc(f){if(t.isOpen===!0)return t.close();t.open(f)}function ue(f,h){if(t.config!==void 0){var g=t.config[f];if(g!==void 0&&g.length>0)for(var b=0;g[b]&&b =0&&$e(f,t.selectedDates[1])<=0}function Li(){t.config.noCalendar||t.isMobile||!t.monthNav||(t.yearElements.forEach(function(f,h){var g=new Date(t.currentYear,t.currentMonth,1);g.setMonth(t.currentMonth+h),t.config.showMonths>1||t.config.monthSelectorType==="static"?t.monthElements[h].textContent=bi(g.getMonth(),t.config.shorthandCurrentMonth,t.l10n)+" ":t.monthsDropdownContainer.value=g.getMonth().toString(),f.value=g.getFullYear().toString()}),t._hidePrevMonthArrow=t.config.minDate!==void 0&&(t.currentYear===t.config.minDate.getFullYear()?t.currentMonth<=t.config.minDate.getMonth():t.currentYear t.config.maxDate.getMonth():t.currentYear>t.config.maxDate.getFullYear()))}function jr(f){var h=f||(t.config.altInput?t.config.altFormat:t.config.dateFormat);return t.selectedDates.map(function(g){return t.formatDate(g,h)}).filter(function(g,b,C){return t.config.mode!=="range"||t.config.enableTime||C.indexOf(g)===b}).join(t.config.mode!=="range"?t.config.conjunction:t.l10n.rangeSeparator)}function st(f){f===void 0&&(f=!0),t.mobileInput!==void 0&&t.mobileFormatStr&&(t.mobileInput.value=t.latestSelectedDateObj!==void 0?t.formatDate(t.latestSelectedDateObj,t.mobileFormatStr):""),t.input.value=jr(t.config.dateFormat),t.altInput!==void 0&&(t.altInput.value=jr(t.config.altFormat)),f!==!1&&ue("onValueUpdate")}function Wc(f){var h=Be(f),g=t.prevMonthNav.contains(h),b=t.nextMonthNav.contains(h);g||b?M(g?-1:1):t.yearElements.indexOf(h)>=0?h.select():h.classList.contains("arrowUp")?t.changeYear(t.currentYear+1):h.classList.contains("arrowDown")&&t.changeYear(t.currentYear-1)}function qc(f){f.preventDefault();var h=f.type==="keydown",g=Be(f),b=g;t.amPM!==void 0&&g===t.amPM&&(t.amPM.textContent=t.l10n.amPM[Fe(t.amPM.textContent===t.l10n.amPM[0])]);var C=parseFloat(b.getAttribute("min")),k=parseFloat(b.getAttribute("max")),X=parseFloat(b.getAttribute("step")),P=parseInt(b.value,10),Q=f.delta||(h?f.which===38?1:-1:0),R=P+X*Q;if(typeof b.value!="undefined"&&b.value.length===2){var G=b===t.hourElement,re=b===t.minuteElement;R k&&(R=b===t.hourElement?R-k-Fe(!t.amPM):C,re&&A(void 0,1,t.hourElement)),t.amPM&&G&&(X===1?R+P===23:Math.abs(R-P)>X)&&(t.amPM.textContent=t.l10n.amPM[Fe(t.amPM.textContent===t.l10n.amPM[0])]),b.value=De(R)}}return r(),t}function kn(n,e){for(var t=Array.prototype.slice.call(n).filter(function(s){return s instanceof HTMLElement}),i=[],r=0;r option"))if(e.selected){for(let t of I("#id_columns"))t.appendChild(e.cloneNode(!0));e.remove()}n.preventDefault()}function Gg(n){for(let e of I("#id_columns > option"))if(e.selected){for(let t of I("#id_available_columns"))t.appendChild(e.cloneNode(!0));e.remove()}n.preventDefault()}function Tc(n,e){return at(this,null,function*(){return yield On(n,e)})}function Kg(n){var l,c,u;n.preventDefault();let e=n.currentTarget,t=e.getAttribute("data-url");if(t==null){It("danger","Error Updating Table Configuration","No API path defined for configuration form.").show();return}let i=((l=document.activeElement)==null?void 0:l.getAttribute("value"))==="Reset",r=(u=(c=e.getAttribute("data-config-root"))==null?void 0:c.split("."))!=null?u:[];if(i){let d=r.reduceRight((p,y)=>({[y]:p}),{});Tc(t,d).then(p=>{tn(p)?It("danger","Error Resetting Table Configuration",p.error).show():window.location.href=window.location.origin+window.location.pathname});return}let o=xl(e,"select[name=columns]"),s=Object.assign({},...o.map(d=>({[d.name]:d.options}))),a=r.reduceRight((d,p)=>({[p]:d}),s);Tc(t,a).then(d=>{tn(d)?It("danger","Error Updating Table Configuration",d.error).show():window.location.href=window.location.origin+window.location.pathname})}function Cc(){for(let n of I("#add_columns"))n.addEventListener("click",Yg);for(let n of I("#remove_columns"))n.addEventListener("click",Gg);for(let n of I("form.userconfigform"))n.addEventListener("submit",Kg)}function Ac(n){return typeof n=="string"&&["show","hide"].includes(n)}var rn=class extends Error{constructor(t,i){super(t);ee(this,"table");this.table=i}},Nn=class{constructor(e,t){ee(this,"button");ee(this,"rows");this.button=e,this.rows=t}hideRows(){for(let e of this.rows)e.classList.add("d-none")}set buttonState(e){Ac(e)&&this.button.setAttribute("data-state",e)}get buttonState(){let e=this.button.getAttribute("data-state");return Ac(e)?e:null}toggleButton(){this.buttonState==="show"?this.button.innerText=Ln(this.button.innerText,"Show","Hide"):this.buttonState==="hide"&&(this.button.innerText=Ln(this.button.innerHTML,"Hide","Show"))}toggleState(){this.buttonState==="show"?this.buttonState="hide":this.buttonState==="hide"&&(this.buttonState="show")}toggle(){this.toggleState(),this.toggleButton()}handleClick(e){e.currentTarget.isEqualNode(this.button)&&this.toggle(),this.buttonState==="hide"&&this.hideRows()}},ss=class{constructor(e){ee(this,"table");ee(this,"enabledButton");ee(this,"disabledButton");ee(this,"virtualButton");ee(this,"disconnectedButton");ee(this,"rows");this.table=e,this.rows=this.table.querySelectorAll("tr");try{let t=nn(this.table,"button.toggle-enabled"),i=nn(this.table,"button.toggle-disabled"),r=nn(this.table,"button.toggle-virtual"),o=nn(this.table,"button.toggle-disconnected");if(t===null)throw new rn("Table is missing a 'toggle-enabled' button.",e);if(i===null)throw new rn("Table is missing a 'toggle-disabled' button.",e);if(r===null)throw new rn("Table is missing a 'toggle-virtual' button.",e);if(o===null)throw new rn("Table is missing a 'toggle-disconnected' button.",e);t.addEventListener("click",s=>this.handleClick(s,this)),i.addEventListener("click",s=>this.handleClick(s,this)),r.addEventListener("click",s=>this.handleClick(s,this)),o.addEventListener("click",s=>this.handleClick(s,this)),this.enabledButton=new Nn(t,e.querySelectorAll('tr[data-enabled="enabled"]')),this.disabledButton=new Nn(i,e.querySelectorAll('tr[data-enabled="disabled"]')),this.virtualButton=new Nn(r,e.querySelectorAll('tr[data-type="virtual"]')),this.disconnectedButton=new Nn(o,e.querySelectorAll('tr[data-connected="disconnected"]'))}catch(t){if(t instanceof rn){console.debug("Table does not contain enable/disable toggle buttons");return}else throw t}}handleClick(e,t){for(let i of this.rows)i.classList.remove("d-none");t.enabledButton.handleClick(e),t.disabledButton.handleClick(e),t.virtualButton.handleClick(e),t.disconnectedButton.handleClick(e)}};function Sc(){for(let n of I("table"))new ss(n)}var as=class{constructor(e){ee(this,"base");ee(this,"state");ee(this,"activeLink",null);ee(this,"sections",[]);this.base=e,this.state=new gi({pinned:!0},{persist:!0,key:"netbox-sidenav"}),this.init(),this.initSectionLinks(),this.initLinks()}bodyHas(e){return document.body.hasAttribute(`data-sidenav-${e}`)}bodyRemove(...e){for(let t of e)document.body.removeAttribute(`data-sidenav-${t}`)}bodyAdd(...e){for(let t of e)document.body.setAttribute(`data-sidenav-${t}`,"")}init(){for(let e of this.base.querySelectorAll(".sidenav-toggle"))e.addEventListener("click",t=>this.onToggle(t));for(let e of I(".sidenav-toggle-mobile"))e.addEventListener("click",t=>this.onMobileToggle(t));window.innerWidth>1200&&(this.state.get("pinned")&&this.pin(),this.state.get("pinned")||this.unpin(),window.addEventListener("resize",()=>this.onResize())),window.innerWidth<1200&&(this.bodyRemove("hide"),this.bodyAdd("hidden"),window.addEventListener("resize",()=>this.onResize())),this.base.addEventListener("mouseenter",()=>this.onEnter()),this.base.addEventListener("mouseleave",()=>this.onLeave())}initLinks(){for(let e of this.getActiveLinks())this.bodyHas("show")?this.activateLink(e,"expand"):this.bodyHas("hidden")&&this.activateLink(e,"collapse")}show(){this.bodyAdd("show"),this.bodyRemove("hidden","hide")}hide(){this.bodyAdd("hidden"),this.bodyRemove("pinned","show");for(let e of this.base.querySelectorAll(".collapse"))e.classList.remove("show")}pin(){this.bodyAdd("show","pinned"),this.bodyRemove("hidden"),this.state.set("pinned",!0)}unpin(){this.bodyRemove("pinned","show"),this.bodyAdd("hidden");for(let e of this.base.querySelectorAll(".collapse"))e.classList.remove("show");this.state.set("pinned",!1)}handleSectionClick(e){e.preventDefault();let t=e.target;this.activeLink=t,this.closeInactiveSections()}closeInactiveSections(){for(let[e,t]of this.sections)e!==this.activeLink&&(e.classList.add("collapsed"),e.setAttribute("aria-expanded","false"),t.hide())}initSectionLinks(){for(let e of I(".navbar-nav .nav-item .nav-link[data-bs-toggle]"))if(e.parentElement!==null){let t=e.parentElement.querySelector(".collapse");if(t!==null){let i=new At(t,{toggle:!1});this.sections.push([e,i]),e.addEventListener("click",r=>this.handleSectionClick(r))}}}activateLink(e,t){var r;let i=e.closest(".dropdown-menu");if(gr(i)){let o=i.parentElement,s=(r=i.parentElement)==null?void 0:r.querySelector(".nav-link");if(gr(s)&&gr(o))switch(t){case"expand":s.setAttribute("aria-expanded","true"),o.classList.add("active"),i.classList.add("show"),e.classList.add("active");break;case"collapse":s.setAttribute("aria-expanded","false"),o.classList.remove("active"),i.classList.remove("show"),e.classList.remove("active");break}}}*getActiveLinks(){for(let e of this.base.querySelectorAll("ul.navbar-nav .nav-item .dropdown-item")){let t=e.querySelector("a");if(t){let i=new RegExp(t.href,"gi");window.location.href.match(i)&&(yield e)}}}onEnter(){if(!this.bodyHas("pinned")){this.bodyRemove("hide","hidden"),this.bodyAdd("show");for(let e of this.getActiveLinks())this.activateLink(e,"expand")}}onLeave(){if(!this.bodyHas("pinned")){this.bodyRemove("show"),this.bodyAdd("hide");for(let e of this.getActiveLinks())this.activateLink(e,"collapse");this.bodyRemove("hide"),this.bodyAdd("hidden")}}onResize(){this.bodyHas("show")&&!this.bodyHas("pinned")&&(this.bodyRemove("show"),this.bodyAdd("hidden"))}onToggle(e){e.preventDefault(),this.state.get("pinned")?this.unpin():this.pin()}onMobileToggle(e){e.preventDefault(),this.bodyHas("hidden")?this.show():this.hide()}};function Dc(){for(let n of I(".navbar"))new as(n)}function Oc(n,e,t,i,r){let o=(...s)=>(console.warn("gridstack.js: Function `"+t+"` is deprecated in "+r+" and has been replaced with `"+i+"`. It will be **removed** in a future release"),e.apply(n,s));return o.prototype=e.prototype,o}var E=class n{static getElements(e,t=document){if(typeof e=="string"){let i="getElementById"in t?t:void 0;if(i&&!isNaN(+e[0])){let o=i.getElementById(e);return o?[o]:[]}let r=t.querySelectorAll(e);return!r.length&&e[0]!=="."&&e[0]!=="#"&&(r=t.querySelectorAll("."+e),r.length||(r=t.querySelectorAll("#"+e))),Array.from(r)}return[e]}static getElement(e,t=document){if(typeof e=="string"){let i="getElementById"in t?t:void 0;if(!e.length)return null;if(i&&e[0]==="#")return i.getElementById(e.substring(1));if(e[0]==="#"||e[0]==="."||e[0]==="[")return t.querySelector(e);if(i&&!isNaN(+e[0]))return i.getElementById(e);let r=t.querySelector(e);return i&&!r&&(r=i.getElementById(e)),r||(r=t.querySelector("."+e)),r}return e}static lazyLoad(e){var t,i;return e.lazyLoad||((i=(t=e.grid)==null?void 0:t.opts)==null?void 0:i.lazyLoad)&&e.lazyLoad!==!1}static createDiv(e,t){let i=document.createElement("div");return e.forEach(r=>{r&&i.classList.add(r)}),t==null||t.appendChild(i),i}static shouldSizeToContent(e,t=!1){return(e==null?void 0:e.grid)&&(t?e.sizeToContent===!0||e.grid.opts.sizeToContent===!0&&e.sizeToContent===void 0:!!e.sizeToContent||e.grid.opts.sizeToContent&&e.sizeToContent!==!1)}static isIntercepted(e,t){return!(e.y>=t.y+t.h||e.y+e.h<=t.y||e.x+e.w<=t.x||e.x>=t.x+t.w)}static isTouching(e,t){return n.isIntercepted(e,{x:t.x-.5,y:t.y-.5,w:t.w+1,h:t.h+1})}static areaIntercept(e,t){let i=e.x>t.x?e.x:t.x,r=e.x+e.w t.y?e.y:t.y,s=e.y+e.h {var a,l,c,u;let s=t*(((a=r.y)!=null?a:1e4)-((l=o.y)!=null?l:1e4));return s===0?t*(((c=r.x)!=null?c:1e4)-((u=o.x)!=null?u:1e4)):s})}static find(e,t){return t?e.find(i=>i.id===t):void 0}static toBool(e){return typeof e=="boolean"?e:typeof e=="string"?(e=e.toLowerCase(),!(e===""||e==="no"||e==="false"||e==="0")):!!e}static toNumber(e){return e===null||e.length===0?void 0:Number(e)}static parseHeight(e){let t,i="px";if(typeof e=="string")if(e==="auto"||e==="")t=0;else{let r=e.match(/^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%|cm|mm)?$/);if(!r)throw new Error(`Invalid height val = ${e}`);i=r[2]||"px",t=parseFloat(r[1])}else t=e;return{h:t,unit:i}}static defaults(e,...t){return t.forEach(i=>{for(let r in i){if(!i.hasOwnProperty(r))return;e[r]===null||e[r]===void 0?e[r]=i[r]:typeof i[r]=="object"&&typeof e[r]=="object"&&n.defaults(e[r],i[r])}}),e}static same(e,t){if(typeof e!="object")return e==t;if(typeof e!=typeof t||Object.keys(e).length!==Object.keys(t).length)return!1;for(let i in e)if(e[i]!==t[i])return!1;return!0}static copyPos(e,t,i=!1){return t.x!==void 0&&(e.x=t.x),t.y!==void 0&&(e.y=t.y),t.w!==void 0&&(e.w=t.w),t.h!==void 0&&(e.h=t.h),i&&(t.minW&&(e.minW=t.minW),t.minH&&(e.minH=t.minH),t.maxW&&(e.maxW=t.maxW),t.maxH&&(e.maxH=t.maxH)),e}static samePos(e,t){return e&&t&&e.x===t.x&&e.y===t.y&&(e.w||1)===(t.w||1)&&(e.h||1)===(t.h||1)}static sanitizeMinMax(e){e.minW||delete e.minW,e.minH||delete e.minH,e.maxW||delete e.maxW,e.maxH||delete e.maxH}static removeInternalAndSame(e,t){if(!(typeof e!="object"||typeof t!="object"))for(let i in e){let r=e[i],o=t[i];i[0]==="_"||r===o?delete e[i]:r&&typeof r=="object"&&o!==void 0&&(n.removeInternalAndSame(r,o),Object.keys(r).length||delete e[i])}}static removeInternalForSave(e,t=!0){for(let i in e)(i[0]==="_"||e[i]===null||e[i]===void 0)&&delete e[i];delete e.grid,t&&delete e.el,e.autoPosition||delete e.autoPosition,e.noResize||delete e.noResize,e.noMove||delete e.noMove,e.locked||delete e.locked,(e.w===1||e.w===e.minW)&&delete e.w,(e.h===1||e.h===e.minH)&&delete e.h}static throttle(e,t){let i=!1;return(...r)=>{i||(i=!0,setTimeout(()=>{e(...r),i=!1},t))}}static removePositioningStyles(e){let t=e.style;t.position&&t.removeProperty("position"),t.left&&t.removeProperty("left"),t.top&&t.removeProperty("top"),t.width&&t.removeProperty("width"),t.height&&t.removeProperty("height")}static getScrollElement(e){if(!e)return document.scrollingElement||document.documentElement;let t=getComputedStyle(e);return/(auto|scroll)/.test(t.overflow+t.overflowY)?e:n.getScrollElement(e.parentElement)}static updateScrollPosition(e,t,i){let r=n.getScrollElement(e);if(!r)return;let o=e.getBoundingClientRect(),s=r.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,l=o.bottom-Math.min(s.bottom,a),c=o.top-Math.max(s.top,0),u=r.scrollTop;c<0&&i<0?e.offsetHeight>s.height?r.scrollTop+=i:r.scrollTop+=Math.abs(c)>Math.abs(i)?i:c:l>0&&i>0&&(e.offsetHeight>s.height?r.scrollTop+=i:r.scrollTop+=l>i?i:l),t.top+=r.scrollTop-u}static updateScrollResize(e,t,i){let r=n.getScrollElement(t),o=r.clientHeight,s=r===n.getScrollElement()?0:r.getBoundingClientRect().top,a=e.clientY-s,l=ao-i;l?r.scrollBy({behavior:"smooth",top:a-i}):c&&r.scrollBy({behavior:"smooth",top:i-(o-a)})}static clone(e){return e==null||typeof e!="object"?e:e instanceof Array?[...e]:O({},e)}static cloneDeep(e){let t=["parentGrid","el","grid","subGrid","engine"],i=n.clone(e);for(let r in i)i.hasOwnProperty(r)&&typeof i[r]=="object"&&r.substring(0,2)!=="__"&&!t.find(o=>o===r)&&(i[r]=n.cloneDeep(e[r]));return i}static cloneNode(e){let t=e.cloneNode(!0);return t.removeAttribute("id"),t}static appendTo(e,t){let i;typeof t=="string"?i=n.getElement(t):i=t,i&&i.appendChild(e)}static addElStyles(e,t){if(t instanceof Object)for(let i in t)t.hasOwnProperty(i)&&(Array.isArray(t[i])?t[i].forEach(r=>{e.style[i]=r}):e.style[i]=t[i])}static initEvent(e,t){let i={type:t.type},r={button:0,which:0,buttons:1,bubbles:!0,cancelable:!0,target:t.target?t.target:e.target};return["altKey","ctrlKey","metaKey","shiftKey"].forEach(o=>i[o]=e[o]),["pageX","pageY","clientX","clientY","screenX","screenY"].forEach(o=>i[o]=e[o]),O(O({},i),r)}static simulateMouseEvent(e,t,i){var s,a,l,c;let r=e,o=new MouseEvent(t,{bubbles:!0,composed:!0,cancelable:!0,view:window,detail:1,screenX:e.screenX,screenY:e.screenY,clientX:e.clientX,clientY:e.clientY,ctrlKey:(s=r.ctrlKey)!=null?s:!1,altKey:(a=r.altKey)!=null?a:!1,shiftKey:(l=r.shiftKey)!=null?l:!1,metaKey:(c=r.metaKey)!=null?c:!1,button:0,relatedTarget:e.target});(i||e.target).dispatchEvent(o)}static getValuesFromTransformedElement(e){let t=document.createElement("div");n.addElStyles(t,{opacity:"0",position:"fixed",top:"0px",left:"0px",width:"1px",height:"1px",zIndex:"-999999"}),e.appendChild(t);let i=t.getBoundingClientRect();return e.removeChild(t),t.remove(),{xScale:1/i.width,yScale:1/i.height,xOffset:i.left,yOffset:i.top}}static swap(e,t,i){if(!e)return;let r=e[t];e[t]=e[i],e[i]=r}static canBeRotated(e){var t;return!(!e||e.w===e.h||e.locked||e.noResize||(t=e.grid)!=null&&t.opts.disableResize||e.minW&&e.minW===e.maxW||e.minH&&e.minH===e.maxH)}};var In=class n{constructor(e={}){this.addedNodes=[],this.removedNodes=[],this.defaultColumn=12,this.column=e.column||this.defaultColumn,this.column>this.defaultColumn&&(this.defaultColumn=this.column),this.maxRow=e.maxRow,this._float=e.float,this.nodes=e.nodes||[],this.onChange=e.onChange}batchUpdate(e=!0,t=!0){return!!this.batchMode===e?this:(this.batchMode=e,e?(this._prevFloat=this._float,this._float=!0,this.cleanNodes(),this.saveInitial()):(this._float=this._prevFloat,delete this._prevFloat,t&&this._packNodes(),this._notify()),this)}_useEntireRowArea(e,t){return(!this.float||this.batchMode&&!this._prevFloat)&&!this._hasLocked&&(!e._moving||e._skipDown||t.y<=e.y)}_fixCollisions(e,t=e,i,r={}){if(this.sortNodes(-1),i=i||this.collide(e,t),!i)return!1;if(e._moving&&!r.nested&&!this.float&&this.swap(e,i))return!0;let o=t;!this._loading&&this._useEntireRowArea(e,t)&&(o={x:0,w:this.column,y:t.y,h:t.h},i=this.collide(e,o,r.skip));let s=!1,a={nested:!0,pack:!1},l=0;for(;i=i||this.collide(e,o,r.skip);){if(l++>this.nodes.length*2)throw new Error("Infinite collide check");let c;if(i.locked||this._loading||e._moving&&!e._skipDown&&t.y>e.y&&!this.float&&(!this.collide(i,ae(O({},i),{y:e.y}),e)||!this.collide(i,ae(O({},i),{y:t.y-i.h}),e))){e._skipDown=e._skipDown||t.y>e.y;let u=O(ae(O({},t),{y:i.y+i.h}),a);c=this._loading&&E.samePos(e,u)?!0:this.moveNode(e,u),(i.locked||this._loading)&&c?E.copyPos(t,e):!i.locked&&c&&r.pack&&(this._packNodes(),t.y=i.y+i.h,E.copyPos(e,t)),s=s||c}else c=this.moveNode(i,O(ae(O({},i),{y:t.y+t.h,skip:e}),a));if(!c)return s;i=void 0}return s}collide(e,t=e,i){let r=e._id,o=i==null?void 0:i._id;return this.nodes.find(s=>s._id!==r&&s._id!==o&&E.isIntercepted(s,t))}collideAll(e,t=e,i){let r=e._id,o=i==null?void 0:i._id;return this.nodes.filter(s=>s._id!==r&&s._id!==o&&E.isIntercepted(s,t))}directionCollideCoverage(e,t,i){if(!t.rect||!e._rect)return;let r=e._rect,o=O({},t.rect);o.y>r.y?(o.h+=o.y-r.y,o.y=r.y):o.h+=r.y-o.y,o.x>r.x?(o.w+=o.x-r.x,o.x=r.x):o.w+=r.x-o.x;let s,a=.5;for(let l of i){if(l.locked||!l._rect)break;let c=l._rect,u=Number.MAX_VALUE,d=Number.MAX_VALUE;r.y c.y+c.h&&(u=(c.y+c.h-o.y)/c.h),r.x c.x+c.w&&(d=(c.x+c.w-o.x)/c.w);let p=Math.min(d,u);p>a&&(a=p,s=l)}return t.collide=s,s}cacheRects(e,t,i,r,o,s){return this.nodes.forEach(a=>a._rect={y:a.y*t+i,x:a.x*e+s,w:a.w*e-s-r,h:a.h*t-i-o}),this}swap(e,t){if(!t||t.locked||!e||e.locked)return!1;function i(){let o=t.x,s=t.y;return t.x=e.x,t.y=e.y,e.h!=t.h?(e.x=o,e.y=t.y+t.h):e.w!=t.w?(e.x=t.x+t.w,e.y=s):(e.x=o,e.y=s),e._dirty=t._dirty=!0,!0}let r;if(e.w===t.w&&e.h===t.h&&(e.x===t.x||e.y===t.y)&&(r=E.isTouching(e,t)))return i();if(r!==!1){if(e.w===t.w&&e.x===t.x&&(r||(r=E.isTouching(e,t)))){if(t.y {let c;s.locked||(s.autoPosition=!0,e==="list"&&a&&(c=l[a-1])),this.addNode(s,!1,c)}),r||delete this._inColumnResize,i||this.batchUpdate(!1),this}set float(e){this._float!==e&&(this._float=e||!1,e||this._packNodes()._notify())}get float(){return this._float||!1}sortNodes(e=1){return this.nodes=E.sort(this.nodes,e),this}_packNodes(){return this.batchMode?this:(this.sortNodes(),this.float?this.nodes.forEach(e=>{if(e._updating||e._orig===void 0||e.y===e._orig.y)return;let t=e.y;for(;t>e._orig.y;)--t,this.collide(e,{x:e.x,y:t,w:e.w,h:e.h})||(e._dirty=!0,e.y=t)}):this.nodes.forEach((e,t)=>{if(!e.locked)for(;e.y>0;){let i=t===0?0:e.y-1;if(!(t===0||!this.collide(e,{x:e.x,y:i,w:e.w,h:e.h})))break;e._dirty=e.y!==i,e.y=i}}),this)}prepareNode(e,t){var o;e._id=(o=e._id)!=null?o:n._idSeq++;let i=e.id;if(i){let s=1;for(;this.nodes.find(a=>a.id===e.id&&a!==e);)e.id=i+"_"+s++}(e.x===void 0||e.y===void 0||e.x===null||e.y===null)&&(e.autoPosition=!0);let r={x:0,y:0,w:1,h:1};return E.defaults(e,r),e.autoPosition||delete e.autoPosition,e.noResize||delete e.noResize,e.noMove||delete e.noMove,E.sanitizeMinMax(e),typeof e.x=="string"&&(e.x=Number(e.x)),typeof e.y=="string"&&(e.y=Number(e.y)),typeof e.w=="string"&&(e.w=Number(e.w)),typeof e.h=="string"&&(e.h=Number(e.h)),isNaN(e.x)&&(e.x=r.x,e.autoPosition=!0),isNaN(e.y)&&(e.y=r.y,e.autoPosition=!0),isNaN(e.w)&&(e.w=r.w),isNaN(e.h)&&(e.h=r.h),this.nodeBoundFix(e,t),e}nodeBoundFix(e,t){let i=e._orig||E.copyPos({},e);if(e.maxW&&(e.w=Math.min(e.w||1,e.maxW)),e.maxH&&(e.h=Math.min(e.h||1,e.maxH)),e.minW&&(e.w=Math.max(e.w||1,e.minW)),e.minH&&(e.h=Math.max(e.h||1,e.minH)),(e.x||0)+(e.w||1)>this.column&&this.column this.column?e.w=this.column:e.w<1&&(e.w=1),this.maxRow&&e.h>this.maxRow?e.h=this.maxRow:e.h<1&&(e.h=1),e.x<0&&(e.x=0),e.y<0&&(e.y=0),e.x+e.w>this.column&&(t?e.w=this.column-e.x:e.x=this.column-e.w),this.maxRow&&e.y+e.h>this.maxRow&&(t?e.h=this.maxRow-e.y:e.y=this.maxRow-e.h),E.samePos(e,i)||(e._dirty=!0),this}getDirtyNodes(e){return e?this.nodes.filter(t=>t._dirty&&!E.samePos(t,t._orig)):this.nodes.filter(t=>t._dirty)}_notify(e){if(this.batchMode||!this.onChange)return this;let t=(e||[]).concat(this.getDirtyNodes());return this.onChange(t),this}cleanNodes(){return this.batchMode?this:(this.nodes.forEach(e=>{delete e._dirty,delete e._lastTried}),this)}saveInitial(){return this.nodes.forEach(e=>{e._orig=E.copyPos({},e),delete e._dirty}),this._hasLocked=this.nodes.some(e=>e.locked),this}restoreInitial(){return this.nodes.forEach(e=>{!e._orig||E.samePos(e,e._orig)||(E.copyPos(e,e._orig),e._dirty=!0)}),this._notify(),this}findEmptyPosition(e,t=this.nodes,i=this.column,r){let o=r?r.y*i+(r.x+r.w):0,s=!1;for(let a=o;!s;++a){let l=a%i,c=Math.floor(a/i);if(l+e.w>i)continue;let u={x:l,y:c,w:e.w,h:e.h};t.find(d=>E.isIntercepted(u,d))||((e.x!==l||e.y!==c)&&(e._dirty=!0),e.x=l,e.y=c,delete e.autoPosition,s=!0)}return s}addNode(e,t=!1,i){let r=this.nodes.find(s=>s._id===e._id);if(r)return r;this._inColumnResize?this.nodeBoundFix(e):this.prepareNode(e),delete e._temporaryRemoved,delete e._removeDOM;let o;return e.autoPosition&&this.findEmptyPosition(e,this.nodes,this.column,i)&&(delete e.autoPosition,o=!0),this.nodes.push(e),t&&this.addedNodes.push(e),o||this._fixCollisions(e),this.batchMode||this._packNodes()._notify(),e}removeNode(e,t=!0,i=!1){return this.nodes.find(r=>r._id===e._id)?(i&&this.removedNodes.push(e),t&&(e._removeDOM=!0),this.nodes=this.nodes.filter(r=>r._id!==e._id),e._isAboutToRemove||this._packNodes(),this._notify([e]),this):this}removeAll(e=!0,t=!0){if(delete this._layouts,!this.nodes.length)return this;e&&this.nodes.forEach(r=>r._removeDOM=!0);let i=this.nodes;return this.removedNodes=t?i:[],this.nodes=[],this._notify(i)}moveNodeCheck(e,t){if(!this.changedPosConstrain(e,t))return!1;if(t.pack=!0,!this.maxRow)return this.moveNode(e,t);let i,r=new n({column:this.column,float:this.float,nodes:this.nodes.map(s=>s._id===e._id?(i=O({},s),i):O({},s))});if(!i)return!1;let o=r.moveNode(i,t)&&r.getRow()<=Math.max(this.getRow(),this.maxRow);if(!o&&!t.resizing&&t.collide){let s=t.collide.el.gridstackNode;if(this.swap(e,s))return this._notify(),!0}return o?(r.nodes.filter(s=>s._dirty).forEach(s=>{let a=this.nodes.find(l=>l._id===s._id);a&&(E.copyPos(a,s),a._dirty=!0)}),this._notify(),!0):!1}willItFit(e){if(delete e._willFitPos,!this.maxRow)return!0;let t=new n({column:this.column,float:this.float,nodes:this.nodes.map(r=>O({},r))}),i=O({},e);return this.cleanupNode(i),delete i.el,delete i._id,delete i.content,delete i.grid,t.addNode(i),t.getRow()<=this.maxRow?(e._willFitPos=E.copyPos({},i),!0):!1}changedPosConstrain(e,t){return t.w=t.w||e.w,t.h=t.h||e.h,e.x!==t.x||e.y!==t.y?!0:(e.maxW&&(t.w=Math.min(t.w,e.maxW)),e.maxH&&(t.h=Math.min(t.h,e.maxH)),e.minW&&(t.w=Math.max(t.w,e.minW)),e.minH&&(t.h=Math.max(t.h,e.minH)),e.w!==t.w||e.h!==t.h)}moveNode(e,t){var c,u;if(!e||!t)return!1;let i;t.pack===void 0&&!this.batchMode&&(i=t.pack=!0),typeof t.x!="number"&&(t.x=e.x),typeof t.y!="number"&&(t.y=e.y),typeof t.w!="number"&&(t.w=e.w),typeof t.h!="number"&&(t.h=e.h);let r=e.w!==t.w||e.h!==t.h,o=E.copyPos({},e,!0);if(E.copyPos(o,t),this.nodeBoundFix(o,r),E.copyPos(t,o),!t.forceCollide&&E.samePos(e,t))return!1;let s=E.copyPos({},e),a=this.collideAll(e,o,t.skip),l=!0;if(a.length){let d=e._moving&&!t.nested,p=d?this.directionCollideCoverage(e,t,a):a[0];if(d&&p&&((u=(c=e.grid)==null?void 0:c.opts)!=null&&u.subGridDynamic)&&!e.grid._isTemp){let y=E.areaIntercept(t.rect,p._rect),m=E.area(t.rect),v=E.area(p._rect);y/(m .8&&(p.grid.makeSubGrid(p.el,void 0,e),p=void 0)}p?l=!this._fixCollisions(e,o,p,t):(l=!1,i&&delete t.pack)}return l&&!E.samePos(e,o)&&(e._dirty=!0,E.copyPos(e,o)),t.pack&&this._packNodes()._notify(),!E.samePos(e,s)}getRow(){return this.nodes.reduce((e,t)=>Math.max(e,t.y+t.h),0)}beginUpdate(e){return e._updating||(e._updating=!0,delete e._skipDown,this.batchMode||this.saveInitial()),this}endUpdate(){let e=this.nodes.find(t=>t._updating);return e&&(delete e._updating,delete e._skipDown),this}save(e=!0,t,i){var a;let r=((a=this._layouts)==null?void 0:a.length)||0,o;r&&(i?i!==this.column&&(o=this._layouts[i]):this.column!==r-1&&(o=this._layouts[r-1]));let s=[];return this.sortNodes(),this.nodes.forEach(l=>{let c=o==null?void 0:o.find(d=>d._id===l._id),u=O(O({},l),c||{});E.removeInternalForSave(u,!e),t&&t(l,u),s.push(u)}),s}layoutsNodesChange(e){return!this._layouts||this._inColumnResize?this:(this._layouts.forEach((t,i)=>{if(!t||i===this.column)return this;if(i {if(!o._orig)return;let s=t.find(a=>a._id===o._id);s&&(s.y>=0&&o.y!==o._orig.y&&(s.y+=o.y-o._orig.y),o.x!==o._orig.x&&(s.x=Math.round(o.x*r)),o.w!==o._orig.w&&(s.w=Math.round(o.w*r)))})}}),this)}columnChanged(e,t,i="moveScale"){var a;if(!this.nodes.length||!t||e===t)return this;let r=i==="compact"||i==="list";r&&this.sortNodes(1),t e&&this._layouts){let l=this._layouts[t]||[],c=this._layouts.length-1;!l.length&&e!==c&&((a=this._layouts[c])!=null&&a.length)&&(e=c,this._layouts[c].forEach(u=>{var p,y,m;let d=s.find(v=>v._id===u._id);d&&(!r&&!u.autoPosition&&(d.x=(p=u.x)!=null?p:d.x,d.y=(y=u.y)!=null?y:d.y),d.w=(m=u.w)!=null?m:d.w,(u.x==null||u.y===void 0)&&(d.autoPosition=!0))})),l.forEach(u=>{var p,y,m;let d=s.findIndex(v=>v._id===u._id);if(d!==-1){let v=s[d];if(r){v.w=u.w;return}(u.autoPosition||isNaN(u.x)||isNaN(u.y))&&this.findEmptyPosition(u,o),u.autoPosition||(v.x=(p=u.x)!=null?p:v.x,v.y=(y=u.y)!=null?y:v.y,v.w=(m=u.w)!=null?m:v.w,o.push(v)),s.splice(d,1)}})}if(r)this.compact(i,!1);else{if(s.length)if(typeof i=="function")i(t,e,o,s);else{let l=r||i==="none"?1:t/e,c=i==="move"||i==="moveScale",u=i==="scale"||i==="moveScale";s.forEach(d=>{d.x=t===1?0:c?Math.round(d.x*l):Math.min(d.x,t-1),d.w=t===1||e===1?1:u?Math.round(d.w*l)||1:Math.min(d.w,t),o.push(d)}),s=[]}o=E.sort(o,-1),this._inColumnResize=!0,this.nodes=[],o.forEach(l=>{this.addNode(l,!1),delete l._orig})}return this.nodes.forEach(l=>delete l._orig),this.batchUpdate(!1,!r),delete this._inColumnResize,this}cacheLayout(e,t,i=!1){let r=[];return e.forEach((o,s)=>{var a;if(o._id===void 0){let l=o.id?this.nodes.find(c=>c.id===o.id):void 0;o._id=(a=l==null?void 0:l._id)!=null?a:n._idSeq++}r[s]={x:o.x,y:o.y,w:o.w,_id:o._id}}),this._layouts=i?[]:this._layouts||[],this._layouts[t]=r,this}cacheOneLayout(e,t){var o;e._id=(o=e._id)!=null?o:n._idSeq++;let i={x:e.x,y:e.y,w:e.w,_id:e._id};(e.autoPosition||e.x===void 0)&&(delete i.x,delete i.y,e.autoPosition&&(i.autoPosition=!0)),this._layouts=this._layouts||[],this._layouts[t]=this._layouts[t]||[];let r=this.findCacheLayout(e,t);return r===-1?this._layouts[t].push(i):this._layouts[t][r]=i,this}findCacheLayout(e,t){var i,r,o;return(o=(r=(i=this._layouts)==null?void 0:i[t])==null?void 0:r.findIndex(s=>s._id===e._id))!=null?o:-1}removeNodeFromLayoutCache(e){if(this._layouts)for(let t=0;t 0||navigator.msMaxTouchPoints>0),Je=class{};function Rr(n,e){n.touches.length>1||(n.cancelable&&n.preventDefault(),E.simulateMouseEvent(n.changedTouches[0],e))}function Lc(n,e){n.cancelable&&n.preventDefault(),E.simulateMouseEvent(n,e)}function Rn(n){Je.touchHandled||(Je.touchHandled=!0,Rr(n,"mousedown"))}function Hn(n){Je.touchHandled&&Rr(n,"mousemove")}function Pn(n){if(!Je.touchHandled)return;Je.pointerLeaveTimeout&&(window.clearTimeout(Je.pointerLeaveTimeout),delete Je.pointerLeaveTimeout);let e=!!F.dragElement;Rr(n,"mouseup"),e||Rr(n,"click"),Je.touchHandled=!1}function Fn(n){n.pointerType!=="mouse"&&n.target.releasePointerCapture(n.pointerId)}function ls(n){F.dragElement&&n.pointerType!=="mouse"&&Lc(n,"mouseenter")}function cs(n){F.dragElement&&n.pointerType!=="mouse"&&(Je.pointerLeaveTimeout=window.setTimeout(()=>{delete Je.pointerLeaveTimeout,Lc(n,"mouseleave")},10))}var _i=class n{constructor(e,t,i){this.host=e,this.dir=t,this.option=i,this.moving=!1,this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this._keyEvent=this._keyEvent.bind(this),this._init()}_init(){let e=this.el=document.createElement("div");return e.classList.add("ui-resizable-handle"),e.classList.add(`${n.prefix}${this.dir}`),e.style.zIndex="100",e.style.userSelect="none",this.host.appendChild(this.el),this.el.addEventListener("mousedown",this._mouseDown),Ne&&(this.el.addEventListener("touchstart",Rn),this.el.addEventListener("pointerdown",Fn)),this}destroy(){return this.moving&&this._mouseUp(this.mouseDownEvent),this.el.removeEventListener("mousedown",this._mouseDown),Ne&&(this.el.removeEventListener("touchstart",Rn),this.el.removeEventListener("pointerdown",Fn)),this.host.removeChild(this.el),delete this.el,delete this.host,this}_mouseDown(e){this.mouseDownEvent=e,document.addEventListener("mousemove",this._mouseMove,{capture:!0,passive:!0}),document.addEventListener("mouseup",this._mouseUp,!0),Ne&&(this.el.addEventListener("touchmove",Hn),this.el.addEventListener("touchend",Pn)),e.stopPropagation(),e.preventDefault()}_mouseMove(e){let t=this.mouseDownEvent;this.moving?this._triggerEvent("move",e):Math.abs(e.x-t.x)+Math.abs(e.y-t.y)>2&&(this.moving=!0,this._triggerEvent("start",this.mouseDownEvent),this._triggerEvent("move",e),document.addEventListener("keydown",this._keyEvent)),e.stopPropagation()}_mouseUp(e){this.moving&&(this._triggerEvent("stop",e),document.removeEventListener("keydown",this._keyEvent)),document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp,!0),Ne&&(this.el.removeEventListener("touchmove",Hn),this.el.removeEventListener("touchend",Pn)),delete this.moving,delete this.mouseDownEvent,e.stopPropagation(),e.preventDefault()}_keyEvent(e){var t,i;e.key==="Escape"&&((i=(t=this.host.gridstackNode)==null?void 0:t.grid)==null||i.engine.restoreInitial(),this._mouseUp(this.mouseDownEvent))}_triggerEvent(e,t){return this.option[e]&&this.option[e](t),this}};_i.prefix="ui-resizable-";var Ft=class{constructor(){this._eventRegister={}}get disabled(){return this._disabled}on(e,t){this._eventRegister[e]=t}off(e){delete this._eventRegister[e]}enable(){this._disabled=!1}disable(){this._disabled=!0}destroy(){delete this._eventRegister}triggerEvent(e,t){if(!this.disabled&&this._eventRegister&&this._eventRegister[e])return this._eventRegister[e](t)}};var wi=class n extends Ft{constructor(e,t={}){super(),this.el=e,this.option=t,this.rectScale={x:1,y:1},this._ui=()=>{let r=this.el.parentElement.getBoundingClientRect(),o={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},s=this.temporalRect||o;return{position:{left:(s.left-r.left)*this.rectScale.x,top:(s.top-r.top)*this.rectScale.y},size:{width:s.width*this.rectScale.x,height:s.height*this.rectScale.y}}},this._mouseOver=this._mouseOver.bind(this),this._mouseOut=this._mouseOut.bind(this),this.enable(),this._setupAutoHide(this.option.autoHide),this._setupHandlers()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){super.enable(),this.el.classList.remove("ui-resizable-disabled"),this._setupAutoHide(this.option.autoHide)}disable(){super.disable(),this.el.classList.add("ui-resizable-disabled"),this._setupAutoHide(!1)}destroy(){this._removeHandlers(),this._setupAutoHide(!1),delete this.el,super.destroy()}updateOption(e){let t=e.handles&&e.handles!==this.option.handles,i=e.autoHide&&e.autoHide!==this.option.autoHide;return Object.keys(e).forEach(r=>this.option[r]=e[r]),t&&(this._removeHandlers(),this._setupHandlers()),i&&this._setupAutoHide(this.option.autoHide),this}_setupAutoHide(e){return e?(this.el.classList.add("ui-resizable-autohide"),this.el.addEventListener("mouseover",this._mouseOver),this.el.addEventListener("mouseout",this._mouseOut)):(this.el.classList.remove("ui-resizable-autohide"),this.el.removeEventListener("mouseover",this._mouseOver),this.el.removeEventListener("mouseout",this._mouseOut),F.overResizeElement===this&&delete F.overResizeElement),this}_mouseOver(e){F.overResizeElement||F.dragElement||(F.overResizeElement=this,this.el.classList.remove("ui-resizable-autohide"))}_mouseOut(e){F.overResizeElement===this&&(delete F.overResizeElement,this.el.classList.add("ui-resizable-autohide"))}_setupHandlers(){return this.handlers=this.option.handles.split(",").map(e=>e.trim()).map(e=>new _i(this.el,e,{start:t=>{this._resizeStart(t)},stop:t=>{this._resizeStop(t)},move:t=>{this._resizing(t,e)}})),this}_resizeStart(e){this.sizeToContent=E.shouldSizeToContent(this.el.gridstackNode,!0),this.originalRect=this.el.getBoundingClientRect(),this.scrollEl=E.getScrollElement(this.el),this.scrollY=this.scrollEl.scrollTop,this.scrolled=0,this.startEvent=e,this._setupHelper(),this._applyChange();let t=E.initEvent(e,{type:"resizestart",target:this.el});return this.option.start&&this.option.start(t,this._ui()),this.el.classList.add("ui-resizable-resizing"),this.triggerEvent("resizestart",t),this}_resizing(e,t){this.scrolled=this.scrollEl.scrollTop-this.scrollY,this.temporalRect=this._getChange(e,t),this._applyChange();let i=E.initEvent(e,{type:"resize",target:this.el});return this.option.resize&&this.option.resize(i,this._ui()),this.triggerEvent("resize",i),this}_resizeStop(e){let t=E.initEvent(e,{type:"resizestop",target:this.el});return this._cleanHelper(),this.option.stop&&this.option.stop(t),this.el.classList.remove("ui-resizable-resizing"),this.triggerEvent("resizestop",t),delete this.startEvent,delete this.originalRect,delete this.temporalRect,delete this.scrollY,delete this.scrolled,this}_setupHelper(){this.elOriginStyleVal=n._originStyleProp.map(i=>this.el.style[i]),this.parentOriginStylePosition=this.el.parentElement.style.position;let e=this.el.parentElement,t=E.getValuesFromTransformedElement(e);return this.rectScale={x:t.xScale,y:t.yScale},getComputedStyle(this.el.parentElement).position.match(/static/)&&(this.el.parentElement.style.position="relative"),this.el.style.position="absolute",this.el.style.opacity="0.8",this}_cleanHelper(){return n._originStyleProp.forEach((e,t)=>{this.el.style[e]=this.elOriginStyleVal[t]||null}),this.el.parentElement.style.position=this.parentOriginStylePosition||null,this}_getChange(e,t){let i=this.startEvent,r={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},o=e.clientX-i.clientX,s=this.sizeToContent?0:e.clientY-i.clientY,a,l;t.indexOf("e")>-1?r.width+=o:t.indexOf("w")>-1&&(r.width-=o,r.left+=o,a=!0),t.indexOf("s")>-1?r.height+=s:t.indexOf("n")>-1&&(r.height-=s,r.top+=s,l=!0);let c=this._constrainSize(r.width,r.height,a,l);return Math.round(r.width)!==Math.round(c.width)&&(t.indexOf("w")>-1&&(r.left+=r.width-c.width),r.width=c.width),Math.round(r.height)!==Math.round(c.height)&&(t.indexOf("n")>-1&&(r.top+=r.height-c.height),r.height=c.height),r}_constrainSize(e,t,i,r){let o=this.option,s=(i?o.maxWidthMoveLeft:o.maxWidth)||Number.MAX_SAFE_INTEGER,a=o.minWidth/this.rectScale.x||e,l=(r?o.maxHeightMoveUp:o.maxHeight)||Number.MAX_SAFE_INTEGER,c=o.minHeight/this.rectScale.y||t,u=Math.min(s,Math.max(a,e)),d=Math.min(l,Math.max(c,t));return{width:u,height:d}}_applyChange(){let e={left:0,top:0,width:0,height:0};if(this.el.style.position==="absolute"){let t=this.el.parentElement,{left:i,top:r}=t.getBoundingClientRect();e={left:i,top:r,width:0,height:0}}return this.temporalRect?(Object.keys(this.temporalRect).forEach(t=>{let i=this.temporalRect[t],r=t==="width"||t==="left"?this.rectScale.x:t==="height"||t==="top"?this.rectScale.y:1;this.el.style[t]=(i-e[t])*r+"px"}),this):this}_removeHandlers(){return this.handlers.forEach(e=>e.destroy()),delete this.handlers,this}};wi._originStyleProp=["width","height","position","left","top","opacity","zIndex"];var Xg='input,textarea,button,select,option,[contenteditable="true"],.ui-resizable-handle',xi=class n extends Ft{constructor(e,t={}){var o;super(),this.el=e,this.option=t,this.dragTransform={xScale:1,yScale:1,xOffset:0,yOffset:0};let i=(o=t==null?void 0:t.handle)==null?void 0:o.substring(1),r=e.gridstackNode;this.dragEls=!i||e.classList.contains(i)?[e]:r!=null&&r.subGrid?[e.querySelector(t.handle)||e]:Array.from(e.querySelectorAll(t.handle)),this.dragEls.length===0&&(this.dragEls=[e]),this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this._keyEvent=this._keyEvent.bind(this),this.enable()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){this.disabled!==!1&&(super.enable(),this.dragEls.forEach(e=>{e.addEventListener("mousedown",this._mouseDown),Ne&&(e.addEventListener("touchstart",Rn),e.addEventListener("pointerdown",Fn))}),this.el.classList.remove("ui-draggable-disabled"))}disable(e=!1){this.disabled!==!0&&(super.disable(),this.dragEls.forEach(t=>{t.removeEventListener("mousedown",this._mouseDown),Ne&&(t.removeEventListener("touchstart",Rn),t.removeEventListener("pointerdown",Fn))}),e||this.el.classList.add("ui-draggable-disabled"))}destroy(){this.dragTimeout&&window.clearTimeout(this.dragTimeout),delete this.dragTimeout,this.mouseDownEvent&&this._mouseUp(this.mouseDownEvent),this.disable(!0),delete this.el,delete this.helper,delete this.option,super.destroy()}updateOption(e){return Object.keys(e).forEach(t=>this.option[t]=e[t]),this}_mouseDown(e){if(!F.mouseHandled)return e.button!==0||!this.dragEls.find(t=>t===e.target)&&e.target.closest(Xg)||this.option.cancel&&e.target.closest(this.option.cancel)||(this.mouseDownEvent=e,delete this.dragging,delete F.dragElement,delete F.dropElement,document.addEventListener("mousemove",this._mouseMove,{capture:!0,passive:!0}),document.addEventListener("mouseup",this._mouseUp,!0),Ne&&(e.currentTarget.addEventListener("touchmove",Hn),e.currentTarget.addEventListener("touchend",Pn)),e.preventDefault(),document.activeElement&&document.activeElement.blur(),F.mouseHandled=!0),!0}_callDrag(e){if(!this.dragging)return;let t=E.initEvent(e,{target:this.el,type:"drag"});this.option.drag&&this.option.drag(t,this.ui()),this.triggerEvent("drag",t)}_mouseMove(e){var i;let t=this.mouseDownEvent;if(this.lastDrag=e,this.dragging)if(this._dragFollow(e),F.pauseDrag){let r=Number.isInteger(F.pauseDrag)?F.pauseDrag:100;this.dragTimeout&&window.clearTimeout(this.dragTimeout),this.dragTimeout=window.setTimeout(()=>this._callDrag(e),r)}else this._callDrag(e);else if(Math.abs(e.x-t.x)+Math.abs(e.y-t.y)>3){this.dragging=!0,F.dragElement=this;let r=(i=this.el.gridstackNode)==null?void 0:i.grid;r?F.dropElement=r.el.ddElement.ddDroppable:delete F.dropElement,this.helper=this._createHelper(),this._setupHelperContainmentStyle(),this.dragTransform=E.getValuesFromTransformedElement(this.helperContainment),this.dragOffset=this._getDragOffset(e,this.el,this.helperContainment),this._setupHelperStyle(e);let o=E.initEvent(e,{target:this.el,type:"dragstart"});this.option.start&&this.option.start(o,this.ui()),this.triggerEvent("dragstart",o),document.addEventListener("keydown",this._keyEvent)}return!0}_mouseUp(e){var t,i;if(document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp,!0),Ne&&e.currentTarget&&(e.currentTarget.removeEventListener("touchmove",Hn,!0),e.currentTarget.removeEventListener("touchend",Pn,!0)),this.dragging){delete this.dragging,(t=this.el.gridstackNode)==null||delete t._origRotate,document.removeEventListener("keydown",this._keyEvent),((i=F.dropElement)==null?void 0:i.el)===this.el.parentElement&&delete F.dropElement,this.helperContainment.style.position=this.parentOriginStylePosition||null,this.helper!==this.el&&this.helper.remove(),this._removeHelperStyle();let r=E.initEvent(e,{target:this.el,type:"dragstop"});this.option.stop&&this.option.stop(r),this.triggerEvent("dragstop",r),F.dropElement&&F.dropElement.drop(e)}delete this.helper,delete this.mouseDownEvent,delete F.dragElement,delete F.dropElement,delete F.mouseHandled,e.preventDefault()}_keyEvent(e){var r,o;let t=this.el.gridstackNode,i=(t==null?void 0:t.grid)||((o=(r=F.dropElement)==null?void 0:r.el)==null?void 0:o.gridstack);if(e.key==="Escape")t&&t._origRotate&&(t._orig=t._origRotate,delete t._origRotate),i==null||i.cancelDrag(),this._mouseUp(this.mouseDownEvent);else if(t&&i&&(e.key==="r"||e.key==="R")){if(!E.canBeRotated(t))return;t._origRotate=t._origRotate||O({},t._orig),delete t._moving,i.setAnimation(!1).rotate(t.el,{top:-this.dragOffset.offsetTop,left:-this.dragOffset.offsetLeft}).setAnimation(),t._moving=!0,this.dragOffset=this._getDragOffset(this.lastDrag,t.el,this.helperContainment),this.helper.style.width=this.dragOffset.width+"px",this.helper.style.height=this.dragOffset.height+"px",E.swap(t._orig,"w","h"),delete t._rect,this._mouseMove(this.lastDrag)}}_createHelper(){let e=this.el;return typeof this.option.helper=="function"?e=this.option.helper(this.el):this.option.helper==="clone"&&(e=E.cloneNode(this.el)),e.parentElement||E.appendTo(e,this.option.appendTo==="parent"?this.el.parentElement:this.option.appendTo),this.dragElementOriginStyle=n.originStyleProp.map(t=>this.el.style[t]),e}_setupHelperStyle(e){var i,r;this.helper.classList.add("ui-draggable-dragging"),(r=(i=this.el.gridstackNode)==null?void 0:i.grid)==null||r.el.classList.add("grid-stack-dragging");let t=this.helper.style;return t.pointerEvents="none",t.width=this.dragOffset.width+"px",t.height=this.dragOffset.height+"px",t.willChange="left, top",t.position="fixed",this._dragFollow(e),t.transition="none",setTimeout(()=>{this.helper&&(t.transition=null)},0),this}_removeHelperStyle(){var t,i,r;this.helper.classList.remove("ui-draggable-dragging"),(i=(t=this.el.gridstackNode)==null?void 0:t.grid)==null||i.el.classList.remove("grid-stack-dragging");let e=(r=this.helper)==null?void 0:r.gridstackNode;if(!(e!=null&&e._isAboutToRemove)&&this.dragElementOriginStyle){let o=this.helper,s=this.dragElementOriginStyle.transition||null;o.style.transition=this.dragElementOriginStyle.transition="none",n.originStyleProp.forEach(a=>o.style[a]=this.dragElementOriginStyle[a]||null),setTimeout(()=>o.style.transition=s,50)}return delete this.dragElementOriginStyle,this}_dragFollow(e){let t={left:0,top:0},i=this.helper.style,r=this.dragOffset;i.left=(e.clientX+r.offsetLeft-t.left)*this.dragTransform.xScale+"px",i.top=(e.clientY+r.offsetTop-t.top)*this.dragTransform.yScale+"px"}_setupHelperContainmentStyle(){return this.helperContainment=this.helper.parentElement,this.helper.style.position!=="fixed"&&(this.parentOriginStylePosition=this.helperContainment.style.position,getComputedStyle(this.helperContainment).position.match(/static/)&&(this.helperContainment.style.position="relative")),this}_getDragOffset(e,t,i){let r=0,o=0;i&&(r=this.dragTransform.xOffset,o=this.dragTransform.yOffset);let s=t.getBoundingClientRect();return{left:s.left,top:s.top,offsetLeft:-e.clientX+s.left-r,offsetTop:-e.clientY+s.top-o,width:s.width*this.dragTransform.xScale,height:s.height*this.dragTransform.yScale}}ui(){let t=this.el.parentElement.getBoundingClientRect(),i=this.helper.getBoundingClientRect();return{position:{top:(i.top-t.top)*this.dragTransform.yScale,left:(i.left-t.left)*this.dragTransform.xScale}}}};xi.originStyleProp=["width","height","transform","transform-origin","transition","pointerEvents","position","left","top","minWidth","willChange"];var Hr=class extends Ft{constructor(e,t={}){super(),this.el=e,this.option=t,this._mouseEnter=this._mouseEnter.bind(this),this._mouseLeave=this._mouseLeave.bind(this),this.enable(),this._setupAccept()}on(e,t){super.on(e,t)}off(e){super.off(e)}enable(){this.disabled!==!1&&(super.enable(),this.el.classList.add("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),this.el.addEventListener("mouseenter",this._mouseEnter),this.el.addEventListener("mouseleave",this._mouseLeave),Ne&&(this.el.addEventListener("pointerenter",ls),this.el.addEventListener("pointerleave",cs)))}disable(e=!1){this.disabled!==!0&&(super.disable(),this.el.classList.remove("ui-droppable"),e||this.el.classList.add("ui-droppable-disabled"),this.el.removeEventListener("mouseenter",this._mouseEnter),this.el.removeEventListener("mouseleave",this._mouseLeave),Ne&&(this.el.removeEventListener("pointerenter",ls),this.el.removeEventListener("pointerleave",cs)))}destroy(){this.disable(!0),this.el.classList.remove("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),super.destroy()}updateOption(e){return Object.keys(e).forEach(t=>this.option[t]=e[t]),this._setupAccept(),this}_mouseEnter(e){if(!F.dragElement||!this._canDrop(F.dragElement.el))return;e.preventDefault(),e.stopPropagation(),F.dropElement&&F.dropElement!==this&&F.dropElement._mouseLeave(e,!0),F.dropElement=this;let t=E.initEvent(e,{target:this.el,type:"dropover"});this.option.over&&this.option.over(t,this._ui(F.dragElement)),this.triggerEvent("dropover",t),this.el.classList.add("ui-droppable-over")}_mouseLeave(e,t=!1){var r;if(!F.dragElement||F.dropElement!==this)return;e.preventDefault(),e.stopPropagation();let i=E.initEvent(e,{target:this.el,type:"dropout"});if(this.option.out&&this.option.out(i,this._ui(F.dragElement)),this.triggerEvent("dropout",i),F.dropElement===this&&(delete F.dropElement,!t)){let o,s=this.el.parentElement;for(;!o&&s;)o=(r=s.ddElement)==null?void 0:r.ddDroppable,s=s.parentElement;o&&o._mouseEnter(e)}}drop(e){e.preventDefault();let t=E.initEvent(e,{target:this.el,type:"drop"});this.option.drop&&this.option.drop(t,this._ui(F.dragElement)),this.triggerEvent("drop",t)}_canDrop(e){return e&&(!this.accept||this.accept(e))}_setupAccept(){return this.option.accept?(typeof this.option.accept=="string"?this.accept=e=>e.classList.contains(this.option.accept)||e.matches(this.option.accept):this.accept=this.option.accept,this):this}_ui(e){return O({draggable:e.el},e.ui())}};var Pr=class n{static init(e){return e.ddElement||(e.ddElement=new n(e)),e.ddElement}constructor(e){this.el=e}on(e,t){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(e)>-1?this.ddDraggable.on(e,t):this.ddDroppable&&["drop","dropover","dropout"].indexOf(e)>-1?this.ddDroppable.on(e,t):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(e)>-1&&this.ddResizable.on(e,t),this}off(e){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(e)>-1?this.ddDraggable.off(e):this.ddDroppable&&["drop","dropover","dropout"].indexOf(e)>-1?this.ddDroppable.off(e):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(e)>-1&&this.ddResizable.off(e),this}setupDraggable(e){return this.ddDraggable?this.ddDraggable.updateOption(e):this.ddDraggable=new xi(this.el,e),this}cleanDraggable(){return this.ddDraggable&&(this.ddDraggable.destroy(),delete this.ddDraggable),this}setupResizable(e){return this.ddResizable?this.ddResizable.updateOption(e):this.ddResizable=new wi(this.el,e),this}cleanResizable(){return this.ddResizable&&(this.ddResizable.destroy(),delete this.ddResizable),this}setupDroppable(e){return this.ddDroppable?this.ddDroppable.updateOption(e):this.ddDroppable=new Hr(this.el,e),this}cleanDroppable(){return this.ddDroppable&&(this.ddDroppable.destroy(),delete this.ddDroppable),this}};var Fr=class{resizable(e,t,i,r){return this._getDDElements(e,t).forEach(o=>{if(t==="disable"||t==="enable")o.ddResizable&&o.ddResizable[t]();else if(t==="destroy")o.ddResizable&&o.cleanResizable();else if(t==="option")o.setupResizable({[i]:r});else{let a=o.el.gridstackNode.grid,l=o.el.getAttribute("gs-resize-handles")||a.opts.resizable.handles||"e,s,se";l==="all"&&(l="n,e,s,w,se,sw,ne,nw");let c=!a.opts.alwaysShowResizeHandle;o.setupResizable(ae(O({},a.opts.resizable),{handles:l,autoHide:c,start:t.start,stop:t.stop,resize:t.resize}))}}),this}draggable(e,t,i,r){return this._getDDElements(e,t).forEach(o=>{if(t==="disable"||t==="enable")o.ddDraggable&&o.ddDraggable[t]();else if(t==="destroy")o.ddDraggable&&o.cleanDraggable();else if(t==="option")o.setupDraggable({[i]:r});else{let s=o.el.gridstackNode.grid;o.setupDraggable(ae(O({},s.opts.draggable),{start:t.start,stop:t.stop,drag:t.drag}))}}),this}dragIn(e,t){return this._getDDElements(e).forEach(i=>i.setupDraggable(t)),this}droppable(e,t,i,r){return typeof t.accept=="function"&&!t._accept&&(t._accept=t.accept,t.accept=o=>t._accept(o)),this._getDDElements(e,t).forEach(o=>{t==="disable"||t==="enable"?o.ddDroppable&&o.ddDroppable[t]():t==="destroy"?o.ddDroppable&&o.cleanDroppable():t==="option"?o.setupDroppable({[i]:r}):o.setupDroppable(t)}),this}isDroppable(e){var t;return!!((t=e==null?void 0:e.ddElement)!=null&&t.ddDroppable&&!e.ddElement.ddDroppable.disabled)}isDraggable(e){var t;return!!((t=e==null?void 0:e.ddElement)!=null&&t.ddDraggable&&!e.ddElement.ddDraggable.disabled)}isResizable(e){var t;return!!((t=e==null?void 0:e.ddElement)!=null&&t.ddResizable&&!e.ddElement.ddResizable.disabled)}on(e,t,i){return this._getDDElements(e).forEach(r=>r.on(t,o=>{i(o,F.dragElement?F.dragElement.el:o.target,F.dragElement?F.dragElement.helper:null)})),this}off(e,t){return this._getDDElements(e).forEach(i=>i.off(t)),this}_getDDElements(e,t){let i=e.gridstack||t!=="destroy"&&t!=="disable",r=E.getElements(e);return r.length?r.map(s=>s.ddElement||(i?Pr.init(s):null)).filter(s=>s):[]}};var Ie=new Fr,Et=class n{static init(e={},t=".grid-stack"){if(typeof document=="undefined")return null;let i=n.getGridElement(t);return i?(i.gridstack||(i.gridstack=new n(i,E.cloneDeep(e))),i.gridstack):(console.error(typeof t=="string"?'GridStack.initAll() no grid was found with selector "'+t+`" - element missing or wrong selector ? Note: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.`:"GridStack.init() no grid element was passed."),null)}static initAll(e={},t=".grid-stack"){let i=[];return typeof document=="undefined"||(n.getGridElements(t).forEach(r=>{r.gridstack||(r.gridstack=new n(r,E.cloneDeep(e))),i.push(r.gridstack)}),i.length===0&&console.error('GridStack.initAll() no grid was found with selector "'+t+`" - element missing or wrong selector ? -Note: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.`)),i}static addGrid(e,t={}){if(!e)return null;let i=e;if(i.gridstack){let s=i.gridstack;return t&&(s.opts=O(O({},s.opts),t)),t.children!==void 0&&s.load(t.children),s}return(!e.classList.contains("grid-stack")||n.addRemoveCB)&&(n.addRemoveCB?i=n.addRemoveCB(e,t,!0,!0):i=E.createDiv(["grid-stack",t.class],e)),n.init(t,i)}static registerEngine(e){n.engineClass=e}get placeholder(){if(!this._placeholder){this._placeholder=E.createDiv([this.opts.placeholderClass,Ve.itemClass,this.opts.itemClass]);let e=E.createDiv(["placeholder-content"],this._placeholder);this.opts.placeholderText&&(e.textContent=this.opts.placeholderText)}return this._placeholder}constructor(e,t={}){var c;this.el=e,this.opts=t,this.animationDelay=310,this._gsEventHandler={},this._extraDragRow=0,this.dragTransform={xScale:1,yScale:1,xOffset:0,yOffset:0},e.gridstack=this,this.opts=t=t||{},e.classList.contains("grid-stack")||this.el.classList.add("grid-stack"),t.row&&(t.minRow=t.maxRow=t.row,delete t.row);let i=E.toNumber(e.getAttribute("gs-row"));t.column==="auto"&&delete t.column,t.alwaysShowResizeHandle!==void 0&&(t._alwaysShowResizeHandle=t.alwaysShowResizeHandle);let r=t.columnOpts;if(r){let u=r.breakpoints;!r.columnWidth&&!(u!=null&&u.length)?delete t.columnOpts:(r.columnMax=r.columnMax||12,(u==null?void 0:u.length)>1&&u.sort((d,p)=>(p.w||0)-(d.w||0)))}let o=ae(O({},E.cloneDeep(Ve)),{column:E.toNumber(e.getAttribute("gs-column"))||Ve.column,minRow:i||E.toNumber(e.getAttribute("gs-min-row"))||Ve.minRow,maxRow:i||E.toNumber(e.getAttribute("gs-max-row"))||Ve.maxRow,staticGrid:E.toBool(e.getAttribute("gs-static"))||Ve.staticGrid,sizeToContent:E.toBool(e.getAttribute("gs-size-to-content"))||void 0,draggable:{handle:(t.handleClass?"."+t.handleClass:t.handle?t.handle:"")||Ve.draggable.handle},removableOptions:{accept:t.itemClass||Ve.removableOptions.accept,decline:Ve.removableOptions.decline}});e.getAttribute("gs-animate")&&(o.animate=E.toBool(e.getAttribute("gs-animate"))),t=E.defaults(t,o),this._initMargin(),this.checkDynamicColumn(),this._updateColumnVar(t),t.rtl==="auto"&&(t.rtl=e.style.direction==="rtl"),t.rtl&&this.el.classList.add("grid-stack-rtl");let s=this.el.closest("."+Ve.itemClass),a=s==null?void 0:s.gridstackNode;if(a&&(a.subGrid=this,this.parentGridNode=a,this.el.classList.add("grid-stack-nested"),a.el.classList.add("grid-stack-sub-grid")),this._isAutoCellHeight=t.cellHeight==="auto",this._isAutoCellHeight||t.cellHeight==="initial")this.cellHeight(void 0);else{typeof t.cellHeight=="number"&&t.cellHeightUnit&&t.cellHeightUnit!==Ve.cellHeightUnit&&(t.cellHeight=t.cellHeight+t.cellHeightUnit,delete t.cellHeightUnit);let u=t.cellHeight;delete t.cellHeight,this.cellHeight(u)}t.alwaysShowResizeHandle==="mobile"&&(t.alwaysShowResizeHandle=Ne),this._setStaticClass();let l=t.engineClass||n.engineClass||In;if(this.engine=new l({column:this.getColumn(),float:t.float,maxRow:t.maxRow,onChange:u=>{u.forEach(d=>{let p=d.el;p&&(d._removeDOM?(p&&p.remove(),delete d._removeDOM):this._writePosAttr(p,d))}),this._updateContainerHeight()}}),t.auto&&(this.batchUpdate(),this.engine._loading=!0,this.getGridItems().forEach(u=>this._prepareElement(u)),delete this.engine._loading,this.batchUpdate(!1)),t.children){let u=t.children;delete t.children,u.length&&this.load(u)}this.setAnimation(),t.subGridDynamic&&!F.pauseDrag&&(F.pauseDrag=!0),((c=t.draggable)==null?void 0:c.pause)!==void 0&&(F.pauseDrag=t.draggable.pause),this._setupRemoveDrop(),this._setupAcceptWidget(),this._updateResizeEvent()}_updateColumnVar(e=this.opts){this.el.classList.add("gs-"+e.column),typeof e.column=="number"&&this.el.style.setProperty("--gs-column-width",`${100/e.column}%`)}addWidget(e){if(typeof e=="string"){console.error("V11: GridStack.addWidget() does not support string anymore. see #2736");return}if(e.ELEMENT_NODE)return console.error("V11: GridStack.addWidget() does not support HTMLElement anymore. use makeWidget()"),this.makeWidget(e);let t,i=e;if(i.grid=this,i!=null&&i.el?t=i.el:n.addRemoveCB?t=n.addRemoveCB(this.el,e,!0,!1):t=this.createWidgetDivs(i),!t)return;if(i=t.gridstackNode,i&&t.parentElement===this.el&&this.engine.nodes.find(o=>o._id===i._id))return t;let r=this._readAttr(t);return E.defaults(e,r),this.engine.prepareNode(e),this.el.appendChild(t),this.makeWidget(t,e),t}createWidgetDivs(e){let t=E.createDiv(["grid-stack-item",this.opts.itemClass]),i=E.createDiv(["grid-stack-item-content"],t);return E.lazyLoad(e)?e.visibleObservable||(e.visibleObservable=new IntersectionObserver(([r])=>{var o,s;r.isIntersecting&&((o=e.visibleObservable)==null||o.disconnect(),delete e.visibleObservable,n.renderCB(i,e),(s=e.grid)==null||s.prepareDragDrop(e.el))}),window.setTimeout(()=>{var r;return(r=e.visibleObservable)==null?void 0:r.observe(t)})):n.renderCB(i,e),t}makeSubGrid(e,t,i,r=!0){var y,m,v;let o=e.gridstackNode;if(o||(o=this.makeWidget(e).gridstackNode),(y=o.subGrid)!=null&&y.el)return o.subGrid;let s,a=this;for(;a&&!s;)s=(m=a.opts)==null?void 0:m.subGridOpts,a=(v=a.parentGridNode)==null?void 0:v.grid;t=E.cloneDeep(O(O(ae(O({},this.opts),{id:void 0,children:void 0,column:"auto",columnOpts:void 0,layout:"list",subGridOpts:void 0}),s||{}),t||o.subGridOpts||{})),o.subGridOpts=t;let l;t.column==="auto"&&(l=!0,t.column=Math.max(o.w||1,(i==null?void 0:i.w)||1),delete t.columnOpts);let c=o.el.querySelector(".grid-stack-item-content"),u,d;if(r&&(this._removeDD(o.el),d=ae(O({},o),{x:0,y:0}),E.removeInternalForSave(d),delete d.subGridOpts,o.content&&(d.content=o.content,delete o.content),n.addRemoveCB?u=n.addRemoveCB(this.el,d,!0,!1):(u=E.createDiv(["grid-stack-item"]),u.appendChild(c),c=E.createDiv(["grid-stack-item-content"],o.el)),this.prepareDragDrop(o.el)),i){let w=l?t.column:o.w,T=o.h+i.h,_=o.el.style;_.transition="none",this.update(o.el,{w,h:T}),setTimeout(()=>_.transition=null)}let p=o.subGrid=n.addGrid(c,t);return i!=null&&i._moving&&(p._isTemp=!0),l&&(p._autoColumn=!0),r&&p.makeWidget(u,d),i&&(i._moving?window.setTimeout(()=>E.simulateMouseEvent(i._event,"mouseenter",p.el),0):p.makeWidget(o.el,o)),this.resizeToContentCheck(!1,o),p}removeAsSubGrid(e){var i;let t=(i=this.parentGridNode)==null?void 0:i.grid;t&&(t.batchUpdate(),t.removeWidget(this.parentGridNode.el,!0,!0),this.engine.nodes.forEach(r=>{r.x+=this.parentGridNode.x,r.y+=this.parentGridNode.y,t.makeWidget(r.el,r)}),t.batchUpdate(!1),this.parentGridNode&&delete this.parentGridNode.subGrid,delete this.parentGridNode,e&&window.setTimeout(()=>E.simulateMouseEvent(e._event,"mouseenter",t.el),0))}save(e=!0,t=!1,i=n.saveCB){let r=this.engine.save(e,i);if(r.forEach(o=>{var s;if(e&&o.el&&!o.subGrid&&!i){let a=o.el.querySelector(".grid-stack-item-content");o.content=a==null?void 0:a.innerHTML,o.content||delete o.content}else if(!e&&!i&&delete o.content,(s=o.subGrid)!=null&&s.el){let a=o.subGrid.save(e,t,i);o.subGridOpts=t?a:{children:a},delete o.subGrid}delete o.el}),t){let o=E.cloneDeep(this.opts);o.marginBottom===o.marginTop&&o.marginRight===o.marginLeft&&o.marginTop===o.marginRight&&(o.margin=o.marginTop,delete o.marginTop,delete o.marginRight,delete o.marginBottom,delete o.marginLeft),o.rtl===(this.el.style.direction==="rtl")&&(o.rtl="auto"),this._isAutoCellHeight&&(o.cellHeight="auto"),this._autoColumn&&(o.column="auto");let s=o._alwaysShowResizeHandle;return delete o._alwaysShowResizeHandle,s!==void 0?o.alwaysShowResizeHandle=s:delete o.alwaysShowResizeHandle,E.removeInternalAndSame(o,Ve),o.children=r,o}return r}load(e,t=n.addRemoveCB||!0){e=E.cloneDeep(e);let i=this.getColumn();e.forEach(u=>{u.w=u.w||1,u.h=u.h||1}),e=E.sort(e),this.engine.skipCacheUpdate=this._ignoreLayoutsNodeChange=!0;let r=0;e.forEach(u=>{r=Math.max(r,(u.x||0)+u.w)}),r>this.engine.defaultColumn&&(this.engine.defaultColumn=r),r>i&&(this.engine.nodes.length===0&&this.responseLayout?(this.engine.nodes=e,this.engine.columnChanged(r,i,this.responseLayout),e=this.engine.nodes,this.engine.nodes=[],delete this.responseLayout):this.engine.cacheLayout(e,r,!0));let o=n.addRemoveCB;typeof t=="function"&&(n.addRemoveCB=t);let s=[];this.batchUpdate();let a=!this.engine.nodes.length,l=a&&this.opts.animate;l&&this.setAnimation(!1),!a&&t&&[...this.engine.nodes].forEach(d=>{if(!d.id)return;E.find(e,d.id)||(n.addRemoveCB&&n.addRemoveCB(this.el,d,!1,!1),s.push(d),this.removeWidget(d.el,!0,!1))}),this.engine._loading=!0;let c=[];return this.engine.nodes=this.engine.nodes.filter(u=>E.find(e,u.id)?(c.push(u),!1):!0),e.forEach(u=>{var p;let d=E.find(c,u.id);if(d){if(E.shouldSizeToContent(d)&&(u.h=d.h),this.engine.nodeBoundFix(u),(u.autoPosition||u.x===void 0||u.y===void 0)&&(u.w=u.w||d.w,u.h=u.h||d.h,this.engine.findEmptyPosition(u)),this.engine.nodes.push(d),E.samePos(d,u)&&this.engine.nodes.length>1&&(this.moveNode(d,ae(O({},u),{forceCollide:!0})),E.copyPos(u,d)),this.update(d.el,u),(p=u.subGridOpts)!=null&&p.children){let y=d.el.querySelector(".grid-stack");y&&y.gridstack&&y.gridstack.load(u.subGridOpts.children)}}else t&&this.addWidget(u)}),delete this.engine._loading,this.engine.removedNodes=s,this.batchUpdate(!1),delete this._ignoreLayoutsNodeChange,delete this.engine.skipCacheUpdate,o?n.addRemoveCB=o:delete n.addRemoveCB,l&&this.setAnimation(!0,!0),this}batchUpdate(e=!0){return this.engine.batchUpdate(e),e||(this._updateContainerHeight(),this._triggerRemoveEvent(),this._triggerAddEvent(),this._triggerChangeEvent()),this}getCellHeight(e=!1){if(this.opts.cellHeight&&this.opts.cellHeight!=="auto"&&(!e||!this.opts.cellHeightUnit||this.opts.cellHeightUnit==="px"))return this.opts.cellHeight;if(this.opts.cellHeightUnit==="rem")return this.opts.cellHeight*parseFloat(getComputedStyle(document.documentElement).fontSize);if(this.opts.cellHeightUnit==="em")return this.opts.cellHeight*parseFloat(getComputedStyle(this.el).fontSize);if(this.opts.cellHeightUnit==="cm")return this.opts.cellHeight*(96/2.54);if(this.opts.cellHeightUnit==="mm")return this.opts.cellHeight*(96/2.54)/10;let t=this.el.querySelector("."+this.opts.itemClass);if(t){let r=E.toNumber(t.getAttribute("gs-h"))||1;return Math.round(t.offsetHeight/r)}let i=parseInt(this.el.getAttribute("gs-current-row"));return i?Math.round(this.el.getBoundingClientRect().height/i):this.opts.cellHeight}cellHeight(e){if(e!==void 0&&this._isAutoCellHeight!==(e==="auto")&&(this._isAutoCellHeight=e==="auto",this._updateResizeEvent()),(e==="initial"||e==="auto")&&(e=void 0),e===void 0){let i=-this.opts.marginRight-this.opts.marginLeft+this.opts.marginTop+this.opts.marginBottom;e=this.cellWidth()+i}let t=E.parseHeight(e);return this.opts.cellHeightUnit===t.unit&&this.opts.cellHeight===t.h?this:(this.opts.cellHeightUnit=t.unit,this.opts.cellHeight=t.h,this.el.style.setProperty("--gs-cell-height",`${this.opts.cellHeight}${this.opts.cellHeightUnit}`),this._updateContainerHeight(),this.resizeToContentCheck(),this)}cellWidth(){return this._widthOrContainer()/this.getColumn()}_widthOrContainer(e=!1){var t;return e&&((t=this.opts.columnOpts)!=null&&t.breakpointForWindow)?window.innerWidth:this.el.clientWidth||this.el.parentElement.clientWidth||window.innerWidth}checkDynamicColumn(){var o,s;let e=this.opts.columnOpts;if(!e||!e.columnWidth&&!((o=e.breakpoints)!=null&&o.length))return!1;let t=this.getColumn(),i=t,r=this._widthOrContainer(!0);if(e.columnWidth)i=Math.min(Math.round(r/e.columnWidth)||1,e.columnMax);else{i=e.columnMax;let a=0;for(;a l.c===i);return this.column(i,(a==null?void 0:a.layout)||e.layout),!0}return!1}compact(e="compact",t=!0){return this.engine.compact(e,t),this._triggerChangeEvent(),this}column(e,t="moveScale"){if(!e||e<1||this.opts.column===e)return this;let i=this.getColumn();return this.opts.column=e,this.engine?(this.engine.column=e,this.el.classList.remove("gs-"+i),this._updateColumnVar(),this.engine.columnChanged(i,e,t),this._isAutoCellHeight&&this.cellHeight(),this.resizeToContentCheck(!0),this._ignoreLayoutsNodeChange=!0,this._triggerChangeEvent(),delete this._ignoreLayoutsNodeChange,this):(this.responseLayout=t,this)}getColumn(){return this.opts.column}getGridItems(){return Array.from(this.el.children).filter(e=>e.matches("."+this.opts.itemClass)&&!e.matches("."+this.opts.placeholderClass))}isIgnoreChangeCB(){return this._ignoreLayoutsNodeChange}destroy(e=!0){var t;if(this.el)return this.offAll(),this._updateResizeEvent(!0),this.setStatic(!0,!1),this.setAnimation(!1),e?this.el.parentNode.removeChild(this.el):(this.removeAll(e),this.el.removeAttribute("gs-current-row")),this.parentGridNode&&delete this.parentGridNode.subGrid,delete this.parentGridNode,delete this.opts,(t=this._placeholder)==null||delete t.gridstackNode,delete this._placeholder,delete this.engine,delete this.el.gridstack,delete this.el,this}float(e){return this.opts.float!==e&&(this.opts.float=this.engine.float=e,this._triggerChangeEvent()),this}getFloat(){return this.engine.float}getCellFromPixel(e,t=!1){let i=this.el.getBoundingClientRect(),r;t?r={top:i.top+document.documentElement.scrollTop,left:i.left}:r={top:this.el.offsetTop,left:this.el.offsetLeft};let o=e.left-r.left,s=e.top-r.top,a=i.width/this.getColumn(),l=i.height/parseInt(this.el.getAttribute("gs-current-row"));return{x:Math.floor(o/a),y:Math.floor(s/l)}}getRow(){return Math.max(this.engine.getRow(),this.opts.minRow||0)}isAreaEmpty(e,t,i,r){return this.engine.isAreaEmpty(e,t,i,r)}makeWidget(e,t){let i=n.getElement(e);if(!i||i.gridstackNode)return i;i.parentElement||this.el.appendChild(i),this._prepareElement(i,!0,t);let r=i.gridstackNode;this._updateContainerHeight(),r.subGridOpts&&this.makeSubGrid(i,r.subGridOpts,void 0,!1);let o;return this.opts.column===1&&!this._ignoreLayoutsNodeChange&&(o=this._ignoreLayoutsNodeChange=!0),this._triggerAddEvent(),this._triggerChangeEvent(),o&&delete this._ignoreLayoutsNodeChange,i}on(e,t){return e.indexOf(" ")!==-1?(e.split(" ").forEach(r=>this.on(r,t)),this):(e==="change"||e==="added"||e==="removed"||e==="enable"||e==="disable"?(e==="enable"||e==="disable"?this._gsEventHandler[e]=r=>t(r):this._gsEventHandler[e]=r=>{r.detail&&t(r,r.detail)},this.el.addEventListener(e,this._gsEventHandler[e])):e==="drag"||e==="dragstart"||e==="dragstop"||e==="resizestart"||e==="resize"||e==="resizestop"||e==="dropped"||e==="resizecontent"?this._gsEventHandler[e]=t:console.error("GridStack.on("+e+") event not supported"),this)}off(e){return e.indexOf(" ")!==-1?(e.split(" ").forEach(i=>this.off(i)),this):((e==="change"||e==="added"||e==="removed"||e==="enable"||e==="disable")&&this._gsEventHandler[e]&&this.el.removeEventListener(e,this._gsEventHandler[e]),delete this._gsEventHandler[e],this)}offAll(){return Object.keys(this._gsEventHandler).forEach(e=>this.off(e)),this}removeWidget(e,t=!0,i=!0){return e?(n.getElements(e).forEach(r=>{if(r.parentElement&&r.parentElement!==this.el)return;let o=r.gridstackNode;o||(o=this.engine.nodes.find(s=>r===s.el)),o&&(t&&n.addRemoveCB&&n.addRemoveCB(this.el,o,!1,!1),delete r.gridstackNode,this._removeDD(r),this.engine.removeNode(o,t,i),t&&r.parentElement&&r.remove())}),i&&(this._triggerRemoveEvent(),this._triggerChangeEvent()),this):(console.error("Error: GridStack.removeWidget(undefined) called"),this)}removeAll(e=!0,t=!0){return this.engine.nodes.forEach(i=>{e&&n.addRemoveCB&&n.addRemoveCB(this.el,i,!1,!1),delete i.el.gridstackNode,this.opts.staticGrid||this._removeDD(i.el)}),this.engine.removeAll(e,t),t&&this._triggerRemoveEvent(),this}setAnimation(e=this.opts.animate,t){return t?setTimeout(()=>{this.opts&&this.setAnimation(e)}):e?this.el.classList.add("grid-stack-animate"):this.el.classList.remove("grid-stack-animate"),this.opts.animate=e,this}hasAnimationCSS(){return this.el.classList.contains("grid-stack-animate")}setStatic(e,t=!0,i=!0){return!!this.opts.staticGrid===e?this:(e?this.opts.staticGrid=!0:delete this.opts.staticGrid,this._setupRemoveDrop(),this._setupAcceptWidget(),this.engine.nodes.forEach(r=>{this.prepareDragDrop(r.el),r.subGrid&&i&&r.subGrid.setStatic(e,t,i)}),t&&this._setStaticClass(),this)}updateOptions(e){var i;let t=this.opts;return e===t?this:(e.acceptWidgets!==void 0&&(t.acceptWidgets=e.acceptWidgets,this._setupAcceptWidget()),e.animate!==void 0&&this.setAnimation(e.animate),e.cellHeight&&this.cellHeight(e.cellHeight),e.class!==void 0&&e.class!==t.class&&(t.class&&this.el.classList.remove(t.class),e.class&&this.el.classList.add(e.class)),e.columnOpts?(this.opts.columnOpts=e.columnOpts,this.checkDynamicColumn()):e.columnOpts===null&&this.opts.columnOpts?(delete this.opts.columnOpts,this._updateResizeEvent()):typeof e.column=="number"&&this.column(e.column),e.margin!==void 0&&this.margin(e.margin),e.staticGrid!==void 0&&this.setStatic(e.staticGrid),e.disableDrag!==void 0&&!e.staticGrid&&this.enableMove(!e.disableDrag),e.disableResize!==void 0&&!e.staticGrid&&this.enableResize(!e.disableResize),e.float!==void 0&&this.float(e.float),e.row!==void 0?(t.minRow=t.maxRow=t.row=e.row,this._updateContainerHeight()):(e.minRow!==void 0&&(t.minRow=e.minRow,this._updateContainerHeight()),e.maxRow!==void 0&&(t.maxRow=e.maxRow)),(i=e.children)!=null&&i.length&&this.load(e.children),this)}update(e,t){return n.getElements(e).forEach(i=>{var u;let r=i==null?void 0:i.gridstackNode;if(!r)return;let o=O(O({},E.copyPos({},r)),E.cloneDeep(t));this.engine.nodeBoundFix(o),delete o.autoPosition;let s=["x","y","w","h"],a;if(s.some(d=>o[d]!==void 0&&o[d]!==r[d])&&(a={},s.forEach(d=>{a[d]=o[d]!==void 0?o[d]:r[d],delete o[d]})),!a&&(o.minW||o.minH||o.maxW||o.maxH)&&(a={}),o.content!==void 0){let d=i.querySelector(".grid-stack-item-content");d&&d.textContent!==o.content&&(r.content=o.content,n.renderCB(d,o),(u=r.subGrid)!=null&&u.el&&(d.appendChild(r.subGrid.el),r.subGrid._updateContainerHeight())),delete o.content}let l=!1,c=!1;for(let d in o)d[0]!=="_"&&r[d]!==o[d]&&(r[d]=o[d],l=!0,c=c||!this.opts.staticGrid&&(d==="noResize"||d==="noMove"||d==="locked"));if(E.sanitizeMinMax(r),a){let d=a.w!==void 0&&a.w!==r.w;this.moveNode(r,a),d&&r.subGrid?r.subGrid.onResize(this.hasAnimationCSS()?r.w:void 0):this.resizeToContentCheck(d,r),delete r._orig}(a||l)&&this._writeAttr(i,r),c&&this.prepareDragDrop(r.el),n.updateCB&&n.updateCB(r)}),this}moveNode(e,t){let i=e._updating;i||this.engine.cleanNodes().beginUpdate(e),this.engine.moveNode(e,t),this._updateContainerHeight(),i||(this._triggerChangeEvent(),this.engine.endUpdate())}resizeToContent(e){var p,y;if(!e||(e.classList.remove("size-to-content-max"),!e.clientHeight))return;let t=e.gridstackNode;if(!t)return;let i=t.grid;if(!i||e.parentElement!==i.el)return;let r=i.getCellHeight(!0);if(!r)return;let o=t.h?t.h*r:e.clientHeight,s;if(t.resizeToContentParent&&(s=e.querySelector(t.resizeToContentParent)),s||(s=e.querySelector(n.resizeToContentParent)),!s)return;let a=e.clientHeight-s.clientHeight,l=t.h?t.h*r-a:s.clientHeight,c;if(t.subGrid){c=t.subGrid.getRow()*t.subGrid.getCellHeight(!0);let m=t.subGrid.el.getBoundingClientRect(),v=e.getBoundingClientRect();c+=m.top-v.top}else{if((y=(p=t.subGridOpts)==null?void 0:p.children)!=null&&y.length)return;{let m=s.firstElementChild;if(!m){console.error(`Error: GridStack.resizeToContent() widget id:${t.id} '${n.resizeToContentParent}'.firstElementChild is null, make sure to have a div like container. Skipping sizing.`);return}c=m.getBoundingClientRect().height||l}}if(l===c)return;o+=c-l;let u=Math.ceil(o/r),d=Number.isInteger(t.sizeToContent)?t.sizeToContent:0;d&&u>d&&(u=d,e.classList.add("size-to-content-max")),t.minH&&u t.maxH&&(u=t.maxH),u!==t.h&&(i._ignoreLayoutsNodeChange=!0,i.moveNode(t,{h:u}),delete i._ignoreLayoutsNodeChange)}resizeToContentCBCheck(e){n.resizeToContentCB?n.resizeToContentCB(e):this.resizeToContent(e)}rotate(e,t){return n.getElements(e).forEach(i=>{let r=i.gridstackNode;if(!E.canBeRotated(r))return;let o={w:r.h,h:r.w,minH:r.minW,minW:r.minH,maxH:r.maxW,maxW:r.maxH};if(t){let a=t.left>0?Math.floor(t.left/this.cellWidth()):0,l=t.top>0?Math.floor(t.top/this.opts.cellHeight):0;o.x=r.x+a-(r.h-(l+1)),o.y=r.y+l-a}Object.keys(o).forEach(a=>{o[a]===void 0&&delete o[a]});let s=r._orig;this.update(i,o),r._orig=s}),this}margin(e){if(!(typeof e=="string"&&e.split(" ").length>1)){let i=E.parseHeight(e);if(this.opts.marginUnit===i.unit&&this.opts.margin===i.h)return}return this.opts.margin=e,this.opts.marginTop=this.opts.marginBottom=this.opts.marginLeft=this.opts.marginRight=void 0,this._initMargin(),this}getMargin(){return this.opts.margin}willItFit(e){if(arguments.length>1){console.warn("gridstack.ts: `willItFit(x,y,w,h,autoPosition)` is deprecated. Use `willItFit({x, y,...})`. It will be removed soon");let t=arguments,i=0,r={x:t[i++],y:t[i++],w:t[i++],h:t[i++],autoPosition:t[i++]};return this.willItFit(r)}return this.engine.willItFit(e)}_triggerChangeEvent(){if(this.engine.batchMode)return this;let e=this.engine.getDirtyNodes(!0);return e&&e.length&&(this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(e),this._triggerEvent("change",e)),this.engine.saveInitial(),this}_triggerAddEvent(){var e;if(this.engine.batchMode)return this;if((e=this.engine.addedNodes)!=null&&e.length){this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(this.engine.addedNodes),this.engine.addedNodes.forEach(i=>{delete i._dirty});let t=[...this.engine.addedNodes];this.engine.addedNodes=[],this._triggerEvent("added",t)}return this}_triggerRemoveEvent(){var e;if(this.engine.batchMode)return this;if((e=this.engine.removedNodes)!=null&&e.length){let t=[...this.engine.removedNodes];this.engine.removedNodes=[],this._triggerEvent("removed",t)}return this}_triggerEvent(e,t){let i=t?new CustomEvent(e,{bubbles:!1,detail:t}):new Event(e),r=this;for(;r.parentGridNode;)r=r.parentGridNode.grid;return r.el.dispatchEvent(i),this}_updateContainerHeight(){if(!this.engine||this.engine.batchMode)return this;let e=this.parentGridNode,t=this.getRow()+this._extraDragRow,i=this.opts.cellHeight,r=this.opts.cellHeightUnit;if(!i)return this;if(!e&&!this.opts.minRow){let o=E.parseHeight(getComputedStyle(this.el).minHeight);if(o.h>0&&o.unit===r){let s=Math.floor(o.h/i);t 1?`calc(${t.w} * var(--gs-column-width))`:null,e.style.height=t.h>1?`calc(${t.h} * var(--gs-cell-height))`:null),t.x>0?e.setAttribute("gs-x",String(t.x)):e.removeAttribute("gs-x"),t.y>0?e.setAttribute("gs-y",String(t.y)):e.removeAttribute("gs-y"),t.w>1?e.setAttribute("gs-w",String(t.w)):e.removeAttribute("gs-w"),t.h>1?e.setAttribute("gs-h",String(t.h)):e.removeAttribute("gs-h"),this}_writeAttr(e,t){if(!t)return this;this._writePosAttr(e,t);let i={noResize:"gs-no-resize",noMove:"gs-no-move",locked:"gs-locked",id:"gs-id",sizeToContent:"gs-size-to-content"};for(let r in i)t[r]?e.setAttribute(i[r],String(t[r])):e.removeAttribute(i[r]);return this}_readAttr(e,t=!0){let i={};i.x=E.toNumber(e.getAttribute("gs-x")),i.y=E.toNumber(e.getAttribute("gs-y")),i.w=E.toNumber(e.getAttribute("gs-w")),i.h=E.toNumber(e.getAttribute("gs-h")),i.autoPosition=E.toBool(e.getAttribute("gs-auto-position")),i.noResize=E.toBool(e.getAttribute("gs-no-resize")),i.noMove=E.toBool(e.getAttribute("gs-no-move")),i.locked=E.toBool(e.getAttribute("gs-locked"));let r=e.getAttribute("gs-size-to-content");r&&(r==="true"||r==="false"?i.sizeToContent=E.toBool(r):i.sizeToContent=parseInt(r,10)),i.id=e.getAttribute("gs-id"),i.maxW=E.toNumber(e.getAttribute("gs-max-w")),i.minW=E.toNumber(e.getAttribute("gs-min-w")),i.maxH=E.toNumber(e.getAttribute("gs-max-h")),i.minH=E.toNumber(e.getAttribute("gs-min-h")),t&&(i.w===1&&e.removeAttribute("gs-w"),i.h===1&&e.removeAttribute("gs-h"),i.maxW&&e.removeAttribute("gs-max-w"),i.minW&&e.removeAttribute("gs-min-w"),i.maxH&&e.removeAttribute("gs-max-h"),i.minH&&e.removeAttribute("gs-min-h"));for(let o in i){if(!i.hasOwnProperty(o))return;!i[o]&&i[o]!==0&&o!=="sizeToContent"&&delete i[o]}return i}_setStaticClass(){let e=["grid-stack-static"];return this.opts.staticGrid?(this.el.classList.add(...e),this.el.setAttribute("gs-static","true")):(this.el.classList.remove(...e),this.el.removeAttribute("gs-static")),this}onResize(e=(t=>(t=this.el)==null?void 0:t.clientWidth)()){if(!e||this.prevWidth===e)return;this.prevWidth=e,this.batchUpdate();let i=!1;return this._autoColumn&&this.parentGridNode?this.opts.column!==this.parentGridNode.w&&(this.column(this.parentGridNode.w,this.opts.layout||"list"),i=!0):i=this.checkDynamicColumn(),this._isAutoCellHeight&&this.cellHeight(),this.engine.nodes.forEach(r=>{r.subGrid&&r.subGrid.onResize()}),this._skipInitialResize||this.resizeToContentCheck(i),delete this._skipInitialResize,this.batchUpdate(!1),this}resizeToContentCheck(e=!1,t=void 0){if(this.engine){if(e&&this.hasAnimationCSS())return setTimeout(()=>this.resizeToContentCheck(!1,t),this.animationDelay);if(t)E.shouldSizeToContent(t)&&this.resizeToContentCBCheck(t.el);else if(this.engine.nodes.some(i=>E.shouldSizeToContent(i))){let i=[...this.engine.nodes];this.batchUpdate(),i.forEach(r=>{E.shouldSizeToContent(r)&&this.resizeToContentCBCheck(r.el)}),this._ignoreLayoutsNodeChange=!0,this.batchUpdate(!1),this._ignoreLayoutsNodeChange=!1}this._gsEventHandler.resizecontent&&this._gsEventHandler.resizecontent(null,t?[t]:this.engine.nodes)}}_updateResizeEvent(e=!1){let t=!this.parentGridNode&&(this._isAutoCellHeight||this.opts.sizeToContent||this.opts.columnOpts||this.engine.nodes.find(i=>i.sizeToContent));return!e&&t&&!this.resizeObserver?(this._sizeThrottle=E.throttle(()=>this.onResize(),this.opts.cellHeightThrottle),this.resizeObserver=new ResizeObserver(()=>this._sizeThrottle()),this.resizeObserver.observe(this.el),this._skipInitialResize=!0):(e||!t)&&this.resizeObserver&&(this.resizeObserver.disconnect(),delete this.resizeObserver,delete this._sizeThrottle),this}static getElement(e=".grid-stack-item"){return E.getElement(e)}static getElements(e=".grid-stack-item"){return E.getElements(e)}static getGridElement(e){return n.getElement(e)}static getGridElements(e){return E.getElements(e)}_initMargin(){let e,t=0,i=[];typeof this.opts.margin=="string"&&(i=this.opts.margin.split(" ")),i.length===2?(this.opts.marginTop=this.opts.marginBottom=i[0],this.opts.marginLeft=this.opts.marginRight=i[1]):i.length===4?(this.opts.marginTop=i[0],this.opts.marginRight=i[1],this.opts.marginBottom=i[2],this.opts.marginLeft=i[3]):(e=E.parseHeight(this.opts.margin),this.opts.marginUnit=e.unit,t=this.opts.margin=e.h),["marginTop","marginRight","marginBottom","marginLeft"].forEach(s=>{this.opts[s]===void 0?this.opts[s]=t:(e=E.parseHeight(this.opts[s]),this.opts[s]=e.h,delete this.opts.margin)}),this.opts.marginUnit=e.unit,this.opts.marginTop===this.opts.marginBottom&&this.opts.marginLeft===this.opts.marginRight&&this.opts.marginTop===this.opts.marginRight&&(this.opts.margin=this.opts.marginTop);let o=this.el.style;return o.setProperty("--gs-item-margin-top",`${this.opts.marginTop}${this.opts.marginUnit}`),o.setProperty("--gs-item-margin-bottom",`${this.opts.marginBottom}${this.opts.marginUnit}`),o.setProperty("--gs-item-margin-right",`${this.opts.marginRight}${this.opts.marginUnit}`),o.setProperty("--gs-item-margin-left",`${this.opts.marginLeft}${this.opts.marginUnit}`),this}static getDD(){return Ie}static setupDragIn(e,t,i,r=document){(t==null?void 0:t.pause)!==void 0&&(F.pauseDrag=t.pause),t=O({appendTo:"body",helper:"clone"},t||{}),(typeof e=="string"?E.getElements(e,r):e).forEach((s,a)=>{Ie.isDraggable(s)||Ie.dragIn(s,t),i!=null&&i[a]&&(s.gridstackNode=i[a])})}movable(e,t){return this.opts.staticGrid?this:(n.getElements(e).forEach(i=>{let r=i.gridstackNode;r&&(t?delete r.noMove:r.noMove=!0,this.prepareDragDrop(r.el))}),this)}resizable(e,t){return this.opts.staticGrid?this:(n.getElements(e).forEach(i=>{let r=i.gridstackNode;r&&(t?delete r.noResize:r.noResize=!0,this.prepareDragDrop(r.el))}),this)}disable(e=!0){if(!this.opts.staticGrid)return this.enableMove(!1,e),this.enableResize(!1,e),this._triggerEvent("disable"),this}enable(e=!0){if(!this.opts.staticGrid)return this.enableMove(!0,e),this.enableResize(!0,e),this._triggerEvent("enable"),this}enableMove(e,t=!0){return this.opts.staticGrid?this:(e?delete this.opts.disableDrag:this.opts.disableDrag=!0,this.engine.nodes.forEach(i=>{this.prepareDragDrop(i.el),i.subGrid&&t&&i.subGrid.enableMove(e,t)}),this)}enableResize(e,t=!0){return this.opts.staticGrid?this:(e?delete this.opts.disableResize:this.opts.disableResize=!0,this.engine.nodes.forEach(i=>{this.prepareDragDrop(i.el),i.subGrid&&t&&i.subGrid.enableResize(e,t)}),this)}cancelDrag(){var t;let e=(t=this._placeholder)==null?void 0:t.gridstackNode;e&&(e._isExternal?(e._isAboutToRemove=!0,this.engine.removeNode(e)):e._isAboutToRemove&&n._itemRemoving(e.el,!1),this.engine.restoreInitial())}_removeDD(e){return Ie.draggable(e,"destroy").resizable(e,"destroy"),e.gridstackNode&&delete e.gridstackNode._initDD,delete e.ddElement,this}_setupAcceptWidget(){if(this.opts.staticGrid||!this.opts.acceptWidgets&&!this.opts.removable)return Ie.droppable(this.el,"destroy"),this;let e,t,i=(r,o,s)=>{var p;s=s||o;let a=s.gridstackNode;if(!a)return;if(!((p=a.grid)!=null&&p.el)){s.style.transform=`scale(${1/this.dragTransform.xScale},${1/this.dragTransform.yScale})`;let y=s.getBoundingClientRect();s.style.left=y.x+(this.dragTransform.xScale-1)*(r.clientX-y.x)/this.dragTransform.xScale+"px",s.style.top=y.y+(this.dragTransform.yScale-1)*(r.clientY-y.y)/this.dragTransform.yScale+"px",s.style.transformOrigin="0px 0px"}let{top:l,left:c}=s.getBoundingClientRect(),u=this.el.getBoundingClientRect();c-=u.left,l-=u.top;let d={position:{top:l*this.dragTransform.xScale,left:c*this.dragTransform.yScale}};if(a._temporaryRemoved){if(a.x=Math.max(0,Math.round(c/t)),a.y=Math.max(0,Math.round(l/e)),delete a.autoPosition,this.engine.nodeBoundFix(a),!this.engine.willItFit(a)){if(a.autoPosition=!0,!this.engine.willItFit(a)){Ie.off(o,"drag");return}a._willFitPos&&(E.copyPos(a,a._willFitPos),delete a._willFitPos)}this._onStartMoving(s,r,d,a,t,e)}else this._dragOrResize(s,r,d,a,t,e)};return Ie.droppable(this.el,{accept:r=>{let o=r.gridstackNode||this._readAttr(r,!1);if((o==null?void 0:o.grid)===this)return!0;if(!this.opts.acceptWidgets)return!1;let s=!0;if(typeof this.opts.acceptWidgets=="function")s=this.opts.acceptWidgets(r);else{let a=this.opts.acceptWidgets===!0?".grid-stack-item":this.opts.acceptWidgets;s=r.matches(a)}if(s&&o&&this.opts.maxRow){let a={w:o.w,h:o.h,minW:o.minW,minH:o.minH};s=this.engine.willItFit(a)}return s}}).on(this.el,"dropover",(r,o,s)=>{let a=(s==null?void 0:s.gridstackNode)||o.gridstackNode;if((a==null?void 0:a.grid)===this&&!a._temporaryRemoved)return!1;if(a!=null&&a._sidebarOrig&&(a.w=a._sidebarOrig.w,a.h=a._sidebarOrig.h),a!=null&&a.grid&&a.grid!==this&&!a._temporaryRemoved&&a.grid._leave(o,s),s=s||o,t=this.cellWidth(),e=this.getCellHeight(!0),!a){let u=s.getAttribute("data-gs-widget")||s.getAttribute("gridstacknode");if(u){try{a=JSON.parse(u)}catch(d){console.error("Gridstack dropover: Bad JSON format: ",u)}s.removeAttribute("data-gs-widget"),s.removeAttribute("gridstacknode")}a||(a=this._readAttr(s)),a._sidebarOrig={w:a.w,h:a.h}}a.grid||(a.el||(a=O({},a)),a._isExternal=!0,s.gridstackNode=a);let l=a.w||Math.round(s.offsetWidth/t)||1,c=a.h||Math.round(s.offsetHeight/e)||1;return a.grid&&a.grid!==this?(o._gridstackNodeOrig||(o._gridstackNodeOrig=a),o.gridstackNode=a=ae(O({},a),{w:l,h:c,grid:this}),delete a.x,delete a.y,this.engine.cleanupNode(a).nodeBoundFix(a),a._initDD=a._isExternal=a._temporaryRemoved=!0):(a.w=l,a.h=c,a._temporaryRemoved=!0),n._itemRemoving(a.el,!1),Ie.on(o,"drag",i),i(r,o,s),!1}).on(this.el,"dropout",(r,o,s)=>{let a=(s==null?void 0:s.gridstackNode)||o.gridstackNode;return a&&(!a.grid||a.grid===this)&&(this._leave(o,s),this._isTemp&&this.removeAsSubGrid(a)),!1}).on(this.el,"drop",(r,o,s)=>{var p,y,m;let a=(s==null?void 0:s.gridstackNode)||o.gridstackNode;if((a==null?void 0:a.grid)===this&&!a._isExternal)return!1;let l=!!this.placeholder.parentElement,c=o!==s;this.placeholder.remove(),delete this.placeholder.gridstackNode,l&&this.opts.animate&&(this.setAnimation(!1),this.setAnimation(!0,!0));let u=o._gridstackNodeOrig;if(delete o._gridstackNodeOrig,l&&(u!=null&&u.grid)&&u.grid!==this){let v=u.grid;v.engine.removeNodeFromLayoutCache(u),v.engine.removedNodes.push(u),v._triggerRemoveEvent()._triggerChangeEvent(),v.parentGridNode&&!v.engine.nodes.length&&v.opts.subGridDynamic&&v.removeAsSubGrid()}if(!a||(l&&(this.engine.cleanupNode(a),a.grid=this),(p=a.grid)==null||delete p._isTemp,Ie.off(o,"drag"),s!==o?(s.remove(),o=s):o.remove(),this._removeDD(o),!l))return!1;let d=(m=(y=a.subGrid)==null?void 0:y.el)==null?void 0:m.gridstack;return E.copyPos(a,this._readAttr(this.placeholder)),E.removePositioningStyles(o),c&&(a.content||a.subGridOpts||n.addRemoveCB)?(delete a.el,o=this.addWidget(a)):(this._prepareElement(o,!0,a),this.el.appendChild(o),this.resizeToContentCheck(!1,a),d&&(d.parentGridNode=a),this._updateContainerHeight()),this.engine.addedNodes.push(a),this._triggerAddEvent(),this._triggerChangeEvent(),this.engine.endUpdate(),this._gsEventHandler.dropped&&this._gsEventHandler.dropped(ae(O({},r),{type:"dropped"}),u&&u.grid?u:void 0,a),!1}),this}static _itemRemoving(e,t){if(!e)return;let i=e?e.gridstackNode:void 0;!(i!=null&&i.grid)||e.classList.contains(i.grid.opts.removableOptions.decline)||(t?i._isAboutToRemove=!0:delete i._isAboutToRemove,t?e.classList.add("grid-stack-item-removing"):e.classList.remove("grid-stack-item-removing"))}_setupRemoveDrop(){if(typeof this.opts.removable!="string")return this;let e=document.querySelector(this.opts.removable);return e?(!this.opts.staticGrid&&!Ie.isDroppable(e)&&Ie.droppable(e,this.opts.removableOptions).on(e,"dropover",(t,i)=>n._itemRemoving(i,!0)).on(e,"dropout",(t,i)=>n._itemRemoving(i,!1)),this):this}prepareDragDrop(e,t=!1){let i=e==null?void 0:e.gridstackNode;if(!i)return;let r=i.noMove||this.opts.disableDrag,o=i.noResize||this.opts.disableResize,s=this.opts.staticGrid||r&&o;if((t||s)&&(i._initDD&&(this._removeDD(e),delete i._initDD),s&&e.classList.add("ui-draggable-disabled","ui-resizable-disabled"),!t))return this;if(!i._initDD){let a,l,c=(p,y)=>{this.triggerEvent(p,p.target),a=this.cellWidth(),l=this.getCellHeight(!0),this._onStartMoving(e,p,y,i,a,l)},u=(p,y)=>{this._dragOrResize(e,p,y,i,a,l)},d=p=>{this.placeholder.remove(),delete this.placeholder.gridstackNode,delete i._moving,delete i._resizing,delete i._event,delete i._lastTried;let y=i.w!==i._orig.w,m=p.target;if(!(!m.gridstackNode||m.gridstackNode.grid!==this)){if(i.el=m,i._isAboutToRemove){let v=e.gridstackNode.grid;v._gsEventHandler[p.type]&&v._gsEventHandler[p.type](p,m),v.engine.nodes.push(i),v.removeWidget(e,!0,!0)}else E.removePositioningStyles(m),i._temporaryRemoved?(E.copyPos(i,i._orig),this._writePosAttr(m,i),this.engine.addNode(i)):this._writePosAttr(m,i),this.triggerEvent(p,m);this._extraDragRow=0,this._updateContainerHeight(),this._triggerChangeEvent(),this.engine.endUpdate(),p.type==="resizestop"&&(Number.isInteger(i.sizeToContent)&&(i.sizeToContent=i.h),this.resizeToContentCheck(y,i))}};Ie.draggable(e,{start:c,stop:d,drag:u}).resizable(e,{start:c,stop:d,resize:u}),i._initDD=!0}return Ie.draggable(e,r?"disable":"enable").resizable(e,o?"disable":"enable"),this}_onStartMoving(e,t,i,r,o,s){var a;if(this.engine.cleanNodes().beginUpdate(r),this._writePosAttr(this.placeholder,r),this.el.appendChild(this.placeholder),this.placeholder.gridstackNode=r,(a=r.grid)!=null&&a.el)this.dragTransform=E.getValuesFromTransformedElement(e);else if(this.placeholder&&this.placeholder.closest(".grid-stack")){let l=this.placeholder.closest(".grid-stack");this.dragTransform=E.getValuesFromTransformedElement(l)}else this.dragTransform={xScale:1,xOffset:0,yScale:1,yOffset:0};if(r.el=this.placeholder,r._lastUiPosition=i.position,r._prevYPix=i.position.top,r._moving=t.type==="dragstart",r._resizing=t.type==="resizestart",delete r._lastTried,t.type==="dropover"&&r._temporaryRemoved&&(this.engine.addNode(r),r._moving=!0),this.engine.cacheRects(o,s,this.opts.marginTop,this.opts.marginRight,this.opts.marginBottom,this.opts.marginLeft),t.type==="resizestart"){let l=this.getColumn()-r.x,c=(this.opts.maxRow||Number.MAX_SAFE_INTEGER)-r.y;Ie.resizable(e,"option","minWidth",o*Math.min(r.minW||1,l)).resizable(e,"option","minHeight",s*Math.min(r.minH||1,c)).resizable(e,"option","maxWidth",o*Math.min(r.maxW||Number.MAX_SAFE_INTEGER,l)).resizable(e,"option","maxWidthMoveLeft",o*Math.min(r.maxW||Number.MAX_SAFE_INTEGER,r.x+r.w)).resizable(e,"option","maxHeight",s*Math.min(r.maxH||Number.MAX_SAFE_INTEGER,c)).resizable(e,"option","maxHeightMoveUp",s*Math.min(r.maxH||Number.MAX_SAFE_INTEGER,r.y+r.h))}}_dragOrResize(e,t,i,r,o,s){let a=O({},r._orig),l,c=this.opts.marginLeft,u=this.opts.marginRight,d=this.opts.marginTop,p=this.opts.marginBottom,y=Math.round(s*.1),m=Math.round(o*.1);if(c=Math.min(c,m),u=Math.min(u,m),d=Math.min(d,y),p=Math.min(p,y),t.type==="drag"){if(r._temporaryRemoved)return;let w=i.position.top-r._prevYPix;r._prevYPix=i.position.top,this.opts.draggable.scroll!==!1&&E.updateScrollPosition(e,i.position,w);let T=i.position.left+(i.position.left>r._lastUiPosition.left?-u:c),_=i.position.top+(i.position.top>r._lastUiPosition.top?-p:d);a.x=Math.round(T/o),a.y=Math.round(_/s);let S=this._extraDragRow;if(this.engine.collide(r,a)){let A=this.getRow(),K=Math.max(0,a.y+r.h-A);this.opts.maxRow&&A+K>this.opts.maxRow&&(K=Math.max(0,this.opts.maxRow-A)),this._extraDragRow=K}else this._extraDragRow=0;if(this._extraDragRow!==S&&this._updateContainerHeight(),r.x===a.x&&r.y===a.y)return}else if(t.type==="resize"){if(a.x<0||(E.updateScrollResize(t,e,s),a.w=Math.round((i.size.width-c)/o),a.h=Math.round((i.size.height-d)/s),r.w===a.w&&r.h===a.h)||r._lastTried&&r._lastTried.w===a.w&&r._lastTried.h===a.h)return;let w=i.position.left+c,T=i.position.top+d;a.x=Math.round(w/o),a.y=Math.round(T/s),l=!0}r._event=t,r._lastTried=a;let v={x:i.position.left+c,y:i.position.top+d,w:(i.size?i.size.width:r.w*o)-c-u,h:(i.size?i.size.height:r.h*s)-d-p};if(this.engine.moveNodeCheck(r,ae(O({},a),{cellWidth:o,cellHeight:s,rect:v,resizing:l}))){r._lastUiPosition=i.position,this.engine.cacheRects(o,s,d,u,p,c),delete r._skipDown,l&&r.subGrid&&r.subGrid.onResize(),this._extraDragRow=0,this._updateContainerHeight();let w=t.target;r._sidebarOrig||this._writePosAttr(w,r),this.triggerEvent(t,w)}}triggerEvent(e,t){let i=this;for(;i.parentGridNode;)i=i.parentGridNode.grid;i._gsEventHandler[e.type]&&i._gsEventHandler[e.type](e,t)}_leave(e,t){t=t||e;let i=t.gridstackNode;if(!i||(t.style.transform=t.style.transformOrigin=null,Ie.off(e,"drag"),i._temporaryRemoved))return;i._temporaryRemoved=!0,this.engine.removeNode(i),i.el=i._isExternal&&t?t:e;let r=i._sidebarOrig;i._isExternal&&this.engine.cleanupNode(i),i._sidebarOrig=r,this.opts.removable===!0&&n._itemRemoving(e,!0),e._gridstackNodeOrig?(e.gridstackNode=e._gridstackNodeOrig,delete e._gridstackNodeOrig):i._isExternal&&this.engine.restoreInitial()}commit(){return Oc(this,this.batchUpdate(!1),"commit","batchUpdate","5.2"),this}};Et.renderCB=(n,e)=>{n&&(e!=null&&e.content)&&(n.textContent=e.content)};Et.resizeToContentParent=".grid-stack-item-content";Et.Utils=E;Et.Engine=In;Et.GDRev="12.2.2";function Qg(){let n=document.getElementById("dashboard");n&&n.gridstack.disable()}function Jg(){let n=document.getElementById("dashboard");n&&n.gridstack.enable()}function Zg(n,e){return at(this,null,function*(){return yield On(n,{layout:e})})}function Mc(){if(document.getElementById("dashboard")==null)return;let e=Et.init({cellHeight:100,disableDrag:!0,disableResize:!0,draggable:{handle:".grid-stack-item-content .card-header",appendTo:"body",scroll:!0}}),t=document.getElementById("lock_dashboard");t&&t.addEventListener("click",()=>{Qg()});let i=document.getElementById("unlock_dashboard");i&&i.addEventListener("click",()=>{Jg()});let r=document.getElementById("save_dashboard");r!==null&&r.addEventListener("click",()=>{let o=r.getAttribute("data-url");if(o==null)return;let s=e.save(!1);Zg(o,s).then(a=>{tn(a)?It("danger","Error Saving Dashboard Config",a.error).show():location.reload()})})}function kc(n,e){switch(n){case"images-and-labels":{us("image.device-image",e),us("text.device-image-label",e);break}case"images-only":{us("image.device-image",e),ds("text.device-image-label",e);break}case"labels-only":{ds("image.device-image",e),ds("text.device-image-label",e);break}}}function us(n,e){var i;let t=(i=e.querySelectorAll(n))!=null?i:[];for(let r of t)r.classList.remove("hidden")}function ds(n,e){var i;let t=(i=e.querySelectorAll(n))!=null?i:[];for(let r of t)r.classList.add("hidden")}function ev(n,e){e.set("view",n);for(let t of I(".rack_elevation"))kc(n,t)}function Nc(){let n=Zo.get("view");for(let e of I("select.rack-view"))e.selectedIndex=[...e.options].findIndex(t=>t.value==n),e.addEventListener("change",t=>{ev(t.currentTarget.value,Zo)},!1);for(let e of I(".rack_elevation"))e.addEventListener("load",()=>{kc(n,e)})}function tv(n){let e=document.getElementById("selector_results");if(e==null)return;let t=e.getAttribute("data-selector-target");if(t==null)return;let i=document.getElementById(t);if(i==null)return;let r=n.getAttribute("data-label"),o=n.getAttribute("data-value");i.tomselect.addOption({id:o,display:r}),i.tomselect.addItem(o)}function Ic(){for(let n of I("#selector_results a"))n.addEventListener("click",()=>tv(n))}function nv(){let n=document.getElementById("quick-add-object");if(n==null)return;let e=n.getAttribute("data-object-id");if(e==null)return;let t=n.getAttribute("data-object-repr");if(t==null)return;let i=n.getAttribute("data-target-id");if(i==null)return;let r=document.getElementById(i);if(r==null)return;r.tomselect.addOption({id:e,display:t}),r.tomselect.addItem(e);let o=document.getElementById("htmx-modal");if(o){let s=tt.getInstance(o);s&&s.hide()}}function Rc(){let n=document.getElementById("htmx-modal-content");n&&n.addEventListener("htmx:afterSwap",()=>nv())}function iv(){Tr(),Ar(),vr(),xr(),Ic(),Rc(),yr(),Cr()}function Hc(){document.addEventListener("htmx:afterSettle",iv)}function rv(n){let e=n.currentTarget,t=e.baseURI.split("?")[0],i="?",r=Array.from(e.options).filter(o=>o.selected).map(o=>`filter_id=${o.value}`).join("&");t+=`${i}${r}`,document.location.href=t}function Pc(){let n=document.getElementById("results");if(pe(n)){let e=document.getElementById("id_filter_id");pe(e)&&e.addEventListener("change",rv)}}function Fc(){for(let n of[yr,mc,Cr,vr,Dl,xr,xc,Tr,Ar,Cc,Sc,Dc,Mc,Nc,Hc,Pc])n()}function ov(){let n=document.forms;for(let t of n)t.method.toUpperCase()=="GET"&&t.addEventListener("formdata",function(i){let r=i.formData;for(let[o,s]of Array.from(r.entries()))s===""&&r.delete(o)});let e=document.querySelector(".content-container");e!==null&&e.focus()}window.addEventListener("load",ov);document.readyState!=="loading"?Fc():document.addEventListener("DOMContentLoaded",Fc);})(); +Note: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.`)),i}static addGrid(e,t={}){if(!e)return null;let i=e;if(i.gridstack){let s=i.gridstack;return t&&(s.opts=O(O({},s.opts),t)),t.children!==void 0&&s.load(t.children),s}return(!e.classList.contains("grid-stack")||n.addRemoveCB)&&(n.addRemoveCB?i=n.addRemoveCB(e,t,!0,!0):i=E.createDiv(["grid-stack",t.class],e)),n.init(t,i)}static registerEngine(e){n.engineClass=e}get placeholder(){if(!this._placeholder){this._placeholder=E.createDiv([this.opts.placeholderClass,Ve.itemClass,this.opts.itemClass]);let e=E.createDiv(["placeholder-content"],this._placeholder);this.opts.placeholderText&&(e.textContent=this.opts.placeholderText)}return this._placeholder}constructor(e,t={}){var c;this.el=e,this.opts=t,this.animationDelay=310,this._gsEventHandler={},this._extraDragRow=0,this.dragTransform={xScale:1,yScale:1,xOffset:0,yOffset:0},e.gridstack=this,this.opts=t=t||{},e.classList.contains("grid-stack")||this.el.classList.add("grid-stack"),t.row&&(t.minRow=t.maxRow=t.row,delete t.row);let i=E.toNumber(e.getAttribute("gs-row"));t.column==="auto"&&delete t.column,t.alwaysShowResizeHandle!==void 0&&(t._alwaysShowResizeHandle=t.alwaysShowResizeHandle);let r=t.columnOpts;if(r){let u=r.breakpoints;!r.columnWidth&&!(u!=null&&u.length)?delete t.columnOpts:(r.columnMax=r.columnMax||12,(u==null?void 0:u.length)>1&&u.sort((d,p)=>(p.w||0)-(d.w||0)))}let o=ae(O({},E.cloneDeep(Ve)),{column:E.toNumber(e.getAttribute("gs-column"))||Ve.column,minRow:i||E.toNumber(e.getAttribute("gs-min-row"))||Ve.minRow,maxRow:i||E.toNumber(e.getAttribute("gs-max-row"))||Ve.maxRow,staticGrid:E.toBool(e.getAttribute("gs-static"))||Ve.staticGrid,sizeToContent:E.toBool(e.getAttribute("gs-size-to-content"))||void 0,draggable:{handle:(t.handleClass?"."+t.handleClass:t.handle?t.handle:"")||Ve.draggable.handle},removableOptions:{accept:t.itemClass||Ve.removableOptions.accept,decline:Ve.removableOptions.decline}});e.getAttribute("gs-animate")&&(o.animate=E.toBool(e.getAttribute("gs-animate"))),t=E.defaults(t,o),this._initMargin(),this.checkDynamicColumn(),this._updateColumnVar(t),t.rtl==="auto"&&(t.rtl=e.style.direction==="rtl"),t.rtl&&this.el.classList.add("grid-stack-rtl");let s=this.el.closest("."+Ve.itemClass),a=s==null?void 0:s.gridstackNode;if(a&&(a.subGrid=this,this.parentGridNode=a,this.el.classList.add("grid-stack-nested"),a.el.classList.add("grid-stack-sub-grid")),this._isAutoCellHeight=t.cellHeight==="auto",this._isAutoCellHeight||t.cellHeight==="initial")this.cellHeight(void 0);else{typeof t.cellHeight=="number"&&t.cellHeightUnit&&t.cellHeightUnit!==Ve.cellHeightUnit&&(t.cellHeight=t.cellHeight+t.cellHeightUnit,delete t.cellHeightUnit);let u=t.cellHeight;delete t.cellHeight,this.cellHeight(u)}t.alwaysShowResizeHandle==="mobile"&&(t.alwaysShowResizeHandle=Ne),this._setStaticClass();let l=t.engineClass||n.engineClass||In;if(this.engine=new l({column:this.getColumn(),float:t.float,maxRow:t.maxRow,onChange:u=>{u.forEach(d=>{let p=d.el;p&&(d._removeDOM?(p&&p.remove(),delete d._removeDOM):this._writePosAttr(p,d))}),this._updateContainerHeight()}}),t.auto&&(this.batchUpdate(),this.engine._loading=!0,this.getGridItems().forEach(u=>this._prepareElement(u)),delete this.engine._loading,this.batchUpdate(!1)),t.children){let u=t.children;delete t.children,u.length&&this.load(u)}this.setAnimation(),t.subGridDynamic&&!F.pauseDrag&&(F.pauseDrag=!0),((c=t.draggable)==null?void 0:c.pause)!==void 0&&(F.pauseDrag=t.draggable.pause),this._setupRemoveDrop(),this._setupAcceptWidget(),this._updateResizeEvent()}_updateColumnVar(e=this.opts){this.el.classList.add("gs-"+e.column),typeof e.column=="number"&&this.el.style.setProperty("--gs-column-width",`${100/e.column}%`)}addWidget(e){if(!e)return;if(typeof e=="string"){console.error("V11: GridStack.addWidget() does not support string anymore. see #2736");return}if(e.ELEMENT_NODE)return console.error("V11: GridStack.addWidget() does not support HTMLElement anymore. use makeWidget()"),this.makeWidget(e);let t,i=e;if(i.grid=this,i.el?t=i.el:n.addRemoveCB?t=n.addRemoveCB(this.el,e,!0,!1):t=this.createWidgetDivs(i),!t)return;if(i=t.gridstackNode,i&&t.parentElement===this.el&&this.engine.nodes.find(o=>o._id===i._id))return t;let r=this._readAttr(t);return E.defaults(e,r),this.engine.prepareNode(e),this.el.appendChild(t),this.makeWidget(t,e),t}createWidgetDivs(e){let t=E.createDiv(["grid-stack-item",this.opts.itemClass]),i=E.createDiv(["grid-stack-item-content"],t);return E.lazyLoad(e)?e.visibleObservable||(e.visibleObservable=new IntersectionObserver(([r])=>{var o,s;r.isIntersecting&&((o=e.visibleObservable)==null||o.disconnect(),delete e.visibleObservable,n.renderCB(i,e),(s=e.grid)==null||s.prepareDragDrop(e.el))}),window.setTimeout(()=>{var r;return(r=e.visibleObservable)==null?void 0:r.observe(t)})):n.renderCB(i,e),t}makeSubGrid(e,t,i,r=!0){var y,m,v;let o=e.gridstackNode;if(o||(o=this.makeWidget(e).gridstackNode),(y=o.subGrid)!=null&&y.el)return o.subGrid;let s,a=this;for(;a&&!s;)s=(m=a.opts)==null?void 0:m.subGridOpts,a=(v=a.parentGridNode)==null?void 0:v.grid;t=E.cloneDeep(O(O(ae(O({},this.opts),{id:void 0,children:void 0,column:"auto",columnOpts:void 0,layout:"list",subGridOpts:void 0}),s||{}),t||o.subGridOpts||{})),o.subGridOpts=t;let l;t.column==="auto"&&(l=!0,t.column=Math.max(o.w||1,(i==null?void 0:i.w)||1),delete t.columnOpts);let c=o.el.querySelector(".grid-stack-item-content"),u,d;if(r&&(this._removeDD(o.el),d=ae(O({},o),{x:0,y:0}),E.removeInternalForSave(d),delete d.subGridOpts,o.content&&(d.content=o.content,delete o.content),n.addRemoveCB?u=n.addRemoveCB(this.el,d,!0,!1):(u=E.createDiv(["grid-stack-item"]),u.appendChild(c),c=E.createDiv(["grid-stack-item-content"],o.el)),this.prepareDragDrop(o.el)),i){let w=l?t.column:o.w,T=o.h+i.h,_=o.el.style;_.transition="none",this.update(o.el,{w,h:T}),setTimeout(()=>_.transition=null)}let p=o.subGrid=n.addGrid(c,t);return i!=null&&i._moving&&(p._isTemp=!0),l&&(p._autoColumn=!0),r&&p.makeWidget(u,d),i&&(i._moving?window.setTimeout(()=>E.simulateMouseEvent(i._event,"mouseenter",p.el),0):p.makeWidget(o.el,o)),this.resizeToContentCheck(!1,o),p}removeAsSubGrid(e){var i;let t=(i=this.parentGridNode)==null?void 0:i.grid;t&&(t.batchUpdate(),t.removeWidget(this.parentGridNode.el,!0,!0),this.engine.nodes.forEach(r=>{r.x+=this.parentGridNode.x,r.y+=this.parentGridNode.y,t.makeWidget(r.el,r)}),t.batchUpdate(!1),this.parentGridNode&&delete this.parentGridNode.subGrid,delete this.parentGridNode,e&&window.setTimeout(()=>E.simulateMouseEvent(e._event,"mouseenter",t.el),0))}save(e=!0,t=!1,i=n.saveCB,r){let o=this.engine.save(e,i,r);if(o.forEach(s=>{var a;if(e&&s.el&&!s.subGrid&&!i){let l=s.el.querySelector(".grid-stack-item-content");s.content=l==null?void 0:l.innerHTML,s.content||delete s.content}else if(!e&&!i&&delete s.content,(a=s.subGrid)!=null&&a.el){let l=s.w||s.subGrid.getColumn(),c=s.subGrid.save(e,t,i,l);s.subGridOpts=t?c:{children:c},delete s.subGrid}delete s.el}),t){let s=E.cloneDeep(this.opts);s.marginBottom===s.marginTop&&s.marginRight===s.marginLeft&&s.marginTop===s.marginRight&&(s.margin=s.marginTop,delete s.marginTop,delete s.marginRight,delete s.marginBottom,delete s.marginLeft),s.rtl===(this.el.style.direction==="rtl")&&(s.rtl="auto"),this._isAutoCellHeight&&(s.cellHeight="auto"),this._autoColumn&&(s.column="auto");let a=s._alwaysShowResizeHandle;return delete s._alwaysShowResizeHandle,a!==void 0?s.alwaysShowResizeHandle=a:delete s.alwaysShowResizeHandle,E.removeInternalAndSame(s,Ve),s.children=o,s}return o}load(e,t=n.addRemoveCB||!0){e=E.cloneDeep(e);let i=this.getColumn();e.forEach(u=>{u.w=u.w||u.minW||1,u.h=u.h||u.minH||1}),e=E.sort(e),this.engine.skipCacheUpdate=this._ignoreLayoutsNodeChange=!0;let r=0;e.forEach(u=>{r=Math.max(r,(u.x||0)+u.w)}),r>this.engine.defaultColumn&&(this.engine.defaultColumn=r),r>i&&(this.engine.nodes.length===0&&this.responseLayout?(this.engine.nodes=e,this.engine.columnChanged(r,i,this.responseLayout),e=this.engine.nodes,this.engine.nodes=[],delete this.responseLayout):this.engine.cacheLayout(e,r,!0));let o=n.addRemoveCB;typeof t=="function"&&(n.addRemoveCB=t);let s=[];this.batchUpdate();let a=!this.engine.nodes.length,l=a&&this.opts.animate;l&&this.setAnimation(!1),!a&&t&&[...this.engine.nodes].forEach(d=>{if(!d.id)return;E.find(e,d.id)||(n.addRemoveCB&&n.addRemoveCB(this.el,d,!1,!1),s.push(d),this.removeWidget(d.el,!0,!1))}),this.engine._loading=!0;let c=[];return this.engine.nodes=this.engine.nodes.filter(u=>E.find(e,u.id)?(c.push(u),!1):!0),e.forEach(u=>{var p;let d=E.find(c,u.id);if(d){if(E.shouldSizeToContent(d)&&(u.h=d.h),this.engine.nodeBoundFix(u),(u.autoPosition||u.x===void 0||u.y===void 0)&&(u.w=u.w||d.w,u.h=u.h||d.h,this.engine.findEmptyPosition(u)),this.engine.nodes.push(d),E.samePos(d,u)&&this.engine.nodes.length>1&&(this.moveNode(d,ae(O({},u),{forceCollide:!0})),E.copyPos(u,d)),this.update(d.el,u),(p=u.subGridOpts)!=null&&p.children){let y=d.el.querySelector(".grid-stack");y&&y.gridstack&&y.gridstack.load(u.subGridOpts.children)}}else t&&this.addWidget(u)}),delete this.engine._loading,this.engine.removedNodes=s,this.batchUpdate(!1),delete this._ignoreLayoutsNodeChange,delete this.engine.skipCacheUpdate,o?n.addRemoveCB=o:delete n.addRemoveCB,l&&this.setAnimation(!0,!0),this}batchUpdate(e=!0){return this.engine.batchUpdate(e),e||(this._updateContainerHeight(),this._triggerRemoveEvent(),this._triggerAddEvent(),this._triggerChangeEvent()),this}getCellHeight(e=!1){if(this.opts.cellHeight&&this.opts.cellHeight!=="auto"&&(!e||!this.opts.cellHeightUnit||this.opts.cellHeightUnit==="px"))return this.opts.cellHeight;if(this.opts.cellHeightUnit==="rem")return this.opts.cellHeight*parseFloat(getComputedStyle(document.documentElement).fontSize);if(this.opts.cellHeightUnit==="em")return this.opts.cellHeight*parseFloat(getComputedStyle(this.el).fontSize);if(this.opts.cellHeightUnit==="cm")return this.opts.cellHeight*(96/2.54);if(this.opts.cellHeightUnit==="mm")return this.opts.cellHeight*(96/2.54)/10;let t=this.el.querySelector("."+this.opts.itemClass);if(t){let r=E.toNumber(t.getAttribute("gs-h"))||1;return Math.round(t.offsetHeight/r)}let i=parseInt(this.el.getAttribute("gs-current-row"));return i?Math.round(this.el.getBoundingClientRect().height/i):this.opts.cellHeight}cellHeight(e){if(e!==void 0&&this._isAutoCellHeight!==(e==="auto")&&(this._isAutoCellHeight=e==="auto",this._updateResizeEvent()),(e==="initial"||e==="auto")&&(e=void 0),e===void 0){let i=-this.opts.marginRight-this.opts.marginLeft+this.opts.marginTop+this.opts.marginBottom;e=this.cellWidth()+i}let t=E.parseHeight(e);return this.opts.cellHeightUnit===t.unit&&this.opts.cellHeight===t.h?this:(this.opts.cellHeightUnit=t.unit,this.opts.cellHeight=t.h,this.el.style.setProperty("--gs-cell-height",`${this.opts.cellHeight}${this.opts.cellHeightUnit}`),this._updateContainerHeight(),this.resizeToContentCheck(),this)}cellWidth(){return this._widthOrContainer()/this.getColumn()}_widthOrContainer(e=!1){var t;return e&&((t=this.opts.columnOpts)!=null&&t.breakpointForWindow)?window.innerWidth:this.el.clientWidth||this.el.parentElement.clientWidth||window.innerWidth}checkDynamicColumn(){var o,s;let e=this.opts.columnOpts;if(!e||!e.columnWidth&&!((o=e.breakpoints)!=null&&o.length))return!1;let t=this.getColumn(),i=t,r=this._widthOrContainer(!0);if(e.columnWidth)i=Math.min(Math.round(r/e.columnWidth)||1,e.columnMax);else{i=e.columnMax;let a=0;for(;al.c===i);return this.column(i,(a==null?void 0:a.layout)||e.layout),!0}return!1}compact(e="compact",t=!0){return this.engine.compact(e,t),this._triggerChangeEvent(),this}column(e,t="moveScale"){if(!e||e<1||this.opts.column===e)return this;let i=this.getColumn();return this.opts.column=e,this.engine?(this.engine.column=e,this.el.classList.remove("gs-"+i),this._updateColumnVar(),this.engine.columnChanged(i,e,t),this._isAutoCellHeight&&this.cellHeight(),this.resizeToContentCheck(!0),this._ignoreLayoutsNodeChange=!0,this._triggerChangeEvent(),delete this._ignoreLayoutsNodeChange,this):(this.responseLayout=t,this)}getColumn(){return this.opts.column}getGridItems(){return Array.from(this.el.children).filter(e=>e.matches("."+this.opts.itemClass)&&!e.matches("."+this.opts.placeholderClass))}isIgnoreChangeCB(){return this._ignoreLayoutsNodeChange}destroy(e=!0){var t;if(this.el)return this.offAll(),this._updateResizeEvent(!0),this.setStatic(!0,!1),this.setAnimation(!1),e?this.el.parentNode.removeChild(this.el):(this.removeAll(e),this.el.removeAttribute("gs-current-row")),this.parentGridNode&&delete this.parentGridNode.subGrid,delete this.parentGridNode,delete this.opts,(t=this._placeholder)==null||delete t.gridstackNode,delete this._placeholder,delete this.engine,delete this.el.gridstack,delete this.el,this}float(e){return this.opts.float!==e&&(this.opts.float=this.engine.float=e,this._triggerChangeEvent()),this}getFloat(){return this.engine.float}getCellFromPixel(e,t=!1){let i=this.el.getBoundingClientRect(),r;t?r={top:i.top+document.documentElement.scrollTop,left:i.left}:r={top:this.el.offsetTop,left:this.el.offsetLeft};let o=e.left-r.left,s=e.top-r.top,a=i.width/this.getColumn(),l=i.height/parseInt(this.el.getAttribute("gs-current-row"));return{x:Math.floor(o/a),y:Math.floor(s/l)}}getRow(){return Math.max(this.engine.getRow(),this.opts.minRow||0)}isAreaEmpty(e,t,i,r){return this.engine.isAreaEmpty(e,t,i,r)}makeWidget(e,t){let i=n.getElement(e);if(!i||i.gridstackNode)return i;i.parentElement||this.el.appendChild(i),this._prepareElement(i,!0,t);let r=i.gridstackNode;this._updateContainerHeight(),r.subGridOpts&&this.makeSubGrid(i,r.subGridOpts,void 0,!1);let o;return this.opts.column===1&&!this._ignoreLayoutsNodeChange&&(o=this._ignoreLayoutsNodeChange=!0),this._triggerAddEvent(),this._triggerChangeEvent(),o&&delete this._ignoreLayoutsNodeChange,i}on(e,t){return e.indexOf(" ")!==-1?(e.split(" ").forEach(r=>this.on(r,t)),this):(e==="change"||e==="added"||e==="removed"||e==="enable"||e==="disable"?(e==="enable"||e==="disable"?this._gsEventHandler[e]=r=>t(r):this._gsEventHandler[e]=r=>{r.detail&&t(r,r.detail)},this.el.addEventListener(e,this._gsEventHandler[e])):e==="drag"||e==="dragstart"||e==="dragstop"||e==="resizestart"||e==="resize"||e==="resizestop"||e==="dropped"||e==="resizecontent"?this._gsEventHandler[e]=t:console.error("GridStack.on("+e+") event not supported"),this)}off(e){return e.indexOf(" ")!==-1?(e.split(" ").forEach(i=>this.off(i)),this):((e==="change"||e==="added"||e==="removed"||e==="enable"||e==="disable")&&this._gsEventHandler[e]&&this.el.removeEventListener(e,this._gsEventHandler[e]),delete this._gsEventHandler[e],this)}offAll(){return Object.keys(this._gsEventHandler).forEach(e=>this.off(e)),this}removeWidget(e,t=!0,i=!0){return e?(n.getElements(e).forEach(r=>{if(r.parentElement&&r.parentElement!==this.el)return;let o=r.gridstackNode;o||(o=this.engine.nodes.find(s=>r===s.el)),o&&(t&&n.addRemoveCB&&n.addRemoveCB(this.el,o,!1,!1),delete r.gridstackNode,this._removeDD(r),this.engine.removeNode(o,t,i),t&&r.parentElement&&r.remove())}),i&&(this._triggerRemoveEvent(),this._triggerChangeEvent()),this):(console.error("Error: GridStack.removeWidget(undefined) called"),this)}removeAll(e=!0,t=!0){return this.engine.nodes.forEach(i=>{e&&n.addRemoveCB&&n.addRemoveCB(this.el,i,!1,!1),delete i.el.gridstackNode,this.opts.staticGrid||this._removeDD(i.el)}),this.engine.removeAll(e,t),t&&this._triggerRemoveEvent(),this}setAnimation(e=this.opts.animate,t){return t?setTimeout(()=>{this.opts&&this.setAnimation(e)}):e?this.el.classList.add("grid-stack-animate"):this.el.classList.remove("grid-stack-animate"),this.opts.animate=e,this}hasAnimationCSS(){return this.el.classList.contains("grid-stack-animate")}setStatic(e,t=!0,i=!0){return!!this.opts.staticGrid===e?this:(e?this.opts.staticGrid=!0:delete this.opts.staticGrid,this._setupRemoveDrop(),this._setupAcceptWidget(),this.engine.nodes.forEach(r=>{this.prepareDragDrop(r.el),r.subGrid&&i&&r.subGrid.setStatic(e,t,i)}),t&&this._setStaticClass(),this)}updateOptions(e){var i;let t=this.opts;return e===t?this:(e.acceptWidgets!==void 0&&(t.acceptWidgets=e.acceptWidgets,this._setupAcceptWidget()),e.animate!==void 0&&this.setAnimation(e.animate),e.cellHeight&&this.cellHeight(e.cellHeight),e.class!==void 0&&e.class!==t.class&&(t.class&&this.el.classList.remove(t.class),e.class&&this.el.classList.add(e.class)),e.columnOpts?(this.opts.columnOpts=e.columnOpts,this.checkDynamicColumn()):e.columnOpts===null&&this.opts.columnOpts?(delete this.opts.columnOpts,this._updateResizeEvent()):typeof e.column=="number"&&this.column(e.column),e.margin!==void 0&&this.margin(e.margin),e.staticGrid!==void 0&&this.setStatic(e.staticGrid),e.disableDrag!==void 0&&!e.staticGrid&&this.enableMove(!e.disableDrag),e.disableResize!==void 0&&!e.staticGrid&&this.enableResize(!e.disableResize),e.float!==void 0&&this.float(e.float),e.row!==void 0?(t.minRow=t.maxRow=t.row=e.row,this._updateContainerHeight()):(e.minRow!==void 0&&(t.minRow=e.minRow,this._updateContainerHeight()),e.maxRow!==void 0&&(t.maxRow=e.maxRow)),(i=e.children)!=null&&i.length&&this.load(e.children),this)}update(e,t){return n.getElements(e).forEach(i=>{var u;let r=i==null?void 0:i.gridstackNode;if(!r)return;let o=O(O({},E.copyPos({},r)),E.cloneDeep(t));this.engine.nodeBoundFix(o),delete o.autoPosition;let s=["x","y","w","h"],a;if(s.some(d=>o[d]!==void 0&&o[d]!==r[d])&&(a={},s.forEach(d=>{a[d]=o[d]!==void 0?o[d]:r[d],delete o[d]})),!a&&(o.minW||o.minH||o.maxW||o.maxH)&&(a={}),o.content!==void 0){let d=i.querySelector(".grid-stack-item-content");d&&d.textContent!==o.content&&(r.content=o.content,n.renderCB(d,o),(u=r.subGrid)!=null&&u.el&&(d.appendChild(r.subGrid.el),r.subGrid._updateContainerHeight())),delete o.content}let l=!1,c=!1;for(let d in o)d[0]!=="_"&&r[d]!==o[d]&&(r[d]=o[d],l=!0,c=c||!this.opts.staticGrid&&(d==="noResize"||d==="noMove"||d==="locked"));if(E.sanitizeMinMax(r),a){let d=a.w!==void 0&&a.w!==r.w;this.moveNode(r,a),d&&r.subGrid?r.subGrid.onResize(this.hasAnimationCSS()?r.w:void 0):this.resizeToContentCheck(d,r),delete r._orig}(a||l)&&this._writeAttr(i,r),c&&this.prepareDragDrop(r.el),n.updateCB&&n.updateCB(r)}),this}moveNode(e,t){let i=e._updating;i||this.engine.cleanNodes().beginUpdate(e),this.engine.moveNode(e,t),this._updateContainerHeight(),i||(this._triggerChangeEvent(),this.engine.endUpdate())}resizeToContent(e){var p,y;if(!e||(e.classList.remove("size-to-content-max"),!e.clientHeight))return;let t=e.gridstackNode;if(!t)return;let i=t.grid;if(!i||e.parentElement!==i.el)return;let r=i.getCellHeight(!0);if(!r)return;let o=t.h?t.h*r:e.clientHeight,s;if(t.resizeToContentParent&&(s=e.querySelector(t.resizeToContentParent)),s||(s=e.querySelector(n.resizeToContentParent)),!s)return;let a=e.clientHeight-s.clientHeight,l=t.h?t.h*r-a:s.clientHeight,c;if(t.subGrid){c=t.subGrid.getRow()*t.subGrid.getCellHeight(!0);let m=t.subGrid.el.getBoundingClientRect(),v=e.getBoundingClientRect();c+=m.top-v.top}else{if((y=(p=t.subGridOpts)==null?void 0:p.children)!=null&&y.length)return;{let m=s.firstElementChild;if(!m){console.error(`Error: GridStack.resizeToContent() widget id:${t.id} '${n.resizeToContentParent}'.firstElementChild is null, make sure to have a div like container. Skipping sizing.`);return}c=m.getBoundingClientRect().height||l}}if(l===c)return;o+=c-l;let u=Math.ceil(o/r),d=Number.isInteger(t.sizeToContent)?t.sizeToContent:0;d&&u>d&&(u=d,e.classList.add("size-to-content-max")),t.minH&&u t.maxH&&(u=t.maxH),u!==t.h&&(i._ignoreLayoutsNodeChange=!0,i.moveNode(t,{h:u}),delete i._ignoreLayoutsNodeChange)}resizeToContentCBCheck(e){n.resizeToContentCB?n.resizeToContentCB(e):this.resizeToContent(e)}rotate(e,t){return n.getElements(e).forEach(i=>{let r=i.gridstackNode;if(!E.canBeRotated(r))return;let o={w:r.h,h:r.w,minH:r.minW,minW:r.minH,maxH:r.maxW,maxW:r.maxH};if(t){let a=t.left>0?Math.floor(t.left/this.cellWidth()):0,l=t.top>0?Math.floor(t.top/this.opts.cellHeight):0;o.x=r.x+a-(r.h-(l+1)),o.y=r.y+l-a}Object.keys(o).forEach(a=>{o[a]===void 0&&delete o[a]});let s=r._orig;this.update(i,o),r._orig=s}),this}margin(e){if(!(typeof e=="string"&&e.split(" ").length>1)){let i=E.parseHeight(e);if(this.opts.marginUnit===i.unit&&this.opts.margin===i.h)return}return this.opts.margin=e,this.opts.marginTop=this.opts.marginBottom=this.opts.marginLeft=this.opts.marginRight=void 0,this._initMargin(),this}getMargin(){return this.opts.margin}willItFit(e){if(arguments.length>1){console.warn("gridstack.ts: `willItFit(x,y,w,h,autoPosition)` is deprecated. Use `willItFit({x, y,...})`. It will be removed soon");let t=arguments,i=0,r={x:t[i++],y:t[i++],w:t[i++],h:t[i++],autoPosition:t[i++]};return this.willItFit(r)}return this.engine.willItFit(e)}_triggerChangeEvent(){if(this.engine.batchMode)return this;let e=this.engine.getDirtyNodes(!0);return e&&e.length&&(this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(e),this._triggerEvent("change",e)),this.engine.saveInitial(),this}_triggerAddEvent(){var e;if(this.engine.batchMode)return this;if((e=this.engine.addedNodes)!=null&&e.length){this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(this.engine.addedNodes),this.engine.addedNodes.forEach(i=>{delete i._dirty});let t=[...this.engine.addedNodes];this.engine.addedNodes=[],this._triggerEvent("added",t)}return this}_triggerRemoveEvent(){var e;if(this.engine.batchMode)return this;if((e=this.engine.removedNodes)!=null&&e.length){let t=[...this.engine.removedNodes];this.engine.removedNodes=[],this._triggerEvent("removed",t)}return this}_triggerEvent(e,t){let i=t?new CustomEvent(e,{bubbles:!1,detail:t}):new Event(e),r=this;for(;r.parentGridNode;)r=r.parentGridNode.grid;return r.el.dispatchEvent(i),this}_updateContainerHeight(){if(!this.engine||this.engine.batchMode)return this;let e=this.parentGridNode,t=this.getRow()+this._extraDragRow,i=this.opts.cellHeight,r=this.opts.cellHeightUnit;if(!i)return this;if(!e&&!this.opts.minRow){let o=E.parseHeight(getComputedStyle(this.el).minHeight);if(o.h>0&&o.unit===r){let s=Math.floor(o.h/i);t 1?`calc(${t.w} * var(--gs-column-width))`:null,e.style.height=t.h>1?`calc(${t.h} * var(--gs-cell-height))`:null),t.x>0?e.setAttribute("gs-x",String(t.x)):e.removeAttribute("gs-x"),t.y>0?e.setAttribute("gs-y",String(t.y)):e.removeAttribute("gs-y"),t.w>1?e.setAttribute("gs-w",String(t.w)):e.removeAttribute("gs-w"),t.h>1?e.setAttribute("gs-h",String(t.h)):e.removeAttribute("gs-h"),this}_writeAttr(e,t){if(!t)return this;this._writePosAttr(e,t);let i={noResize:"gs-no-resize",noMove:"gs-no-move",locked:"gs-locked",id:"gs-id",sizeToContent:"gs-size-to-content"};for(let r in i)t[r]?e.setAttribute(i[r],String(t[r])):e.removeAttribute(i[r]);return this}_readAttr(e,t=!0){let i={};i.x=E.toNumber(e.getAttribute("gs-x")),i.y=E.toNumber(e.getAttribute("gs-y")),i.w=E.toNumber(e.getAttribute("gs-w")),i.h=E.toNumber(e.getAttribute("gs-h")),i.autoPosition=E.toBool(e.getAttribute("gs-auto-position")),i.noResize=E.toBool(e.getAttribute("gs-no-resize")),i.noMove=E.toBool(e.getAttribute("gs-no-move")),i.locked=E.toBool(e.getAttribute("gs-locked"));let r=e.getAttribute("gs-size-to-content");r&&(r==="true"||r==="false"?i.sizeToContent=E.toBool(r):i.sizeToContent=parseInt(r,10)),i.id=e.getAttribute("gs-id"),i.maxW=E.toNumber(e.getAttribute("gs-max-w")),i.minW=E.toNumber(e.getAttribute("gs-min-w")),i.maxH=E.toNumber(e.getAttribute("gs-max-h")),i.minH=E.toNumber(e.getAttribute("gs-min-h")),t&&(i.w===1&&e.removeAttribute("gs-w"),i.h===1&&e.removeAttribute("gs-h"),i.maxW&&e.removeAttribute("gs-max-w"),i.minW&&e.removeAttribute("gs-min-w"),i.maxH&&e.removeAttribute("gs-max-h"),i.minH&&e.removeAttribute("gs-min-h"));for(let o in i){if(!i.hasOwnProperty(o))return;!i[o]&&i[o]!==0&&o!=="sizeToContent"&&delete i[o]}return i}_setStaticClass(){let e=["grid-stack-static"];return this.opts.staticGrid?(this.el.classList.add(...e),this.el.setAttribute("gs-static","true")):(this.el.classList.remove(...e),this.el.removeAttribute("gs-static")),this}onResize(e=(t=>(t=this.el)==null?void 0:t.clientWidth)()){if(!e||this.prevWidth===e)return;this.prevWidth=e,this.batchUpdate();let i=!1;return this._autoColumn&&this.parentGridNode?this.opts.column!==this.parentGridNode.w&&(this.column(this.parentGridNode.w,this.opts.layout||"list"),i=!0):i=this.checkDynamicColumn(),this._isAutoCellHeight&&this.cellHeight(),this.engine.nodes.forEach(r=>{r.subGrid&&r.subGrid.onResize()}),this._skipInitialResize||this.resizeToContentCheck(i),delete this._skipInitialResize,this.batchUpdate(!1),this}resizeToContentCheck(e=!1,t=void 0){if(this.engine){if(e&&this.hasAnimationCSS())return setTimeout(()=>this.resizeToContentCheck(!1,t),this.animationDelay);if(t)E.shouldSizeToContent(t)&&this.resizeToContentCBCheck(t.el);else if(this.engine.nodes.some(i=>E.shouldSizeToContent(i))){let i=[...this.engine.nodes];this.batchUpdate(),i.forEach(r=>{E.shouldSizeToContent(r)&&this.resizeToContentCBCheck(r.el)}),this._ignoreLayoutsNodeChange=!0,this.batchUpdate(!1),this._ignoreLayoutsNodeChange=!1}this._gsEventHandler.resizecontent&&this._gsEventHandler.resizecontent(null,t?[t]:this.engine.nodes)}}_updateResizeEvent(e=!1){let t=!this.parentGridNode&&(this._isAutoCellHeight||this.opts.sizeToContent||this.opts.columnOpts||this.engine.nodes.find(i=>i.sizeToContent));return!e&&t&&!this.resizeObserver?(this._sizeThrottle=E.throttle(()=>this.onResize(),this.opts.cellHeightThrottle),this.resizeObserver=new ResizeObserver(()=>this._sizeThrottle()),this.resizeObserver.observe(this.el),this._skipInitialResize=!0):(e||!t)&&this.resizeObserver&&(this.resizeObserver.disconnect(),delete this.resizeObserver,delete this._sizeThrottle),this}static getElement(e=".grid-stack-item"){return E.getElement(e)}static getElements(e=".grid-stack-item"){return E.getElements(e)}static getGridElement(e){return n.getElement(e)}static getGridElements(e){return E.getElements(e)}_initMargin(){let e,t=0,i=[];typeof this.opts.margin=="string"&&(i=this.opts.margin.split(" ")),i.length===2?(this.opts.marginTop=this.opts.marginBottom=i[0],this.opts.marginLeft=this.opts.marginRight=i[1]):i.length===4?(this.opts.marginTop=i[0],this.opts.marginRight=i[1],this.opts.marginBottom=i[2],this.opts.marginLeft=i[3]):(e=E.parseHeight(this.opts.margin),this.opts.marginUnit=e.unit,t=this.opts.margin=e.h),["marginTop","marginRight","marginBottom","marginLeft"].forEach(s=>{this.opts[s]===void 0?this.opts[s]=t:(e=E.parseHeight(this.opts[s]),this.opts[s]=e.h,delete this.opts.margin)}),this.opts.marginUnit=e.unit,this.opts.marginTop===this.opts.marginBottom&&this.opts.marginLeft===this.opts.marginRight&&this.opts.marginTop===this.opts.marginRight&&(this.opts.margin=this.opts.marginTop);let o=this.el.style;return o.setProperty("--gs-item-margin-top",`${this.opts.marginTop}${this.opts.marginUnit}`),o.setProperty("--gs-item-margin-bottom",`${this.opts.marginBottom}${this.opts.marginUnit}`),o.setProperty("--gs-item-margin-right",`${this.opts.marginRight}${this.opts.marginUnit}`),o.setProperty("--gs-item-margin-left",`${this.opts.marginLeft}${this.opts.marginUnit}`),this}static getDD(){return Ie}static setupDragIn(e,t,i,r=document){(t==null?void 0:t.pause)!==void 0&&(F.pauseDrag=t.pause),t=O({appendTo:"body",helper:"clone"},t||{}),(typeof e=="string"?E.getElements(e,r):e).forEach((s,a)=>{Ie.isDraggable(s)||Ie.dragIn(s,t),i!=null&&i[a]&&(s.gridstackNode=i[a])})}movable(e,t){return this.opts.staticGrid?this:(n.getElements(e).forEach(i=>{let r=i.gridstackNode;r&&(t?delete r.noMove:r.noMove=!0,this.prepareDragDrop(r.el))}),this)}resizable(e,t){return this.opts.staticGrid?this:(n.getElements(e).forEach(i=>{let r=i.gridstackNode;r&&(t?delete r.noResize:r.noResize=!0,this.prepareDragDrop(r.el))}),this)}disable(e=!0){if(!this.opts.staticGrid)return this.enableMove(!1,e),this.enableResize(!1,e),this._triggerEvent("disable"),this}enable(e=!0){if(!this.opts.staticGrid)return this.enableMove(!0,e),this.enableResize(!0,e),this._triggerEvent("enable"),this}enableMove(e,t=!0){return this.opts.staticGrid?this:(e?delete this.opts.disableDrag:this.opts.disableDrag=!0,this.engine.nodes.forEach(i=>{this.prepareDragDrop(i.el),i.subGrid&&t&&i.subGrid.enableMove(e,t)}),this)}enableResize(e,t=!0){return this.opts.staticGrid?this:(e?delete this.opts.disableResize:this.opts.disableResize=!0,this.engine.nodes.forEach(i=>{this.prepareDragDrop(i.el),i.subGrid&&t&&i.subGrid.enableResize(e,t)}),this)}cancelDrag(){var t;let e=(t=this._placeholder)==null?void 0:t.gridstackNode;e&&(e._isExternal?(e._isAboutToRemove=!0,this.engine.removeNode(e)):e._isAboutToRemove&&n._itemRemoving(e.el,!1),this.engine.restoreInitial())}_removeDD(e){return Ie.draggable(e,"destroy").resizable(e,"destroy"),e.gridstackNode&&delete e.gridstackNode._initDD,delete e.ddElement,this}_setupAcceptWidget(){if(this.opts.staticGrid||!this.opts.acceptWidgets&&!this.opts.removable)return Ie.droppable(this.el,"destroy"),this;let e,t,i=(r,o,s)=>{var p;s=s||o;let a=s.gridstackNode;if(!a)return;if(!((p=a.grid)!=null&&p.el)){s.style.transform=`scale(${1/this.dragTransform.xScale},${1/this.dragTransform.yScale})`;let y=s.getBoundingClientRect();s.style.left=y.x+(this.dragTransform.xScale-1)*(r.clientX-y.x)/this.dragTransform.xScale+"px",s.style.top=y.y+(this.dragTransform.yScale-1)*(r.clientY-y.y)/this.dragTransform.yScale+"px",s.style.transformOrigin="0px 0px"}let{top:l,left:c}=s.getBoundingClientRect(),u=this.el.getBoundingClientRect();c-=u.left,l-=u.top;let d={position:{top:l*this.dragTransform.xScale,left:c*this.dragTransform.yScale}};if(a._temporaryRemoved){if(a.x=Math.max(0,Math.round(c/t)),a.y=Math.max(0,Math.round(l/e)),delete a.autoPosition,this.engine.nodeBoundFix(a),!this.engine.willItFit(a)){if(a.autoPosition=!0,!this.engine.willItFit(a)){Ie.off(o,"drag");return}a._willFitPos&&(E.copyPos(a,a._willFitPos),delete a._willFitPos)}this._onStartMoving(s,r,d,a,t,e)}else this._dragOrResize(s,r,d,a,t,e)};return Ie.droppable(this.el,{accept:r=>{let o=r.gridstackNode||this._readAttr(r,!1);if((o==null?void 0:o.grid)===this)return!0;if(!this.opts.acceptWidgets)return!1;let s=!0;if(typeof this.opts.acceptWidgets=="function")s=this.opts.acceptWidgets(r);else{let a=this.opts.acceptWidgets===!0?".grid-stack-item":this.opts.acceptWidgets;s=r.matches(a)}if(s&&o&&this.opts.maxRow){let a={w:o.w,h:o.h,minW:o.minW,minH:o.minH};s=this.engine.willItFit(a)}return s}}).on(this.el,"dropover",(r,o,s)=>{let a=(s==null?void 0:s.gridstackNode)||o.gridstackNode;if((a==null?void 0:a.grid)===this&&!a._temporaryRemoved)return!1;if(a!=null&&a._sidebarOrig&&(a.w=a._sidebarOrig.w,a.h=a._sidebarOrig.h),a!=null&&a.grid&&a.grid!==this&&!a._temporaryRemoved&&a.grid._leave(o,s),s=s||o,t=this.cellWidth(),e=this.getCellHeight(!0),!a){let u=s.getAttribute("data-gs-widget")||s.getAttribute("gridstacknode");if(u){try{a=JSON.parse(u)}catch(d){console.error("Gridstack dropover: Bad JSON format: ",u)}s.removeAttribute("data-gs-widget"),s.removeAttribute("gridstacknode")}a||(a=this._readAttr(s)),a._sidebarOrig={w:a.w,h:a.h}}a.grid||(a.el||(a=O({},a)),a._isExternal=!0,s.gridstackNode=a);let l=a.w||Math.round(s.offsetWidth/t)||1,c=a.h||Math.round(s.offsetHeight/e)||1;return a.grid&&a.grid!==this?(o._gridstackNodeOrig||(o._gridstackNodeOrig=a),o.gridstackNode=a=ae(O({},a),{w:l,h:c,grid:this}),delete a.x,delete a.y,this.engine.cleanupNode(a).nodeBoundFix(a),a._initDD=a._isExternal=a._temporaryRemoved=!0):(a.w=l,a.h=c,a._temporaryRemoved=!0),n._itemRemoving(a.el,!1),Ie.on(o,"drag",i),i(r,o,s),!1}).on(this.el,"dropout",(r,o,s)=>{let a=(s==null?void 0:s.gridstackNode)||o.gridstackNode;return a&&(!a.grid||a.grid===this)&&(this._leave(o,s),this._isTemp&&this.removeAsSubGrid(a)),!1}).on(this.el,"drop",(r,o,s)=>{var p,y,m;let a=(s==null?void 0:s.gridstackNode)||o.gridstackNode;if((a==null?void 0:a.grid)===this&&!a._isExternal)return!1;let l=!!this.placeholder.parentElement,c=o!==s;this.placeholder.remove(),delete this.placeholder.gridstackNode,l&&this.opts.animate&&(this.setAnimation(!1),this.setAnimation(!0,!0));let u=o._gridstackNodeOrig;if(delete o._gridstackNodeOrig,l&&(u!=null&&u.grid)&&u.grid!==this){let v=u.grid;v.engine.removeNodeFromLayoutCache(u),v.engine.removedNodes.push(u),v._triggerRemoveEvent()._triggerChangeEvent(),v.parentGridNode&&!v.engine.nodes.length&&v.opts.subGridDynamic&&v.removeAsSubGrid()}if(!a||(l&&(this.engine.cleanupNode(a),a.grid=this),(p=a.grid)==null||delete p._isTemp,Ie.off(o,"drag"),s!==o?(s.remove(),o=s):o.remove(),this._removeDD(o),!l))return!1;let d=(m=(y=a.subGrid)==null?void 0:y.el)==null?void 0:m.gridstack;return E.copyPos(a,this._readAttr(this.placeholder)),E.removePositioningStyles(o),c&&(a.content||a.subGridOpts||n.addRemoveCB)?(delete a.el,o=this.addWidget(a)):(this._prepareElement(o,!0,a),this.el.appendChild(o),this.resizeToContentCheck(!1,a),d&&(d.parentGridNode=a),this._updateContainerHeight()),this.engine.addedNodes.push(a),this._triggerAddEvent(),this._triggerChangeEvent(),this.engine.endUpdate(),this._gsEventHandler.dropped&&this._gsEventHandler.dropped(ae(O({},r),{type:"dropped"}),u&&u.grid?u:void 0,a),!1}),this}static _itemRemoving(e,t){if(!e)return;let i=e?e.gridstackNode:void 0;!(i!=null&&i.grid)||e.classList.contains(i.grid.opts.removableOptions.decline)||(t?i._isAboutToRemove=!0:delete i._isAboutToRemove,t?e.classList.add("grid-stack-item-removing"):e.classList.remove("grid-stack-item-removing"))}_setupRemoveDrop(){if(typeof this.opts.removable!="string")return this;let e=document.querySelector(this.opts.removable);return e?(!this.opts.staticGrid&&!Ie.isDroppable(e)&&Ie.droppable(e,this.opts.removableOptions).on(e,"dropover",(t,i)=>n._itemRemoving(i,!0)).on(e,"dropout",(t,i)=>n._itemRemoving(i,!1)),this):this}prepareDragDrop(e,t=!1){let i=e==null?void 0:e.gridstackNode;if(!i)return;let r=i.noMove||this.opts.disableDrag,o=i.noResize||this.opts.disableResize,s=this.opts.staticGrid||r&&o;if((t||s)&&(i._initDD&&(this._removeDD(e),delete i._initDD),s&&e.classList.add("ui-draggable-disabled","ui-resizable-disabled"),!t))return this;if(!i._initDD){let a,l,c=(p,y)=>{this.triggerEvent(p,p.target),a=this.cellWidth(),l=this.getCellHeight(!0),this._onStartMoving(e,p,y,i,a,l)},u=(p,y)=>{this._dragOrResize(e,p,y,i,a,l)},d=p=>{this.placeholder.remove(),delete this.placeholder.gridstackNode,delete i._moving,delete i._resizing,delete i._event,delete i._lastTried;let y=i.w!==i._orig.w,m=p.target;if(!(!m.gridstackNode||m.gridstackNode.grid!==this)){if(i.el=m,i._isAboutToRemove){let v=e.gridstackNode.grid;v._gsEventHandler[p.type]&&v._gsEventHandler[p.type](p,m),v.engine.nodes.push(i),v.removeWidget(e,!0,!0)}else E.removePositioningStyles(m),i._temporaryRemoved?(this._writePosAttr(m,i),this.engine.addNode(i)):this._writePosAttr(m,i),this.triggerEvent(p,m);this._extraDragRow=0,this._updateContainerHeight(),this._triggerChangeEvent(),this.engine.endUpdate(),p.type==="resizestop"&&(Number.isInteger(i.sizeToContent)&&(i.sizeToContent=i.h),this.resizeToContentCheck(y,i))}};Ie.draggable(e,{start:c,stop:d,drag:u}).resizable(e,{start:c,stop:d,resize:u}),i._initDD=!0}return Ie.draggable(e,r?"disable":"enable").resizable(e,o?"disable":"enable"),this}_onStartMoving(e,t,i,r,o,s){var a;if(this.engine.cleanNodes().beginUpdate(r),this._writePosAttr(this.placeholder,r),this.el.appendChild(this.placeholder),this.placeholder.gridstackNode=r,(a=r.grid)!=null&&a.el)this.dragTransform=E.getValuesFromTransformedElement(e);else if(this.placeholder&&this.placeholder.closest(".grid-stack")){let l=this.placeholder.closest(".grid-stack");this.dragTransform=E.getValuesFromTransformedElement(l)}else this.dragTransform={xScale:1,xOffset:0,yScale:1,yOffset:0};if(r.el=this.placeholder,r._lastUiPosition=i.position,r._prevYPix=i.position.top,r._moving=t.type==="dragstart",r._resizing=t.type==="resizestart",delete r._lastTried,t.type==="dropover"&&r._temporaryRemoved&&(this.engine.addNode(r),r._moving=!0),this.engine.cacheRects(o,s,this.opts.marginTop,this.opts.marginRight,this.opts.marginBottom,this.opts.marginLeft),t.type==="resizestart"){let l=this.getColumn()-r.x,c=(this.opts.maxRow||Number.MAX_SAFE_INTEGER)-r.y;Ie.resizable(e,"option","minWidth",o*Math.min(r.minW||1,l)).resizable(e,"option","minHeight",s*Math.min(r.minH||1,c)).resizable(e,"option","maxWidth",o*Math.min(r.maxW||Number.MAX_SAFE_INTEGER,l)).resizable(e,"option","maxWidthMoveLeft",o*Math.min(r.maxW||Number.MAX_SAFE_INTEGER,r.x+r.w)).resizable(e,"option","maxHeight",s*Math.min(r.maxH||Number.MAX_SAFE_INTEGER,c)).resizable(e,"option","maxHeightMoveUp",s*Math.min(r.maxH||Number.MAX_SAFE_INTEGER,r.y+r.h))}}_dragOrResize(e,t,i,r,o,s){let a=O({},r._orig),l,c=this.opts.marginLeft,u=this.opts.marginRight,d=this.opts.marginTop,p=this.opts.marginBottom,y=Math.round(s*.1),m=Math.round(o*.1);if(c=Math.min(c,m),u=Math.min(u,m),d=Math.min(d,y),p=Math.min(p,y),t.type==="drag"){if(r._temporaryRemoved)return;let w=i.position.top-r._prevYPix;r._prevYPix=i.position.top,this.opts.draggable.scroll!==!1&&E.updateScrollPosition(e,i.position,w);let T=i.position.left+(i.position.left>r._lastUiPosition.left?-u:c),_=i.position.top+(i.position.top>r._lastUiPosition.top?-p:d);a.x=Math.round(T/o),a.y=Math.round(_/s);let S=this._extraDragRow;if(this.engine.collide(r,a)){let A=this.getRow(),K=Math.max(0,a.y+r.h-A);this.opts.maxRow&&A+K>this.opts.maxRow&&(K=Math.max(0,this.opts.maxRow-A)),this._extraDragRow=K}else this._extraDragRow=0;if(this._extraDragRow!==S&&this._updateContainerHeight(),r.x===a.x&&r.y===a.y)return}else if(t.type==="resize"){if(a.x<0||(E.updateScrollResize(t,e,s),a.w=Math.round((i.size.width-c)/o),a.h=Math.round((i.size.height-d)/s),r.w===a.w&&r.h===a.h)||r._lastTried&&r._lastTried.w===a.w&&r._lastTried.h===a.h)return;let w=i.position.left+c,T=i.position.top+d;a.x=Math.round(w/o),a.y=Math.round(T/s),l=!0}r._event=t,r._lastTried=a;let v={x:i.position.left+c,y:i.position.top+d,w:(i.size?i.size.width:r.w*o)-c-u,h:(i.size?i.size.height:r.h*s)-d-p};if(this.engine.moveNodeCheck(r,ae(O({},a),{cellWidth:o,cellHeight:s,rect:v,resizing:l}))){r._lastUiPosition=i.position,this.engine.cacheRects(o,s,d,u,p,c),delete r._skipDown,l&&r.subGrid&&r.subGrid.onResize(),this._extraDragRow=0,this._updateContainerHeight();let w=t.target;r._sidebarOrig||this._writePosAttr(w,r),this.triggerEvent(t,w)}}triggerEvent(e,t){let i=this;for(;i.parentGridNode;)i=i.parentGridNode.grid;i._gsEventHandler[e.type]&&i._gsEventHandler[e.type](e,t)}_leave(e,t){t=t||e;let i=t.gridstackNode;if(!i||(t.style.transform=t.style.transformOrigin=null,Ie.off(e,"drag"),i._temporaryRemoved))return;i._temporaryRemoved=!0,this.engine.removeNode(i),i.el=i._isExternal&&t?t:e;let r=i._sidebarOrig;i._isExternal&&this.engine.cleanupNode(i),i._sidebarOrig=r,this.opts.removable===!0&&n._itemRemoving(e,!0),e._gridstackNodeOrig?(e.gridstackNode=e._gridstackNodeOrig,delete e._gridstackNodeOrig):i._isExternal&&this.engine.restoreInitial()}commit(){return Oc(this,this.batchUpdate(!1),"commit","batchUpdate","5.2"),this}};Et.renderCB=(n,e)=>{n&&(e!=null&&e.content)&&(n.textContent=e.content)};Et.resizeToContentParent=".grid-stack-item-content";Et.Utils=E;Et.Engine=In;Et.GDRev="12.3.2";function Qg(){let n=document.getElementById("dashboard");n&&n.gridstack.disable()}function Jg(){let n=document.getElementById("dashboard");n&&n.gridstack.enable()}function Zg(n,e){return at(this,null,function*(){return yield On(n,{layout:e})})}function Mc(){if(document.getElementById("dashboard")==null)return;let e=Et.init({cellHeight:100,disableDrag:!0,disableResize:!0,draggable:{handle:".grid-stack-item-content .card-header",appendTo:"body",scroll:!0}}),t=document.getElementById("lock_dashboard");t&&t.addEventListener("click",()=>{Qg()});let i=document.getElementById("unlock_dashboard");i&&i.addEventListener("click",()=>{Jg()});let r=document.getElementById("save_dashboard");r!==null&&r.addEventListener("click",()=>{let o=r.getAttribute("data-url");if(o==null)return;let s=e.save(!1);Zg(o,s).then(a=>{tn(a)?It("danger","Error Saving Dashboard Config",a.error).show():location.reload()})})}function kc(n,e){switch(n){case"images-and-labels":{us("image.device-image",e),us("text.device-image-label",e);break}case"images-only":{us("image.device-image",e),ds("text.device-image-label",e);break}case"labels-only":{ds("image.device-image",e),ds("text.device-image-label",e);break}}}function us(n,e){var i;let t=(i=e.querySelectorAll(n))!=null?i:[];for(let r of t)r.classList.remove("hidden")}function ds(n,e){var i;let t=(i=e.querySelectorAll(n))!=null?i:[];for(let r of t)r.classList.add("hidden")}function ev(n,e){e.set("view",n);for(let t of I(".rack_elevation"))kc(n,t)}function Nc(){let n=Zo.get("view");for(let e of I("select.rack-view"))e.selectedIndex=[...e.options].findIndex(t=>t.value==n),e.addEventListener("change",t=>{ev(t.currentTarget.value,Zo)},!1);for(let e of I(".rack_elevation"))e.addEventListener("load",()=>{kc(n,e)})}function tv(n){let e=document.getElementById("selector_results");if(e==null)return;let t=e.getAttribute("data-selector-target");if(t==null)return;let i=document.getElementById(t);if(i==null)return;let r=n.getAttribute("data-label"),o=n.getAttribute("data-value");i.tomselect.addOption({id:o,display:r}),i.tomselect.addItem(o)}function Ic(){for(let n of I("#selector_results a"))n.addEventListener("click",()=>tv(n))}function nv(){let n=document.getElementById("quick-add-object");if(n==null)return;let e=n.getAttribute("data-object-id");if(e==null)return;let t=n.getAttribute("data-object-repr");if(t==null)return;let i=n.getAttribute("data-target-id");if(i==null)return;let r=document.getElementById(i);if(r==null)return;r.tomselect.addOption({id:e,display:t}),r.tomselect.addItem(e);let o=document.getElementById("htmx-modal");if(o){let s=tt.getInstance(o);s&&s.hide()}}function Rc(){let n=document.getElementById("htmx-modal-content");n&&n.addEventListener("htmx:afterSwap",()=>nv())}function iv(){Tr(),Ar(),vr(),xr(),Ic(),Rc(),yr(),Cr()}function Hc(){document.addEventListener("htmx:afterSettle",iv)}function rv(n){let e=n.currentTarget,t=e.baseURI.split("?")[0],i="?",r=Array.from(e.options).filter(o=>o.selected).map(o=>`filter_id=${o.value}`).join("&");t+=`${i}${r}`,document.location.href=t}function Pc(){let n=document.getElementById("results");if(pe(n)){let e=document.getElementById("id_filter_id");pe(e)&&e.addEventListener("change",rv)}}function Fc(){for(let n of[yr,mc,Cr,vr,Dl,xr,xc,Tr,Ar,Cc,Sc,Dc,Mc,Nc,Hc,Pc])n()}function ov(){let n=document.forms;for(let t of n)t.method.toUpperCase()=="GET"&&t.addEventListener("formdata",function(i){let r=i.formData;for(let[o,s]of Array.from(r.entries()))s===""&&r.delete(o)});let e=document.querySelector(".content-container");e!==null&&e.focus()}window.addEventListener("load",ov);document.readyState!=="loading"?Fc():document.addEventListener("DOMContentLoaded",Fc);})(); /*! Bundled license information: clipboard/dist/clipboard.js: @@ -18,17 +18,17 @@ clipboard/dist/clipboard.js: bootstrap/dist/js/bootstrap.esm.js: (*! - * Bootstrap v5.3.7 (https://getbootstrap.com/) + * Bootstrap v5.3.8 (https://getbootstrap.com/) * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) *) gridstack/dist/gridstack.js: (*! - * GridStack 12.2.2 + * GridStack 12.3.2 * https://gridstackjs.com/ * - * Copyright (c) 2021-2024 Alain Dumesny + * Copyright (c) 2021-2025 Alain Dumesny * see root license https://github.com/gridstack/gridstack.js/tree/master/LICENSE *) */ diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index 94d189c5b4..2d0c72c2dd 100644 --- a/netbox/project-static/dist/netbox.js.map +++ b/netbox/project-static/dist/netbox.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../node_modules/clipboard/dist/clipboard.js", "../node_modules/@popperjs/core/lib/index.js", "../node_modules/@popperjs/core/lib/enums.js", "../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js", "../node_modules/@popperjs/core/lib/dom-utils/getWindow.js", "../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js", "../node_modules/@popperjs/core/lib/modifiers/applyStyles.js", "../node_modules/@popperjs/core/lib/utils/getBasePlacement.js", "../node_modules/@popperjs/core/lib/utils/math.js", "../node_modules/@popperjs/core/lib/utils/userAgent.js", "../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js", "../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js", "../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js", "../node_modules/@popperjs/core/lib/dom-utils/contains.js", "../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js", "../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js", "../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js", "../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js", "../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js", "../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js", "../node_modules/@popperjs/core/lib/utils/within.js", "../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js", "../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js", "../node_modules/@popperjs/core/lib/utils/expandToHashMap.js", "../node_modules/@popperjs/core/lib/modifiers/arrow.js", "../node_modules/@popperjs/core/lib/utils/getVariation.js", "../node_modules/@popperjs/core/lib/modifiers/computeStyles.js", "../node_modules/@popperjs/core/lib/modifiers/eventListeners.js", "../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js", "../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js", "../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js", "../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js", "../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js", "../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js", "../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js", "../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js", "../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js", "../node_modules/@popperjs/core/lib/utils/rectToClientRect.js", "../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js", "../node_modules/@popperjs/core/lib/utils/computeOffsets.js", "../node_modules/@popperjs/core/lib/utils/detectOverflow.js", "../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js", "../node_modules/@popperjs/core/lib/modifiers/flip.js", "../node_modules/@popperjs/core/lib/modifiers/hide.js", "../node_modules/@popperjs/core/lib/modifiers/offset.js", "../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js", "../node_modules/@popperjs/core/lib/utils/getAltAxis.js", "../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js", "../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js", "../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js", "../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js", "../node_modules/@popperjs/core/lib/utils/orderModifiers.js", "../node_modules/@popperjs/core/lib/utils/debounce.js", "../node_modules/@popperjs/core/lib/utils/mergeByName.js", "../node_modules/@popperjs/core/lib/createPopper.js", "../node_modules/@popperjs/core/lib/popper-lite.js", "../node_modules/@popperjs/core/lib/popper.js", "../node_modules/bootstrap/js/src/dom/data.js", "../node_modules/bootstrap/js/src/util/index.js", "../node_modules/bootstrap/js/src/dom/event-handler.js", "../node_modules/bootstrap/js/src/dom/manipulator.js", "../node_modules/bootstrap/js/src/util/config.js", "../node_modules/bootstrap/js/src/base-component.js", "../node_modules/bootstrap/js/src/dom/selector-engine.js", "../node_modules/bootstrap/js/src/util/component-functions.js", "../node_modules/bootstrap/js/src/alert.js", "../node_modules/bootstrap/js/src/button.js", "../node_modules/bootstrap/js/src/util/swipe.js", "../node_modules/bootstrap/js/src/carousel.js", "../node_modules/bootstrap/js/src/collapse.js", "../node_modules/bootstrap/js/src/dropdown.js", "../node_modules/bootstrap/js/src/util/backdrop.js", "../node_modules/bootstrap/js/src/util/focustrap.js", "../node_modules/bootstrap/js/src/util/scrollbar.js", "../node_modules/bootstrap/js/src/modal.js", "../node_modules/bootstrap/js/src/offcanvas.js", "../node_modules/bootstrap/js/src/util/sanitizer.js", "../node_modules/bootstrap/js/src/util/template-factory.js", "../node_modules/bootstrap/js/src/tooltip.js", "../node_modules/bootstrap/js/src/popover.js", "../node_modules/bootstrap/js/src/scrollspy.js", "../node_modules/bootstrap/js/src/tab.js", "../node_modules/bootstrap/js/src/toast.js", "../node_modules/htmx.org/dist/htmx.esm.js", "../node_modules/tom-select/src/contrib/microevent.ts", "../node_modules/tom-select/src/contrib/microplugin.ts", "../node_modules/@orchidjs/unicode-variants/lib/regex.ts", "../node_modules/@orchidjs/unicode-variants/lib/strings.ts", "../node_modules/@orchidjs/unicode-variants/lib/index.ts", "../node_modules/@orchidjs/sifter/lib/utils.ts", "../node_modules/@orchidjs/sifter/lib/sifter.ts", "../node_modules/tom-select/src/utils.ts", "../node_modules/tom-select/src/vanilla.ts", "../node_modules/tom-select/src/contrib/highlight.ts", "../node_modules/tom-select/src/constants.ts", "../node_modules/tom-select/src/defaults.ts", "../node_modules/tom-select/src/getSettings.ts", "../node_modules/tom-select/src/tom-select.ts", "../node_modules/tom-select/src/utils.ts", "../node_modules/tom-select/src/plugins/change_listener/plugin.ts", "../node_modules/tom-select/src/utils.ts", "../node_modules/tom-select/src/vanilla.ts", "../node_modules/tom-select/src/plugins/checkbox_options/plugin.ts", "../node_modules/tom-select/src/vanilla.ts", "../node_modules/tom-select/src/plugins/clear_button/plugin.ts", "../node_modules/tom-select/src/utils.ts", "../node_modules/tom-select/src/vanilla.ts", "../node_modules/tom-select/src/plugins/drag_drop/plugin.ts", "../node_modules/tom-select/src/utils.ts", "../node_modules/tom-select/src/vanilla.ts", "../node_modules/tom-select/src/plugins/dropdown_header/plugin.ts", "../node_modules/tom-select/src/utils.ts", "../node_modules/tom-select/src/vanilla.ts", "../node_modules/tom-select/src/plugins/caret_position/plugin.ts", "../node_modules/tom-select/src/constants.ts", "../node_modules/tom-select/src/utils.ts", "../node_modules/tom-select/src/vanilla.ts", "../node_modules/tom-select/src/plugins/dropdown_input/plugin.ts", "../node_modules/tom-select/src/utils.ts", "../node_modules/tom-select/src/plugins/input_autogrow/plugin.ts", "../node_modules/tom-select/src/plugins/no_backspace_delete/plugin.ts", "../node_modules/tom-select/src/plugins/no_active_items/plugin.ts", "../node_modules/tom-select/src/constants.ts", "../node_modules/tom-select/src/vanilla.ts", "../node_modules/tom-select/src/plugins/optgroup_columns/plugin.ts", "../node_modules/tom-select/src/utils.ts", "../node_modules/tom-select/src/vanilla.ts", "../node_modules/tom-select/src/plugins/remove_button/plugin.ts", "../node_modules/tom-select/src/plugins/restore_on_backspace/plugin.ts", "../node_modules/tom-select/src/utils.ts", "../node_modules/tom-select/src/vanilla.ts", "../node_modules/tom-select/src/plugins/virtual_scroll/plugin.ts", "../node_modules/tom-select/src/tom-select.complete.ts", "../src/util.ts", "../src/forms/elements.ts", "../src/forms/speedSelector.ts", "../src/forms/index.ts", "../src/bs.ts", "../src/search.ts", "../src/select/config.ts", "../src/select/static.ts", "../node_modules/tom-select/src/utils.ts", "../node_modules/tom-select/src/vanilla.ts", "../node_modules/query-string/base.js", "../node_modules/decode-uri-component/index.js", "../node_modules/filter-obj/index.js", "../node_modules/split-on-first/index.js", "../node_modules/query-string/index.js", "../src/select/types.ts", "../src/select/classes/dynamicParamsMap.ts", "../src/select/classes/dynamicTomSelect.ts", "../src/select/dynamic.ts", "../src/select/index.ts", "../src/buttons/connectionToggle.ts", "../src/state/index.ts", "../src/stores/objectDepth.ts", "../src/stores/rackImages.ts", "../src/stores/previousPkCheck.ts", "../src/stores/secret.ts", "../src/buttons/depthToggle.ts", "../src/buttons/moveOptions.ts", "../src/buttons/reslug.ts", "../src/buttons/selectAll.ts", "../src/buttons/floatBulk.ts", "../src/buttons/selectMultiple.ts", "../src/buttons/markdownPreview.ts", "../src/buttons/secretToggle.ts", "../src/buttons/index.ts", "../src/colorMode.ts", "../src/messages.ts", "../src/clipboard.ts", "../node_modules/flatpickr/dist/esm/types/options.js", "../node_modules/flatpickr/dist/esm/l10n/default.js", "../node_modules/flatpickr/dist/esm/utils/index.js", "../node_modules/flatpickr/dist/esm/utils/dom.js", "../node_modules/flatpickr/dist/esm/utils/formatting.js", "../node_modules/flatpickr/dist/esm/utils/dates.js", "../node_modules/flatpickr/dist/esm/utils/polyfills.js", "../node_modules/flatpickr/dist/esm/index.js", "../src/dateSelector.ts", "../src/tableConfig.ts", "../src/tables/interfaceTable.ts", "../src/sidenav.ts", "../node_modules/gridstack/src/utils.ts", "../node_modules/gridstack/src/gridstack-engine.ts", "../node_modules/gridstack/src/types.ts", "../node_modules/gridstack/src/dd-manager.ts", "../node_modules/gridstack/src/dd-touch.ts", "../node_modules/gridstack/src/dd-resizable-handle.ts", "../node_modules/gridstack/src/dd-base-impl.ts", "../node_modules/gridstack/src/dd-resizable.ts", "../node_modules/gridstack/src/dd-draggable.ts", "../node_modules/gridstack/src/dd-droppable.ts", "../node_modules/gridstack/src/dd-element.ts", "../node_modules/gridstack/src/dd-gridstack.ts", "../node_modules/gridstack/src/gridstack.ts", "../src/dashboard.ts", "../src/racks.ts", "../src/objectSelector.ts", "../src/quickAdd.ts", "../src/htmx.ts", "../src/forms/savedFiltersSelect.ts", "../src/netbox.ts"], - "sourcesContent": ["/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "export * from \"./enums.js\";\nexport * from \"./modifiers/index.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport { popperGenerator, detectOverflow, createPopper as createPopperBase } from \"./createPopper.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper } from \"./popper.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\";", "export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];", "export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}", "export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}", "import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };", "import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};", "import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}", "export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;", "export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}", "import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}", "import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}", "import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}", "import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}", "import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}", "import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}", "import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}", "import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}", "import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}", "export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}", "import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}", "export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}", "import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}", "export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}", "import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};", "export default function getVariation(placement) {\n return placement.split('-')[1];\n}", "import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};", "import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};", "var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}", "var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}", "import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}", "import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}", "import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}", "import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}", "import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}", "import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}", "import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}", "export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}", "import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}", "import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}", "import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}", "import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}", "import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases \u2013 research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};", "import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};", "import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};", "import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};", "export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}", "import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};", "export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}", "import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}", "import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}", "import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}", "export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}", "export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}", "import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update \u2013 it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update \u2013 it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };", "import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };", "import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";", "/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.harrytheo.com/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback.call(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.7'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n // Private\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n }\n\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n // Private\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n\n // Explicitly return focus to the trigger element\n this._element.focus()\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org/docs/v2/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport {\n execute, executeAfterTransition, getElement, reflow\n} from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin, isRTL, isVisible, reflow\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: ''\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [undefined, this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport {\n defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop\n} from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '' +\n '' +\n '' +\n '',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org/docs/v2/)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element, this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK])\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '' +\n '' +\n '' +\n '' +\n '',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin, getElement, isDisabled, isVisible\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With bothand
;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n * - start\n * - length\n *\n * Note: \"selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password\"\n * \t- https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n", "\nimport { iterate } from './utils.ts';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\t\\n\\f\\r\\s]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array |NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\n}\n", "/**\n * highlight v3 | MIT license | Johann Burkard \n * Highlights arbitrary terms in a node.\n *\n * - Modified by Marshal 2011-6-24 (added regex)\n * - Modified by Brian Reavis 2012-8-27 (cleanup)\n */\n\nimport {replaceNode} from '../vanilla.ts';\n\n\nexport const highlight = (element:HTMLElement, regex:string|RegExp) => {\n\n\tif( regex === null ) return;\n\n\t// convet string to regex\n\tif( typeof regex === 'string' ){\n\n\t\tif( !regex.length ) return;\n\t\tregex = new RegExp(regex, 'i');\n\t}\n\n\n\t// Wrap matching part of text node with highlighting , e.g.\n\t// Soccer -> Soccer for regex = /soc/i\n\tconst highlightText = ( node:Text ):number => {\n\n\t\tvar match = node.data.match(regex);\n\t\tif( match && node.data.length > 0 ){\n\t\t\tvar spannode\t\t= document.createElement('span');\n\t\t\tspannode.className\t= 'highlight';\n\t\t\tvar middlebit\t\t= node.splitText(match.index as number);\n\n\t\t\tmiddlebit.splitText(match[0]!.length);\n\t\t\tvar middleclone\t\t= middlebit.cloneNode(true);\n\n\t\t\tspannode.appendChild(middleclone);\n\t\t\treplaceNode(middlebit, spannode);\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn 0;\n\t};\n\n\t// Recurse element node, looking for child text nodes to highlight, unless element\n\t// is childless,