{
	"openapi": "3.0.0",
	"components": {
		"examples": {},
		"headers": {},
		"parameters": {},
		"requestBodies": {},
		"responses": {},
		"schemas": {
			"ProblemFieldError": {
				"properties": {
					"field": {
						"type": "string"
					},
					"code": {
						"type": "string"
					},
					"message": {
						"type": "string"
					}
				},
				"required": [
					"field",
					"code",
					"message"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ProblemDetails": {
				"properties": {
					"type": {
						"type": "string"
					},
					"title": {
						"type": "string"
					},
					"status": {
						"type": "number",
						"format": "double"
					},
					"detail": {
						"type": "string"
					},
					"code": {
						"type": "string"
					},
					"traceId": {
						"type": "string"
					},
					"errors": {
						"items": {
							"$ref": "#/components/schemas/ProblemFieldError"
						},
						"type": "array"
					},
					"currentVersion": {
						"type": "number",
						"format": "double"
					}
				},
				"required": [
					"type",
					"title",
					"status",
					"detail",
					"code",
					"traceId"
				],
				"type": "object",
				"additionalProperties": false
			},
			"Uuid": {
				"type": "string",
				"format": "uuid",
				"description": "Opaque resource identifier. The pattern makes tsoa reject malformed IDs before they reach a\ndatabase query.",
				"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
			},
			"UserAccountEvent": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"slug": {
						"type": "string"
					},
					"name": {
						"type": "string"
					}
				},
				"required": [
					"id",
					"slug",
					"name"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UserGroupSummary": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					}
				},
				"required": [
					"id",
					"name"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UserDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"displayName": {
						"type": "string"
					},
					"username": {
						"type": "string",
						"nullable": true,
						"description": "Sign-in and TAK login name, or `null` when the user has no local login yet."
					},
					"email": {
						"type": "string",
						"nullable": true,
						"description": "Email of the linked local login, or `null` when the user has no local login yet."
					},
					"disabled": {
						"type": "boolean",
						"description": "Disabled users cannot sign in, keep no sessions and lose TAK access."
					},
					"passwordSet": {
						"type": "boolean",
						"description": "`false` until the user has set a password; a setup link can then sign them in once."
					},
					"accountEvent": {
						"allOf": [
							{
								"$ref": "#/components/schemas/UserAccountEvent"
							}
						],
						"nullable": true,
						"description": "Set for event accounts, which are deleted when this event is archived; `null` for permanent\naccounts."
					},
					"userGroups": {
						"items": {
							"$ref": "#/components/schemas/UserGroupSummary"
						},
						"type": "array",
						"description": "User groups the user belongs to, in the order they were added."
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; send it back unchanged with updates."
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"displayName",
					"username",
					"email",
					"disabled",
					"passwordSet",
					"accountEvent",
					"userGroups",
					"version",
					"createdAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PageInfo": {
				"properties": {
					"nextCursor": {
						"type": "string",
						"nullable": true
					},
					"hasMore": {
						"type": "boolean"
					}
				},
				"required": [
					"nextCursor",
					"hasMore"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UserPage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/UserDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UserAccountType": {
				"type": "string",
				"enum": [
					"permanent",
					"event"
				],
				"description": "`permanent` accounts stay; `event` accounts are deleted when their event is archived."
			},
			"SetupLinkDto": {
				"properties": {
					"url": {
						"type": "string",
						"description": "Single-use link for the user, returned exactly once. The token travels in the URL fragment,\nwhich browsers never send to the server; the Web application exchanges it in a request body."
					},
					"expiresAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"url",
					"expiresAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreatedUserResponse": {
				"properties": {
					"user": {
						"$ref": "#/components/schemas/UserDto"
					},
					"setupLink": {
						"$ref": "#/components/schemas/SetupLinkDto"
					}
				},
				"required": [
					"user",
					"setupLink"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreateUserRequest": {
				"properties": {
					"displayName": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"username": {
						"type": "string",
						"description": "Sign-in and TAK login name; derived from the display name when omitted. The person may still\nchange it while setting up the account.",
						"pattern": "^[a-z0-9._-]{3,32}$"
					}
				},
				"required": [
					"displayName"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateUserRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"minimum": 1
					},
					"displayName": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"email": {
						"type": "string",
						"nullable": true,
						"description": "New email address, or `null` to remove it; only for users with a local login and with\n`users.set-email`. It stays unverified until its owner confirms the link sent to it.",
						"maxLength": 254,
						"pattern": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"
					},
					"username": {
						"type": "string",
						"description": "New sign-in and TAK login name; only for users with a local login. Apps enrolled with the old\nname keep working, because client certificates name the user ID.",
						"pattern": "^[a-z0-9._-]{3,32}$"
					}
				},
				"required": [
					"version",
					"displayName"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SetupLinkExchangeResponse": {
				"properties": {
					"user": {
						"properties": {
							"displayName": {
								"type": "string"
							},
							"id": {
								"$ref": "#/components/schemas/Uuid"
							}
						},
						"required": [
							"displayName",
							"id"
						],
						"type": "object"
					}
				},
				"required": [
					"user"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SetupLinkExchangeRequest": {
				"properties": {
					"token": {
						"type": "string",
						"maxLength": 200
					}
				},
				"required": [
					"token"
				],
				"type": "object",
				"additionalProperties": false
			},
			"Permission": {
				"type": "string",
				"enum": [
					"users.read",
					"users.create",
					"users.edit",
					"users.set-email",
					"users.disable",
					"users.sign-out",
					"users.password-reset",
					"users.setup-links",
					"registration.manage",
					"user-groups.read",
					"user-groups.manage",
					"user-group-members.manage",
					"events.read",
					"events.manage",
					"events.reactivate",
					"configuration.publish",
					"event-groups.manage",
					"event-roles.manage",
					"tak-settings.manage",
					"tak-groups.manage",
					"meshtastic-settings.manage",
					"meshtastic-channels.manage",
					"presets.read",
					"presets.manage",
					"members.read",
					"members.manage",
					"members.sync",
					"member-accounts.create",
					"event-accounts.manage",
					"member-claims.create",
					"channel-keys.reveal",
					"data-packages.read",
					"data-packages.edit",
					"data-packages.publish",
					"missions.read",
					"missions.edit",
					"missions.publish",
					"offline-snapshots.prepare",
					"artifacts.generate",
					"artifacts.download",
					"member-artifacts.download",
					"tak-traffic.view",
					"tak-traffic.history",
					"tak-traffic.export",
					"tak-traffic.delete",
					"tak-traffic.recording",
					"api-clients.manage",
					"tak-server.manage",
					"tak-server.admin-access",
					"email.manage",
					"settings.manage",
					"audit.read",
					"server-logs.read"
				]
			},
			"PermissionGrantDto": {
				"properties": {
					"permission": {
						"$ref": "#/components/schemas/Permission"
					},
					"eventId": {
						"allOf": [
							{
								"$ref": "#/components/schemas/Uuid"
							}
						],
						"nullable": true,
						"description": "Event the grant is limited to, or `null` for an instance-wide grant."
					}
				},
				"required": [
					"permission",
					"eventId"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UserGroupDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					},
					"slug": {
						"type": "string"
					},
					"system": {
						"type": "boolean",
						"description": "Protected group managed by the server, such as the setup Admin group. It cannot be deleted,\nits permissions cannot change and it always keeps at least one member."
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; send it back unchanged with updates."
					},
					"memberCount": {
						"type": "number",
						"format": "double"
					},
					"permissions": {
						"items": {
							"$ref": "#/components/schemas/PermissionGrantDto"
						},
						"type": "array"
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"name",
					"slug",
					"system",
					"version",
					"memberCount",
					"permissions",
					"createdAt",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UserGroupPage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/UserGroupDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"Slug": {
				"type": "string",
				"description": "Lowercase ASCII letters and digits separated by single hyphens.",
				"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
				"minLength": 1,
				"maxLength": 64
			},
			"CreateUserGroupRequest": {
				"properties": {
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"slug": {
						"$ref": "#/components/schemas/Slug"
					},
					"permissions": {
						"items": {
							"$ref": "#/components/schemas/PermissionGrantDto"
						},
						"type": "array",
						"maxItems": 200
					}
				},
				"required": [
					"name",
					"slug",
					"permissions"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateUserGroupRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"slug": {
						"$ref": "#/components/schemas/Slug"
					},
					"permissions": {
						"items": {
							"$ref": "#/components/schemas/PermissionGrantDto"
						},
						"type": "array",
						"description": "Complete replacement of the group's grants.",
						"maxItems": 200
					}
				},
				"required": [
					"version",
					"name",
					"slug",
					"permissions"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakTrafficRecordingDto": {
				"description": "Whether an event stores its TAK traffic, and for how long. Off by default.",
				"properties": {
					"enabled": {
						"type": "boolean"
					},
					"retentionDays": {
						"type": "number",
						"format": "double",
						"description": "Recorded positions and markers are deleted after this many days."
					},
					"storedItems": {
						"type": "number",
						"format": "double",
						"description": "Number of items currently stored for the event."
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; 0 until first saved."
					}
				},
				"required": [
					"enabled",
					"retentionDays",
					"storedItems",
					"version"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateTakTrafficRecordingRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"minimum": 0
					},
					"enabled": {
						"type": "boolean"
					},
					"retentionDays": {
						"type": "integer",
						"format": "int32",
						"minimum": 1,
						"maximum": 365
					}
				},
				"required": [
					"version",
					"enabled",
					"retentionDays"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakTrackSenderDto": {
				"description": "The OpenMeshTak user whose TAK app sent a track, with their event group when still a member.",
				"properties": {
					"userId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"displayName": {
						"type": "string"
					},
					"eventGroupId": {
						"allOf": [
							{
								"$ref": "#/components/schemas/Uuid"
							}
						],
						"nullable": true
					},
					"eventGroupName": {
						"type": "string",
						"nullable": true
					}
				},
				"required": [
					"userId",
					"displayName",
					"eventGroupId",
					"eventGroupName"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakTrackPointDto": {
				"description": "One recorded position on a track.",
				"properties": {
					"time": {
						"type": "string",
						"description": "When the sender says the position was taken.",
						"format": "date-time"
					},
					"lat": {
						"type": "number",
						"format": "double"
					},
					"lon": {
						"type": "number",
						"format": "double"
					},
					"ce": {
						"type": "number",
						"format": "double",
						"nullable": true,
						"description": "Circular error in metres, or null when the sender did not say."
					},
					"delayed": {
						"type": "boolean",
						"description": "Reached Core more than a minute after its own time, for example relayed over a mesh."
					},
					"approximate": {
						"type": "boolean",
						"description": "A large circular error or a human estimate; never connected to other positions."
					}
				},
				"required": [
					"time",
					"lat",
					"lon",
					"ce",
					"delayed",
					"approximate"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakTrackDto": {
				"description": "The recorded movement of one CoT UID, such as a member's device or a marker.",
				"properties": {
					"uid": {
						"type": "string"
					},
					"type": {
						"type": "string",
						"description": "Newest CoT type in the range."
					},
					"callsign": {
						"type": "string",
						"nullable": true
					},
					"selfReported": {
						"type": "boolean",
						"description": "At least one position was the app's own beacon rather than a marker it placed."
					},
					"sender": {
						"$ref": "#/components/schemas/TakTrackSenderDto"
					},
					"pointCount": {
						"type": "number",
						"format": "double"
					},
					"duplicatesDropped": {
						"type": "number",
						"format": "double",
						"description": "Positions dropped because another position of the same UID carried the same time."
					},
					"segments": {
						"items": {
							"items": {
								"$ref": "#/components/schemas/TakTrackPointDto"
							},
							"type": "array"
						},
						"type": "array",
						"description": "Continuous parts ordered by time. Lines are drawn only inside a segment; a gap, an implausible\njump or an approximate position starts a new one."
					}
				},
				"required": [
					"uid",
					"type",
					"callsign",
					"selfReported",
					"sender",
					"pointCount",
					"duplicatesDropped",
					"segments"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakTrafficHistoryGroupDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					}
				},
				"required": [
					"id",
					"name"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakTrafficHistoryDto": {
				"description": "Recorded positions of an event within a time range, grouped into tracks.",
				"properties": {
					"from": {
						"type": "string",
						"format": "date-time"
					},
					"to": {
						"type": "string",
						"format": "date-time"
					},
					"gapSeconds": {
						"type": "number",
						"format": "double"
					},
					"truncated": {
						"type": "boolean",
						"description": "More positions were recorded than one answer holds; the newest ones are missing."
					},
					"maxPoints": {
						"type": "number",
						"format": "double",
						"description": "Most positions one answer contains."
					},
					"tracks": {
						"items": {
							"$ref": "#/components/schemas/TakTrackDto"
						},
						"type": "array"
					},
					"groups": {
						"items": {
							"$ref": "#/components/schemas/TakTrafficHistoryGroupDto"
						},
						"type": "array",
						"description": "The event's groups, for filtering."
					}
				},
				"required": [
					"from",
					"to",
					"gapSeconds",
					"truncated",
					"maxPoints",
					"tracks",
					"groups"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakTrafficExportFormat": {
				"type": "string",
				"enum": [
					"geojson",
					"gpx"
				]
			},
			"DeletedTakTrafficDto": {
				"properties": {
					"deleted": {
						"type": "number",
						"format": "double"
					}
				},
				"required": [
					"deleted"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakServerCertificateDto": {
				"description": "The certificate the TAK listeners present. The private key is never returned.",
				"properties": {
					"source": {
						"type": "string",
						"enum": [
							"issued",
							"added",
							"acme",
							"file"
						],
						"description": "OpenMeshTak-issued, administrator-added, obtained automatically through ACME, or read from the reverse proxy's files."
					},
					"hostName": {
						"type": "string"
					},
					"subject": {
						"type": "string"
					},
					"fingerprintSha256": {
						"type": "string"
					},
					"notAfter": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"source",
					"hostName",
					"subject",
					"fingerprintSha256",
					"notAfter"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakCertificateFilesDto": {
				"properties": {
					"certificateFile": {
						"type": "string",
						"description": "Full chain, server certificate first, e.g. `live/tak.example.org/fullchain.pem`."
					},
					"keyFile": {
						"type": "string",
						"description": "Unencrypted private key, e.g. `live/tak.example.org/privkey.pem`."
					}
				},
				"required": [
					"certificateFile",
					"keyFile"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakServerSettingsDto": {
				"properties": {
					"enabled": {
						"type": "boolean",
						"description": "Whether the TAK listeners run. Requires a host name."
					},
					"hostName": {
						"type": "string",
						"nullable": true,
						"description": "Public host name or IPv4 address that ATAK and iTAK connect to."
					},
					"enrollmentPort": {
						"type": "number",
						"format": "double"
					},
					"martiPort": {
						"type": "number",
						"format": "double"
					},
					"streamingPort": {
						"type": "number",
						"format": "double"
					},
					"clientCertificateDays": {
						"type": "number",
						"format": "double",
						"description": "Lifetime of newly enrolled client certificates."
					},
					"unusedPackageHours": {
						"type": "number",
						"format": "double",
						"description": "Hours after which a downloaded iTAK or WinTAK package that never connected is revoked."
					},
					"serverCertificate": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TakServerCertificateDto"
							}
						],
						"nullable": true,
						"description": "`null` until the server first starts or a certificate is added."
					},
					"certificateFiles": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TakCertificateFilesDto"
							}
						],
						"nullable": true,
						"description": "The reverse proxy's certificate files Core reads, relative to `certificateDirectory`; `null` unless used."
					},
					"certificateDirectory": {
						"type": "string",
						"description": "Where the proxy's certificate directory must be mounted for `certificateFiles`."
					},
					"endpointChangedAt": {
						"type": "string",
						"nullable": true,
						"description": "When the public host name or a port last changed after setup; `null` if never. Apps enrolled\nbefore it may still use the old endpoint.",
						"format": "date-time"
					},
					"validClientCertificates": {
						"type": "integer",
						"format": "int32",
						"description": "Valid client certificates. Changing the host name or a port while this is above 0 requires\n`endpointChange` in the update, because those apps must enroll again."
					},
					"clientCertificatesToReEnroll": {
						"type": "integer",
						"format": "int32",
						"description": "Valid client certificates issued before `endpointChangedAt`; their apps may still point to the\nold endpoint and must enroll again."
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; 0 until first saved."
					}
				},
				"required": [
					"enabled",
					"hostName",
					"enrollmentPort",
					"martiPort",
					"streamingPort",
					"clientCertificateDays",
					"unusedPackageHours",
					"serverCertificate",
					"certificateFiles",
					"certificateDirectory",
					"endpointChangedAt",
					"validClientCertificates",
					"clientCertificatesToReEnroll",
					"version"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakEndpointChangeConfirmation": {
				"description": "The administrator's decision for a host name or port change that affects devices.",
				"properties": {
					"notifyAffectedUsers": {
						"type": "boolean",
						"description": "Email users with enrolled apps that they must set them up again; otherwise only warn here."
					}
				},
				"required": [
					"notifyAffectedUsers"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateTakServerSettingsRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"minimum": 0
					},
					"enabled": {
						"type": "boolean"
					},
					"hostName": {
						"type": "string",
						"nullable": true,
						"maxLength": 253
					},
					"enrollmentPort": {
						"type": "integer",
						"format": "int32",
						"minimum": 1,
						"maximum": 65535
					},
					"martiPort": {
						"type": "integer",
						"format": "int32",
						"minimum": 1,
						"maximum": 65535
					},
					"streamingPort": {
						"type": "integer",
						"format": "int32",
						"minimum": 1,
						"maximum": 65535
					},
					"clientCertificateDays": {
						"type": "integer",
						"format": "int32",
						"minimum": 1,
						"maximum": 825
					},
					"unusedPackageHours": {
						"type": "integer",
						"format": "int32",
						"description": "Hours after which a downloaded iTAK or WinTAK package that never connected is revoked; kept\nwhen omitted.",
						"minimum": 1,
						"maximum": 720
					},
					"endpointChange": {
						"$ref": "#/components/schemas/TakEndpointChangeConfirmation",
						"description": "Required when this update moves a port to a non-standard value, or changes the host name or a\nport while apps are enrolled. Core never changes a public port on its own."
					}
				},
				"required": [
					"version",
					"enabled",
					"hostName",
					"enrollmentPort",
					"martiPort",
					"streamingPort",
					"clientCertificateDays"
				],
				"type": "object",
				"additionalProperties": false
			},
			"AddTakServerCertificateRequest": {
				"properties": {
					"certificateChainPem": {
						"type": "string",
						"description": "Full chain in PEM format, server certificate first, e.g. the `fullchain.pem` of Let's Encrypt.",
						"maxLength": 50000
					},
					"privateKeyPem": {
						"type": "string",
						"description": "Unencrypted private key in PEM format, e.g. the `privkey.pem` of Let's Encrypt. Encrypted at\nrest and never returned.",
						"maxLength": 20000
					}
				},
				"required": [
					"certificateChainPem",
					"privateKeyPem"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UseTakCertificateFilesRequest": {
				"description": "Use the reverse proxy's certificate files; both paths are relative to the mounted directory.",
				"properties": {
					"certificateFile": {
						"type": "string",
						"maxLength": 500
					},
					"keyFile": {
						"type": "string",
						"maxLength": 500
					}
				},
				"required": [
					"certificateFile",
					"keyFile"
				],
				"type": "object",
				"additionalProperties": false
			},
			"LiveTakAssignmentDto": {
				"description": "An event group or role, as far as the live view needs it for grouping and filtering.",
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					}
				},
				"required": [
					"id",
					"name"
				],
				"type": "object",
				"additionalProperties": false
			},
			"LiveTakConnectionDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"userId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"userDisplayName": {
						"type": "string"
					},
					"eventGroup": {
						"allOf": [
							{
								"$ref": "#/components/schemas/LiveTakAssignmentDto"
							}
						],
						"nullable": true,
						"description": "The user's group in this event, or null when they are not a member, e.g. an administrator."
					},
					"eventRole": {
						"allOf": [
							{
								"$ref": "#/components/schemas/LiveTakAssignmentDto"
							}
						],
						"nullable": true,
						"description": "The user's role in this event, or null when they are not a member."
					},
					"callsign": {
						"type": "string",
						"nullable": true,
						"description": "The app's callsign once it reported its position."
					},
					"connectedAt": {
						"type": "string",
						"format": "date-time"
					},
					"lastSeenAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"userId",
					"userDisplayName",
					"eventGroup",
					"eventRole",
					"callsign",
					"connectedAt",
					"lastSeenAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"LiveTakItemDto": {
				"description": "The newest state of one CoT item, such as a member's position or a marker they placed.",
				"properties": {
					"uid": {
						"type": "string"
					},
					"type": {
						"type": "string",
						"description": "CoT type, e.g. `a-f-G-U-C` for a friendly ground unit."
					},
					"callsign": {
						"type": "string",
						"nullable": true
					},
					"lat": {
						"type": "number",
						"format": "double"
					},
					"lon": {
						"type": "number",
						"format": "double"
					},
					"course": {
						"type": "number",
						"format": "double",
						"nullable": true,
						"description": "Direction of travel in degrees clockwise from true north (CoT `track/course`), or null when not sent."
					},
					"speed": {
						"type": "number",
						"format": "double",
						"nullable": true,
						"description": "Ground speed in metres per second (CoT `track/speed`), or null when not sent."
					},
					"time": {
						"type": "string",
						"format": "date-time"
					},
					"stale": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"uid",
					"type",
					"callsign",
					"lat",
					"lon",
					"course",
					"speed",
					"time",
					"stale"
				],
				"type": "object",
				"additionalProperties": false
			},
			"LiveTakTrafficDto": {
				"description": "Current TAK traffic of one event, held in memory only; nothing of it is stored.",
				"properties": {
					"connections": {
						"items": {
							"$ref": "#/components/schemas/LiveTakConnectionDto"
						},
						"type": "array"
					},
					"items": {
						"items": {
							"$ref": "#/components/schemas/LiveTakItemDto"
						},
						"type": "array"
					}
				},
				"required": [
					"connections",
					"items"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakEnrollmentDto": {
				"description": "Everything a TAK app needs to connect. Manual setup uses `username` with the account password;\nthe ATAK link and QR code carry a QR token instead, which is shown only in this response.",
				"properties": {
					"username": {
						"type": "string",
						"description": "The account username, the TAK login name."
					},
					"expiresAt": {
						"type": "string",
						"nullable": true,
						"description": "When the QR token expires, from the token lifetime of the user's active events: a number of\ndays, or the event end. `null` when it does not expire (an event without end date) or when\n`atakEnrollmentUrl` is `null`. Users without an active event get 30 days.",
						"format": "date-time"
					},
					"hostName": {
						"type": "string"
					},
					"enrollmentPort": {
						"type": "number",
						"format": "double",
						"description": "Public ports; they may differ from the listen ports inside the container."
					},
					"martiPort": {
						"type": "number",
						"format": "double",
						"description": "Public Marti port for Data Packages; the enrollment profile also sets it in ATAK."
					},
					"streamingPort": {
						"type": "number",
						"format": "double"
					},
					"atakEnrollmentUrl": {
						"type": "string",
						"nullable": true,
						"description": "Link and QR code content for ATAK certificate enrollment, with the QR token. `null` while the\nTAK server uses a certificate from its own CA, because ATAK's QR enrollment then fails."
					},
					"itakQrString": {
						"type": "string",
						"nullable": true,
						"description": "QR payload understood by iTAK's server scanner. It configures the SSL streaming endpoint and\niTAK then asks for the user's login. `null` with a private server certificate because the QR\ncannot carry CA trust material."
					},
					"unusedPackageHours": {
						"type": "number",
						"format": "double",
						"description": "Hours within which a downloaded iTAK or WinTAK package must connect once; otherwise its\ncertificate is revoked."
					}
				},
				"required": [
					"username",
					"expiresAt",
					"hostName",
					"enrollmentPort",
					"martiPort",
					"streamingPort",
					"atakEnrollmentUrl",
					"itakQrString",
					"unusedPackageHours"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakReportedDeviceDto": {
				"description": "The app's own description from the `takv` and `contact` details of its position beacon. Set by\nthe app, so it names the device but proves nothing.",
				"properties": {
					"name": {
						"type": "string",
						"nullable": true,
						"description": "Device model, e.g. `iPhone 17`."
					},
					"app": {
						"type": "string",
						"nullable": true,
						"description": "TAK app, e.g. `iTAK` or `WinTAK-CIV`."
					},
					"appVersion": {
						"type": "string",
						"nullable": true
					},
					"os": {
						"type": "string",
						"nullable": true
					},
					"callsign": {
						"type": "string",
						"nullable": true
					}
				},
				"required": [
					"name",
					"app",
					"appVersion",
					"os",
					"callsign"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakClientCertificateDto": {
				"description": "A client certificate issued to a TAK app. Certificates are public; no key material exists here.",
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"userId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"userDisplayName": {
						"type": "string"
					},
					"clientUid": {
						"type": "string",
						"nullable": true,
						"description": "Device UID the app sent during enrollment, if any."
					},
					"serialNumber": {
						"type": "string"
					},
					"fingerprintSha256": {
						"type": "string"
					},
					"status": {
						"type": "string",
						"enum": [
							"valid",
							"expired",
							"revoked"
						]
					},
					"notBefore": {
						"type": "string",
						"format": "date-time"
					},
					"notAfter": {
						"type": "string",
						"format": "date-time"
					},
					"revokedAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"revocationReason": {
						"type": "string",
						"nullable": true
					},
					"firstConnectedAt": {
						"type": "string",
						"nullable": true,
						"description": "First streaming connection with this certificate; `null` while an app never connected.",
						"format": "date-time"
					},
					"lastConnectedAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"device": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TakReportedDeviceDto"
							}
						],
						"nullable": true,
						"description": "What the app last reported about itself; `null` until it sent its own position."
					},
					"issuedForOldEndpoint": {
						"type": "boolean",
						"description": "Issued before the TAK server's host name or a port last changed; the app may still use the old\nendpoint and must enroll again."
					}
				},
				"required": [
					"id",
					"userId",
					"userDisplayName",
					"clientUid",
					"serialNumber",
					"fingerprintSha256",
					"status",
					"notBefore",
					"notAfter",
					"revokedAt",
					"revocationReason",
					"firstConnectedAt",
					"lastConnectedAt",
					"device",
					"issuedForOldEndpoint"
				],
				"type": "object",
				"additionalProperties": false
			},
			"RevokeTakCertificateRequest": {
				"properties": {
					"reason": {
						"type": "string",
						"nullable": true,
						"maxLength": 200
					}
				},
				"type": "object",
				"additionalProperties": false
			},
			"TakCertificateAuthorityDto": {
				"description": "A TAK certificate authority. The certificate is public trust material; the key never leaves Core.",
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"origin": {
						"type": "string",
						"enum": [
							"generated",
							"imported"
						]
					},
					"active": {
						"type": "boolean",
						"description": "Signs new client and server certificates."
					},
					"subject": {
						"type": "string"
					},
					"fingerprintSha256": {
						"type": "string",
						"description": "SHA-256 of the DER certificate, lowercase hex, for comparing with what devices show."
					},
					"notBefore": {
						"type": "string",
						"format": "date-time"
					},
					"notAfter": {
						"type": "string",
						"format": "date-time"
					},
					"certificatePem": {
						"type": "string"
					}
				},
				"required": [
					"id",
					"origin",
					"active",
					"subject",
					"fingerprintSha256",
					"notBefore",
					"notAfter",
					"certificatePem"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ImportTakCertificateAuthorityRequest": {
				"properties": {
					"certificatePem": {
						"type": "string",
						"description": "The CA certificate in PEM format.",
						"maxLength": 20000
					},
					"privateKeyPem": {
						"type": "string",
						"description": "The unencrypted CA private key in PEM format (PKCS#8 or PKCS#1). It is encrypted at rest and\nnever returned.",
						"maxLength": 20000
					}
				},
				"required": [
					"certificatePem",
					"privateKeyPem"
				],
				"type": "object",
				"additionalProperties": false
			},
			"AcmeSolverDto": {
				"properties": {
					"challengeType": {
						"type": "string"
					},
					"provider": {
						"type": "string"
					},
					"label": {
						"type": "string"
					}
				},
				"required": [
					"challengeType",
					"provider",
					"label"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakAcmeSettingsDto": {
				"description": "ACME settings and renewal status. Provider tokens and the account key are never returned.",
				"properties": {
					"enabled": {
						"type": "boolean"
					},
					"email": {
						"type": "string",
						"nullable": true
					},
					"challengeType": {
						"type": "string"
					},
					"provider": {
						"type": "string"
					},
					"cloudflareZoneId": {
						"type": "string",
						"nullable": true
					},
					"apiTokenSet": {
						"type": "boolean"
					},
					"availableSolvers": {
						"items": {
							"$ref": "#/components/schemas/AcmeSolverDto"
						},
						"type": "array"
					},
					"running": {
						"type": "boolean"
					},
					"lastAttemptAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"lastSuccessAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"lastError": {
						"type": "string",
						"nullable": true
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; 0 until first saved."
					}
				},
				"required": [
					"enabled",
					"email",
					"challengeType",
					"provider",
					"cloudflareZoneId",
					"apiTokenSet",
					"availableSolvers",
					"running",
					"lastAttemptAt",
					"lastSuccessAt",
					"lastError",
					"version"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateTakAcmeSettingsRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"minimum": 0
					},
					"enabled": {
						"type": "boolean"
					},
					"email": {
						"type": "string",
						"nullable": true,
						"maxLength": 254
					},
					"challengeType": {
						"type": "string",
						"maxLength": 30
					},
					"provider": {
						"type": "string",
						"maxLength": 50
					},
					"cloudflareZoneId": {
						"type": "string",
						"nullable": true,
						"maxLength": 64
					},
					"apiToken": {
						"type": "string",
						"nullable": true,
						"description": "Omit to keep the stored token, `null` to remove it. The token is encrypted and write-only.",
						"maxLength": 500
					}
				},
				"required": [
					"version",
					"enabled",
					"email",
					"challengeType",
					"provider",
					"cloudflareZoneId"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakAcmeTestResultDto": {
				"description": "Result of a test run against Let's Encrypt staging.",
				"properties": {
					"succeeded": {
						"type": "boolean"
					},
					"message": {
						"type": "string",
						"description": "What happened, safe to show to the administrator."
					}
				},
				"required": [
					"succeeded",
					"message"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakGroupSummaryDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					},
					"description": {
						"type": "string",
						"nullable": true
					},
					"receiverCount": {
						"type": "number",
						"format": "double",
						"description": "Members that receive what is sent into the group."
					},
					"senderCount": {
						"type": "number",
						"format": "double",
						"description": "Members that send into the group."
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; send it back unchanged with updates."
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"eventId",
					"name",
					"description",
					"receiverCount",
					"senderCount",
					"version",
					"createdAt",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakGroupPage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/TakGroupSummaryDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakGroupMemberDto": {
				"description": "A member's place in a TAK group: receiving what is sent into it (in), sending into it (out).",
				"properties": {
					"memberId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"receive": {
						"type": "boolean"
					},
					"send": {
						"type": "boolean"
					}
				},
				"required": [
					"memberId",
					"receive",
					"send"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakGroupDto": {
				"description": "A free TAK group of the advanced group mode, e.g. `Medics`. Members are assigned per group;\nroles with `seesAllTakGroups` need no assignment.",
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					},
					"description": {
						"type": "string",
						"nullable": true
					},
					"receiverCount": {
						"type": "number",
						"format": "double",
						"description": "Members that receive what is sent into the group."
					},
					"senderCount": {
						"type": "number",
						"format": "double",
						"description": "Members that send into the group."
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; send it back unchanged with updates."
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					},
					"members": {
						"items": {
							"$ref": "#/components/schemas/TakGroupMemberDto"
						},
						"type": "array"
					}
				},
				"required": [
					"id",
					"eventId",
					"name",
					"description",
					"receiverCount",
					"senderCount",
					"version",
					"createdAt",
					"updatedAt",
					"members"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreateTakGroupRequest": {
				"properties": {
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 60
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 500
					},
					"members": {
						"items": {
							"$ref": "#/components/schemas/TakGroupMemberDto"
						},
						"type": "array",
						"maxItems": 5000
					}
				},
				"required": [
					"name"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateTakGroupRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 60
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 500
					},
					"members": {
						"items": {
							"$ref": "#/components/schemas/TakGroupMemberDto"
						},
						"type": "array",
						"description": "Replaces the group's members; omit to keep them. Entries with neither `receive` nor `send`\nare dropped.",
						"maxItems": 5000
					}
				},
				"required": [
					"version",
					"name",
					"description"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakGroupMode": {
				"type": "string",
				"enum": [
					"off",
					"simple",
					"advanced"
				]
			},
			"TakConfigurationDto": {
				"description": "TAK settings of an event. Every event sends TAK clients to the built-in TAK server; Meshtastic\nevents (`meshtasticEnabled` on the event) also connect them to the Meshtastic app's local TAK\nserver, which carries CoT over the mesh channel. ATAK preferences have their own list\n(`/events/{eventId}/tak/atak-preferences`).",
				"properties": {
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"meshChannelId": {
						"allOf": [
							{
								"$ref": "#/components/schemas/Uuid"
							}
						],
						"nullable": true,
						"description": "Channel for the app's \"TAK Mesh Channel\"; `null` uses the primary channel."
					},
					"groupMode": {
						"$ref": "#/components/schemas/TakGroupMode",
						"description": "`off`: every member sees the whole event. `simple`: members see only their event group.\n`advanced`: members receive what is sent into the event's TAK groups they receive from\n(`/events/{eventId}/tak/groups`). In both separating modes roles with `seesAllTakGroups` see\nand reach everyone. Applies to live connections within seconds, without publishing."
					},
					"groupsInApp": {
						"type": "boolean",
						"description": "In the advanced mode, TAK apps list their groups and may switch them on and off."
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; 0 until first saved."
					},
					"updatedAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					}
				},
				"required": [
					"eventId",
					"meshChannelId",
					"groupMode",
					"groupsInApp",
					"version",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateTakConfigurationRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 0
					},
					"meshChannelId": {
						"allOf": [
							{
								"$ref": "#/components/schemas/Uuid"
							}
						],
						"nullable": true
					},
					"groupMode": {
						"$ref": "#/components/schemas/TakGroupMode",
						"description": "Omit to keep the current mode."
					},
					"groupsInApp": {
						"type": "boolean",
						"description": "Omit to keep the current value."
					}
				},
				"required": [
					"version",
					"meshChannelId"
				],
				"type": "object",
				"additionalProperties": false
			},
			"AtakPreferenceTargetDto": {
				"description": "Who an entry is for. Targets are event memberships, never OpenMeshTak accounts.",
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"event",
							"group",
							"role",
							"member"
						]
					},
					"id": {
						"allOf": [
							{
								"$ref": "#/components/schemas/Uuid"
							}
						],
						"nullable": true,
						"description": "The event group, role or member; `null` for the whole event."
					}
				},
				"required": [
					"type",
					"id"
				],
				"type": "object",
				"additionalProperties": false
			},
			"AtakPreferenceTypeDto": {
				"type": "string",
				"enum": [
					"string",
					"boolean",
					"integer",
					"long",
					"float"
				]
			},
			"AtakPreferenceEntryDto": {
				"description": "One ATAK preference the event sends, as a `.pref` file stores it.",
				"properties": {
					"target": {
						"$ref": "#/components/schemas/AtakPreferenceTargetDto"
					},
					"preference": {
						"type": "string",
						"description": "The `<preference name>` group, usually `com.atakmap.app_preferences`.",
						"maxLength": 200
					},
					"key": {
						"type": "string",
						"maxLength": 200
					},
					"type": {
						"$ref": "#/components/schemas/AtakPreferenceTypeDto",
						"description": "The Java class ATAK stores; known keys must use the catalog's type."
					},
					"value": {
						"type": "string",
						"maxLength": 10000
					}
				},
				"required": [
					"target",
					"preference",
					"key",
					"type",
					"value"
				],
				"type": "object",
				"additionalProperties": false
			},
			"AtakPreferenceListDto": {
				"description": "The ATAK preferences every member's app receives through its device profile once a\nconfiguration revision is published. For one member the most specific entry wins per key:\nmember, then role, then group, then the whole event. Removing an entry does not change a device;\nset ATAK's default instead.",
				"properties": {
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"entries": {
						"items": {
							"$ref": "#/components/schemas/AtakPreferenceEntryDto"
						},
						"type": "array"
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; 0 until first saved."
					},
					"updatedAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					}
				},
				"required": [
					"eventId",
					"entries",
					"version",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ReplaceAtakPreferencesRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 0
					},
					"entries": {
						"items": {
							"$ref": "#/components/schemas/AtakPreferenceEntryDto"
						},
						"type": "array",
						"maxItems": 2000
					}
				},
				"required": [
					"version",
					"entries"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SkippedAtakPreferenceDto": {
				"properties": {
					"key": {
						"type": "string"
					},
					"message": {
						"type": "string"
					}
				},
				"required": [
					"key",
					"message"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ImportAtakPreferencesResponse": {
				"properties": {
					"list": {
						"$ref": "#/components/schemas/AtakPreferenceListDto"
					},
					"importedCount": {
						"type": "number",
						"format": "double",
						"description": "Entries added to the whole event or replacing an event-wide entry of the same key."
					},
					"removedKeys": {
						"items": {
							"type": "string"
						},
						"type": "array",
						"description": "Keys left out because OpenMeshTak sets them, they hold a secret or they belong to one person or device."
					},
					"invalidKeys": {
						"items": {
							"$ref": "#/components/schemas/SkippedAtakPreferenceDto"
						},
						"type": "array",
						"description": "Keys left out because their type or value does not match what ATAK expects."
					}
				},
				"required": [
					"list",
					"importedCount",
					"removedKeys",
					"invalidKeys"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ImportAtakPreferencesRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 0
					},
					"fileName": {
						"type": "string",
						"maxLength": 200
					},
					"content": {
						"type": "string",
						"description": "The `.pref` file's text, such as ATAK's settings export.",
						"maxLength": 262144
					}
				},
				"required": [
					"version",
					"fileName",
					"content"
				],
				"type": "object",
				"additionalProperties": false
			},
			"AtakCatalogValueDto": {
				"properties": {
					"value": {
						"type": "string"
					},
					"label": {
						"type": "string"
					}
				},
				"required": [
					"value",
					"label"
				],
				"type": "object",
				"additionalProperties": false
			},
			"AtakCatalogKeyDto": {
				"properties": {
					"key": {
						"type": "string"
					},
					"group": {
						"type": "string",
						"description": "Subgroup within the topic, such as \"Altitude\"; keys of a group are listed together."
					},
					"type": {
						"$ref": "#/components/schemas/AtakPreferenceTypeDto"
					},
					"defaultValue": {
						"type": "string",
						"nullable": true,
						"description": "ATAK's own default; `null` when ATAK sets none."
					},
					"values": {
						"items": {
							"$ref": "#/components/schemas/AtakCatalogValueDto"
						},
						"type": "array",
						"nullable": true,
						"description": "Allowed values of a list; `null` for free values."
					},
					"numeric": {
						"type": "boolean",
						"description": "Text fields ATAK reads as numbers; they are still stored as strings."
					},
					"description": {
						"type": "string"
					},
					"use": {
						"type": "string",
						"enum": [
							"form",
							"member",
							"warning",
							"advanced",
							null
						],
						"nullable": true,
						"description": "`form`: a ready field; `member`: only for one member; `warning`: allowed with a warning; `advanced`: hidden by default."
					}
				},
				"required": [
					"key",
					"group",
					"type",
					"defaultValue",
					"values",
					"numeric",
					"description",
					"use"
				],
				"type": "object",
				"additionalProperties": false
			},
			"AtakCatalogTopicDto": {
				"properties": {
					"id": {
						"type": "string"
					},
					"title": {
						"type": "string"
					},
					"description": {
						"type": "string"
					},
					"keys": {
						"items": {
							"$ref": "#/components/schemas/AtakCatalogKeyDto"
						},
						"type": "array"
					}
				},
				"required": [
					"id",
					"title",
					"description",
					"keys"
				],
				"type": "object",
				"additionalProperties": false
			},
			"AtakScreenItemDto": {
				"description": "A settings item that stores no value of its own, such as a link to another settings screen.",
				"properties": {
					"id": {
						"type": "string",
						"description": "The item ID that `disablePreferenceItem_<id>` and `hidePreferenceItem_<id>` name."
					},
					"area": {
						"type": "string",
						"description": "Where the item is in ATAK, such as \"Settings → Network\"."
					},
					"description": {
						"type": "string"
					}
				},
				"required": [
					"id",
					"area",
					"description"
				],
				"type": "object",
				"additionalProperties": false
			},
			"AtakPreferenceCatalogDto": {
				"description": "The ATAK preference keys this Core release knows, by topic, all in\n`com.atakmap.app_preferences`. Other keys, such as plugin keys, may still be set.\n\nEvery catalog key and every screen item can also be greyed out or hidden in ATAK's settings\nscreens with the Boolean entries `disablePreferenceItem_<key>` and `hidePreferenceItem_<key>`;\nother item IDs are refused.",
				"properties": {
					"atakVersion": {
						"type": "string",
						"description": "The ATAK version the catalog was read from."
					},
					"topics": {
						"items": {
							"$ref": "#/components/schemas/AtakCatalogTopicDto"
						},
						"type": "array"
					},
					"screenItems": {
						"items": {
							"$ref": "#/components/schemas/AtakScreenItemDto"
						},
						"type": "array",
						"description": "Settings items without a value key that can be greyed out or hidden as well."
					},
					"blockedKeys": {
						"items": {
							"properties": {
								"reason": {
									"type": "string"
								},
								"key": {
									"type": "string"
								}
							},
							"required": [
								"reason",
								"key"
							],
							"type": "object"
						},
						"type": "array",
						"description": "Keys an event can never set, with the reason."
					}
				},
				"required": [
					"atakVersion",
					"topics",
					"screenItems",
					"blockedKeys"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SystemCheckState": {
				"type": "string",
				"enum": [
					"ok",
					"warning",
					"error",
					"off"
				],
				"description": "`off` marks a part that is switched off on purpose, such as a disabled TAK server."
			},
			"SystemCheckDto": {
				"properties": {
					"id": {
						"type": "string",
						"enum": [
							"database",
							"storage",
							"tak-server",
							"tak-certificate",
							"errors"
						]
					},
					"state": {
						"$ref": "#/components/schemas/SystemCheckState"
					},
					"detail": {
						"type": "string",
						"description": "One plain sentence for operators; never contains secrets."
					}
				},
				"required": [
					"id",
					"state",
					"detail"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ServerLogLevel": {
				"type": "string",
				"enum": [
					"trace",
					"debug",
					"info",
					"warn",
					"error",
					"fatal"
				]
			},
			"LoggedProblemDto": {
				"description": "A stored warning or error, sanitized like the server log.",
				"properties": {
					"time": {
						"type": "string",
						"nullable": true
					},
					"level": {
						"$ref": "#/components/schemas/ServerLogLevel"
					},
					"message": {
						"type": "string"
					},
					"details": {
						"type": "string",
						"nullable": true,
						"description": "Structured fields as JSON, or null."
					}
				},
				"required": [
					"time",
					"level",
					"message",
					"details"
				],
				"type": "object",
				"additionalProperties": false
			},
			"MetricScope": {
				"type": "string",
				"enum": [
					"container",
					"host"
				],
				"description": "Whether system CPU and memory are the container's (cgroup) or the whole machine's."
			},
			"MetricSampleDto": {
				"properties": {
					"time": {
						"type": "string"
					},
					"coreCpuPercent": {
						"type": "number",
						"format": "double",
						"description": "CPU used by the Core process, as a share of the CPUs it may use (0–100)."
					},
					"systemCpuPercent": {
						"type": "number",
						"format": "double",
						"description": "CPU used by the container (against its CPU limit) or the machine, 0–100; see `scope`."
					},
					"coreMemoryBytes": {
						"type": "number",
						"format": "double",
						"description": "Resident memory of the Core process."
					},
					"systemMemoryUsedBytes": {
						"type": "number",
						"format": "double",
						"description": "Memory in use by the container or the machine; see `scope`."
					},
					"systemMemoryTotalBytes": {
						"type": "number",
						"format": "double",
						"description": "The container's memory limit (at most the machine's memory) or the machine's memory."
					},
					"takConnections": {
						"type": "number",
						"format": "double"
					}
				},
				"required": [
					"time",
					"coreCpuPercent",
					"systemCpuPercent",
					"coreMemoryBytes",
					"systemMemoryUsedBytes",
					"systemMemoryTotalBytes",
					"takConnections"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SystemStatusDto": {
				"properties": {
					"version": {
						"type": "string",
						"description": "Core release version."
					},
					"startedAt": {
						"type": "string"
					},
					"checks": {
						"items": {
							"$ref": "#/components/schemas/SystemCheckDto"
						},
						"type": "array"
					},
					"databaseLatencyMs": {
						"type": "number",
						"format": "double",
						"nullable": true,
						"description": "Database round trip of a trivial query in milliseconds; null when it failed."
					},
					"databaseBytes": {
						"type": "number",
						"format": "double",
						"nullable": true,
						"description": "Size of the SQLite database file in bytes; null when unknown."
					},
					"storedFileBytes": {
						"type": "number",
						"format": "double",
						"description": "Bytes of stored files (Data Package content, icon sets)."
					},
					"diskFreeBytes": {
						"type": "number",
						"format": "double",
						"nullable": true,
						"description": "Free and total bytes on the disk that holds the data directory; null when unknown."
					},
					"diskTotalBytes": {
						"type": "number",
						"format": "double",
						"nullable": true
					},
					"memoryBytes": {
						"type": "number",
						"format": "double",
						"description": "Resident memory of the Core process in bytes."
					},
					"takConnections": {
						"type": "number",
						"format": "double",
						"description": "Open TAK connections (streaming) right now."
					},
					"activeEvents": {
						"type": "number",
						"format": "double"
					},
					"recentErrors": {
						"type": "number",
						"format": "double",
						"description": "Errors (including fatal) logged in the last 24 hours, also before a restart."
					},
					"recentWarnings": {
						"type": "number",
						"format": "double"
					},
					"problems": {
						"items": {
							"$ref": "#/components/schemas/LoggedProblemDto"
						},
						"type": "array",
						"description": "Stored warnings and errors of the last seven days, newest first, at most 100."
					},
					"sampleIntervalSeconds": {
						"type": "number",
						"format": "double",
						"description": "Seconds between two samples of `history`."
					},
					"metricScope": {
						"$ref": "#/components/schemas/MetricScope"
					},
					"history": {
						"items": {
							"$ref": "#/components/schemas/MetricSampleDto"
						},
						"type": "array",
						"description": "CPU, memory and TAK connections of the last six hours since Core started, oldest first."
					}
				},
				"required": [
					"version",
					"startedAt",
					"checks",
					"databaseLatencyMs",
					"databaseBytes",
					"storedFileBytes",
					"diskFreeBytes",
					"diskTotalBytes",
					"memoryBytes",
					"takConnections",
					"activeEvents",
					"recentErrors",
					"recentWarnings",
					"problems",
					"sampleIntervalSeconds",
					"metricScope",
					"history"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SetupStatusResponse": {
				"properties": {
					"configured": {
						"type": "boolean",
						"description": "`false` until the first administrator exists; the Web app then opens the setup flow."
					}
				},
				"required": [
					"configured"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SetupResponse": {
				"properties": {
					"user": {
						"properties": {
							"email": {
								"type": "string"
							},
							"username": {
								"type": "string"
							},
							"name": {
								"type": "string"
							},
							"id": {
								"type": "string"
							}
						},
						"required": [
							"email",
							"username",
							"name",
							"id"
						],
						"type": "object"
					}
				},
				"required": [
					"user"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SetupRequest": {
				"properties": {
					"email": {
						"type": "string",
						"format": "email"
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"username": {
						"type": "string",
						"description": "Sign-in and TAK login name: 3 to 32 lowercase letters, digits, dots, underscores or hyphens.",
						"pattern": "^[a-z0-9._-]{3,32}$"
					},
					"password": {
						"type": "string",
						"minLength": 12,
						"maxLength": 128
					},
					"token": {
						"type": "string",
						"minLength": 48,
						"maxLength": 128
					}
				},
				"required": [
					"email",
					"name",
					"username",
					"password",
					"token"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PresetKind": {
				"type": "string",
				"enum": [
					"meshtastic",
					"tak"
				]
			},
			"SettingsPresetSummaryDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"kind": {
						"$ref": "#/components/schemas/PresetKind"
					},
					"name": {
						"type": "string"
					},
					"description": {
						"type": "string",
						"nullable": true
					},
					"targetVersion": {
						"type": "string",
						"nullable": true,
						"description": "Meshtastic firmware or ATAK version the preset was made for."
					},
					"itemCount": {
						"type": "number",
						"format": "double",
						"description": "Number of settings or ATAK preference entries."
					},
					"version": {
						"type": "number",
						"format": "double"
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"kind",
					"name",
					"description",
					"targetVersion",
					"itemCount",
					"version",
					"createdAt",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SettingsPresetPage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/SettingsPresetSummaryDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PresetSourceDto": {
				"description": "Where a preset document came from. Free text such as `note` lets a person or an assistant say\nwhat they changed; Core never acts on it.",
				"properties": {
					"application": {
						"type": "string",
						"maxLength": 100
					},
					"applicationVersion": {
						"type": "string",
						"maxLength": 40
					},
					"exportedFrom": {
						"type": "string",
						"enum": [
							"event",
							"library"
						]
					},
					"note": {
						"type": "string",
						"maxLength": 1000
					}
				},
				"type": "object",
				"additionalProperties": false
			},
			"PresetMeshtasticSettings": {
				"description": "Values of Meshtastic firmware-profile fields, keyed by field key.",
				"properties": {},
				"type": "object",
				"additionalProperties": {
					"anyOf": [
						{
							"type": "string"
						},
						{
							"type": "number",
							"format": "double"
						},
						{
							"type": "boolean"
						}
					]
				}
			},
			"MeshtasticPresetContentDto": {
				"properties": {
					"firmwareVersion": {
						"type": "string",
						"description": "The firmware the settings were made for, such as `2.8`. Imports check every value against the\ntarget event's own firmware profile instead.",
						"maxLength": 20
					},
					"settings": {
						"$ref": "#/components/schemas/PresetMeshtasticSettings"
					}
				},
				"required": [
					"firmwareVersion",
					"settings"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PresetAtakTargetDto": {
				"description": "Who a portable ATAK preference is for. Groups and roles are named by their slug, because their\nIDs only exist in one event; importing maps each one explicitly onto the target event.",
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"event",
							"group",
							"role"
						]
					},
					"slug": {
						"type": "string",
						"maxLength": 100
					},
					"name": {
						"type": "string",
						"description": "Display name in the source event.",
						"maxLength": 200
					}
				},
				"required": [
					"type"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PresetAtakPreferenceDto": {
				"properties": {
					"target": {
						"$ref": "#/components/schemas/PresetAtakTargetDto"
					},
					"preference": {
						"type": "string",
						"maxLength": 200
					},
					"key": {
						"type": "string",
						"maxLength": 200
					},
					"type": {
						"$ref": "#/components/schemas/AtakPreferenceTypeDto"
					},
					"value": {
						"type": "string",
						"maxLength": 10000
					}
				},
				"required": [
					"target",
					"preference",
					"key",
					"type",
					"value"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakPresetContentDto": {
				"properties": {
					"atakVersion": {
						"type": "string",
						"maxLength": 40
					},
					"atakPreferences": {
						"items": {
							"$ref": "#/components/schemas/PresetAtakPreferenceDto"
						},
						"type": "array",
						"maxItems": 2000
					}
				},
				"required": [
					"atakPreferences"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PresetDocumentDto": {
				"description": "A portable, self-describing OpenMeshTak settings preset (`format` `openmeshtak-preset`). It is not\nan ATAK `.pref`, a Meshtastic `.cfg` or a firmware profile. It never holds channel keys,\npasswords, fixed PINs, certificates, tokens or member-specific values.",
				"properties": {
					"format": {
						"type": "string",
						"description": "Always `openmeshtak-preset`.",
						"maxLength": 40
					},
					"formatVersion": {
						"type": "integer",
						"format": "int32",
						"description": "Format version; this Core reads version 1."
					},
					"kind": {
						"$ref": "#/components/schemas/PresetKind"
					},
					"name": {
						"type": "string",
						"maxLength": 100
					},
					"description": {
						"type": "string",
						"maxLength": 1000
					},
					"about": {
						"type": "string",
						"description": "Human-readable explanation of the format. Ignored on import.",
						"maxLength": 4000
					},
					"exportedAt": {
						"type": "string",
						"format": "date-time"
					},
					"source": {
						"$ref": "#/components/schemas/PresetSourceDto"
					},
					"meshtastic": {
						"$ref": "#/components/schemas/MeshtasticPresetContentDto",
						"description": "Present when `kind` is `meshtastic`."
					},
					"tak": {
						"$ref": "#/components/schemas/TakPresetContentDto",
						"description": "Present when `kind` is `tak`."
					}
				},
				"required": [
					"format",
					"formatVersion",
					"kind",
					"name"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SettingsPresetDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"kind": {
						"$ref": "#/components/schemas/PresetKind"
					},
					"name": {
						"type": "string"
					},
					"description": {
						"type": "string",
						"nullable": true
					},
					"targetVersion": {
						"type": "string",
						"nullable": true,
						"description": "Meshtastic firmware or ATAK version the preset was made for."
					},
					"itemCount": {
						"type": "number",
						"format": "double",
						"description": "Number of settings or ATAK preference entries."
					},
					"version": {
						"type": "number",
						"format": "double"
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					},
					"document": {
						"$ref": "#/components/schemas/PresetDocumentDto"
					}
				},
				"required": [
					"id",
					"kind",
					"name",
					"description",
					"targetVersion",
					"itemCount",
					"version",
					"createdAt",
					"updatedAt",
					"document"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreateSettingsPresetRequest": {
				"properties": {
					"document": {
						"$ref": "#/components/schemas/PresetDocumentDto",
						"description": "Name and description default to the document's."
					},
					"name": {
						"type": "string",
						"maxLength": 100
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 1000
					}
				},
				"required": [
					"document"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateSettingsPresetRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					},
					"name": {
						"type": "string",
						"maxLength": 100
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 1000
					},
					"document": {
						"$ref": "#/components/schemas/PresetDocumentDto",
						"description": "Replaces the settings; omit to keep them. The kind cannot change."
					}
				},
				"required": [
					"version",
					"name",
					"description"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PresetSettingChangeDto": {
				"properties": {
					"key": {
						"type": "string"
					},
					"from": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "number",
								"format": "double"
							},
							{
								"type": "boolean"
							}
						],
						"nullable": true
					},
					"to": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "number",
								"format": "double"
							},
							{
								"type": "boolean"
							}
						]
					}
				},
				"required": [
					"key",
					"from",
					"to"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PresetSettingProblemDto": {
				"properties": {
					"key": {
						"type": "string"
					},
					"message": {
						"type": "string"
					}
				},
				"required": [
					"key",
					"message"
				],
				"type": "object",
				"additionalProperties": false
			},
			"MeshtasticPresetPreviewDto": {
				"description": "What importing a Meshtastic preset would change in the event's draft. Only `changed` values are\nwritten; invalid and unsupported values are left out and current values stay.",
				"properties": {
					"version": {
						"type": "number",
						"format": "double",
						"description": "Configuration version the preview was computed on; send it with the import."
					},
					"presetFirmwareVersion": {
						"type": "string"
					},
					"eventFirmwareVersion": {
						"type": "string"
					},
					"sameFirmwareLine": {
						"type": "boolean",
						"description": "`false` when the preset was made for another firmware line than the event uses."
					},
					"changed": {
						"items": {
							"$ref": "#/components/schemas/PresetSettingChangeDto"
						},
						"type": "array"
					},
					"unchanged": {
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"invalid": {
						"items": {
							"$ref": "#/components/schemas/PresetSettingProblemDto"
						},
						"type": "array",
						"description": "Values the event's firmware profile rejects; the current value stays."
					},
					"unsupported": {
						"items": {
							"type": "string"
						},
						"type": "array",
						"description": "Keys the event's firmware cannot set: unknown, managed by OpenMeshTak, secret or newer."
					},
					"notInPreset": {
						"items": {
							"type": "string"
						},
						"type": "array",
						"description": "Settings the preset does not mention; they keep their current value."
					},
					"secretsKept": {
						"items": {
							"type": "string"
						},
						"type": "array",
						"description": "Secrets set on the event. An import never changes them."
					},
					"confirmation": {
						"type": "string",
						"description": "Token to send with the import to confirm exactly this preview."
					}
				},
				"required": [
					"version",
					"presetFirmwareVersion",
					"eventFirmwareVersion",
					"sameFirmwareLine",
					"changed",
					"unchanged",
					"invalid",
					"unsupported",
					"notInPreset",
					"secretsKept",
					"confirmation"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PreviewMeshtasticPresetRequest": {
				"properties": {
					"document": {
						"$ref": "#/components/schemas/PresetDocumentDto"
					}
				},
				"required": [
					"document"
				],
				"type": "object",
				"additionalProperties": false
			},
			"FirmwareSettingsDocument": {
				"description": "Values of a firmware profile's editable fields, keyed by field key.",
				"properties": {},
				"type": "object",
				"additionalProperties": {
					"anyOf": [
						{
							"type": "string"
						},
						{
							"type": "number",
							"format": "double"
						},
						{
							"type": "boolean"
						}
					]
				}
			},
			"ConfigurationProblemDto": {
				"properties": {
					"field": {
						"type": "string"
					},
					"code": {
						"type": "string"
					},
					"message": {
						"type": "string"
					}
				},
				"required": [
					"field",
					"code",
					"message"
				],
				"type": "object",
				"additionalProperties": false
			},
			"MeshtasticConfigurationDto": {
				"properties": {
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"firmwareVersion": {
						"type": "string",
						"description": "Recommended firmware: a line such as `2.8` or a minimum patch such as `2.8.3`."
					},
					"effectiveMinimumVersion": {
						"type": "string",
						"nullable": true,
						"description": "The given patch or the profile minimum; `null` when the version is no longer supported."
					},
					"profileId": {
						"type": "string",
						"nullable": true
					},
					"verified": {
						"type": "boolean",
						"description": "`false` when no tested patch reaches the effective minimum version."
					},
					"settings": {
						"$ref": "#/components/schemas/FirmwareSettingsDocument"
					},
					"secretFields": {
						"items": {
							"type": "string"
						},
						"type": "array",
						"description": "Secret fields available for the event's firmware version, set through `PUT secrets`."
					},
					"secretsSet": {
						"items": {
							"type": "string"
						},
						"type": "array",
						"description": "Keys of secret fields that hold a value. The values themselves are never returned."
					},
					"problems": {
						"items": {
							"$ref": "#/components/schemas/ConfigurationProblemDto"
						},
						"type": "array",
						"description": "Why the stored configuration is not valid for this Core release; empty when it is."
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; 0 until the configuration is first saved."
					},
					"updatedAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					}
				},
				"required": [
					"eventId",
					"firmwareVersion",
					"effectiveMinimumVersion",
					"profileId",
					"verified",
					"settings",
					"secretFields",
					"secretsSet",
					"problems",
					"version",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ApplyMeshtasticPresetRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the preview returned.",
						"minimum": 0
					},
					"document": {
						"$ref": "#/components/schemas/PresetDocumentDto"
					},
					"confirmation": {
						"type": "string",
						"maxLength": 100
					}
				},
				"required": [
					"version",
					"document",
					"confirmation"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PresetTargetDto": {
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"group",
							"role"
						]
					},
					"slug": {
						"type": "string"
					},
					"name": {
						"type": "string"
					},
					"entryCount": {
						"type": "number",
						"format": "double"
					},
					"suggestedTargetId": {
						"allOf": [
							{
								"$ref": "#/components/schemas/Uuid"
							}
						],
						"nullable": true,
						"description": "A group or role of the target event with the same slug or name; never applied unless mapped."
					},
					"mapping": {
						"properties": {
							"targetId": {
								"allOf": [
									{
										"$ref": "#/components/schemas/Uuid"
									}
								],
								"nullable": true
							}
						},
						"required": [
							"targetId"
						],
						"type": "object",
						"description": "The mapping sent with this preview; absent while unmapped."
					}
				},
				"required": [
					"type",
					"slug",
					"name",
					"entryCount",
					"suggestedTargetId"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PresetEntryChangeDto": {
				"properties": {
					"target": {
						"$ref": "#/components/schemas/AtakPreferenceTargetDto"
					},
					"preference": {
						"type": "string"
					},
					"key": {
						"type": "string"
					},
					"type": {
						"$ref": "#/components/schemas/AtakPreferenceTypeDto"
					},
					"from": {
						"type": "string",
						"nullable": true,
						"description": "The event's current value for the same target and key; `null` when the key is new."
					},
					"to": {
						"type": "string"
					}
				},
				"required": [
					"target",
					"preference",
					"key",
					"type",
					"from",
					"to"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PresetEntryProblemDto": {
				"properties": {
					"target": {
						"$ref": "#/components/schemas/PresetAtakTargetDto"
					},
					"key": {
						"type": "string"
					},
					"message": {
						"type": "string"
					}
				},
				"required": [
					"target",
					"key",
					"message"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakPresetPreviewDto": {
				"description": "What importing a TAK preset would change in the event's ATAK preference draft. Entries are merged:\na preset entry replaces the event's entry for the same target and key, other entries stay.",
				"properties": {
					"version": {
						"type": "number",
						"format": "double",
						"description": "ATAK preference list version the preview was computed on; send it with the import."
					},
					"presetAtakVersion": {
						"type": "string",
						"nullable": true
					},
					"catalogAtakVersion": {
						"type": "string"
					},
					"targets": {
						"items": {
							"$ref": "#/components/schemas/PresetTargetDto"
						},
						"type": "array",
						"description": "Groups and roles the preset targets; each needs an explicit mapping."
					},
					"added": {
						"items": {
							"$ref": "#/components/schemas/PresetEntryChangeDto"
						},
						"type": "array"
					},
					"changed": {
						"items": {
							"$ref": "#/components/schemas/PresetEntryChangeDto"
						},
						"type": "array"
					},
					"unchanged": {
						"type": "number",
						"format": "double"
					},
					"invalid": {
						"items": {
							"$ref": "#/components/schemas/PresetEntryProblemDto"
						},
						"type": "array",
						"description": "Entries the catalog or the target event rejects; they are left out."
					},
					"skipped": {
						"type": "number",
						"format": "double",
						"description": "Entries of groups or roles mapped to `null`."
					},
					"confirmation": {
						"type": "string",
						"nullable": true,
						"description": "`null` until every group and role is mapped."
					}
				},
				"required": [
					"version",
					"presetAtakVersion",
					"catalogAtakVersion",
					"targets",
					"added",
					"changed",
					"unchanged",
					"invalid",
					"skipped",
					"confirmation"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PresetTargetMappingDto": {
				"description": "Maps a group or role of a preset onto the target event; `targetId` `null` leaves its entries out.",
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"group",
							"role"
						]
					},
					"slug": {
						"type": "string",
						"maxLength": 100
					},
					"targetId": {
						"allOf": [
							{
								"$ref": "#/components/schemas/Uuid"
							}
						],
						"nullable": true
					}
				},
				"required": [
					"type",
					"slug",
					"targetId"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PreviewTakPresetRequest": {
				"properties": {
					"document": {
						"$ref": "#/components/schemas/PresetDocumentDto"
					},
					"mappings": {
						"items": {
							"$ref": "#/components/schemas/PresetTargetMappingDto"
						},
						"type": "array",
						"maxItems": 500
					}
				},
				"required": [
					"document"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ApplyTakPresetRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the preview returned.",
						"minimum": 0
					},
					"document": {
						"$ref": "#/components/schemas/PresetDocumentDto"
					},
					"mappings": {
						"items": {
							"$ref": "#/components/schemas/PresetTargetMappingDto"
						},
						"type": "array",
						"maxItems": 500
					},
					"confirmation": {
						"type": "string",
						"maxLength": 100
					}
				},
				"required": [
					"version",
					"document",
					"mappings",
					"confirmation"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ServerLogEntryDto": {
				"properties": {
					"sequence": {
						"type": "number",
						"format": "double",
						"description": "Increases by one per line since Core started; poll with the last one seen."
					},
					"time": {
						"type": "string",
						"nullable": true,
						"description": "ISO 8601 time the line was written."
					},
					"level": {
						"$ref": "#/components/schemas/ServerLogLevel"
					},
					"message": {
						"type": "string"
					},
					"details": {
						"type": "string",
						"nullable": true,
						"description": "The remaining structured fields as JSON, already sanitized like the container log."
					}
				},
				"required": [
					"sequence",
					"time",
					"level",
					"message",
					"details"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ServerLogPage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/ServerLogEntryDto"
						},
						"type": "array"
					},
					"latestSequence": {
						"type": "number",
						"format": "double",
						"description": "Pass as `after` on the next request to receive only newer lines."
					},
					"reset": {
						"type": "boolean",
						"description": "True when `items` starts a fresh view: no `after` was given or Core restarted since."
					}
				},
				"required": [
					"items",
					"latestSequence",
					"reset"
				],
				"type": "object",
				"additionalProperties": false
			},
			"RegistrationMode": {
				"type": "string",
				"enum": [
					"closed",
					"invite",
					"open"
				],
				"description": "Who may create their own account: nobody (`closed`, the default), people holding a\nregistration invite (`invite`), or anyone who can reach the instance (`open`)."
			},
			"RegistrationStatusDto": {
				"properties": {
					"mode": {
						"$ref": "#/components/schemas/RegistrationMode"
					}
				},
				"required": [
					"mode"
				],
				"type": "object",
				"additionalProperties": false
			},
			"RegisterResponse": {
				"properties": {
					"user": {
						"properties": {
							"username": {
								"type": "string"
							},
							"displayName": {
								"type": "string"
							},
							"id": {
								"$ref": "#/components/schemas/Uuid"
							}
						},
						"required": [
							"username",
							"displayName",
							"id"
						],
						"type": "object"
					}
				},
				"required": [
					"user"
				],
				"type": "object",
				"additionalProperties": false
			},
			"RegisterRequest": {
				"properties": {
					"displayName": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"username": {
						"type": "string",
						"description": "Sign-in and TAK login name: 3 to 32 lowercase letters, digits, dots, underscores or hyphens.",
						"pattern": "^[a-z0-9._-]{3,32}$"
					},
					"password": {
						"type": "string",
						"minLength": 12,
						"maxLength": 128
					},
					"inviteToken": {
						"type": "string",
						"description": "Registration invite; required while registration is invite-only.",
						"maxLength": 200
					}
				},
				"required": [
					"displayName",
					"username",
					"password"
				],
				"type": "object",
				"additionalProperties": false
			},
			"RegistrationSettingsDto": {
				"properties": {
					"mode": {
						"$ref": "#/components/schemas/RegistrationMode"
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; `0` while the defaults were never saved."
					}
				},
				"required": [
					"mode",
					"version"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateRegistrationSettingsRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"minimum": 0
					},
					"mode": {
						"$ref": "#/components/schemas/RegistrationMode"
					}
				},
				"required": [
					"version",
					"mode"
				],
				"type": "object",
				"additionalProperties": false
			},
			"AccountInviteStatus": {
				"type": "string",
				"enum": [
					"open",
					"consumed",
					"revoked",
					"expired"
				]
			},
			"RegistrationInviteDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"status": {
						"$ref": "#/components/schemas/AccountInviteStatus"
					},
					"expiresAt": {
						"type": "string",
						"format": "date-time"
					},
					"consumedAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"revokedAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"status",
					"expiresAt",
					"consumedAt",
					"revokedAt",
					"createdAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreatedRegistrationInviteResponse": {
				"properties": {
					"invite": {
						"$ref": "#/components/schemas/RegistrationInviteDto"
					},
					"inviteUrl": {
						"type": "string",
						"description": "Single-use registration link, returned exactly once. The token travels in the URL fragment,\nwhich browsers never send to the server."
					}
				},
				"required": [
					"invite",
					"inviteUrl"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ProfileAssignment": {
				"properties": {
					"slug": {
						"type": "string"
					},
					"name": {
						"type": "string"
					}
				},
				"required": [
					"slug",
					"name"
				],
				"type": "object",
				"additionalProperties": false
			},
			"TakTeam": {
				"type": "string",
				"enum": [
					"White",
					"Yellow",
					"Orange",
					"Magenta",
					"Red",
					"Maroon",
					"Purple",
					"Dark Blue",
					"Blue",
					"Cyan",
					"Teal",
					"Green",
					"Dark Green",
					"Brown"
				],
				"description": "ATAK team colors as listed by the upstream Meshtastic `atak.proto` `Team` enum, using the\ndisplay names ATAK writes into CoT `__group` elements. Verified 2026-10-04."
			},
			"TakRole": {
				"type": "string",
				"enum": [
					"Team Member",
					"Team Lead",
					"HQ",
					"Sniper",
					"Medic",
					"Forward Observer",
					"RTO",
					"K9"
				],
				"description": "ATAK member roles from the upstream Meshtastic `atak.proto` `MemberRole` enum."
			},
			"ProfileTakServer": {
				"description": "The built-in TAK server participants enroll with from the dashboard.",
				"properties": {
					"hostName": {
						"type": "string",
						"nullable": true,
						"description": "`null` while the TAK server is not enabled."
					},
					"streamingPort": {
						"type": "number",
						"format": "double"
					}
				},
				"required": [
					"hostName",
					"streamingPort"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ProfileMeshtasticTakServer": {
				"description": "The Meshtastic app's local TAK server, which carries CoT over the mesh when there is no network.\n`meshChannel` is the value for the app's \"TAK Mesh Channel\": the channel's slot on this member's\ndevice, or `null` while that channel has not reached the device yet (then the primary channel\nis used).",
				"properties": {
					"meshChannel": {
						"properties": {
							"slot": {
								"type": "number",
								"format": "double"
							},
							"name": {
								"type": "string"
							}
						},
						"required": [
							"slot",
							"name"
						],
						"type": "object",
						"nullable": true
					}
				},
				"required": [
					"meshChannel"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ProfileChannel": {
				"description": "A channel the member receives. `included` channels come with the member's channel set;\n`on-site` channels are secret and handed out on site by a key holder before their release.",
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					},
					"primary": {
						"type": "boolean"
					},
					"uplinkEnabled": {
						"type": "boolean"
					},
					"downlinkEnabled": {
						"type": "boolean"
					},
					"positionPrecision": {
						"type": "number",
						"format": "double"
					},
					"delivery": {
						"type": "string",
						"enum": [
							"included",
							"on-site"
						]
					},
					"keyHolder": {
						"type": "boolean",
						"description": "Holds this secret channel ahead of the event to share it on site."
					}
				},
				"required": [
					"id",
					"name",
					"primary",
					"uplinkEnabled",
					"downlinkEnabled",
					"positionPrecision",
					"delivery",
					"keyHolder"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ProfileFirmware": {
				"description": "The Meshtastic firmware a participant must flash before importing OpenMeshTak settings.",
				"properties": {
					"recommendedVersion": {
						"type": "string",
						"description": "As recommended by the event, e.g. `2.8` or `2.8.3`."
					},
					"line": {
						"type": "string"
					},
					"minimumVersion": {
						"type": "string",
						"description": "Lowest version the settings are made for, e.g. `2.8.1`."
					},
					"channel": {
						"type": "string",
						"enum": [
							"stable",
							"beta",
							"alpha"
						]
					},
					"verified": {
						"type": "boolean",
						"description": "`false` while no tested patch reaches the minimum version."
					},
					"flasherUrl": {
						"type": "string"
					},
					"flashingNotes": {
						"type": "string",
						"nullable": true
					}
				},
				"required": [
					"recommendedVersion",
					"line",
					"minimumVersion",
					"channel",
					"verified",
					"flasherUrl",
					"flashingNotes"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ResolvedProfileDto": {
				"description": "The single resolved provisioning identity of one member in one event. Every TAK, Meshtastic and\nmission output is derived from this shape.",
				"properties": {
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"memberId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"userId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"source": {
						"type": "string",
						"enum": [
							"published",
							"preview"
						],
						"description": "`published` profiles use the event's latest configuration revision. `preview` profiles of\ndraft events use the current, unpublished configuration and are visible to administrators only."
					},
					"configurationRevision": {
						"properties": {
							"number": {
								"type": "number",
								"format": "double"
							},
							"id": {
								"$ref": "#/components/schemas/Uuid"
							}
						},
						"required": [
							"number",
							"id"
						],
						"type": "object",
						"nullable": true
					},
					"username": {
						"type": "string"
					},
					"callsign": {
						"type": "string"
					},
					"eventRole": {
						"$ref": "#/components/schemas/ProfileAssignment"
					},
					"group": {
						"$ref": "#/components/schemas/ProfileAssignment"
					},
					"tak": {
						"properties": {
							"meshtasticLocalServer": {
								"allOf": [
									{
										"$ref": "#/components/schemas/ProfileMeshtasticTakServer"
									}
								],
								"nullable": true,
								"description": "Meshtastic events also connect ATAK/iTAK to the Meshtastic app; `null` otherwise."
							},
							"server": {
								"$ref": "#/components/schemas/ProfileTakServer",
								"description": "Every member enrolls with the built-in TAK server for Data Packages and CoT over the network."
							},
							"serverGroups": {
								"items": {
									"type": "string"
								},
								"type": "array",
								"description": "The group's TAK server groups for an external TAK server; the built-in server ignores them."
							},
							"role": {
								"$ref": "#/components/schemas/TakRole"
							},
							"team": {
								"$ref": "#/components/schemas/TakTeam"
							},
							"callsign": {
								"type": "string"
							}
						},
						"required": [
							"meshtasticLocalServer",
							"server",
							"serverGroups",
							"role",
							"team",
							"callsign"
						],
						"type": "object"
					},
					"meshtastic": {
						"properties": {
							"firmware": {
								"allOf": [
									{
										"$ref": "#/components/schemas/ProfileFirmware"
									}
								],
								"nullable": true,
								"description": "`null` for configurations published before events had a firmware version."
							},
							"channels": {
								"items": {
									"$ref": "#/components/schemas/ProfileChannel"
								},
								"type": "array",
								"description": "Device order, primary first. Channels outside the member's audience are absent."
							},
							"shortName": {
								"type": "string",
								"nullable": true,
								"description": "`null` only in previews while the group has no short-name prefix."
							},
							"longName": {
								"type": "string"
							}
						},
						"required": [
							"firmware",
							"channels",
							"shortName",
							"longName"
						],
						"type": "object",
						"nullable": true,
						"description": "`null` when the event does not use Meshtastic."
					}
				},
				"required": [
					"eventId",
					"memberId",
					"userId",
					"source",
					"configurationRevision",
					"username",
					"callsign",
					"eventRole",
					"group",
					"tak",
					"meshtastic"
				],
				"type": "object",
				"additionalProperties": false
			},
			"MyEventMembershipDto": {
				"properties": {
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"eventName": {
						"type": "string"
					},
					"eventSlug": {
						"type": "string"
					},
					"timeZone": {
						"type": "string"
					},
					"memberId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"callsign": {
						"type": "string"
					}
				},
				"required": [
					"eventId",
					"eventName",
					"eventSlug",
					"timeZone",
					"memberId",
					"callsign"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ChannelHandoutDto": {
				"description": "A secret-bearing Meshtastic channel handout. It is returned only to the signed-in key holder,\nmust not be persisted by clients and becomes obsolete as soon as the channel key rotates.",
				"properties": {
					"channelId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"channelName": {
						"type": "string"
					},
					"primary": {
						"type": "boolean"
					},
					"pskVersion": {
						"type": "number",
						"format": "double"
					},
					"url": {
						"type": "string",
						"description": "Canonical Meshtastic ChannelSet URL; the fragment contains the channel key."
					}
				},
				"required": [
					"channelId",
					"channelName",
					"primary",
					"pskVersion",
					"url"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PrincipalDto": {
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"user",
							"api-client"
						]
					},
					"id": {
						"type": "string",
						"format": "uuid"
					},
					"name": {
						"type": "string"
					},
					"username": {
						"type": "string",
						"nullable": true,
						"description": "Sign-in and TAK login name of a user; `null` for API clients."
					},
					"hasPassword": {
						"type": "boolean",
						"description": "Whether a user can sign in with a password, which the TAK login needs; `false` for API clients."
					},
					"permissions": {
						"items": {
							"$ref": "#/components/schemas/PermissionGrantDto"
						},
						"type": "array",
						"description": "Effective grants, deduplicated across all sources."
					}
				},
				"required": [
					"type",
					"id",
					"name",
					"username",
					"hasPassword",
					"permissions"
				],
				"type": "object",
				"additionalProperties": false
			},
			"DataPackageKind": {
				"type": "string",
				"enum": [
					"package",
					"mission"
				],
				"description": "`package`: a Data Package, published as revisions and installed by members. `mission`: an ATAK\nData Sync mission edited with the same editor; each revision is synced to subscribed TAK apps."
			},
			"PackageSnapshotLayer": {
				"properties": {
					"id": {
						"type": "string"
					},
					"name": {
						"type": "string"
					},
					"sortOrder": {
						"type": "number",
						"format": "double"
					},
					"visible": {
						"type": "boolean"
					}
				},
				"required": [
					"id",
					"name",
					"sortOrder",
					"visible"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageObjectKind": {
				"type": "string",
				"enum": [
					"point",
					"line",
					"polygon",
					"circle",
					"rectangle",
					"ellipse",
					"route"
				]
			},
			"Position": {
				"items": {
					"type": "number",
					"format": "double"
				},
				"type": "array",
				"description": "GeoJSON position: `[longitude, latitude]` or `[longitude, latitude, altitudeMetresHae]`.",
				"minItems": 2,
				"maxItems": 3
			},
			"PointGeometry": {
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"Point"
						],
						"nullable": false
					},
					"coordinates": {
						"$ref": "#/components/schemas/Position"
					}
				},
				"required": [
					"type",
					"coordinates"
				],
				"type": "object",
				"additionalProperties": false
			},
			"LineStringGeometry": {
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"LineString"
						],
						"nullable": false
					},
					"coordinates": {
						"items": {
							"$ref": "#/components/schemas/Position"
						},
						"type": "array"
					}
				},
				"required": [
					"type",
					"coordinates"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PolygonGeometry": {
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"Polygon"
						],
						"nullable": false
					},
					"coordinates": {
						"items": {
							"items": {
								"$ref": "#/components/schemas/Position"
							},
							"type": "array"
						},
						"type": "array",
						"description": "Outer ring first, then holes; every ring repeats its first position at the end."
					}
				},
				"required": [
					"type",
					"coordinates"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CircleGeometry": {
				"description": "A true circle, which GeoJSON cannot express: centre plus radius in metres. It is never stored as\na silently approximated polygon and maps to ATAK `u-d-c-c` circles.",
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"Circle"
						],
						"nullable": false
					},
					"coordinates": {
						"$ref": "#/components/schemas/Position",
						"description": "Centre position."
					},
					"radius": {
						"type": "number",
						"format": "double",
						"description": "Radius in metres.",
						"minimum": 0.1,
						"maximum": 100000
					}
				},
				"required": [
					"type",
					"coordinates",
					"radius"
				],
				"type": "object",
				"additionalProperties": false
			},
			"RectangleGeometry": {
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"Rectangle"
						],
						"nullable": false
					},
					"coordinates": {
						"items": {
							"$ref": "#/components/schemas/Position"
						},
						"type": "array",
						"description": "Four corners in drawing order, without a repeated closing position."
					}
				},
				"required": [
					"type",
					"coordinates"
				],
				"type": "object",
				"additionalProperties": false
			},
			"EllipseGeometry": {
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"Ellipse"
						],
						"nullable": false
					},
					"coordinates": {
						"$ref": "#/components/schemas/Position",
						"description": "Centre; axes are semi-axis lengths, matching TAK's ellipse major/minor."
					},
					"major": {
						"type": "number",
						"format": "double",
						"minimum": 0.1,
						"maximum": 100000
					},
					"minor": {
						"type": "number",
						"format": "double",
						"minimum": 0.1,
						"maximum": 100000
					},
					"rotation": {
						"type": "number",
						"format": "double",
						"description": "Bearing of the major axis clockwise from north, in degrees.",
						"minimum": 0,
						"maximum": 360
					}
				},
				"required": [
					"type",
					"coordinates",
					"major",
					"minor",
					"rotation"
				],
				"type": "object",
				"additionalProperties": false
			},
			"RoutePointId": {
				"type": "string",
				"description": "TAK routes refer to their own stable point identifiers in navigation cues.",
				"minLength": 1,
				"maxLength": 128,
				"pattern": "^[^\\u0000-\\u001f]+$"
			},
			"RoutePoint": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/RoutePointId"
					},
					"type": {
						"type": "string",
						"enum": [
							"waypoint",
							"checkpoint"
						]
					},
					"name": {
						"type": "string",
						"maxLength": 100
					},
					"remarks": {
						"type": "string",
						"maxLength": 2000
					}
				},
				"required": [
					"id",
					"type",
					"name",
					"remarks"
				],
				"type": "object",
				"additionalProperties": false
			},
			"RouteOption": {
				"type": "string",
				"maxLength": 64
			},
			"RouteOptions": {
				"properties": {
					"transportationType": {
						"$ref": "#/components/schemas/RouteOption"
					},
					"method": {
						"$ref": "#/components/schemas/RouteOption"
					},
					"direction": {
						"$ref": "#/components/schemas/RouteOption"
					},
					"routeType": {
						"$ref": "#/components/schemas/RouteOption"
					},
					"order": {
						"$ref": "#/components/schemas/RouteOption"
					},
					"planningMethod": {
						"$ref": "#/components/schemas/RouteOption"
					},
					"prefix": {
						"$ref": "#/components/schemas/RouteOption"
					}
				},
				"type": "object",
				"additionalProperties": false
			},
			"RouteCueTrigger": {
				"properties": {
					"mode": {
						"type": "string",
						"enum": [
							"d",
							"t"
						]
					},
					"value": {
						"type": "integer",
						"format": "int32",
						"minimum": 0,
						"maximum": 2147483647
					}
				},
				"required": [
					"mode",
					"value"
				],
				"type": "object",
				"additionalProperties": false
			},
			"RouteNavigationCue": {
				"properties": {
					"pointId": {
						"$ref": "#/components/schemas/RoutePointId"
					},
					"text": {
						"type": "string",
						"maxLength": 2000
					},
					"voice": {
						"type": "string",
						"maxLength": 2000
					},
					"triggers": {
						"items": {
							"$ref": "#/components/schemas/RouteCueTrigger"
						},
						"type": "array",
						"maxItems": 16
					}
				},
				"required": [
					"pointId",
					"text",
					"voice",
					"triggers"
				],
				"type": "object",
				"additionalProperties": false
			},
			"RouteGeometry": {
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"Route"
						],
						"nullable": false
					},
					"coordinates": {
						"items": {
							"$ref": "#/components/schemas/Position"
						},
						"type": "array",
						"description": "Ordered route positions; each has matching metadata in `points`."
					},
					"points": {
						"items": {
							"$ref": "#/components/schemas/RoutePoint"
						},
						"type": "array",
						"maxItems": 10000
					},
					"options": {
						"$ref": "#/components/schemas/RouteOptions"
					},
					"navigationCues": {
						"items": {
							"$ref": "#/components/schemas/RouteNavigationCue"
						},
						"type": "array",
						"maxItems": 1000
					}
				},
				"required": [
					"type",
					"coordinates",
					"points",
					"options",
					"navigationCues"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageGeometry": {
				"anyOf": [
					{
						"$ref": "#/components/schemas/PointGeometry"
					},
					{
						"$ref": "#/components/schemas/LineStringGeometry"
					},
					{
						"$ref": "#/components/schemas/PolygonGeometry"
					},
					{
						"$ref": "#/components/schemas/CircleGeometry"
					},
					{
						"$ref": "#/components/schemas/RectangleGeometry"
					},
					{
						"$ref": "#/components/schemas/EllipseGeometry"
					},
					{
						"$ref": "#/components/schemas/RouteGeometry"
					}
				],
				"description": "RFC 7946 semantics in WGS84, with explicit parametric shapes and ordered TAK routes."
			},
			"HexColor": {
				"type": "string",
				"description": "Colour as `#RRGGBB`.",
				"pattern": "^#[0-9A-Fa-f]{6}$"
			},
			"StrokeStyle": {
				"type": "string",
				"enum": [
					"solid",
					"dashed",
					"dotted",
					"outlined",
					"custom"
				],
				"description": "How lines, outlines and circles are drawn; ATAK writes it as `strokeStyle`."
			},
			"HeightUnit": {
				"type": "number",
				"enum": [
					0,
					1,
					2,
					3,
					4,
					5
				],
				"description": "ATAK Span display units; the stored height itself is always metres."
			},
			"ExtrudeMode": {
				"type": "string",
				"enum": [
					"cylinder",
					"cone_down"
				]
			},
			"ArrowHeads": {
				"type": "string",
				"enum": [
					"none",
					"start",
					"end",
					"both"
				]
			},
			"DistanceUnit": {
				"type": "string",
				"enum": [
					"m",
					"km",
					"ft",
					"mi",
					"nm"
				]
			},
			"SectorStyle": {
				"properties": {
					"heading": {
						"type": "number",
						"format": "double",
						"description": "True heading clockwise from north.",
						"minimum": 0,
						"maximum": 360
					},
					"sweep": {
						"type": "number",
						"format": "double",
						"minimum": 1,
						"maximum": 360
					},
					"radius": {
						"type": "number",
						"format": "double",
						"description": "Metres.",
						"minimum": 0.1,
						"maximum": 100000
					},
					"rangeLines": {
						"type": "number",
						"format": "double",
						"nullable": true,
						"minimum": 1,
						"maximum": 60000
					},
					"displayLabels": {
						"type": "boolean"
					},
					"visible": {
						"type": "boolean"
					}
				},
				"required": [
					"heading",
					"sweep",
					"radius"
				],
				"type": "object",
				"additionalProperties": false
			},
			"BullseyeStyle": {
				"properties": {
					"ringDistance": {
						"type": "number",
						"format": "double",
						"minimum": 0.1,
						"maximum": 100000
					},
					"ringCount": {
						"type": "integer",
						"format": "int32",
						"minimum": 1,
						"maximum": 10
					},
					"ringsVisible": {
						"type": "boolean"
					},
					"edgeToCenter": {
						"type": "boolean"
					}
				},
				"required": [
					"ringDistance",
					"ringCount",
					"ringsVisible",
					"edgeToCenter"
				],
				"type": "object",
				"additionalProperties": false
			},
			"Record_string.string_": {
				"properties": {},
				"additionalProperties": {
					"type": "string"
				},
				"type": "object",
				"description": "Construct a type with a set of properties K of type T"
			},
			"TacticalGraphicStyle": {
				"description": "Source-confirmed 2525D control measures; this deliberately excludes single-point symbols.",
				"properties": {
					"sidc": {
						"type": "string",
						"pattern": "^11[0-9]{18}$"
					},
					"modifiers": {
						"$ref": "#/components/schemas/Record_string.string_",
						"description": "Native __milsym unitmodifier codes, bounded and validated against the selected graphic."
					}
				},
				"required": [
					"sidc",
					"modifiers"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageObjectStyle": {
				"properties": {
					"color": {
						"$ref": "#/components/schemas/HexColor",
						"description": "Marker, line and polygon outline colour."
					},
					"strokeWidth": {
						"type": "integer",
						"format": "int32",
						"description": "Line and outline width in pixels.",
						"minimum": 1,
						"maximum": 20
					},
					"fillOpacity": {
						"type": "number",
						"format": "double",
						"description": "Polygon and circle fill opacity.",
						"minimum": 0,
						"maximum": 1
					},
					"strokeStyle": {
						"$ref": "#/components/schemas/StrokeStyle",
						"description": "Line style of lines, outlines and circles; `solid` when left out."
					},
					"fillColor": {
						"allOf": [
							{
								"$ref": "#/components/schemas/HexColor"
							}
						],
						"nullable": true,
						"description": "Fill colour of areas and circles; `null` or left out fills with `color`."
					},
					"height": {
						"type": "number",
						"format": "double",
						"nullable": true,
						"description": "Shape extrusion height in metres, independent of coordinate altitude. Null/absent is unknown.",
						"minimum": -100000,
						"maximum": 100000
					},
					"heightUnit": {
						"allOf": [
							{
								"$ref": "#/components/schemas/HeightUnit"
							}
						],
						"nullable": true,
						"description": "Preferred TAK height display unit (0 km, 1 m, 2 mi, 3 yd, 4 ft, 5 NM)."
					},
					"extrudeMode": {
						"allOf": [
							{
								"$ref": "#/components/schemas/ExtrudeMode"
							}
						],
						"nullable": true,
						"description": "Circle extrusion mode; absent uses the client's default."
					},
					"arrowHeads": {
						"$ref": "#/components/schemas/ArrowHeads",
						"description": "Endpoint arrowheads for lines; absent means none. CoT/KML export the underlying line."
					},
					"arrowHeadSize": {
						"type": "integer",
						"format": "int32",
						"description": "Arrowhead length in screen pixels, independent of map zoom.",
						"minimum": 6,
						"maximum": 64
					},
					"routeDirectionArrows": {
						"type": "boolean",
						"description": "Direction indicators following route point order; absent means false. Web presentation only."
					},
					"routeArrowSpacing": {
						"type": "integer",
						"format": "int32",
						"description": "Distance between route indicators in screen pixels.",
						"minimum": 24,
						"maximum": 256
					},
					"rangeBearing": {
						"type": "boolean",
						"description": "Saved, exactly two-point true Range & Bearing line."
					},
					"distanceUnit": {
						"$ref": "#/components/schemas/DistanceUnit"
					},
					"sector": {
						"allOf": [
							{
								"$ref": "#/components/schemas/SectorStyle"
							}
						],
						"nullable": true,
						"description": "Coverage sector centred at a Point; polygon export is an approximation."
					},
					"corridorWidth": {
						"type": "number",
						"format": "double",
						"nullable": true,
						"description": "Full corridor width in metres around a line/route; null disables it.",
						"minimum": 1,
						"maximum": 10000
					},
					"dashPattern": {
						"items": {
							"type": "number",
							"format": "double"
						},
						"type": "array",
						"nullable": true,
						"description": "Alternating dash/gap lengths in screen pixels; custom line style only.",
						"minItems": 2,
						"maxItems": 8
					},
					"labelVisible": {
						"type": "boolean",
						"description": "Marker hideLabel / shape labels_on; defaults to visible."
					},
					"rangeCircle": {
						"type": "boolean",
						"description": "Native u-r-b-c-c presentation of Circle geometry."
					},
					"rangeRings": {
						"type": "integer",
						"format": "int32",
						"minimum": 1,
						"maximum": 10
					},
					"bullseye": {
						"allOf": [
							{
								"$ref": "#/components/schemas/BullseyeStyle"
							}
						],
						"nullable": true
					},
					"bearingUnit": {
						"type": "string",
						"enum": [
							"degrees",
							"mils",
							"radians",
							"warsaw-mils",
							"streck",
							"clock"
						]
					},
					"minimumSafeDistance": {
						"type": "number",
						"format": "double",
						"nullable": true,
						"description": "Distance outside a shape in metres; native MSD. Incompatible with route/R&B/bullseye.",
						"minimum": 0.1,
						"maximum": 5000
					},
					"msdColor": {
						"allOf": [
							{
								"$ref": "#/components/schemas/HexColor"
							}
						],
						"nullable": true
					},
					"tacticalGraphic": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TacticalGraphicStyle"
							}
						],
						"nullable": true
					}
				},
				"required": [
					"color",
					"strokeWidth",
					"fillOpacity"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CotType": {
				"type": "string",
				"description": "CoT event type, e.g. `b-m-p-s-m` (spot marker) or `a-f-G-U-C-I` (MIL-STD-2525 friendly\ninfantry).",
				"pattern": "^[a-z](-[A-Za-z0-9]+){1,15}$",
				"maxLength": 64
			},
			"TakMarker": {
				"description": "Optional TAK presentation of a marker, kept so ATAK packages round-trip without loss.",
				"properties": {
					"cotType": {
						"$ref": "#/components/schemas/CotType",
						"description": "Defaults to the spot marker `b-m-p-s-m`; `a-*` types are drawn as military symbols."
					},
					"iconsetPath": {
						"type": "string",
						"nullable": true,
						"description": "ATAK icon set path such as `COT_MAPPING_SPOTMAP/b-m-p-s-m/-35072` or an icon in a custom\nicon set. Passed through unchanged; the editor shows a plain marker when it cannot draw it.",
						"pattern": "^[^\\u0000-\\u001f<>\"]+$",
						"maxLength": 256
					}
				},
				"required": [
					"cotType",
					"iconsetPath"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageSnapshotObject": {
				"properties": {
					"supplementParent": {
						"type": "string",
						"description": "Derived export-only visual association; never written into canonical draft objects."
					},
					"id": {
						"type": "string"
					},
					"layerId": {
						"type": "string"
					},
					"kind": {
						"$ref": "#/components/schemas/PackageObjectKind"
					},
					"name": {
						"type": "string"
					},
					"description": {
						"type": "string",
						"nullable": true
					},
					"geometry": {
						"$ref": "#/components/schemas/PackageGeometry"
					},
					"style": {
						"$ref": "#/components/schemas/PackageObjectStyle"
					},
					"tak": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TakMarker"
							}
						],
						"nullable": true
					}
				},
				"required": [
					"id",
					"layerId",
					"kind",
					"name",
					"description",
					"geometry",
					"style",
					"tak"
				],
				"type": "object",
				"additionalProperties": false
			},
			"OfflineTileContentDto": {
				"description": "An ATAK tile cache of the revision, copied tile by tile through the tiles endpoint.",
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"layerId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"kind": {
						"type": "string",
						"enum": [
							"tiles"
						],
						"nullable": false
					},
					"name": {
						"type": "string"
					},
					"minZoom": {
						"type": "number",
						"format": "double"
					},
					"maxZoom": {
						"type": "number",
						"format": "double"
					},
					"bounds": {
						"items": {
							"type": "number",
							"format": "double"
						},
						"type": "array",
						"description": "West, south, east, north in WGS84 degrees."
					},
					"tiles": {
						"type": "number",
						"format": "double"
					},
					"size": {
						"type": "number",
						"format": "double",
						"description": "Size of the stored cache in bytes; the tiles alone usually need less."
					}
				},
				"required": [
					"id",
					"layerId",
					"kind",
					"name",
					"minZoom",
					"maxZoom",
					"bounds",
					"tiles",
					"size"
				],
				"type": "object",
				"additionalProperties": false
			},
			"OfflineImageContentDto": {
				"description": "A rubber sheet of the revision, downloaded as one image through the image endpoint.",
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"layerId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"kind": {
						"type": "string",
						"enum": [
							"image"
						],
						"nullable": false
					},
					"name": {
						"type": "string"
					},
					"corners": {
						"items": {
							"items": {
								"type": "number",
								"format": "double"
							},
							"type": "array"
						},
						"type": "array",
						"description": "Lower left, lower right, upper right and upper left corner as [longitude, latitude]."
					},
					"mediaType": {
						"type": "string",
						"enum": [
							"image/png",
							"image/jpeg"
						]
					},
					"sha256": {
						"type": "string",
						"description": "SHA-256 of the image bytes, checked by the browser after the download."
					},
					"size": {
						"type": "number",
						"format": "double"
					}
				},
				"required": [
					"id",
					"layerId",
					"kind",
					"name",
					"corners",
					"mediaType",
					"sha256",
					"size"
				],
				"type": "object",
				"additionalProperties": false
			},
			"OfflineContentDto": {
				"anyOf": [
					{
						"$ref": "#/components/schemas/OfflineTileContentDto"
					},
					{
						"$ref": "#/components/schemas/OfflineImageContentDto"
					}
				]
			},
			"OfflineSkippedContentDto": {
				"description": "Content of the revision that the offline view cannot show, listed so nothing is dropped silently.",
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					},
					"kind": {
						"type": "string"
					},
					"reason": {
						"type": "string",
						"enum": [
							"not-displayable",
							"unreadable"
						]
					}
				},
				"required": [
					"id",
					"name",
					"kind",
					"reason"
				],
				"type": "object",
				"additionalProperties": false
			},
			"OfflineSnapshotPackageDto": {
				"properties": {
					"packageId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"kind": {
						"$ref": "#/components/schemas/DataPackageKind"
					},
					"name": {
						"type": "string"
					},
					"revision": {
						"type": "number",
						"format": "double"
					},
					"revisionId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"snapshotHash": {
						"type": "string",
						"description": "SHA-256 of the published revision snapshot, for provenance."
					},
					"publishedAt": {
						"type": "string",
						"format": "date-time"
					},
					"layers": {
						"items": {
							"$ref": "#/components/schemas/PackageSnapshotLayer"
						},
						"type": "array"
					},
					"objects": {
						"items": {
							"$ref": "#/components/schemas/PackageSnapshotObject"
						},
						"type": "array"
					},
					"contents": {
						"items": {
							"$ref": "#/components/schemas/OfflineContentDto"
						},
						"type": "array"
					},
					"skippedContents": {
						"items": {
							"$ref": "#/components/schemas/OfflineSkippedContentDto"
						},
						"type": "array"
					}
				},
				"required": [
					"packageId",
					"kind",
					"name",
					"revision",
					"revisionId",
					"snapshotHash",
					"publishedAt",
					"layers",
					"objects",
					"contents",
					"skippedContents"
				],
				"type": "object",
				"additionalProperties": false
			},
			"OfflineSnapshotDto": {
				"description": "Everything the browser stores for the offline HQ view of one event: published revisions only,\nnever drafts, credentials, certificates, channel keys or member data.",
				"properties": {
					"format": {
						"type": "number",
						"format": "double",
						"description": "Version of this document; the browser refuses formats it does not know."
					},
					"event": {
						"properties": {
							"timeZone": {
								"type": "string"
							},
							"name": {
								"type": "string"
							},
							"id": {
								"$ref": "#/components/schemas/Uuid"
							}
						},
						"required": [
							"timeZone",
							"name",
							"id"
						],
						"type": "object"
					},
					"preparedAt": {
						"type": "string",
						"format": "date-time"
					},
					"packages": {
						"items": {
							"$ref": "#/components/schemas/OfflineSnapshotPackageDto"
						},
						"type": "array"
					},
					"skippedPackages": {
						"items": {
							"properties": {
								"reason": {
									"type": "string",
									"enum": [
										"not-published"
									],
									"nullable": false
								},
								"name": {
									"type": "string"
								},
								"packageId": {
									"$ref": "#/components/schemas/Uuid"
								}
							},
							"required": [
								"reason",
								"name",
								"packageId"
							],
							"type": "object"
						},
						"type": "array",
						"description": "Selected packages without a published revision."
					},
					"estimatedBytes": {
						"type": "number",
						"format": "double",
						"description": "Approximate bytes the browser has to store: tile caches plus images."
					}
				},
				"required": [
					"format",
					"event",
					"preparedAt",
					"packages",
					"skippedPackages",
					"estimatedBytes"
				],
				"type": "object",
				"additionalProperties": false
			},
			"OfflineSnapshotSelection": {
				"properties": {
					"packageId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"revision": {
						"type": "integer",
						"format": "int32",
						"description": "Published revision to take; the newest one when omitted.",
						"minimum": 1
					}
				},
				"required": [
					"packageId"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreateOfflineSnapshotRequest": {
				"properties": {
					"packages": {
						"items": {
							"$ref": "#/components/schemas/OfflineSnapshotSelection"
						},
						"type": "array",
						"description": "Published Data Packages or missions to make available offline.",
						"minItems": 1,
						"maxItems": 50
					}
				},
				"required": [
					"packages"
				],
				"type": "object",
				"additionalProperties": false
			},
			"OfflineTileDto": {
				"properties": {
					"z": {
						"type": "number",
						"format": "double"
					},
					"x": {
						"type": "number",
						"format": "double"
					},
					"y": {
						"type": "number",
						"format": "double"
					},
					"mediaType": {
						"type": "string",
						"enum": [
							"image/png",
							"image/jpeg"
						]
					},
					"data": {
						"type": "string",
						"description": "Base64-encoded tile image."
					},
					"sha256": {
						"type": "string",
						"description": "SHA-256 of the decoded tile bytes, checked by the browser."
					}
				},
				"required": [
					"z",
					"x",
					"y",
					"mediaType",
					"data",
					"sha256"
				],
				"type": "object",
				"additionalProperties": false
			},
			"OfflineTilePage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/OfflineTileDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"FirmwareReleaseDto": {
				"properties": {
					"version": {
						"type": "string",
						"description": "`major.minor.patch`, e.g. `2.8.1`."
					},
					"build": {
						"type": "string",
						"description": "Short commit hash of the build, e.g. `8e6a88d`."
					},
					"channel": {
						"type": "string",
						"enum": [
							"stable",
							"beta",
							"alpha"
						]
					},
					"support": {
						"type": "string",
						"enum": [
							"tested",
							"supported",
							"unsupported"
						],
						"description": "`tested`: in a shipped profile's line and verified on a device; `supported`: in a shipped\nprofile's line at or above its minimum; `unsupported`: no shipped profile covers it."
					},
					"profileId": {
						"type": "string",
						"nullable": true,
						"description": "The profile that covers the release, or null when it is unsupported."
					},
					"releaseUrl": {
						"type": "string",
						"description": "Upstream release page on GitHub."
					}
				},
				"required": [
					"version",
					"build",
					"channel",
					"support",
					"profileId",
					"releaseUrl"
				],
				"type": "object",
				"additionalProperties": false
			},
			"FirmwareReleaseListDto": {
				"properties": {
					"status": {
						"type": "string",
						"enum": [
							"current",
							"cached",
							"unknown",
							"disabled"
						],
						"description": "`current`: downloaded within the last 12 hours; `cached`: the last downloaded list, older than\n12 hours because the flasher could not be reached or a refresh is underway; `unknown`: no list\nhas ever been downloaded; `disabled`: lookups are switched off."
					},
					"fetchedAt": {
						"type": "string",
						"nullable": true,
						"description": "When the shown list was downloaded; null without a list."
					},
					"releases": {
						"items": {
							"$ref": "#/components/schemas/FirmwareReleaseDto"
						},
						"type": "array",
						"description": "Full releases only, newest first; revoked and pull-request builds are left out."
					}
				},
				"required": [
					"status",
					"fetchedAt",
					"releases"
				],
				"type": "object",
				"additionalProperties": false
			},
			"FirmwareReleaseSettingsDto": {
				"properties": {
					"checkEnabled": {
						"type": "boolean",
						"description": "Look up published releases from the official Meshtastic flasher."
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; 0 while the default is in use."
					}
				},
				"required": [
					"checkEnabled",
					"version"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateFirmwareReleaseSettingsRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"minimum": 0
					},
					"checkEnabled": {
						"type": "boolean"
					}
				},
				"required": [
					"version",
					"checkEnabled"
				],
				"type": "object",
				"additionalProperties": false
			},
			"FirmwareProfileSummaryDto": {
				"properties": {
					"id": {
						"type": "string",
						"description": "Stable profile id such as `meshtastic-2.8`."
					},
					"line": {
						"type": "string",
						"description": "Firmware line such as `2.8`."
					},
					"minVersion": {
						"type": "string",
						"description": "Lowest supported patch of the line, e.g. `2.8.1`."
					},
					"testedVersions": {
						"items": {
							"type": "string"
						},
						"type": "array",
						"description": "Patches verified on a real device. Newer patches are allowed but not verified."
					},
					"channel": {
						"type": "string",
						"enum": [
							"stable",
							"beta",
							"alpha"
						]
					},
					"default": {
						"type": "boolean"
					},
					"flasherUrl": {
						"type": "string"
					}
				},
				"required": [
					"id",
					"line",
					"minVersion",
					"testedVersions",
					"channel",
					"default",
					"flasherUrl"
				],
				"type": "object",
				"additionalProperties": false
			},
			"FirmwareSectionDto": {
				"properties": {
					"id": {
						"type": "string"
					},
					"label": {
						"type": "string"
					}
				},
				"required": [
					"id",
					"label"
				],
				"type": "object",
				"additionalProperties": false
			},
			"FirmwareFieldDto": {
				"properties": {
					"key": {
						"type": "string",
						"description": "Path in the Meshtastic `DeviceProfile`, e.g. `config.lora.hopLimit`."
					},
					"section": {
						"type": "string"
					},
					"type": {
						"type": "string",
						"enum": [
							"string",
							"integer",
							"number",
							"boolean",
							"enum",
							"bytes"
						]
					},
					"label": {
						"type": "string"
					},
					"description": {
						"type": "string"
					},
					"unit": {
						"type": "string"
					},
					"since": {
						"type": "string",
						"description": "First patch that has the field; hidden while the event's minimum version is lower."
					},
					"managed": {
						"type": "boolean",
						"description": "Resolved per member by OpenMeshTak and never editable."
					},
					"secret": {
						"type": "boolean",
						"description": "Write-only: set through the secrets endpoint and never returned. Has no default."
					},
					"maxBytes": {
						"type": "number",
						"format": "double"
					},
					"min": {
						"type": "number",
						"format": "double"
					},
					"max": {
						"type": "number",
						"format": "double"
					},
					"enum": {
						"type": "string",
						"description": "Name of the enum in `enums`."
					},
					"default": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "number",
								"format": "double"
							},
							{
								"type": "boolean"
							}
						]
					}
				},
				"required": [
					"key",
					"section",
					"type",
					"label",
					"since",
					"managed",
					"secret"
				],
				"type": "object",
				"additionalProperties": false
			},
			"FirmwareEnumValueDto": {
				"properties": {
					"value": {
						"type": "string",
						"description": "Upstream enum name stored in settings, e.g. `LONG_FAST`."
					},
					"label": {
						"type": "string"
					}
				},
				"required": [
					"value",
					"label"
				],
				"type": "object",
				"additionalProperties": false
			},
			"Record_string.FirmwareEnumValueDto-Array_": {
				"properties": {},
				"additionalProperties": {
					"items": {
						"$ref": "#/components/schemas/FirmwareEnumValueDto"
					},
					"type": "array"
				},
				"type": "object",
				"description": "Construct a type with a set of properties K of type T"
			},
			"FirmwareProfileDto": {
				"properties": {
					"id": {
						"type": "string",
						"description": "Stable profile id such as `meshtastic-2.8`."
					},
					"line": {
						"type": "string",
						"description": "Firmware line such as `2.8`."
					},
					"minVersion": {
						"type": "string",
						"description": "Lowest supported patch of the line, e.g. `2.8.1`."
					},
					"testedVersions": {
						"items": {
							"type": "string"
						},
						"type": "array",
						"description": "Patches verified on a real device. Newer patches are allowed but not verified."
					},
					"channel": {
						"type": "string",
						"enum": [
							"stable",
							"beta",
							"alpha"
						]
					},
					"default": {
						"type": "boolean"
					},
					"flasherUrl": {
						"type": "string"
					},
					"flashingNotes": {
						"type": "string",
						"nullable": true
					},
					"sha256": {
						"type": "string",
						"description": "SHA-256 of the profile file, recorded in configuration revisions."
					},
					"sections": {
						"items": {
							"$ref": "#/components/schemas/FirmwareSectionDto"
						},
						"type": "array"
					},
					"fields": {
						"items": {
							"$ref": "#/components/schemas/FirmwareFieldDto"
						},
						"type": "array"
					},
					"enums": {
						"$ref": "#/components/schemas/Record_string.FirmwareEnumValueDto-Array_",
						"description": "Allowed values per enum with English UI labels."
					}
				},
				"required": [
					"id",
					"line",
					"minVersion",
					"testedVersions",
					"channel",
					"default",
					"flasherUrl",
					"flashingNotes",
					"sha256",
					"sections",
					"fields",
					"enums"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateMeshtasticSettingsRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 0
					},
					"settings": {
						"$ref": "#/components/schemas/FirmwareSettingsDocument",
						"description": "Complete or partial document; missing fields take the profile default."
					}
				},
				"required": [
					"version",
					"settings"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SecretSettingsChanges": {
				"description": "Values of write-only secret fields; `null` clears a value.",
				"properties": {},
				"type": "object",
				"additionalProperties": {
					"anyOf": [
						{
							"type": "string"
						},
						{
							"type": "number",
							"format": "double"
						}
					],
					"nullable": true
				}
			},
			"UpdateMeshtasticSecretsRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 0
					},
					"secrets": {
						"$ref": "#/components/schemas/SecretSettingsChanges",
						"description": "Only the secrets to change; others keep their value."
					}
				},
				"required": [
					"version",
					"secrets"
				],
				"type": "object",
				"additionalProperties": false
			},
			"FirmwareChangeReportDto": {
				"properties": {
					"kept": {
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"dropped": {
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"invalid": {
						"items": {
							"type": "string"
						},
						"type": "array"
					},
					"added": {
						"items": {
							"type": "string"
						},
						"type": "array"
					}
				},
				"required": [
					"kept",
					"dropped",
					"invalid",
					"added"
				],
				"type": "object",
				"additionalProperties": false
			},
			"FirmwareChangePreviewDto": {
				"properties": {
					"firmwareVersion": {
						"type": "string"
					},
					"effectiveMinimumVersion": {
						"type": "string"
					},
					"profileId": {
						"type": "string"
					},
					"report": {
						"$ref": "#/components/schemas/FirmwareChangeReportDto"
					},
					"confirmation": {
						"type": "string",
						"nullable": true,
						"description": "Token to send with the change when it needs confirmation; `null` when only the minimum patch\nwithin the same line is raised, which never drops values."
					}
				},
				"required": [
					"firmwareVersion",
					"effectiveMinimumVersion",
					"profileId",
					"report",
					"confirmation"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PreviewFirmwareChangeRequest": {
				"properties": {
					"firmwareVersion": {
						"type": "string",
						"maxLength": 20
					}
				},
				"required": [
					"firmwareVersion"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ChangeFirmwareRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 0
					},
					"firmwareVersion": {
						"type": "string",
						"maxLength": 20
					},
					"confirmation": {
						"type": "string",
						"description": "The `confirmation` of the preview the administrator accepted."
					}
				},
				"required": [
					"version",
					"firmwareVersion"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ChannelPskKind": {
				"type": "string",
				"enum": [
					"none",
					"default",
					"aes128",
					"aes256"
				],
				"description": "How a channel encrypts traffic, derived from the PSK length as defined by upstream\n`channel.proto`: no key disables encryption, one byte selects a well-known default key, and 16\nor 32 bytes are AES-128 or AES-256 keys."
			},
			"ChannelPskInfo": {
				"description": "Describes the stored key without revealing it.",
				"properties": {
					"kind": {
						"$ref": "#/components/schemas/ChannelPskKind"
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Increments on every rotation."
					},
					"rotatedAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					}
				},
				"required": [
					"kind",
					"version",
					"rotatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"EventAudience": {
				"description": "A selection of event members: everyone who matches any listed group, role or member. Used by\nMeshtastic channels and Data Packages so both decide \"who receives this\" the same way.",
				"properties": {
					"groupIds": {
						"items": {
							"$ref": "#/components/schemas/Uuid"
						},
						"type": "array",
						"maxItems": 100
					},
					"roleIds": {
						"items": {
							"$ref": "#/components/schemas/Uuid"
						},
						"type": "array",
						"maxItems": 100
					},
					"memberIds": {
						"items": {
							"$ref": "#/components/schemas/Uuid"
						},
						"type": "array",
						"maxItems": 500
					}
				},
				"required": [
					"groupIds",
					"roleIds",
					"memberIds"
				],
				"type": "object",
				"additionalProperties": false
			},
			"MeshtasticChannelDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					},
					"sortOrder": {
						"type": "number",
						"format": "double",
						"description": "Channel order; the lowest value (oldest on ties) is the primary channel."
					},
					"primary": {
						"type": "boolean"
					},
					"psk": {
						"$ref": "#/components/schemas/ChannelPskInfo"
					},
					"uplinkEnabled": {
						"type": "boolean"
					},
					"downlinkEnabled": {
						"type": "boolean"
					},
					"positionPrecision": {
						"type": "number",
						"format": "double",
						"description": "Upstream position precision: 0 sends no position, 32 sends the full position."
					},
					"audience": {
						"$ref": "#/components/schemas/EventAudience"
					},
					"secret": {
						"type": "boolean",
						"description": "Secret channels withhold their key from every participant view and artifact except those of\nkey holders until the channel is released."
					},
					"releasedAt": {
						"type": "string",
						"nullable": true,
						"description": "When a secret channel was released to its whole audience; `null` while withheld.",
						"format": "date-time"
					},
					"keyHolders": {
						"$ref": "#/components/schemas/EventAudience",
						"description": "Members of the audience who receive a secret channel ahead of the event to share it on site.\nSelected like the audience; only members who are also in the audience count."
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; send it back unchanged with updates."
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"eventId",
					"name",
					"sortOrder",
					"primary",
					"psk",
					"uplinkEnabled",
					"downlinkEnabled",
					"positionPrecision",
					"audience",
					"secret",
					"releasedAt",
					"keyHolders",
					"version",
					"createdAt",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"MeshtasticChannelPage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/MeshtasticChannelDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"MeshtasticChannelName": {
				"type": "string",
				"description": "Meshtastic channel name; ASCII so the upstream 11-byte limit equals the character count.",
				"pattern": "^[A-Za-z0-9_-]{1,11}$"
			},
			"ChannelSortOrder": {
				"type": "integer",
				"format": "int32",
				"minimum": 0,
				"maximum": 1000
			},
			"PositionPrecision": {
				"type": "integer",
				"format": "int32",
				"minimum": 0,
				"maximum": 32
			},
			"CreateMeshtasticChannelRequest": {
				"properties": {
					"name": {
						"$ref": "#/components/schemas/MeshtasticChannelName"
					},
					"sortOrder": {
						"$ref": "#/components/schemas/ChannelSortOrder",
						"description": "Defaults to after the last channel."
					},
					"psk": {
						"type": "string",
						"description": "Optional base64 key: empty (no encryption), 1 byte (upstream default key), 16 or 32 bytes.\nOmit it to let the server generate a random 32-byte key.",
						"maxLength": 64
					},
					"uplinkEnabled": {
						"type": "boolean"
					},
					"downlinkEnabled": {
						"type": "boolean"
					},
					"positionPrecision": {
						"$ref": "#/components/schemas/PositionPrecision"
					},
					"audience": {
						"$ref": "#/components/schemas/EventAudience"
					},
					"secret": {
						"type": "boolean",
						"description": "Secret channels need an AES key. The primary channel may also be secret."
					},
					"keyHolders": {
						"$ref": "#/components/schemas/EventAudience",
						"description": "Only for secret channels."
					}
				},
				"required": [
					"name"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateMeshtasticChannelRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					},
					"name": {
						"$ref": "#/components/schemas/MeshtasticChannelName"
					},
					"sortOrder": {
						"$ref": "#/components/schemas/ChannelSortOrder"
					},
					"uplinkEnabled": {
						"type": "boolean"
					},
					"downlinkEnabled": {
						"type": "boolean"
					},
					"positionPrecision": {
						"$ref": "#/components/schemas/PositionPrecision"
					},
					"audience": {
						"$ref": "#/components/schemas/EventAudience"
					},
					"secret": {
						"type": "boolean",
						"description": "Turning a channel secret again withholds it until it is released anew."
					},
					"keyHolders": {
						"$ref": "#/components/schemas/EventAudience"
					}
				},
				"required": [
					"version",
					"name",
					"sortOrder",
					"uplinkEnabled",
					"downlinkEnabled",
					"positionPrecision",
					"audience",
					"secret",
					"keyHolders"
				],
				"type": "object",
				"additionalProperties": false
			},
			"RotateChannelPskRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					},
					"psk": {
						"type": "string",
						"description": "Optional replacement key in the same format as on creation; omit it for a random key.",
						"maxLength": 64
					}
				},
				"required": [
					"version"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ReleaseMeshtasticChannelRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					}
				},
				"required": [
					"version"
				],
				"type": "object",
				"additionalProperties": false
			},
			"RevealedChannelPsk": {
				"description": "Plain key material; returned only by the audited reveal action.",
				"properties": {
					"kind": {
						"$ref": "#/components/schemas/ChannelPskKind"
					},
					"version": {
						"type": "number",
						"format": "double"
					},
					"psk": {
						"type": "string",
						"description": "Base64 key exactly as Meshtastic clients expect it."
					}
				},
				"required": [
					"kind",
					"version",
					"psk"
				],
				"type": "object",
				"additionalProperties": false
			},
			"MemberDataPackageDto": {
				"description": "A published Data Package a member receives, at its newest revision.",
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					},
					"description": {
						"type": "string",
						"nullable": true
					},
					"revision": {
						"type": "number",
						"format": "double",
						"description": "Newest published revision; downloads always deliver this one."
					},
					"publishedAt": {
						"type": "string",
						"format": "date-time"
					},
					"installOnEnrollment": {
						"type": "boolean",
						"description": "The built-in TAK server installs it in the app right after the app enrolls."
					},
					"installOnConnection": {
						"type": "boolean",
						"description": "The built-in TAK server installs it, and every new revision, whenever the app connects."
					}
				},
				"required": [
					"id",
					"name",
					"description",
					"revision",
					"publishedAt",
					"installOnEnrollment",
					"installOnConnection"
				],
				"type": "object",
				"additionalProperties": false
			},
			"MemberClaimStatus": {
				"type": "string",
				"enum": [
					"open",
					"consumed",
					"revoked",
					"expired"
				]
			},
			"MemberClaimDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"memberId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"status": {
						"$ref": "#/components/schemas/MemberClaimStatus"
					},
					"expiresAt": {
						"type": "string",
						"format": "date-time"
					},
					"consumedAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"revokedAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"eventId",
					"memberId",
					"status",
					"expiresAt",
					"consumedAt",
					"revokedAt",
					"createdAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreatedMemberClaimResponse": {
				"properties": {
					"claim": {
						"$ref": "#/components/schemas/MemberClaimDto"
					},
					"token": {
						"type": "string",
						"description": "Single-use bearer value. Returned exactly once and never retrievable again."
					},
					"claimUrl": {
						"type": "string",
						"description": "Link for the participant. The token travels in the URL fragment, which browsers never send\nto the server; the Web application removes it from history before exchanging it."
					}
				},
				"required": [
					"claim",
					"token",
					"claimUrl"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ClaimExchangeResponse": {
				"properties": {
					"user": {
						"properties": {
							"displayName": {
								"type": "string"
							},
							"id": {
								"$ref": "#/components/schemas/Uuid"
							}
						},
						"required": [
							"displayName",
							"id"
						],
						"type": "object"
					},
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					}
				},
				"required": [
					"user",
					"eventId"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ClaimExchangeRequest": {
				"properties": {
					"token": {
						"type": "string",
						"maxLength": 200
					}
				},
				"required": [
					"token"
				],
				"type": "object",
				"additionalProperties": false
			},
			"BaseMapLayerDto": {
				"description": "One mutually exclusive XYZ base map; package overlays remain separate.",
				"properties": {
					"providerName": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"tileUrlTemplate": {
						"type": "string",
						"minLength": 1,
						"maxLength": 500
					},
					"attribution": {
						"type": "string",
						"minLength": 1,
						"maxLength": 300
					},
					"maxZoom": {
						"type": "integer",
						"format": "int32",
						"minimum": 1,
						"maximum": 22
					},
					"id": {
						"$ref": "#/components/schemas/Uuid"
					}
				},
				"required": [
					"providerName",
					"tileUrlTemplate",
					"attribution",
					"maxZoom",
					"id"
				],
				"type": "object",
				"additionalProperties": false
			},
			"MapSettingsDto": {
				"description": "Legacy top-level fields mirror the default layer.",
				"properties": {
					"providerName": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"tileUrlTemplate": {
						"type": "string",
						"minLength": 1,
						"maxLength": 500
					},
					"attribution": {
						"type": "string",
						"minLength": 1,
						"maxLength": 300
					},
					"maxZoom": {
						"type": "integer",
						"format": "int32",
						"minimum": 1,
						"maximum": 22
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; 0 while the default is in use."
					},
					"layers": {
						"items": {
							"$ref": "#/components/schemas/BaseMapLayerDto"
						},
						"type": "array"
					},
					"defaultLayerId": {
						"$ref": "#/components/schemas/Uuid"
					}
				},
				"required": [
					"providerName",
					"tileUrlTemplate",
					"attribution",
					"maxZoom",
					"version",
					"layers",
					"defaultLayerId"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateMapSettingsRequest": {
				"properties": {
					"providerName": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"tileUrlTemplate": {
						"type": "string",
						"minLength": 1,
						"maxLength": 500
					},
					"attribution": {
						"type": "string",
						"minLength": 1,
						"maxLength": 300
					},
					"maxZoom": {
						"type": "integer",
						"format": "int32",
						"minimum": 1,
						"maximum": 22
					},
					"version": {
						"type": "integer",
						"format": "int32",
						"minimum": 0
					},
					"layers": {
						"items": {
							"$ref": "#/components/schemas/BaseMapLayerDto"
						},
						"type": "array",
						"description": "Omit to update only the existing default layer, preserving other layers.",
						"minItems": 1,
						"maxItems": 10
					},
					"defaultLayerId": {
						"$ref": "#/components/schemas/Uuid",
						"description": "Must refer to a supplied layer; otherwise the first supplied layer is the default."
					}
				},
				"required": [
					"providerName",
					"tileUrlTemplate",
					"attribution",
					"maxZoom",
					"version"
				],
				"type": "object",
				"additionalProperties": false
			},
			"InstanceSettingsDto": {
				"description": "How this installation presents itself. Public, because the sign-in page shows it.",
				"properties": {
					"name": {
						"type": "string",
						"description": "Shown as the browser page title, on the sign-in page and in account emails."
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; 0 while the default is in use."
					}
				},
				"required": [
					"name",
					"version"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateInstanceSettingsRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"minimum": 0
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 60
					}
				},
				"required": [
					"version",
					"name"
				],
				"type": "object",
				"additionalProperties": false
			},
			"IconSettingsDto": {
				"properties": {
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; 0 until the first upload."
					},
					"icons": {
						"type": "number",
						"format": "double"
					},
					"sets": {
						"type": "number",
						"format": "double"
					},
					"groups": {
						"type": "number",
						"format": "double"
					},
					"updatedAt": {
						"type": "string",
						"nullable": true
					}
				},
				"required": [
					"version",
					"icons",
					"sets",
					"groups",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ImportReportEntry": {
				"properties": {
					"feature": {
						"type": "string",
						"description": "Which input feature this is about, e.g. `Feature 3 (Rally point)`."
					},
					"message": {
						"type": "string"
					}
				},
				"required": [
					"feature",
					"message"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateIconSettingsResult": {
				"properties": {
					"settings": {
						"$ref": "#/components/schemas/IconSettingsDto"
					},
					"accepted": {
						"type": "number",
						"format": "double"
					},
					"rejected": {
						"items": {
							"$ref": "#/components/schemas/ImportReportEntry"
						},
						"type": "array"
					}
				},
				"required": [
					"settings",
					"accepted",
					"rejected"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageIconDto": {
				"description": "Operator-provided PNG icon, identified by its original TAK path.",
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"path": {
						"type": "string"
					},
					"setName": {
						"type": "string"
					},
					"group": {
						"type": "string"
					},
					"filename": {
						"type": "string"
					},
					"cotType": {
						"type": "string",
						"nullable": true
					},
					"width": {
						"type": "number",
						"format": "double"
					},
					"height": {
						"type": "number",
						"format": "double"
					}
				},
				"required": [
					"id",
					"path",
					"setName",
					"group",
					"filename",
					"cotType",
					"width",
					"height"
				],
				"type": "object",
				"additionalProperties": false
			},
			"InstanceIconCatalogue": {
				"properties": {
					"version": {
						"type": "number",
						"format": "double"
					},
					"icons": {
						"items": {
							"$ref": "#/components/schemas/PackageIconDto"
						},
						"type": "array"
					}
				},
				"required": [
					"version",
					"icons"
				],
				"type": "object",
				"additionalProperties": false
			},
			"HealthResponse": {
				"properties": {
					"status": {
						"type": "string",
						"enum": [
							"ok"
						],
						"nullable": false
					},
					"service": {
						"type": "string",
						"enum": [
							"openmeshtak"
						],
						"nullable": false
					},
					"version": {
						"type": "string",
						"description": "Core release version. Core and Web are released together: a Web app works with every Core of\nthe same major and minor version and warns otherwise.",
						"example": "0.1.0"
					},
					"timestamp": {
						"type": "string"
					}
				},
				"required": [
					"status",
					"service",
					"version",
					"timestamp"
				],
				"type": "object",
				"additionalProperties": false
			},
			"EventOverview": {
				"properties": {
					"memberCount": {
						"type": "number",
						"format": "double",
						"description": "Members of the event, whatever their group or role."
					},
					"openSyncIssueCount": {
						"type": "number",
						"format": "double",
						"description": "Synchronized members that could not be resolved and wait for an administrator."
					},
					"publishedRevision": {
						"type": "number",
						"format": "double",
						"nullable": true,
						"description": "Number of the configuration revision participants receive; `null` before the first one."
					},
					"unpublishedChanges": {
						"type": "boolean",
						"description": "Whether an active event's current configuration differs from its published revision, so\nparticipants do not see the changes until someone publishes. Always `false` for drafts\n(activation publishes) and archived events (read-only)."
					}
				},
				"required": [
					"memberCount",
					"openSyncIssueCount",
					"publishedRevision",
					"unpublishedChanges"
				],
				"type": "object",
				"additionalProperties": false
			},
			"EventStatus": {
				"type": "string",
				"enum": [
					"draft",
					"active",
					"archived"
				]
			},
			"EventListItemDto": {
				"description": "An event in the overview list, with the facts organizers act on.",
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					},
					"slug": {
						"type": "string"
					},
					"timeZone": {
						"type": "string",
						"description": "IANA time-zone identifier used for event-local schedules, e.g. `Europe/Berlin`."
					},
					"status": {
						"$ref": "#/components/schemas/EventStatus"
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; send it back unchanged with updates."
					},
					"startsAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"endsAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"takLoginTokenDays": {
						"type": "integer",
						"format": "int32",
						"description": "Days a TAK login token (QR code or typed instead of the password) stays valid. `0` keeps it valid\nuntil the event's end date, or with no end date it never expires. Tokens stop working anyway once the user\nloses TAK access.",
						"minimum": 0,
						"maximum": 3650
					},
					"permanentAccounts": {
						"type": "boolean",
						"description": "Accounts created for this event (new members, synchronized participants) are permanent instead\nof event accounts that are deleted when the event is archived."
					},
					"meshtasticEnabled": {
						"type": "boolean",
						"description": "The event provisions Meshtastic radios. When off, profiles carry no Meshtastic part, radio\ndownloads are unavailable and channels and radio settings stay stored but unused. Like other\nconfiguration it reaches participants of an active event with the next published revision."
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					},
					"overview": {
						"$ref": "#/components/schemas/EventOverview"
					}
				},
				"required": [
					"id",
					"name",
					"slug",
					"timeZone",
					"status",
					"version",
					"startsAt",
					"endsAt",
					"takLoginTokenDays",
					"permanentAccounts",
					"meshtasticEnabled",
					"createdAt",
					"updatedAt",
					"overview"
				],
				"type": "object",
				"additionalProperties": false
			},
			"EventPage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/EventListItemDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"EventDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					},
					"slug": {
						"type": "string"
					},
					"timeZone": {
						"type": "string",
						"description": "IANA time-zone identifier used for event-local schedules, e.g. `Europe/Berlin`."
					},
					"status": {
						"$ref": "#/components/schemas/EventStatus"
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; send it back unchanged with updates."
					},
					"startsAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"endsAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"takLoginTokenDays": {
						"type": "integer",
						"format": "int32",
						"description": "Days a TAK login token (QR code or typed instead of the password) stays valid. `0` keeps it valid\nuntil the event's end date, or with no end date it never expires. Tokens stop working anyway once the user\nloses TAK access.",
						"minimum": 0,
						"maximum": 3650
					},
					"permanentAccounts": {
						"type": "boolean",
						"description": "Accounts created for this event (new members, synchronized participants) are permanent instead\nof event accounts that are deleted when the event is archived."
					},
					"meshtasticEnabled": {
						"type": "boolean",
						"description": "The event provisions Meshtastic radios. When off, profiles carry no Meshtastic part, radio\ndownloads are unavailable and channels and radio settings stay stored but unused. Like other\nconfiguration it reaches participants of an active event with the next published revision."
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"name",
					"slug",
					"timeZone",
					"status",
					"version",
					"startsAt",
					"endsAt",
					"takLoginTokenDays",
					"permanentAccounts",
					"meshtasticEnabled",
					"createdAt",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreateEventRequest": {
				"properties": {
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"slug": {
						"$ref": "#/components/schemas/Slug"
					},
					"timeZone": {
						"type": "string",
						"description": "IANA time-zone identifier. Fixed offsets such as `+01:00` are rejected.",
						"minLength": 1,
						"maxLength": 64
					},
					"startsAt": {
						"type": "string",
						"nullable": true,
						"description": "Descriptive start instant; it never changes the lifecycle state.",
						"format": "date-time"
					},
					"endsAt": {
						"type": "string",
						"nullable": true,
						"description": "Descriptive end instant; it never changes the lifecycle state.",
						"format": "date-time"
					},
					"takLoginTokenDays": {
						"type": "integer",
						"format": "int32",
						"description": "Days a TAK login token (QR code or typed instead of the password) stays valid. `0` keeps it valid\nuntil the event's end date, or with no end date it never expires. Defaults to `0`. Tokens stop working anyway once the user\nloses TAK access.",
						"minimum": 0,
						"maximum": 3650
					},
					"permanentAccounts": {
						"type": "boolean",
						"description": "Accounts created for this event (new members, synchronized participants) are permanent instead\nof event accounts that are deleted when the event is archived. Defaults to `false`."
					},
					"meshtasticEnabled": {
						"type": "boolean",
						"description": "The event provisions Meshtastic radios. Defaults to `false`, a TAK-only event."
					}
				},
				"required": [
					"name",
					"slug",
					"timeZone"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateEventRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"slug": {
						"$ref": "#/components/schemas/Slug"
					},
					"timeZone": {
						"type": "string",
						"minLength": 1,
						"maxLength": 64
					},
					"startsAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"endsAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"takLoginTokenDays": {
						"type": "integer",
						"format": "int32",
						"description": "Days a TAK login token (QR code or typed instead of the password) stays valid. `0` keeps it valid\nuntil the event's end date, or with no end date it never expires. Omitted keeps the current value. Tokens stop working anyway once the user\nloses TAK access.",
						"minimum": 0,
						"maximum": 3650
					},
					"permanentAccounts": {
						"type": "boolean",
						"description": "Accounts created for this event (new members, synchronized participants) are permanent instead\nof event accounts that are deleted when the event is archived. Omitted keeps the current value."
					},
					"meshtasticEnabled": {
						"type": "boolean",
						"description": "The event provisions Meshtastic radios. Omitted keeps the current value."
					}
				},
				"required": [
					"version",
					"name",
					"slug",
					"timeZone",
					"startsAt",
					"endsAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"EventTransitionRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					}
				},
				"required": [
					"version"
				],
				"type": "object",
				"additionalProperties": false
			},
			"EventAccountsMadePermanentResponse": {
				"properties": {
					"accounts": {
						"type": "number",
						"format": "double",
						"description": "Event accounts of the event that are now permanent."
					}
				},
				"required": [
					"accounts"
				],
				"type": "object",
				"additionalProperties": false
			},
			"EventRoleDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					},
					"slug": {
						"type": "string",
						"description": "Stable key used by integrations, unique within the event, e.g. `participant`."
					},
					"description": {
						"type": "string",
						"nullable": true
					},
					"takRoleOverride": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TakRole"
							}
						],
						"nullable": true,
						"description": "ATAK role for members of this role, replacing their event group's default TAK role, e.g.\n`Team Lead` for platoon leaders. `null` keeps the group's role."
					},
					"seesAllTakGroups": {
						"type": "boolean",
						"description": "Members of this role see and reach every event group when the event separates TAK groups,\ne.g. platoon leaders."
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; send it back unchanged with updates."
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"eventId",
					"name",
					"slug",
					"description",
					"takRoleOverride",
					"seesAllTakGroups",
					"version",
					"createdAt",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"EventRolePage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/EventRoleDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreateEventRoleRequest": {
				"properties": {
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"slug": {
						"$ref": "#/components/schemas/Slug"
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 500
					},
					"takRoleOverride": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TakRole"
							}
						],
						"nullable": true
					},
					"seesAllTakGroups": {
						"type": "boolean"
					}
				},
				"required": [
					"name",
					"slug"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateEventRoleRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"slug": {
						"$ref": "#/components/schemas/Slug"
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 500
					},
					"takRoleOverride": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TakRole"
							}
						],
						"nullable": true,
						"description": "Omit to keep the current override; `null` removes it."
					},
					"seesAllTakGroups": {
						"type": "boolean",
						"description": "Omit to keep the current value."
					}
				},
				"required": [
					"version",
					"name",
					"slug",
					"description"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SyncIssueStatus": {
				"type": "string",
				"enum": [
					"open",
					"resolved"
				]
			},
			"SyncIssueReason": {
				"properties": {
					"field": {
						"type": "string",
						"enum": [
							"eventRole",
							"group",
							"callsign",
							"shortName"
						]
					},
					"code": {
						"type": "string",
						"enum": [
							"NOT_FOUND",
							"CONFLICT",
							"TOO_LONG",
							"EXHAUSTED"
						]
					},
					"message": {
						"type": "string"
					}
				},
				"required": [
					"field",
					"code",
					"message"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SyncIssueDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"provider": {
						"type": "string"
					},
					"externalId": {
						"type": "string"
					},
					"status": {
						"$ref": "#/components/schemas/SyncIssueStatus"
					},
					"username": {
						"type": "string"
					},
					"requestedRole": {
						"type": "string"
					},
					"requestedGroup": {
						"type": "string"
					},
					"reasons": {
						"items": {
							"$ref": "#/components/schemas/SyncIssueReason"
						},
						"type": "array"
					},
					"occurrences": {
						"type": "number",
						"format": "double",
						"description": "How often the integration reported this unresolved member."
					},
					"resolvedAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"eventId",
					"provider",
					"externalId",
					"status",
					"username",
					"requestedRole",
					"requestedGroup",
					"reasons",
					"occurrences",
					"resolvedAt",
					"createdAt",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SyncIssuePage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/SyncIssueDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"EventAssignmentSummary": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"slug": {
						"type": "string"
					},
					"name": {
						"type": "string"
					}
				},
				"required": [
					"id",
					"slug",
					"name"
				],
				"type": "object",
				"additionalProperties": false
			},
			"EventMemberDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"userId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"displayName": {
						"type": "string"
					},
					"username": {
						"type": "string",
						"description": "Name reported by the integration for this event."
					},
					"callsign": {
						"type": "string",
						"description": "Effective callsign, unique within the event; also the Meshtastic long name."
					},
					"callsignOverride": {
						"type": "string",
						"nullable": true,
						"description": "Administrator override replacing the group's callsign format for this member."
					},
					"shortName": {
						"type": "string",
						"nullable": true,
						"description": "Meshtastic short name such as `B1`; `null` while the group has no short-name prefix."
					},
					"eventRole": {
						"$ref": "#/components/schemas/EventAssignmentSummary"
					},
					"eventGroup": {
						"$ref": "#/components/schemas/EventAssignmentSummary"
					},
					"enrolledTakApps": {
						"type": "number",
						"format": "double",
						"description": "TAK apps the member's user has enrolled with the built-in TAK server and that may still\nconnect (valid client certificates). Certificates belong to the user, not to one event."
					},
					"version": {
						"type": "number",
						"format": "double"
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"eventId",
					"userId",
					"displayName",
					"username",
					"callsign",
					"callsignOverride",
					"shortName",
					"eventRole",
					"eventGroup",
					"enrolledTakApps",
					"version",
					"createdAt",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"MemberSyncOutcome": {
				"properties": {
					"outcome": {
						"type": "string",
						"enum": [
							"member"
						],
						"nullable": false
					},
					"change": {
						"type": "string",
						"enum": [
							"created",
							"updated",
							"unchanged"
						]
					},
					"member": {
						"$ref": "#/components/schemas/EventMemberDto"
					}
				},
				"required": [
					"outcome",
					"change",
					"member"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SyncIssueOutcome": {
				"properties": {
					"outcome": {
						"type": "string",
						"enum": [
							"sync-issue"
						],
						"nullable": false
					},
					"syncIssue": {
						"$ref": "#/components/schemas/SyncIssueDto"
					}
				},
				"required": [
					"outcome",
					"syncIssue"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ExternalMemberSyncResult": {
				"anyOf": [
					{
						"$ref": "#/components/schemas/MemberSyncOutcome"
					},
					{
						"$ref": "#/components/schemas/SyncIssueOutcome"
					}
				],
				"description": "Either the resolved membership or the recorded sync issue; never a credential or session."
			},
			"RetrySyncIssueRequest": {
				"properties": {
					"callsignOverride": {
						"type": "string",
						"description": "Callsign to use instead of the group format, e.g. to resolve a callsign conflict.",
						"minLength": 1,
						"maxLength": 39
					}
				},
				"type": "object",
				"additionalProperties": false
			},
			"ReorderGroupMembersRequest": {
				"properties": {
					"memberIds": {
						"items": {
							"type": "string"
						},
						"type": "array",
						"description": "Every member of the group exactly once, in the new short-name order (first becomes 1)."
					},
					"notifyMembers": {
						"type": "boolean",
						"description": "Emails members whose short name changed, if they have a confirmed address, asking them to set\nup their radio again. Otherwise the change is only shown to the administrator."
					}
				},
				"required": [
					"memberIds"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ExternalProvider": {
				"type": "string",
				"description": "Opaque lowercase namespace of the external system, e.g. `discord`. It is not a login provider.",
				"pattern": "^[a-z0-9][a-z0-9-]{0,31}$"
			},
			"ExternalId": {
				"type": "string",
				"description": "Identifier of the person inside the external system, e.g. a Discord user ID.",
				"pattern": "^[A-Za-z0-9._:@-]{1,128}$"
			},
			"ExternalMemberSyncRequest": {
				"properties": {
					"username": {
						"type": "string",
						"description": "Name reported by the external system; used for display and callsigns.",
						"minLength": 1,
						"maxLength": 100
					},
					"eventRole": {
						"$ref": "#/components/schemas/Slug",
						"description": "Slug of an existing event role."
					},
					"group": {
						"$ref": "#/components/schemas/Slug",
						"description": "Slug of an existing event group."
					}
				},
				"required": [
					"username",
					"eventRole",
					"group"
				],
				"type": "object",
				"additionalProperties": false
			},
			"EventMemberPage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/EventMemberDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreateEventMemberRequest": {
				"properties": {
					"userId": {
						"$ref": "#/components/schemas/Uuid",
						"description": "Existing OpenMeshTak user; their display name feeds the group's callsign format."
					},
					"eventRoleId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"eventGroupId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"callsignOverride": {
						"type": "string",
						"nullable": true,
						"description": "Callsign to use instead of the group format.",
						"minLength": 1,
						"maxLength": 39
					}
				},
				"required": [
					"userId",
					"eventRoleId",
					"eventGroupId"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreatedEventMemberAccountResponse": {
				"properties": {
					"member": {
						"$ref": "#/components/schemas/EventMemberDto"
					},
					"user": {
						"$ref": "#/components/schemas/UserDto"
					},
					"setupLink": {
						"$ref": "#/components/schemas/SetupLinkDto"
					}
				},
				"required": [
					"member",
					"user",
					"setupLink"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreateEventMemberAccountRequest": {
				"properties": {
					"eventRoleId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"eventGroupId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"callsignOverride": {
						"type": "string",
						"nullable": true,
						"description": "Callsign to use instead of the group format.",
						"minLength": 1,
						"maxLength": 39
					},
					"displayName": {
						"type": "string",
						"description": "Name of the new person; it feeds the group's callsign format.",
						"minLength": 1,
						"maxLength": 100
					},
					"username": {
						"type": "string",
						"description": "Sign-in and TAK login name; derived from the display name when omitted.",
						"pattern": "^[a-z0-9._-]{3,32}$"
					}
				},
				"required": [
					"eventRoleId",
					"eventGroupId",
					"displayName"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateEventMemberRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					},
					"eventRoleId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"eventGroupId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"callsignOverride": {
						"type": "string",
						"nullable": true,
						"description": "Callsign to use instead of the group format; `null` returns to the group format.",
						"minLength": 1,
						"maxLength": 39
					}
				},
				"required": [
					"version",
					"eventRoleId",
					"eventGroupId",
					"callsignOverride"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ProvisioningName": {
				"type": "string",
				"description": "Identifier used for TAK server groups.",
				"pattern": "^[A-Za-z0-9_-]+$",
				"minLength": 1,
				"maxLength": 64
			},
			"GroupProvisioning": {
				"properties": {
					"callsignFormat": {
						"type": "string",
						"description": "Callsign template. Allowed placeholders: `{username}` (required) and `{group}`.\nExample: `{username} [Bravo]`.",
						"minLength": 1,
						"maxLength": 64
					},
					"shortNamePrefix": {
						"type": "string",
						"nullable": true,
						"description": "Meshtastic short-name prefix, e.g. `B` for `B1`, `B2`. Unique within the event.\n`null` until chosen; activation requires it.",
						"pattern": "^[A-Z0-9]{1,3}$"
					},
					"tak": {
						"properties": {
							"serverGroups": {
								"items": {
									"$ref": "#/components/schemas/ProvisioningName"
								},
								"type": "array",
								"description": "Group names for an external TAK server, passed on unchanged in each member's profile for\nintegrations. The built-in TAK server ignores them; the event alone decides who sees whom.",
								"maxItems": 20
							},
							"role": {
								"$ref": "#/components/schemas/TakRole"
							},
							"team": {
								"$ref": "#/components/schemas/TakTeam"
							}
						},
						"required": [
							"serverGroups",
							"role",
							"team"
						],
						"type": "object"
					}
				},
				"required": [
					"callsignFormat",
					"shortNamePrefix",
					"tak"
				],
				"type": "object",
				"additionalProperties": false
			},
			"EventGroupDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					},
					"slug": {
						"type": "string",
						"description": "Stable key used by integrations, unique within the event, e.g. `bravo`."
					},
					"description": {
						"type": "string",
						"nullable": true
					},
					"provisioning": {
						"$ref": "#/components/schemas/GroupProvisioning",
						"description": "Callsign, TAK and short-name settings shared by every member of the group."
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; send it back unchanged with updates."
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"eventId",
					"name",
					"slug",
					"description",
					"provisioning",
					"version",
					"createdAt",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"EventGroupPage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/EventGroupDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreateEventGroupRequest": {
				"properties": {
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"slug": {
						"$ref": "#/components/schemas/Slug"
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 500
					},
					"provisioning": {
						"$ref": "#/components/schemas/GroupProvisioning",
						"description": "Optional; defaults to the plain username, Cyan, Team Member and the first slug letter."
					}
				},
				"required": [
					"name",
					"slug"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateEventGroupRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"slug": {
						"$ref": "#/components/schemas/Slug"
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 500
					},
					"provisioning": {
						"$ref": "#/components/schemas/GroupProvisioning",
						"description": "Complete replacement of the provisioning settings."
					}
				},
				"required": [
					"version",
					"name",
					"slug",
					"description",
					"provisioning"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ConfigurationRevisionReason": {
				"type": "string",
				"enum": [
					"activation",
					"reactivation",
					"publish"
				]
			},
			"ConfigurationRevisionSummaryDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"number": {
						"type": "number",
						"format": "double",
						"description": "Increments per event, starting at 1."
					},
					"reason": {
						"$ref": "#/components/schemas/ConfigurationRevisionReason"
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"eventId",
					"number",
					"reason",
					"createdAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ConfigurationRevisionPage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/ConfigurationRevisionSummaryDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SnapshotRole": {
				"properties": {
					"id": {
						"type": "string"
					},
					"slug": {
						"type": "string"
					},
					"name": {
						"type": "string"
					},
					"takRoleOverride": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TakRole"
							}
						],
						"nullable": true,
						"description": "`null` when the role keeps the group's TAK role, and in revisions before version 5."
					}
				},
				"required": [
					"id",
					"slug",
					"name",
					"takRoleOverride"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SnapshotGroup": {
				"properties": {
					"id": {
						"type": "string"
					},
					"slug": {
						"type": "string"
					},
					"name": {
						"type": "string"
					},
					"provisioning": {
						"$ref": "#/components/schemas/GroupProvisioning"
					}
				},
				"required": [
					"id",
					"slug",
					"name",
					"provisioning"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SnapshotChannel": {
				"description": "A channel's published settings. Keys never enter snapshots: they stay encrypted on the channel,\nand rotation and release act on the channel directly so a leaked key stops being handed out at\nonce. `pskVersion` records which key was current when the revision was created.",
				"properties": {
					"id": {
						"type": "string"
					},
					"name": {
						"type": "string"
					},
					"uplinkEnabled": {
						"type": "boolean"
					},
					"downlinkEnabled": {
						"type": "boolean"
					},
					"positionPrecision": {
						"type": "number",
						"format": "double"
					},
					"secret": {
						"type": "boolean"
					},
					"pskVersion": {
						"type": "number",
						"format": "double"
					},
					"audience": {
						"$ref": "#/components/schemas/EventAudience"
					},
					"keyHolders": {
						"$ref": "#/components/schemas/EventAudience"
					}
				},
				"required": [
					"id",
					"name",
					"uplinkEnabled",
					"downlinkEnabled",
					"positionPrecision",
					"secret",
					"pskVersion",
					"audience",
					"keyHolders"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SnapshotMeshtastic": {
				"description": "The event's Meshtastic firmware target and settings, with the profile file hash so an artifact\ncan always be traced back to the exact field definitions used to generate it.",
				"properties": {
					"firmwareVersion": {
						"type": "string"
					},
					"effectiveMinimumVersion": {
						"type": "string"
					},
					"profileId": {
						"type": "string"
					},
					"profileSha256": {
						"type": "string"
					},
					"settings": {
						"$ref": "#/components/schemas/FirmwareSettingsDocument"
					}
				},
				"required": [
					"firmwareVersion",
					"effectiveMinimumVersion",
					"profileId",
					"profileSha256",
					"settings"
				],
				"type": "object",
				"additionalProperties": false
			},
			"AtakPreferenceTarget": {
				"anyOf": [
					{
						"properties": {
							"type": {
								"type": "string",
								"enum": [
									"event"
								],
								"nullable": false
							}
						},
						"required": [
							"type"
						],
						"type": "object"
					},
					{
						"properties": {
							"id": {
								"type": "string"
							},
							"type": {
								"type": "string",
								"enum": [
									"group",
									"role",
									"member"
								]
							}
						},
						"required": [
							"id",
							"type"
						],
						"type": "object"
					}
				],
				"description": "Who an entry is for: the whole event, or one event group, role or member."
			},
			"AtakPreferenceType": {
				"type": "string",
				"enum": [
					"string",
					"boolean",
					"integer",
					"long",
					"float"
				]
			},
			"TargetedAtakPreference": {
				"description": "An event's preference with its target, as stored and published.",
				"properties": {
					"preference": {
						"type": "string",
						"description": "The `<preference name>` group, such as `com.atakmap.app_preferences`."
					},
					"key": {
						"type": "string"
					},
					"type": {
						"$ref": "#/components/schemas/AtakPreferenceType"
					},
					"value": {
						"type": "string"
					},
					"target": {
						"$ref": "#/components/schemas/AtakPreferenceTarget"
					}
				},
				"required": [
					"preference",
					"key",
					"type",
					"value",
					"target"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CurrentTakConfiguration": {
				"properties": {
					"meshChannelId": {
						"type": "string",
						"nullable": true
					},
					"atakPreferences": {
						"items": {
							"$ref": "#/components/schemas/TargetedAtakPreference"
						},
						"type": "array",
						"description": "The event's ATAK preferences with their targets; each member's app gets its resolved share."
					}
				},
				"required": [
					"meshChannelId",
					"atakPreferences"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SnapshotTak": {
				"$ref": "#/components/schemas/CurrentTakConfiguration",
				"description": "The Meshtastic app's TAK mesh channel and the ATAK preferences; `null` in revisions created\nbefore version 4, and without ATAK preferences before version 7. Version 7 stored preferences\nwithout targets, which all reached the whole event. Revisions before version 6 also stored a\nconnection mode, which the switch `meshtasticEnabled` replaced."
			},
			"ConfigurationSnapshot": {
				"description": "Bump `schemaVersion` whenever the snapshot shape changes; old revisions are never rewritten.\nVersion 2 added `channels` in device order, the first being the primary channel; version 3\nadded `meshtastic`; version 4 added `tak`; version 5 added role TAK overrides; version 6 added\n`meshtasticEnabled`; version 7 added `tak.atakPreferences`; version 8 gave each preference a target.",
				"properties": {
					"schemaVersion": {
						"type": "number",
						"enum": [
							1,
							2,
							3,
							4,
							5,
							6,
							7,
							8
						]
					},
					"meshtasticEnabled": {
						"type": "boolean",
						"description": "Whether the event provisions Meshtastic radios; `true` in revisions before version 6. When\n`false`, `channels` is empty and `meshtastic` is `null`."
					},
					"roles": {
						"items": {
							"$ref": "#/components/schemas/SnapshotRole"
						},
						"type": "array"
					},
					"groups": {
						"items": {
							"$ref": "#/components/schemas/SnapshotGroup"
						},
						"type": "array"
					},
					"channels": {
						"items": {
							"$ref": "#/components/schemas/SnapshotChannel"
						},
						"type": "array"
					},
					"meshtastic": {
						"allOf": [
							{
								"$ref": "#/components/schemas/SnapshotMeshtastic"
							}
						],
						"nullable": true,
						"description": "`null` in revisions created before version 3."
					},
					"tak": {
						"allOf": [
							{
								"$ref": "#/components/schemas/SnapshotTak"
							}
						],
						"nullable": true
					}
				},
				"required": [
					"schemaVersion",
					"meshtasticEnabled",
					"roles",
					"groups",
					"channels",
					"meshtastic",
					"tak"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ConfigurationRevisionDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"number": {
						"type": "number",
						"format": "double",
						"description": "Increments per event, starting at 1."
					},
					"reason": {
						"$ref": "#/components/schemas/ConfigurationRevisionReason"
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"snapshot": {
						"$ref": "#/components/schemas/ConfigurationSnapshot"
					}
				},
				"required": [
					"id",
					"eventId",
					"number",
					"reason",
					"createdAt",
					"snapshot"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PublishConfigurationResponse": {
				"properties": {
					"created": {
						"type": "boolean",
						"description": "`false` when the configuration was unchanged and the latest revision is returned instead."
					},
					"revision": {
						"$ref": "#/components/schemas/ConfigurationRevisionDto"
					}
				},
				"required": [
					"created",
					"revision"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ConfigurationChangeArea": {
				"type": "string",
				"enum": [
					"event",
					"roles",
					"groups",
					"channels",
					"meshtastic",
					"tak"
				]
			},
			"ConfigurationChangeKind": {
				"type": "string",
				"enum": [
					"added",
					"removed",
					"changed"
				]
			},
			"ConfigurationChangeDto": {
				"properties": {
					"area": {
						"$ref": "#/components/schemas/ConfigurationChangeArea"
					},
					"kind": {
						"$ref": "#/components/schemas/ConfigurationChangeKind"
					},
					"name": {
						"type": "string",
						"description": "Name of the role, group or channel, a Meshtastic setting key, or a short description."
					},
					"fields": {
						"items": {
							"type": "string"
						},
						"type": "array",
						"description": "Dotted paths of the changed fields of a changed item; empty otherwise."
					}
				},
				"required": [
					"area",
					"kind",
					"name",
					"fields"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PendingConfigurationChangesDto": {
				"properties": {
					"publishedRevision": {
						"type": "number",
						"format": "double",
						"nullable": true,
						"description": "Number of the revision participants receive; `null` before the first one."
					},
					"changes": {
						"items": {
							"$ref": "#/components/schemas/ConfigurationChangeDto"
						},
						"type": "array",
						"description": "What publishing would change. Empty when nothing is pending, and always empty for drafts\n(activation publishes) and archived events (read-only)."
					}
				},
				"required": [
					"publishedRevision",
					"changes"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SmtpSecurity": {
				"type": "string",
				"enum": [
					"starttls",
					"tls",
					"none"
				]
			},
			"EmailSettingsDto": {
				"description": "SMTP settings without the password, which is write-only.",
				"properties": {
					"enabled": {
						"type": "boolean"
					},
					"host": {
						"type": "string",
						"nullable": true
					},
					"port": {
						"type": "number",
						"format": "double"
					},
					"security": {
						"$ref": "#/components/schemas/SmtpSecurity"
					},
					"username": {
						"type": "string",
						"nullable": true
					},
					"passwordSet": {
						"type": "boolean",
						"description": "Whether a password is stored. The password itself is never returned."
					},
					"fromAddress": {
						"type": "string",
						"nullable": true
					},
					"fromName": {
						"type": "string"
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; 0 until first saved."
					}
				},
				"required": [
					"enabled",
					"host",
					"port",
					"security",
					"username",
					"passwordSet",
					"fromAddress",
					"fromName",
					"version"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateEmailSettingsRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"minimum": 0
					},
					"enabled": {
						"type": "boolean"
					},
					"host": {
						"type": "string",
						"nullable": true,
						"maxLength": 253
					},
					"port": {
						"type": "integer",
						"format": "int32",
						"minimum": 1,
						"maximum": 65535
					},
					"security": {
						"$ref": "#/components/schemas/SmtpSecurity"
					},
					"username": {
						"type": "string",
						"nullable": true,
						"maxLength": 200
					},
					"password": {
						"type": "string",
						"nullable": true,
						"description": "Omit to keep the stored password, `null` to remove it.",
						"maxLength": 500
					},
					"fromAddress": {
						"type": "string",
						"nullable": true,
						"maxLength": 254,
						"pattern": "^[^\\s@]+@[^\\s@]+$"
					},
					"fromName": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					}
				},
				"required": [
					"version",
					"enabled",
					"host",
					"port",
					"security",
					"username",
					"fromAddress",
					"fromName"
				],
				"type": "object",
				"additionalProperties": false
			},
			"SendTestEmailRequest": {
				"properties": {
					"to": {
						"type": "string",
						"maxLength": 254,
						"pattern": "^[^\\s@]+@[^\\s@]+$"
					}
				},
				"required": [
					"to"
				],
				"type": "object",
				"additionalProperties": false
			},
			"DownloadGrantDto": {
				"description": "A link that downloads the artifact without a session, e.g. from a QR code on another device.",
				"properties": {
					"url": {
						"type": "string",
						"description": "Treat as a secret: whoever has it can download the file until it expires."
					},
					"expiresAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"url",
					"expiresAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"DownloadGrantKind": {
				"type": "string",
				"enum": [
					"device-profile",
					"member-data-package",
					"tak-connection-package",
					"itak-connection-package",
					"wintak-connection-package",
					"atak-unlock-package"
				]
			},
			"CreateDownloadGrantRequest": {
				"properties": {
					"kind": {
						"$ref": "#/components/schemas/DownloadGrantKind"
					},
					"eventId": {
						"$ref": "#/components/schemas/Uuid",
						"description": "Required for `device-profile`, `member-data-package` and `atak-unlock-package`."
					},
					"memberId": {
						"$ref": "#/components/schemas/Uuid",
						"description": "Required for `device-profile` and `member-data-package`."
					},
					"packageId": {
						"$ref": "#/components/schemas/Uuid",
						"description": "Required for `member-data-package`."
					}
				},
				"required": [
					"kind"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageRevisionSummaryDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"packageId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"number": {
						"type": "number",
						"format": "double",
						"description": "Increments per data package, starting at 1."
					},
					"snapshotHash": {
						"type": "string",
						"description": "SHA-256 of the canonical snapshot, for provenance."
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"packageId",
					"number",
					"snapshotHash",
					"createdAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageRevisionPage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/PackageRevisionSummaryDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageSnapshotContent": {
				"properties": {
					"id": {
						"type": "string"
					},
					"layerId": {
						"type": "string"
					},
					"blobId": {
						"type": "string"
					},
					"kind": {
						"type": "string"
					},
					"name": {
						"type": "string"
					},
					"archivePath": {
						"type": "string"
					},
					"sha256": {
						"type": "string"
					},
					"size": {
						"type": "number",
						"format": "double"
					},
					"mediaType": {
						"type": "string"
					},
					"metadata": {
						"description": "Rubber-sheet placement and similar display data; absent for plain files."
					}
				},
				"required": [
					"id",
					"layerId",
					"blobId",
					"kind",
					"name",
					"archivePath",
					"sha256",
					"size",
					"mediaType"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageSnapshot": {
				"description": "Everything a package generator needs; timestamps and versions are left out on purpose.",
				"properties": {
					"schema": {
						"type": "number",
						"format": "double"
					},
					"name": {
						"type": "string"
					},
					"description": {
						"type": "string",
						"nullable": true
					},
					"layers": {
						"items": {
							"$ref": "#/components/schemas/PackageSnapshotLayer"
						},
						"type": "array"
					},
					"objects": {
						"items": {
							"$ref": "#/components/schemas/PackageSnapshotObject"
						},
						"type": "array"
					},
					"contents": {
						"items": {
							"$ref": "#/components/schemas/PackageSnapshotContent"
						},
						"type": "array",
						"description": "Missing only on schema-1 revisions created before package content existed."
					}
				},
				"required": [
					"schema",
					"name",
					"description",
					"layers",
					"objects"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageRevisionDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"packageId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"number": {
						"type": "number",
						"format": "double",
						"description": "Increments per data package, starting at 1."
					},
					"snapshotHash": {
						"type": "string",
						"description": "SHA-256 of the canonical snapshot, for provenance."
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"snapshot": {
						"$ref": "#/components/schemas/PackageSnapshot"
					}
				},
				"required": [
					"id",
					"packageId",
					"number",
					"snapshotHash",
					"createdAt",
					"snapshot"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PublishDataPackageResponse": {
				"properties": {
					"created": {
						"type": "boolean",
						"description": "`false` when the draft equals the latest revision, which is returned instead."
					},
					"revision": {
						"$ref": "#/components/schemas/PackageRevisionDto"
					}
				},
				"required": [
					"created",
					"revision"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PresentationLoss": {
				"properties": {
					"objectId": {
						"type": "string"
					},
					"objectName": {
						"type": "string"
					},
					"code": {
						"type": "string"
					},
					"message": {
						"type": "string"
					}
				},
				"required": [
					"objectId",
					"objectName",
					"code",
					"message"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PresentationReport": {
				"properties": {
					"format": {
						"type": "string",
						"enum": [
							"cot",
							"kml"
						]
					},
					"losses": {
						"items": {
							"$ref": "#/components/schemas/PresentationLoss"
						},
						"type": "array"
					}
				},
				"required": [
					"format",
					"losses"
				],
				"type": "object",
				"additionalProperties": false
			},
			"DataPackageContentSummary": {
				"properties": {
					"points": {
						"type": "number",
						"format": "double"
					},
					"lines": {
						"type": "number",
						"format": "double"
					},
					"polygons": {
						"type": "number",
						"format": "double"
					},
					"circles": {
						"type": "number",
						"format": "double"
					},
					"rectangles": {
						"type": "number",
						"format": "double"
					},
					"ellipses": {
						"type": "number",
						"format": "double"
					},
					"routes": {
						"type": "number",
						"format": "double"
					},
					"offlineMaps": {
						"type": "number",
						"format": "double",
						"description": "Offline map caches, including nested map packages."
					},
					"rubberSheets": {
						"type": "number",
						"format": "double"
					}
				},
				"required": [
					"points",
					"lines",
					"polygons",
					"circles",
					"offlineMaps",
					"rubberSheets"
				],
				"type": "object",
				"additionalProperties": false
			},
			"DataPackageSourceDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"sourcePackageId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"sourcePackageName": {
						"type": "string"
					},
					"sourceRevision": {
						"type": "number",
						"format": "double"
					},
					"sourceSnapshotHash": {
						"type": "string"
					},
					"sourceLayerIds": {
						"items": {
							"$ref": "#/components/schemas/Uuid"
						},
						"type": "array"
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"sourcePackageId",
					"sourcePackageName",
					"sourceRevision",
					"sourceSnapshotHash",
					"sourceLayerIds",
					"createdAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageAudience": {
				"description": "Who receives the published Data Package: every event member, or only those matching any\nselected group, role or member. The selection is ignored while `allMembers` is true.",
				"properties": {
					"groupIds": {
						"items": {
							"$ref": "#/components/schemas/Uuid"
						},
						"type": "array",
						"maxItems": 100
					},
					"roleIds": {
						"items": {
							"$ref": "#/components/schemas/Uuid"
						},
						"type": "array",
						"maxItems": 100
					},
					"memberIds": {
						"items": {
							"$ref": "#/components/schemas/Uuid"
						},
						"type": "array",
						"maxItems": 500
					},
					"allMembers": {
						"type": "boolean"
					}
				},
				"required": [
					"groupIds",
					"roleIds",
					"memberIds",
					"allMembers"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageTakDelivery": {
				"description": "When the built-in TAK server installs the package on members' TAK apps by itself.",
				"properties": {
					"onEnrollment": {
						"type": "boolean",
						"description": "Right after a member enrolls a TAK app."
					},
					"onConnection": {
						"type": "boolean",
						"description": "Whenever a member's TAK app connects, if a newer revision exists."
					}
				},
				"required": [
					"onEnrollment",
					"onConnection"
				],
				"type": "object",
				"additionalProperties": false
			},
			"DataPackageDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"eventId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"kind": {
						"$ref": "#/components/schemas/DataPackageKind"
					},
					"name": {
						"type": "string"
					},
					"description": {
						"type": "string",
						"nullable": true
					},
					"latestRevision": {
						"type": "number",
						"format": "double",
						"nullable": true,
						"description": "Number of the newest published revision, or `null` while nothing is published."
					},
					"latestRevisionSize": {
						"type": "number",
						"format": "double",
						"nullable": true,
						"description": "Approximate download size in bytes of the newest revision's ATAK Data Package, or `null`\nwhile nothing is published. Counts attached files plus uncompressed CoT."
					},
					"hasUnpublishedChanges": {
						"type": "boolean",
						"description": "`true` when publishing would create a new revision: nothing is published yet or the draft differs."
					},
					"draftContents": {
						"$ref": "#/components/schemas/DataPackageContentSummary",
						"description": "What the draft holds, by kind."
					},
					"sources": {
						"items": {
							"$ref": "#/components/schemas/DataPackageSourceDto"
						},
						"type": "array",
						"description": "Published package revisions whose content was copied into this package's initial draft."
					},
					"audience": {
						"$ref": "#/components/schemas/PackageAudience"
					},
					"writers": {
						"$ref": "#/components/schemas/EventAudience",
						"description": "Missions only: who may change the mission from a TAK app; empty for packages."
					},
					"takDelivery": {
						"$ref": "#/components/schemas/PackageTakDelivery"
					},
					"sortOrder": {
						"type": "number",
						"format": "double",
						"description": "Drawing order within the event; lower values are drawn first, below higher ones."
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; send it back unchanged with updates."
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"eventId",
					"kind",
					"name",
					"description",
					"latestRevision",
					"latestRevisionSize",
					"hasUnpublishedChanges",
					"draftContents",
					"sources",
					"audience",
					"writers",
					"takDelivery",
					"sortOrder",
					"version",
					"createdAt",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ReorderDataPackagesRequest": {
				"properties": {
					"packageIds": {
						"items": {
							"type": "string"
						},
						"type": "array",
						"description": "Every data package of the event of `kind`, bottom first; the last one is drawn on top.",
						"maxItems": 500
					},
					"kind": {
						"$ref": "#/components/schemas/DataPackageKind",
						"description": "Packages and missions are ordered separately; `package` when omitted."
					}
				},
				"required": [
					"packageIds"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageObjectDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"packageId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"layerId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"kind": {
						"$ref": "#/components/schemas/PackageObjectKind"
					},
					"name": {
						"type": "string"
					},
					"description": {
						"type": "string",
						"nullable": true
					},
					"geometry": {
						"$ref": "#/components/schemas/PackageGeometry"
					},
					"style": {
						"$ref": "#/components/schemas/PackageObjectStyle"
					},
					"tak": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TakMarker"
							}
						],
						"nullable": true,
						"description": "Only markers carry TAK metadata; `null` means a plain spot marker."
					},
					"version": {
						"type": "number",
						"format": "double"
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"packageId",
					"layerId",
					"kind",
					"name",
					"description",
					"geometry",
					"style",
					"tak",
					"version",
					"createdAt",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"BatchPackageObjectsResponse": {
				"properties": {
					"updated": {
						"items": {
							"$ref": "#/components/schemas/PackageObjectDto"
						},
						"type": "array"
					},
					"created": {
						"items": {
							"$ref": "#/components/schemas/PackageObjectDto"
						},
						"type": "array"
					},
					"deletedIds": {
						"items": {
							"$ref": "#/components/schemas/Uuid"
						},
						"type": "array"
					}
				},
				"required": [
					"updated",
					"created",
					"deletedIds"
				],
				"type": "object",
				"additionalProperties": false
			},
			"BatchPackageObjectUpdate": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"minimum": 1
					},
					"layerId": {
						"$ref": "#/components/schemas/Uuid",
						"description": "Moving an object to another layer of the same data package is allowed."
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 2000
					},
					"geometry": {
						"$ref": "#/components/schemas/PackageGeometry"
					},
					"style": {
						"$ref": "#/components/schemas/PackageObjectStyle"
					},
					"tak": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TakMarker"
							}
						],
						"nullable": true,
						"description": "Markers only; send `null` for a plain spot marker."
					},
					"id": {
						"$ref": "#/components/schemas/Uuid"
					}
				},
				"required": [
					"version",
					"layerId",
					"name",
					"description",
					"geometry",
					"style",
					"tak",
					"id"
				],
				"type": "object",
				"additionalProperties": false
			},
			"BatchPackageObjectDelete": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"version": {
						"type": "integer",
						"format": "int32",
						"minimum": 1
					}
				},
				"required": [
					"id",
					"version"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreatePackageObjectRequest": {
				"properties": {
					"layerId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 2000
					},
					"geometry": {
						"$ref": "#/components/schemas/PackageGeometry"
					},
					"style": {
						"$ref": "#/components/schemas/PackageObjectStyle",
						"description": "Defaults to a blue outline with a light fill."
					},
					"tak": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TakMarker"
							}
						],
						"nullable": true,
						"description": "Markers only."
					}
				},
				"required": [
					"layerId",
					"name",
					"geometry"
				],
				"type": "object",
				"additionalProperties": false
			},
			"BatchPackageObjectsRequest": {
				"description": "Atomic changes in one draft. Any conflict or locked layer rejects the entire batch.",
				"properties": {
					"updates": {
						"items": {
							"$ref": "#/components/schemas/BatchPackageObjectUpdate"
						},
						"type": "array",
						"maxItems": 500
					},
					"deletes": {
						"items": {
							"$ref": "#/components/schemas/BatchPackageObjectDelete"
						},
						"type": "array",
						"maxItems": 500
					},
					"creates": {
						"items": {
							"$ref": "#/components/schemas/CreatePackageObjectRequest"
						},
						"type": "array",
						"description": "Restores deleted objects with new server IDs, in request order.",
						"maxItems": 500
					}
				},
				"required": [
					"updates",
					"deletes",
					"creates"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageObjectPage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/PackageObjectDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdatePackageObjectRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"minimum": 1
					},
					"layerId": {
						"$ref": "#/components/schemas/Uuid",
						"description": "Moving an object to another layer of the same data package is allowed."
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 2000
					},
					"geometry": {
						"$ref": "#/components/schemas/PackageGeometry"
					},
					"style": {
						"$ref": "#/components/schemas/PackageObjectStyle"
					},
					"tak": {
						"allOf": [
							{
								"$ref": "#/components/schemas/TakMarker"
							}
						],
						"nullable": true,
						"description": "Markers only; send `null` for a plain spot marker."
					}
				},
				"required": [
					"version",
					"layerId",
					"name",
					"description",
					"geometry",
					"style",
					"tak"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ImportReport": {
				"description": "Outcome of a GeoJSON or ATAK import; every input item appears somewhere in it.",
				"properties": {
					"accepted": {
						"type": "number",
						"format": "double",
						"description": "Number of objects created."
					},
					"changed": {
						"items": {
							"$ref": "#/components/schemas/ImportReportEntry"
						},
						"type": "array",
						"description": "Imported, but adjusted: split multi-geometries, clamped styles."
					},
					"retained": {
						"items": {
							"$ref": "#/components/schemas/ImportReportEntry"
						},
						"type": "array",
						"description": "Opaque package files retained byte-for-byte, such as offline map caches."
					},
					"skipped": {
						"items": {
							"$ref": "#/components/schemas/ImportReportEntry"
						},
						"type": "array",
						"description": "Not imported because the content type is not supported, e.g. GeometryCollection."
					},
					"rejected": {
						"items": {
							"$ref": "#/components/schemas/ImportReportEntry"
						},
						"type": "array",
						"description": "Not imported because the content is invalid, e.g. a self-intersecting polygon."
					}
				},
				"required": [
					"accepted",
					"changed",
					"retained",
					"skipped",
					"rejected"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ImportedDataPackage": {
				"properties": {
					"dataPackage": {
						"$ref": "#/components/schemas/DataPackageDto"
					},
					"report": {
						"$ref": "#/components/schemas/ImportReport"
					}
				},
				"required": [
					"dataPackage",
					"report"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageLayerDto": {
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"packageId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					},
					"sortOrder": {
						"type": "number",
						"format": "double",
						"description": "Drawing and export order; lower values are drawn first."
					},
					"visible": {
						"type": "boolean",
						"description": "Editor display only; hidden layers are still published."
					},
					"locked": {
						"type": "boolean",
						"description": "Locked layers reject object changes until they are unlocked."
					},
					"version": {
						"type": "number",
						"format": "double"
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"packageId",
					"name",
					"sortOrder",
					"visible",
					"locked",
					"version",
					"createdAt",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageLayerPage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/PackageLayerDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreatePackageLayerRequest": {
				"properties": {
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					}
				},
				"required": [
					"name"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdatePackageLayerRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"minimum": 1
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"sortOrder": {
						"type": "integer",
						"format": "int32",
						"minimum": 0,
						"maximum": 10000
					},
					"visible": {
						"type": "boolean"
					},
					"locked": {
						"type": "boolean"
					}
				},
				"required": [
					"version",
					"name",
					"sortOrder",
					"visible",
					"locked"
				],
				"type": "object",
				"additionalProperties": false
			},
			"GeoJsonDocument": {
				"description": "Untrusted GeoJSON document: a FeatureCollection, a Feature or a bare geometry.",
				"properties": {
					"type": {
						"type": "string"
					}
				},
				"required": [
					"type"
				],
				"type": "object",
				"additionalProperties": {}
			},
			"GeoJsonFeatureCollection": {
				"description": "GeoJSON FeatureCollection exported from a data package draft or revision.",
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"FeatureCollection"
						],
						"nullable": false
					},
					"features": {
						"items": {},
						"type": "array"
					}
				},
				"required": [
					"type",
					"features"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CombinedExportSelection": {
				"properties": {
					"packageId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"revision": {
						"type": "integer",
						"format": "int32",
						"description": "Published revision to use; omit for the newest one.",
						"minimum": 1
					},
					"layerIds": {
						"items": {
							"$ref": "#/components/schemas/Uuid"
						},
						"type": "array",
						"description": "Only these layers of the package; omit for all layers.",
						"minItems": 1,
						"maxItems": 100
					}
				},
				"required": [
					"packageId"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreateDataPackageCopyRequest": {
				"properties": {
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 1000
					},
					"kind": {
						"$ref": "#/components/schemas/DataPackageKind",
						"description": "The kind of the new package, e.g. `mission` to start a mission from published packages; `package` when omitted."
					},
					"source": {
						"type": "string",
						"enum": [
							"published",
							"draft"
						],
						"description": "Copy current drafts explicitly; defaults to immutable published revisions. Draft selections cannot specify revision numbers."
					},
					"packages": {
						"items": {
							"$ref": "#/components/schemas/CombinedExportSelection"
						},
						"type": "array",
						"description": "Source packages and optional layer selections to copy.",
						"minItems": 1,
						"maxItems": 100
					}
				},
				"required": [
					"name",
					"packages"
				],
				"type": "object",
				"additionalProperties": false
			},
			"RubberSheetDto": {
				"properties": {
					"corners": {
						"items": {
							"items": {
								"type": "number",
								"format": "double"
							},
							"type": "array"
						},
						"type": "array",
						"description": "Lower left, lower right, upper right and upper left corner as [longitude, latitude] in\nWGS84, as ATAK placed the image."
					},
					"imageMediaType": {
						"type": "string",
						"enum": [
							"image/png",
							"image/jpeg"
						]
					}
				},
				"required": [
					"corners",
					"imageMediaType"
				],
				"type": "object",
				"additionalProperties": false
			},
			"OfflineMapDto": {
				"properties": {
					"minZoom": {
						"type": "number",
						"format": "double"
					},
					"maxZoom": {
						"type": "number",
						"format": "double"
					},
					"bounds": {
						"items": {
							"type": "number",
							"format": "double"
						},
						"type": "array",
						"description": "West, south, east, north in WGS84 degrees."
					},
					"tiles": {
						"type": "number",
						"format": "double"
					}
				},
				"required": [
					"minZoom",
					"maxZoom",
					"bounds",
					"tiles"
				],
				"type": "object",
				"additionalProperties": false
			},
			"PackageContentDto": {
				"description": "Imported map content and files from TAK apps (exported unchanged), or an editor-only icon library.",
				"properties": {
					"id": {
						"$ref": "#/components/schemas/Uuid"
					},
					"layerId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"kind": {
						"type": "string",
						"enum": [
							"offline-map",
							"nested-data-package",
							"rubber-sheet",
							"icon-library",
							"file"
						]
					},
					"name": {
						"type": "string"
					},
					"size": {
						"type": "number",
						"format": "double",
						"description": "Size of the stored file in bytes."
					},
					"rubberSheet": {
						"allOf": [
							{
								"$ref": "#/components/schemas/RubberSheetDto"
							}
						],
						"nullable": true,
						"description": "Placement for display; only for rubber sheets."
					},
					"offlineMap": {
						"allOf": [
							{
								"$ref": "#/components/schemas/OfflineMapDto"
							}
						],
						"nullable": true,
						"description": "Tile range for display; only for offline maps that could be read."
					},
					"visible": {
						"type": "boolean",
						"description": "Editor display only; the exported file is always unchanged."
					},
					"opacity": {
						"type": "number",
						"format": "double",
						"description": "Editor display opacity from 0 to 1."
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; send it back unchanged with updates."
					}
				},
				"required": [
					"id",
					"layerId",
					"kind",
					"name",
					"size",
					"rubberSheet",
					"offlineMap",
					"visible",
					"opacity",
					"version"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdatePackageContentRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"minimum": 1
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 200
					},
					"layerId": {
						"type": "string",
						"description": "Moves the content to another layer of the same package."
					},
					"visible": {
						"type": "boolean"
					},
					"opacity": {
						"type": "number",
						"format": "double",
						"minimum": 0,
						"maximum": 1
					}
				},
				"required": [
					"version",
					"name",
					"layerId",
					"visible",
					"opacity"
				],
				"type": "object",
				"additionalProperties": false
			},
			"IconLibraryImportResult": {
				"properties": {
					"contentId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"accepted": {
						"type": "number",
						"format": "double"
					},
					"rejected": {
						"items": {
							"$ref": "#/components/schemas/ImportReportEntry"
						},
						"type": "array"
					}
				},
				"required": [
					"contentId",
					"accepted",
					"rejected"
				],
				"type": "object",
				"additionalProperties": false
			},
			"DataPackagePage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/DataPackageDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreateDataPackageRequest": {
				"properties": {
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 1000
					},
					"kind": {
						"$ref": "#/components/schemas/DataPackageKind",
						"description": "Fixed at creation; `package` when omitted."
					}
				},
				"required": [
					"name"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateDataPackageRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 1000
					}
				},
				"required": [
					"version",
					"name",
					"description"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdatePackageAudienceRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					},
					"audience": {
						"$ref": "#/components/schemas/PackageAudience"
					}
				},
				"required": [
					"version",
					"audience"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdatePackageWritersRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					},
					"writers": {
						"$ref": "#/components/schemas/EventAudience"
					}
				},
				"required": [
					"version",
					"writers"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdatePackageTakDeliveryRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					},
					"takDelivery": {
						"$ref": "#/components/schemas/PackageTakDelivery"
					}
				},
				"required": [
					"version",
					"takDelivery"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CombinedExportIncluded": {
				"properties": {
					"packageId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					},
					"revision": {
						"type": "number",
						"format": "double"
					},
					"objects": {
						"type": "number",
						"format": "double"
					}
				},
				"required": [
					"packageId",
					"name",
					"revision",
					"objects"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CombinedExportSkipped": {
				"properties": {
					"packageId": {
						"$ref": "#/components/schemas/Uuid"
					},
					"name": {
						"type": "string"
					},
					"reason": {
						"type": "string",
						"enum": [
							"not-published"
						],
						"nullable": false,
						"description": "`not-published`: the package has no published revision yet."
					}
				},
				"required": [
					"packageId",
					"name",
					"reason"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CombinedExportNameClash": {
				"description": "An object name used in more than one included package; both objects are kept.",
				"properties": {
					"name": {
						"type": "string"
					},
					"packageIds": {
						"items": {
							"$ref": "#/components/schemas/Uuid"
						},
						"type": "array"
					}
				},
				"required": [
					"name",
					"packageIds"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CombinedExportReport": {
				"properties": {
					"included": {
						"items": {
							"$ref": "#/components/schemas/CombinedExportIncluded"
						},
						"type": "array"
					},
					"skipped": {
						"items": {
							"$ref": "#/components/schemas/CombinedExportSkipped"
						},
						"type": "array"
					},
					"nameClashes": {
						"items": {
							"$ref": "#/components/schemas/CombinedExportNameClash"
						},
						"type": "array"
					},
					"presentationLosses": {
						"items": {
							"$ref": "#/components/schemas/PresentationLoss"
						},
						"type": "array"
					}
				},
				"required": [
					"included",
					"skipped",
					"nameClashes",
					"presentationLosses"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CombinedExportRequest": {
				"properties": {
					"name": {
						"type": "string",
						"description": "Name of the combined Data Package; defaults to the event name.",
						"minLength": 1,
						"maxLength": 100
					},
					"packages": {
						"items": {
							"$ref": "#/components/schemas/CombinedExportSelection"
						},
						"type": "array",
						"minItems": 1,
						"maxItems": 100
					}
				},
				"required": [
					"packages"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ApiClientStatus": {
				"type": "string",
				"enum": [
					"active",
					"disabled"
				]
			},
			"ApiClientDto": {
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid"
					},
					"name": {
						"type": "string"
					},
					"description": {
						"type": "string",
						"nullable": true
					},
					"status": {
						"$ref": "#/components/schemas/ApiClientStatus"
					},
					"version": {
						"type": "number",
						"format": "double",
						"description": "Optimistic-concurrency version; send it back unchanged with updates."
					},
					"permissions": {
						"items": {
							"$ref": "#/components/schemas/PermissionGrantDto"
						},
						"type": "array"
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					},
					"updatedAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"name",
					"description",
					"status",
					"version",
					"permissions",
					"createdAt",
					"updatedAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ApiClientPage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/ApiClientDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreateApiClientRequest": {
				"properties": {
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 500
					},
					"permissions": {
						"items": {
							"$ref": "#/components/schemas/PermissionGrantDto"
						},
						"type": "array",
						"maxItems": 100
					}
				},
				"required": [
					"name",
					"permissions"
				],
				"type": "object",
				"additionalProperties": false
			},
			"UpdateApiClientRequest": {
				"properties": {
					"version": {
						"type": "integer",
						"format": "int32",
						"description": "Version the client last read.",
						"minimum": 1
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"description": {
						"type": "string",
						"nullable": true,
						"maxLength": 500
					},
					"status": {
						"$ref": "#/components/schemas/ApiClientStatus",
						"description": "Disabling an account immediately invalidates all of its API keys."
					},
					"permissions": {
						"items": {
							"$ref": "#/components/schemas/PermissionGrantDto"
						},
						"type": "array",
						"description": "Complete replacement of the account's grants.",
						"maxItems": 100
					}
				},
				"required": [
					"version",
					"name",
					"description",
					"status",
					"permissions"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ApiKeyStatus": {
				"type": "string",
				"enum": [
					"active",
					"expired",
					"revoked"
				]
			},
			"ApiKeyDto": {
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid"
					},
					"apiClientId": {
						"type": "string",
						"format": "uuid"
					},
					"name": {
						"type": "string"
					},
					"displayPrefix": {
						"type": "string",
						"description": "Recognizable, non-secret beginning of the key."
					},
					"status": {
						"$ref": "#/components/schemas/ApiKeyStatus"
					},
					"expiresAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"lastUsedAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"revokedAt": {
						"type": "string",
						"nullable": true,
						"format": "date-time"
					},
					"createdAt": {
						"type": "string",
						"format": "date-time"
					}
				},
				"required": [
					"id",
					"apiClientId",
					"name",
					"displayPrefix",
					"status",
					"expiresAt",
					"lastUsedAt",
					"revokedAt",
					"createdAt"
				],
				"type": "object",
				"additionalProperties": false
			},
			"ApiKeyPage": {
				"properties": {
					"items": {
						"items": {
							"$ref": "#/components/schemas/ApiKeyDto"
						},
						"type": "array"
					},
					"page": {
						"$ref": "#/components/schemas/PageInfo"
					}
				},
				"required": [
					"items",
					"page"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreatedApiKeyResponse": {
				"properties": {
					"apiKey": {
						"$ref": "#/components/schemas/ApiKeyDto"
					},
					"key": {
						"type": "string",
						"description": "Complete bearer value. It is returned exactly once and cannot be retrieved again."
					}
				},
				"required": [
					"apiKey",
					"key"
				],
				"type": "object",
				"additionalProperties": false
			},
			"CreateApiKeyRequest": {
				"properties": {
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100
					},
					"expiresAt": {
						"type": "string",
						"nullable": true,
						"description": "Optional expiry instant; must lie in the future.",
						"format": "date-time"
					}
				},
				"required": [
					"name"
				],
				"type": "object",
				"additionalProperties": false
			},
			"AccountSetupRequest": {
				"properties": {
					"newPassword": {
						"type": "string",
						"minLength": 12,
						"maxLength": 128
					},
					"username": {
						"type": "string",
						"description": "Sign-in and TAK login name; keeps the one derived from the name when omitted.",
						"pattern": "^[a-z0-9._-]{3,32}$"
					}
				},
				"required": [
					"newPassword"
				],
				"type": "object",
				"additionalProperties": false
			}
		},
		"securitySchemes": {
			"sessionCookie": {
				"type": "apiKey",
				"in": "cookie",
				"name": "openmeshtak.session_token"
			},
			"apiClientBearer": {
				"type": "http",
				"scheme": "bearer",
				"bearerFormat": "omtk_ak_<publicKeyId>_<secret>",
				"description": "API key of an API client. Never send it in a URL."
			}
		}
	},
	"info": {
		"title": "OpenMeshTak Core API",
		"version": "0.3.4",
		"description": "Authoritative API for OpenMeshTak provisioning and mission distribution.",
		"license": {
			"name": "AGPL-3.0-only"
		},
		"contact": {}
	},
	"paths": {
		"/users": {
			"get": {
				"operationId": "ListUsers",
				"responses": {
					"200": {
						"description": "Users",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UserPage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists users ordered by creation time, oldest first. Requires instance-wide `users.read`.",
				"tags": [
					"Users"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Matches part of the display name or email.",
						"in": "query",
						"name": "search",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Only permanent accounts or only event accounts.",
						"in": "query",
						"name": "accountType",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/UserAccountType"
						}
					}
				]
			},
			"post": {
				"operationId": "CreateUser",
				"responses": {
					"201": {
						"description": "User created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CreatedUserResponse"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Username taken",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Creates a user without a password and returns a single-use setup link, valid for seven days.\nThe person opens it, signs in once and sets their own password. The new user has no\npermissions until added to a user group or an event. Requires `users.create`.",
				"tags": [
					"Users"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateUserRequest"
							}
						}
					}
				}
			}
		},
		"/users/{userId}": {
			"get": {
				"operationId": "GetUser",
				"responses": {
					"200": {
						"description": "User",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UserDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Users"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "userId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"put": {
				"operationId": "UpdateUser",
				"responses": {
					"200": {
						"description": "User updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UserDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Renames a user. Requires instance-wide `users.edit`.",
				"tags": [
					"Users"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "userId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateUserRequest"
							}
						}
					}
				}
			}
		},
		"/users/{userId}/disable": {
			"post": {
				"operationId": "DisableUser",
				"responses": {
					"200": {
						"description": "User disabled",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UserDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Cannot disable yourself",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Disables a user: all sessions end, and sign-in, access links and TAK connections are refused.\nAdministrators cannot disable themselves. Requires `users.disable`.",
				"tags": [
					"Users"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "userId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/users/{userId}/enable": {
			"post": {
				"operationId": "EnableUser",
				"responses": {
					"200": {
						"description": "User enabled",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UserDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Enables a disabled user again. Requires `users.disable`.",
				"tags": [
					"Users"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "userId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/users/{userId}/password-reset": {
			"post": {
				"operationId": "SendUserPasswordReset",
				"responses": {
					"202": {
						"description": "Reset email requested"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Emails the user a single-use password-reset link if their address is verified. Administrators\nnever see or set passwords. Requires `users.password-reset`.",
				"tags": [
					"Users"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "userId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/users/{userId}/setup-link": {
			"post": {
				"operationId": "CreateSetupLink",
				"responses": {
					"201": {
						"description": "Setup link created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SetupLinkDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "The user can already sign in",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Issues a new single-use setup link for a user who has not set a password yet. Earlier links\nof the user stop working. Requires `users.setup-links`.",
				"tags": [
					"Users"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "userId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/users/{userId}/revoke-sessions": {
			"post": {
				"operationId": "RevokeUserSessions",
				"responses": {
					"204": {
						"description": "Sessions revoked"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Signs the user out everywhere. Requires `users.sign-out`.",
				"tags": [
					"Users"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "userId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/users/{userId}/make-permanent": {
			"post": {
				"operationId": "MakeUserPermanent",
				"responses": {
					"200": {
						"description": "User is permanent",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UserDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Turns an event account into a permanent account that stays when its event is archived.\nPermanent accounts are returned unchanged. Requires `users.read` and\n`event-accounts.manage` for the account's event.",
				"tags": [
					"Users"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "userId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/auth/setup-links/exchange": {
			"post": {
				"operationId": "ExchangeSetupLink",
				"responses": {
					"200": {
						"description": "Session established",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SetupLinkExchangeResponse"
								}
							}
						}
					},
					"401": {
						"description": "Setup link not usable",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"429": {
						"description": "Too many attempts",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Exchanges a single-use setup link of an administrator-created user for a browser session, so\nthe person can set their first password. The token is sent in the body, never in the URL.\nEvery unusable link returns the same `401`.",
				"tags": [
					"Authentication"
				],
				"security": [],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/SetupLinkExchangeRequest"
							}
						}
					}
				}
			}
		},
		"/user-groups": {
			"get": {
				"operationId": "ListUserGroups",
				"responses": {
					"200": {
						"description": "User groups",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UserGroupPage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists user groups ordered by creation time, oldest first. Requires `user-groups.read`.",
				"tags": [
					"User groups"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			},
			"post": {
				"operationId": "CreateUserGroup",
				"responses": {
					"201": {
						"description": "User group created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UserGroupDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Slug already in use",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Creates a group. Callers can only grant permissions they hold themselves.",
				"tags": [
					"User groups"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateUserGroupRequest"
							}
						}
					}
				}
			}
		},
		"/user-groups/{userGroupId}": {
			"get": {
				"operationId": "GetUserGroup",
				"responses": {
					"200": {
						"description": "User group",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UserGroupDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"User groups"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "userGroupId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"put": {
				"operationId": "UpdateUserGroup",
				"responses": {
					"200": {
						"description": "User group updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UserGroupDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, slug conflict or protected system group",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces name, slug and grants. Requires the current `version`.",
				"tags": [
					"User groups"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "userGroupId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateUserGroupRequest"
							}
						}
					}
				}
			},
			"delete": {
				"operationId": "DeleteUserGroup",
				"responses": {
					"204": {
						"description": "User group deleted"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Protected system group",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"User groups"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "userGroupId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/user-groups/{userGroupId}/members": {
			"get": {
				"operationId": "ListUserGroupMembers",
				"responses": {
					"200": {
						"description": "Group members",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UserPage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists the group's members ordered by user creation time, oldest first.",
				"tags": [
					"User groups"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "userGroupId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			}
		},
		"/user-groups/{userGroupId}/members/{userId}": {
			"put": {
				"operationId": "AddUserGroupMember",
				"responses": {
					"204": {
						"description": "Member added"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Adds a user to the group. Idempotent. The caller must hold every grant of the group, because\nmembership passes those grants on.",
				"tags": [
					"User groups"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "userGroupId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "userId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"delete": {
				"operationId": "RemoveUserGroupMember",
				"responses": {
					"204": {
						"description": "Member removed"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Last member of a system group",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Removes a user from the group. A system group always keeps at least one member.",
				"tags": [
					"User groups"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "userGroupId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "userId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/tak-traffic/recording": {
			"get": {
				"operationId": "GetTakTrafficRecording",
				"responses": {
					"200": {
						"description": "Recording settings",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakTrafficRecordingDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Requires `tak-traffic.view`, `tak-traffic.history` or `tak-traffic.recording` for the event.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"put": {
				"operationId": "UpdateTakTrafficRecording",
				"responses": {
					"200": {
						"description": "Recording settings updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakTrafficRecordingDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Turns recording on or off and sets the retention in days. Requires `tak-traffic.recording`.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateTakTrafficRecordingRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/tak-traffic/recording/export": {
			"get": {
				"operationId": "ExportTakTraffic",
				"responses": {
					"200": {
						"description": "Recorded traffic as GeoJSON",
						"content": {
							"application/json": {
								"schema": {}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "The recorded positions and markers as a GeoJSON FeatureCollection, oldest first, at most\n50,000 items. Requires `tak-traffic.export`; every export is audited.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/tak-traffic/history": {
			"get": {
				"operationId": "GetTakTrafficHistory",
				"responses": {
					"200": {
						"description": "Recorded tracks",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakTrafficHistoryDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Recorded positions between `from` and `to` (at most 31 days), grouped into tracks per CoT UID\nand split wherever positions are more than `gapSeconds` apart, jump implausibly or are only\napproximate. `groupId` keeps positions sent by members of one event group; `uid` keeps one\ntrack. At most 20,000 positions, oldest first; `truncated` says the newest are missing.\nRequires `tak-traffic.history`; every request is audited.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"description": "RFC 3339 instant with offset.",
						"in": "query",
						"name": "from",
						"required": true,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "RFC 3339 instant with offset.",
						"in": "query",
						"name": "to",
						"required": true,
						"schema": {
							"type": "string"
						}
					},
					{
						"in": "query",
						"name": "groupId",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"description": "CoT UID of one track.",
						"in": "query",
						"name": "uid",
						"required": false,
						"schema": {
							"type": "string",
							"maxLength": 200
						}
					},
					{
						"description": "Seconds without a position after which a track is broken. Default 300.",
						"in": "query",
						"name": "gapSeconds",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 30,
							"maximum": 3600
						}
					}
				]
			}
		},
		"/events/{eventId}/tak-traffic/history/export": {
			"get": {
				"operationId": "ExportTakTracks",
				"responses": {
					"200": {
						"description": "Tracks as GeoJSON or GPX",
						"content": {
							"application/json": {
								"schema": {
									"type": "string",
									"format": "byte"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "The same tracks as GeoJSON (one feature per continuous segment) or GPX (one track per UID,\none segment per continuous part, approximate positions as waypoints), at most 50,000\npositions. Requires `tak-traffic.export`; every export is audited.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "format",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/TakTrafficExportFormat"
						}
					},
					{
						"in": "query",
						"name": "from",
						"required": true,
						"schema": {
							"type": "string"
						}
					},
					{
						"in": "query",
						"name": "to",
						"required": true,
						"schema": {
							"type": "string"
						}
					},
					{
						"in": "query",
						"name": "groupId",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "uid",
						"required": false,
						"schema": {
							"type": "string",
							"maxLength": 200
						}
					},
					{
						"in": "query",
						"name": "gapSeconds",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 30,
							"maximum": 3600
						}
					}
				]
			}
		},
		"/events/{eventId}/tak-traffic/recording/items": {
			"delete": {
				"operationId": "DeleteRecordedTakTraffic",
				"responses": {
					"200": {
						"description": "Recorded traffic deleted",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DeletedTakTrafficDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Deletes the event's recorded traffic now instead of after the retention, or only the items of\none CoT UID. Requires `tak-traffic.delete`; audited.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "uid",
						"required": false,
						"schema": {
							"type": "string",
							"maxLength": 200
						}
					}
				]
			}
		},
		"/tak-server/settings": {
			"get": {
				"operationId": "GetTakServerSettings",
				"responses": {
					"200": {
						"description": "TAK server settings",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakServerSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			},
			"put": {
				"operationId": "UpdateTakServerSettings",
				"responses": {
					"200": {
						"description": "Settings updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakServerSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces the settings. Requires the current `version` (0 before the first save).",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateTakServerSettingsRequest"
							}
						}
					}
				}
			}
		},
		"/tak-server/server-certificate": {
			"put": {
				"operationId": "AddTakServerCertificate",
				"responses": {
					"200": {
						"description": "Server certificate added",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakServerSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Adds a publicly trusted server certificate for the TAK host name, e.g. the `fullchain.pem` and\n`privkey.pem` of Let's Encrypt, so devices trust the server without the OpenMeshTak CA.\nRequires a recent sign-in. Client certificates are still issued by the OpenMeshTak CA.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/AddTakServerCertificateRequest"
							}
						}
					}
				}
			},
			"delete": {
				"operationId": "RemoveTakServerCertificate",
				"responses": {
					"200": {
						"description": "Server certificate removed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakServerSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Removes an added, ACME or file certificate and disables ACME and the file reload; the server then uses one issued by the\nOpenMeshTak CA.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			}
		},
		"/tak-server/server-certificate/files": {
			"put": {
				"operationId": "UseTakCertificateFiles",
				"responses": {
					"200": {
						"description": "Certificate files in use",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakServerSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Uses the reverse proxy's certificate files, mounted read-only below `certificateDirectory`.\nCore reloads them every twelve hours, so a certificate the proxy renews is picked up. Disables ACME.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UseTakCertificateFilesRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/tak-traffic": {
			"get": {
				"operationId": "GetLiveTakTraffic",
				"responses": {
					"200": {
						"description": "Live TAK traffic",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/LiveTakTrafficDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Connected TAK apps of the event and their current positions and markers, from the built-in\nTAK server's memory. Requires `tak-traffic.view` for the event.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/me/tak-enrollments": {
			"post": {
				"operationId": "CreateTakEnrollment",
				"responses": {
					"201": {
						"description": "Enrollment created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakEnrollmentDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "No TAK access",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "TAK server not enabled",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Returns the TAK login of the signed-in user (account username, used with the account\npassword) and a fresh QR token in the ATAK enrollment link. The token lifetime of the user's\nactive events decides how long it is valid (`expiresAt`, `null` for no time limit). Members of\nactive events and holders of `tak-server.admin-access` may\nenroll. QR tokens never carry the account password.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			}
		},
		"/me/tak-connection-package": {
			"get": {
				"operationId": "GetTakConnectionPackage",
				"responses": {
					"200": {
						"description": "Connection Data Package",
						"content": {
							"application/json": {
								"schema": {
									"type": "string",
									"format": "byte"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "No TAK access",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "TAK server not enabled",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "A TAK Data Package with the server address and the CA to trust, for TAK apps that enroll by\nimporting a package instead of scanning the enrollment code. It contains no key or password;\nthe app asks for the enrollment user name and password.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			}
		},
		"/me/itak-connection-package": {
			"get": {
				"operationId": "GetItakConnectionPackage",
				"responses": {
					"200": {
						"description": "iTAK Connection Data Package",
						"content": {
							"application/json": {
								"schema": {
									"type": "string",
									"format": "byte"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "No TAK access",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "TAK server not enabled, or an earlier iTAK package certificate is still valid",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "An iTAK connection package with the configured server ports, trust material and a newly\nissued user-bound client identity. The private client key exists only in this download.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			}
		},
		"/me/wintak-connection-package": {
			"get": {
				"operationId": "GetWintakConnectionPackage",
				"responses": {
					"200": {
						"description": "WinTAK Connection Data Package",
						"content": {
							"application/json": {
								"schema": {
									"type": "string",
									"format": "byte"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "No TAK access",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "TAK server not enabled, or an earlier WinTAK package certificate is still valid",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "A WinTAK connection package in the iTAK layout, with a newly issued user-bound client identity.\nWinTAK cannot enroll with a username and password, so it imports this ready-made certificate.\nThe private client key exists only in this download.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			}
		},
		"/tak-server/client-certificates": {
			"get": {
				"operationId": "ListTakClientCertificates",
				"responses": {
					"200": {
						"description": "Client certificates",
						"content": {
							"application/json": {
								"schema": {
									"items": {
										"$ref": "#/components/schemas/TakClientCertificateDto"
									},
									"type": "array"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "The 500 newest certificates.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			}
		},
		"/tak-server/client-certificates/{certificateId}/revoke": {
			"post": {
				"operationId": "RevokeTakClientCertificate",
				"responses": {
					"200": {
						"description": "Certificate revoked",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakClientCertificateDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Revokes a certificate; its TAK connections end immediately and it cannot reconnect.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "certificateId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/RevokeTakCertificateRequest"
							}
						}
					}
				}
			}
		},
		"/me/tak-certificates": {
			"get": {
				"operationId": "ListMyTakCertificates",
				"responses": {
					"200": {
						"description": "Own certificates",
						"content": {
							"application/json": {
								"schema": {
									"items": {
										"$ref": "#/components/schemas/TakClientCertificateDto"
									},
									"type": "array"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			}
		},
		"/me/tak-certificates/{certificateId}/revoke": {
			"post": {
				"operationId": "RevokeMyTakCertificate",
				"responses": {
					"200": {
						"description": "Certificate revoked",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakClientCertificateDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "certificateId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/RevokeTakCertificateRequest"
							}
						}
					}
				}
			}
		},
		"/tak-server/certificate-authorities": {
			"get": {
				"operationId": "ListTakCertificateAuthorities",
				"responses": {
					"200": {
						"description": "Certificate authorities",
						"content": {
							"application/json": {
								"schema": {
									"items": {
										"$ref": "#/components/schemas/TakCertificateAuthorityDto"
									},
									"type": "array"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists the active CA and older CAs that are still trusted. A new installation creates its own\nCA on the first call. Private keys are never returned.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			}
		},
		"/tak-server/certificate-authorities/rotate": {
			"post": {
				"operationId": "RotateTakCertificateAuthority",
				"responses": {
					"201": {
						"description": "Certificate authority created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakCertificateAuthorityDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Generates a new CA and makes it the active one. The previous CA stays trusted until it\nexpires. Requires a recent sign-in.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			}
		},
		"/tak-server/certificate-authorities/import": {
			"post": {
				"operationId": "ImportTakCertificateAuthority",
				"responses": {
					"201": {
						"description": "Certificate authority imported",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakCertificateAuthorityDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Imports an existing CA and makes it the active one. The previous CA stays trusted until it\nexpires. Requires a recent sign-in; the key is encrypted at rest and never returned.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ImportTakCertificateAuthorityRequest"
							}
						}
					}
				}
			}
		},
		"/tak-server/acme": {
			"get": {
				"operationId": "GetSettings",
				"responses": {
					"200": {
						"description": "ACME settings",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakAcmeSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			},
			"put": {
				"operationId": "UpdateSettings",
				"responses": {
					"200": {
						"description": "ACME settings updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakAcmeSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces settings. The provider token is write-only; omit it to keep the stored value.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateTakAcmeSettingsRequest"
							}
						}
					}
				}
			}
		},
		"/tak-server/acme/renew": {
			"post": {
				"operationId": "Renew",
				"responses": {
					"200": {
						"description": "Certificate renewed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakAcmeSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "ACME is disabled",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"502": {
						"description": "ACME renewal failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Immediately obtains or renews the public certificate with the configured solver.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			}
		},
		"/tak-server/acme/test": {
			"post": {
				"operationId": "Test",
				"responses": {
					"200": {
						"description": "Test finished",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakAcmeTestResultDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Runs the saved settings against Let's Encrypt staging to check the setup without touching the\nproduction rate limits. Nothing is installed; a failure is returned as `succeeded: false`.",
				"tags": [
					"TAK server"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			}
		},
		"/events/{eventId}/tak/groups": {
			"get": {
				"operationId": "ListTakGroups",
				"responses": {
					"200": {
						"description": "TAK groups",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakGroupPage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists the event's TAK groups ordered by creation time, oldest first.",
				"tags": [
					"TAK groups"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			},
			"post": {
				"operationId": "CreateTakGroup",
				"responses": {
					"201": {
						"description": "TAK group created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakGroupDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Name already in use or event archived; Idempotency-Key conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"TAK groups"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"description": "Makes retries safe: a repeated request returns the original response.",
						"in": "header",
						"name": "Idempotency-Key",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateTakGroupRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/tak/groups/{groupId}": {
			"get": {
				"operationId": "GetTakGroup",
				"responses": {
					"200": {
						"description": "TAK group",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakGroupDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Returns the group with its members.",
				"tags": [
					"TAK groups"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "groupId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"put": {
				"operationId": "UpdateTakGroup",
				"responses": {
					"200": {
						"description": "TAK group updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakGroupDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, name already in use or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces name and description, and the members when given. Requires the current `version`.",
				"tags": [
					"TAK groups"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "groupId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateTakGroupRequest"
							}
						}
					}
				}
			},
			"delete": {
				"operationId": "DeleteTakGroup",
				"responses": {
					"204": {
						"description": "TAK group deleted"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"TAK groups"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "groupId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/tak/configuration": {
			"get": {
				"operationId": "GetTakConfiguration",
				"responses": {
					"200": {
						"description": "TAK configuration",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakConfigurationDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"TAK configuration"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"put": {
				"operationId": "UpdateTakConfiguration",
				"responses": {
					"200": {
						"description": "TAK configuration updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakConfigurationDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces the TAK connection settings. Requires the current `version` (0 before the first save).",
				"tags": [
					"TAK configuration"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateTakConfigurationRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/tak/atak-preferences": {
			"get": {
				"operationId": "GetAtakPreferences",
				"responses": {
					"200": {
						"description": "ATAK preferences",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AtakPreferenceListDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"TAK configuration"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"put": {
				"operationId": "ReplaceAtakPreferences",
				"responses": {
					"200": {
						"description": "ATAK preferences replaced",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AtakPreferenceListDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces the whole list. Requires the current `version` (0 before the first save).",
				"tags": [
					"TAK configuration"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ReplaceAtakPreferencesRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/tak/atak-preferences/import": {
			"post": {
				"operationId": "ImportAtakPreferences",
				"responses": {
					"200": {
						"description": "ATAK preferences imported",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ImportAtakPreferencesResponse"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Imports a `.pref` file, such as ATAK's settings export, as event-wide entries. Keys\nOpenMeshTak owns and entries that do not fit ATAK's types are left out and listed.",
				"tags": [
					"TAK configuration"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ImportAtakPreferencesRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/tak/atak-preferences/unlock-package": {
			"get": {
				"operationId": "DownloadAtakUnlockPackage",
				"responses": {
					"200": {
						"description": "ATAK unlock Data Package",
						"content": {
							"application/json": {
								"schema": {
									"type": "string",
									"format": "byte"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "The event never restricted a settings item",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "An ATAK Data Package that sets `disablePreferenceItem_<item>` and `hidePreferenceItem_<item>`\nto `false` for every settings item the event restricts now or restricted in a published\nrevision, so devices show those items normally again after the event.",
				"tags": [
					"TAK configuration"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/tak/atak-preference-catalog": {
			"get": {
				"operationId": "GetAtakPreferenceCatalog",
				"responses": {
					"200": {
						"description": "ATAK preference catalog",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AtakPreferenceCatalogDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"TAK configuration"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": []
			}
		},
		"/system-status": {
			"get": {
				"operationId": "GetSystemStatus",
				"responses": {
					"200": {
						"description": "System status",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SystemStatusDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Health overview for operators: database, data disk, TAK server, its certificate and recent\nerrors, with a few numbers. Requires instance-wide `server-logs.read`.",
				"tags": [
					"Operations"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			}
		},
		"/setup": {
			"get": {
				"operationId": "GetSetupStatus",
				"responses": {
					"200": {
						"description": "Setup status",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SetupStatusResponse"
								}
							}
						}
					}
				},
				"description": "Reports whether first-administrator setup has been completed. Reveals nothing else.",
				"tags": [
					"Setup"
				],
				"security": [],
				"parameters": []
			},
			"post": {
				"operationId": "CreateAdministrator",
				"responses": {
					"201": {
						"description": "Administrator created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SetupResponse"
								}
							}
						}
					}
				},
				"description": "Creates the first password-backed administrator using the one-time operator token.",
				"tags": [
					"Setup"
				],
				"security": [],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/SetupRequest"
							}
						}
					}
				}
			}
		},
		"/presets": {
			"get": {
				"operationId": "ListSettingsPresets",
				"responses": {
					"200": {
						"description": "Presets",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SettingsPresetPage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists library presets ordered by creation time, oldest first.",
				"tags": [
					"Settings presets"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "query",
						"name": "kind",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/PresetKind"
						}
					},
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			},
			"post": {
				"operationId": "CreateSettingsPreset",
				"responses": {
					"201": {
						"description": "Preset saved",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SettingsPresetDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Invalid preset",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Validates a preset document without an event and saves a copy to the library.",
				"tags": [
					"Settings presets"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateSettingsPresetRequest"
							}
						}
					}
				}
			}
		},
		"/presets/{presetId}": {
			"get": {
				"operationId": "GetSettingsPreset",
				"responses": {
					"200": {
						"description": "Preset",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SettingsPresetDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "The preset with its portable document, ready to download or import into an event.",
				"tags": [
					"Settings presets"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "presetId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"put": {
				"operationId": "UpdateSettingsPreset",
				"responses": {
					"200": {
						"description": "Preset updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SettingsPresetDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Invalid preset",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Renames the preset or replaces its settings. Requires the current `version`.",
				"tags": [
					"Settings presets"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "presetId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateSettingsPresetRequest"
							}
						}
					}
				}
			},
			"delete": {
				"operationId": "DeleteSettingsPreset",
				"responses": {
					"204": {
						"description": "Preset deleted"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Deletes the preset. Events that used it keep their values.",
				"tags": [
					"Settings presets"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "presetId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/meshtastic/preset": {
			"get": {
				"operationId": "ExportMeshtasticPreset",
				"responses": {
					"200": {
						"description": "Meshtastic preset",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PresetDocumentDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "The event's Meshtastic settings without secrets, managed or member-specific values.",
				"tags": [
					"Settings presets"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/meshtastic/preset/preview": {
			"post": {
				"operationId": "PreviewMeshtasticPreset",
				"responses": {
					"200": {
						"description": "Import preview",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MeshtasticPresetPreviewDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Invalid preset",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Checks a preset against the event's firmware profile and reports what an import would change.",
				"tags": [
					"Settings presets"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/PreviewMeshtasticPresetRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/meshtastic/preset/import": {
			"post": {
				"operationId": "ImportMeshtasticPreset",
				"responses": {
					"200": {
						"description": "Preset imported into the draft",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MeshtasticConfigurationDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, unconfirmed import or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Invalid preset",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Applies a previewed preset to the draft. Send the preview's `version` and `confirmation`.",
				"tags": [
					"Settings presets"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ApplyMeshtasticPresetRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/tak/preset": {
			"get": {
				"operationId": "ExportTakPreset",
				"responses": {
					"200": {
						"description": "TAK preset",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PresetDocumentDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "The event's ATAK preferences for the whole event, its groups and roles.",
				"tags": [
					"Settings presets"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/tak/preset/preview": {
			"post": {
				"operationId": "PreviewTakPreset",
				"responses": {
					"200": {
						"description": "Import preview",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/TakPresetPreviewDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Invalid preset or mapping",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Checks a preset against the ATAK catalog and the event, and reports what an import would add or\nchange. `confirmation` stays `null` until every group and role of the preset is mapped.",
				"tags": [
					"Settings presets"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/PreviewTakPresetRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/tak/preset/import": {
			"post": {
				"operationId": "ImportTakPreset",
				"responses": {
					"200": {
						"description": "Preset imported into the draft",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/AtakPreferenceListDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, unconfirmed import or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Invalid preset or mapping",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Merges a previewed preset into the draft. Send the preview's `version`, mappings and `confirmation`.",
				"tags": [
					"Settings presets"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ApplyTakPresetRequest"
							}
						}
					}
				}
			}
		},
		"/server-logs": {
			"get": {
				"operationId": "ListServerLogs",
				"responses": {
					"200": {
						"description": "Server log lines",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ServerLogPage"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Core's most recent log lines from memory, sanitized like the container log. Without `after`\nit returns the newest lines; with `after` only lines written since. Requires instance-wide\n`server-logs.read`.",
				"tags": [
					"Server log"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "query",
						"name": "after",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 0
						}
					}
				]
			}
		},
		"/registration": {
			"get": {
				"operationId": "GetRegistrationStatus",
				"responses": {
					"200": {
						"description": "Registration status",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/RegistrationStatusDto"
								}
							}
						}
					}
				},
				"description": "Reports whether people may create their own account. Reveals nothing else.",
				"tags": [
					"Authentication"
				],
				"security": [],
				"parameters": []
			},
			"post": {
				"operationId": "Register",
				"responses": {
					"201": {
						"description": "Account created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/RegisterResponse"
								}
							}
						}
					},
					"401": {
						"description": "Invite not usable",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Registration closed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Username taken",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"429": {
						"description": "Too many attempts",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Creates an account and signs it in, if registration is open or invite-only with a usable\ninvite. New accounts have no permissions until an administrator grants some.",
				"tags": [
					"Authentication"
				],
				"security": [],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/RegisterRequest"
							}
						}
					}
				}
			}
		},
		"/registration-settings": {
			"get": {
				"operationId": "GetRegistrationSettings",
				"responses": {
					"200": {
						"description": "Registration settings",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/RegistrationSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Who may create their own account. Requires `registration.manage`.",
				"tags": [
					"Users"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": []
			},
			"put": {
				"operationId": "UpdateRegistrationSettings",
				"responses": {
					"200": {
						"description": "Registration settings saved",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/RegistrationSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Closes registration, makes it invite-only or opens it to everyone. Requires `registration.manage`.",
				"tags": [
					"Users"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateRegistrationSettingsRequest"
							}
						}
					}
				}
			}
		},
		"/registration-invites": {
			"get": {
				"operationId": "ListRegistrationInvites",
				"responses": {
					"200": {
						"description": "Registration invites",
						"content": {
							"application/json": {
								"schema": {
									"items": {
										"$ref": "#/components/schemas/RegistrationInviteDto"
									},
									"type": "array"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "The 50 most recent registration invites, newest first. Requires `registration.manage`.",
				"tags": [
					"Users"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": []
			},
			"post": {
				"operationId": "CreateRegistrationInvite",
				"responses": {
					"201": {
						"description": "Registration invite created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CreatedRegistrationInviteResponse"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Issues a single-use registration link, valid for seven days, for invite-only registration.\nThe link is returned once. Requires `registration.manage`.",
				"tags": [
					"Users"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": []
			}
		},
		"/registration-invites/{inviteId}/revoke": {
			"post": {
				"operationId": "RevokeRegistrationInvite",
				"responses": {
					"200": {
						"description": "Registration invite revoked",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/RegistrationInviteDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Revokes an unused invite immediately. Requires `registration.manage`.",
				"tags": [
					"Users"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "inviteId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/members/{memberId}/profile": {
			"get": {
				"operationId": "GetMemberProfile",
				"responses": {
					"200": {
						"description": "Resolved profile",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ResolvedProfileDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Configuration not published",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Resolves the member's callsign, TAK and Meshtastic identity. Requires\n`members.read`, being that member in an active event, or `member-artifacts.download` in an\nactive event, which is audited as an on-behalf view. Draft events return an administrator\npreview of the unpublished configuration.",
				"tags": [
					"Profiles"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "memberId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/me/event-memberships": {
			"get": {
				"operationId": "ListMyEventMemberships",
				"responses": {
					"200": {
						"description": "Active event memberships",
						"content": {
							"application/json": {
								"schema": {
									"items": {
										"$ref": "#/components/schemas/MyEventMembershipDto"
									},
									"type": "array"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists the signed-in user's memberships in active events.",
				"tags": [
					"Profiles"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			}
		},
		"/events/{eventId}/members/{memberId}/meshtastic/channels/{channelId}/handout": {
			"get": {
				"operationId": "GetChannelHandout",
				"responses": {
					"200": {
						"description": "Channel handout",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ChannelHandoutDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Delivers an audited Meshtastic channel URL to the signed-in member when the published event\nconfiguration designates that member as a key holder. The URL contains secret key material.",
				"tags": [
					"Profiles"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "memberId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "channelId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/principal": {
			"get": {
				"operationId": "GetPrincipal",
				"responses": {
					"200": {
						"description": "Authenticated principal",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PrincipalDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Describes the authenticated caller and its effective grants. Integrations use it to verify\nan API key; the Web application uses it to adapt navigation. It never replaces server-side\nauthorization.",
				"tags": [
					"Authentication"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": []
			}
		},
		"/events/{eventId}/offline-snapshots": {
			"post": {
				"operationId": "CreateOfflineSnapshot",
				"responses": {
					"200": {
						"description": "Offline snapshot document",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/OfflineSnapshotDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event not active",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Describes the published revisions of the selected packages: layers, objects and displayable\nmap content with sizes and checksums. Stores nothing on the server; audited.",
				"tags": [
					"Offline"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateOfflineSnapshotRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/offline-snapshots/packages/{packageId}/revisions/{number}/contents/{contentId}/tiles": {
			"get": {
				"operationId": "ListOfflineTiles",
				"responses": {
					"200": {
						"description": "Tile page",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/OfflineTilePage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event not active",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "One page of the tiles of a published offline map, base64-encoded with their SHA-256.",
				"tags": [
					"Offline"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "number",
						"required": true,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1
						}
					},
					{
						"in": "path",
						"name": "contentId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			}
		},
		"/events/{eventId}/offline-snapshots/packages/{packageId}/revisions/{number}/contents/{contentId}/image": {
			"get": {
				"operationId": "GetOfflineImage",
				"responses": {
					"200": {
						"description": "Rubber-sheet image",
						"content": {
							"application/json": {
								"schema": {
									"type": "string",
									"format": "byte"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event not active",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "The image of a published rubber sheet.",
				"tags": [
					"Offline"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "number",
						"required": true,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1
						}
					},
					{
						"in": "path",
						"name": "contentId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/meshtastic/firmware-releases": {
			"get": {
				"operationId": "ListFirmwareReleases",
				"responses": {
					"200": {
						"description": "Firmware releases",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FirmwareReleaseListDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists full releases, newest first. When the flasher cannot be reached, the last downloaded\nlist is returned; without one the list is unknown. Requires `events.manage` for at least one\nevent.",
				"tags": [
					"Meshtastic firmware profiles"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": []
			}
		},
		"/meshtastic/firmware-releases/settings": {
			"get": {
				"operationId": "GetFirmwareReleaseSettings",
				"responses": {
					"200": {
						"description": "Firmware release settings",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FirmwareReleaseSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Whether Core looks up releases. Requires instance-wide `settings.manage`.",
				"tags": [
					"Meshtastic firmware profiles"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			},
			"put": {
				"operationId": "UpdateFirmwareReleaseSettings",
				"responses": {
					"200": {
						"description": "Firmware release settings updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FirmwareReleaseSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Switches release lookups on or off. Requires instance-wide `settings.manage`.",
				"tags": [
					"Meshtastic firmware profiles"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateFirmwareReleaseSettingsRequest"
							}
						}
					}
				}
			}
		},
		"/meshtastic/firmware-profiles": {
			"get": {
				"operationId": "ListFirmwareProfiles",
				"responses": {
					"200": {
						"description": "Firmware profiles",
						"content": {
							"application/json": {
								"schema": {
									"items": {
										"$ref": "#/components/schemas/FirmwareProfileSummaryDto"
									},
									"type": "array"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists the supported firmware lines, newest first.",
				"tags": [
					"Meshtastic firmware profiles"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": []
			}
		},
		"/meshtastic/firmware-profiles/{profileId}": {
			"get": {
				"operationId": "GetFirmwareProfile",
				"responses": {
					"200": {
						"description": "Firmware profile",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FirmwareProfileDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Returns the sections, fields and enums of one profile.",
				"tags": [
					"Meshtastic firmware profiles"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "profileId",
						"required": true,
						"schema": {
							"type": "string"
						}
					}
				]
			}
		},
		"/events/{eventId}/meshtastic/configuration": {
			"get": {
				"operationId": "GetMeshtasticConfiguration",
				"responses": {
					"200": {
						"description": "Meshtastic configuration",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MeshtasticConfigurationDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Meshtastic configuration"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/meshtastic/configuration/settings": {
			"put": {
				"operationId": "UpdateMeshtasticSettings",
				"responses": {
					"200": {
						"description": "Settings updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MeshtasticConfigurationDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces the settings for the current firmware version. Requires the current `version`.",
				"tags": [
					"Meshtastic configuration"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateMeshtasticSettingsRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/meshtastic/configuration/secrets": {
			"put": {
				"operationId": "UpdateMeshtasticSecrets",
				"responses": {
					"200": {
						"description": "Secrets updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MeshtasticConfigurationDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Sets or clears write-only secrets such as the Wi-Fi or MQTT password. Values are never\nreturned; `secretsSet` only says which secrets hold a value. Requires the current `version`.",
				"tags": [
					"Meshtastic configuration"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateMeshtasticSecretsRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/meshtastic/configuration/firmware/preview": {
			"post": {
				"operationId": "PreviewFirmwareChange",
				"responses": {
					"200": {
						"description": "Firmware change preview",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/FirmwareChangePreviewDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Unsupported firmware version",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Reports which settings a firmware change would keep, drop, invalidate or add.",
				"tags": [
					"Meshtastic configuration"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/PreviewFirmwareChangeRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/meshtastic/configuration/firmware": {
			"put": {
				"operationId": "ChangeFirmware",
				"responses": {
					"200": {
						"description": "Firmware changed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MeshtasticConfigurationDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, unconfirmed change or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Unsupported firmware version",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Changes the recommended firmware. Except for raising the minimum patch within a line, send\nthe `confirmation` of the preview that was accepted.",
				"tags": [
					"Meshtastic configuration"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ChangeFirmwareRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/meshtastic/channels": {
			"get": {
				"operationId": "ListMeshtasticChannels",
				"responses": {
					"200": {
						"description": "Meshtastic channels",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MeshtasticChannelPage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists the event's channels in creation order; sort by `sortOrder` for the device order.",
				"tags": [
					"Meshtastic channels"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			},
			"post": {
				"operationId": "CreateMeshtasticChannel",
				"responses": {
					"201": {
						"description": "Meshtastic channel created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MeshtasticChannelDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Name in use, channel limit reached or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Creates a channel; without `psk` the server generates a random 32-byte key.",
				"tags": [
					"Meshtastic channels"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateMeshtasticChannelRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/meshtastic/channels/{channelId}": {
			"get": {
				"operationId": "GetMeshtasticChannel",
				"responses": {
					"200": {
						"description": "Meshtastic channel",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MeshtasticChannelDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Meshtastic channels"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "channelId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"put": {
				"operationId": "UpdateMeshtasticChannel",
				"responses": {
					"200": {
						"description": "Meshtastic channel updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MeshtasticChannelDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, name in use or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces everything except the key. Requires the current `version`.",
				"tags": [
					"Meshtastic channels"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "channelId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateMeshtasticChannelRequest"
							}
						}
					}
				}
			},
			"delete": {
				"operationId": "DeleteMeshtasticChannel",
				"responses": {
					"204": {
						"description": "Meshtastic channel deleted"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Meshtastic channels"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "channelId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/meshtastic/channels/{channelId}/psk/rotate": {
			"post": {
				"operationId": "RotateMeshtasticChannelPsk",
				"responses": {
					"200": {
						"description": "Key rotated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MeshtasticChannelDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces the key, for example after a leak. Audited; requires the current `version`.",
				"tags": [
					"Meshtastic channels"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "channelId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/RotateChannelPskRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/meshtastic/channels/{channelId}/release": {
			"post": {
				"operationId": "ReleaseMeshtasticChannel",
				"responses": {
					"200": {
						"description": "Channel released",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MeshtasticChannelDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, channel not withheld or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Releases a withheld secret channel to its whole audience. Audited; requires the current\n`version`.",
				"tags": [
					"Meshtastic channels"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "channelId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ReleaseMeshtasticChannelRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/meshtastic/channels/{channelId}/psk/reveal": {
			"post": {
				"operationId": "RevealMeshtasticChannelPsk",
				"responses": {
					"200": {
						"description": "Channel key",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/RevealedChannelPsk"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Returns the plain key. Requires `channel-keys.reveal`; every reveal is audited.",
				"tags": [
					"Meshtastic channels"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "channelId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/members/{memberId}/meshtastic/device-profile": {
			"get": {
				"operationId": "GetMeshtasticDeviceProfile",
				"responses": {
					"200": {
						"description": "Meshtastic device profile",
						"content": {
							"application/json": {
								"schema": {
									"type": "string",
									"format": "byte"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Meshtastic configuration not published or event without Meshtastic",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Generates the signed-in member's Meshtastic device profile (`.cfg`) from the published event\nconfiguration: owner names, device role, the event's radio settings and the channels the\nmember receives now. An operator with `member-artifacts.download` receives exactly the\nmember's file on their behalf. The file contains channel keys; every download is audited. The file\nname names the firmware line it is made for.",
				"tags": [
					"Profiles"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "memberId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/members/{memberId}/data-packages": {
			"get": {
				"operationId": "ListMemberDataPackages",
				"responses": {
					"200": {
						"description": "Data packages the member receives",
						"content": {
							"application/json": {
								"schema": {
									"items": {
										"$ref": "#/components/schemas/MemberDataPackageDto"
									},
									"type": "array"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "The member's packages; `members.read` previews and `member-artifacts.download` acts on their behalf.",
				"tags": [
					"Profiles"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "memberId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/members/{memberId}/data-packages/{packageId}/atak": {
			"get": {
				"operationId": "DownloadMemberDataPackage",
				"responses": {
					"200": {
						"description": "ATAK Data Package",
						"content": {
							"application/json": {
								"schema": {
									"type": "string",
									"format": "byte"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Downloads the newest published revision as an ATAK Data Package, for the member or on their behalf.",
				"tags": [
					"Profiles"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "memberId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/members/{memberId}/claims": {
			"get": {
				"operationId": "ListMemberClaims",
				"responses": {
					"200": {
						"description": "Claims",
						"content": {
							"application/json": {
								"schema": {
									"items": {
										"$ref": "#/components/schemas/MemberClaimDto"
									},
									"type": "array"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists the member's 20 most recent claims without their tokens. Requires `members.read`.",
				"tags": [
					"Event members"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "memberId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"post": {
				"operationId": "CreateMemberClaim",
				"responses": {
					"201": {
						"description": "Claim created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CreatedMemberClaimResponse"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event not active",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"429": {
						"description": "Too many new access links",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Issues a 24-hour single-use claim and returns its token exactly once. Earlier open claims of\nthe member are revoked. Requires `member-claims.create` and an active event.",
				"tags": [
					"Event members"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "memberId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/members/{memberId}/claims/{claimId}/revoke": {
			"post": {
				"operationId": "RevokeMemberClaim",
				"responses": {
					"200": {
						"description": "Claim revoked",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MemberClaimDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Revokes an open claim immediately. Repeating the request is harmless.",
				"tags": [
					"Event members"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "memberId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "claimId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/auth/claims/exchange": {
			"post": {
				"operationId": "ExchangeClaim",
				"responses": {
					"200": {
						"description": "Session established",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ClaimExchangeResponse"
								}
							}
						}
					},
					"401": {
						"description": "Claim not usable",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "The account has its own sign-in",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"429": {
						"description": "Too many attempts",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Exchanges a single-use participant claim for a normal browser session. The token is sent in\nthe body, never in the URL. Every unusable claim returns the same `401`.",
				"tags": [
					"Authentication"
				],
				"security": [],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ClaimExchangeRequest"
							}
						}
					}
				}
			}
		},
		"/map/settings": {
			"get": {
				"operationId": "GetMapSettings",
				"responses": {
					"200": {
						"description": "Map settings",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MapSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Available Web base maps and the installation default. Readable by every signed-in user.",
				"tags": [
					"Map"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			},
			"put": {
				"operationId": "UpdateMapSettings",
				"responses": {
					"200": {
						"description": "Map settings updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/MapSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Changes available base maps and their default. Requires instance-wide `settings.manage`.",
				"tags": [
					"Map"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateMapSettingsRequest"
							}
						}
					}
				}
			}
		},
		"/instance": {
			"get": {
				"operationId": "GetInstanceSettings",
				"responses": {
					"200": {
						"description": "Instance settings",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/InstanceSettingsDto"
								}
							}
						}
					}
				},
				"description": "How this installation presents itself. Public, because the sign-in page shows it.",
				"tags": [
					"Instance"
				],
				"security": [],
				"parameters": []
			},
			"put": {
				"operationId": "UpdateInstanceSettings",
				"responses": {
					"200": {
						"description": "Instance settings updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/InstanceSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Renames the installation. Requires instance-wide `settings.manage`.",
				"tags": [
					"Instance"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateInstanceSettingsRequest"
							}
						}
					}
				}
			}
		},
		"/map/icons/settings": {
			"get": {
				"operationId": "GetIconSettings",
				"responses": {
					"200": {
						"description": "Icon settings",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/IconSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "The installation-wide library summary. Readable by signed-in users.",
				"tags": [
					"Map"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			},
			"put": {
				"operationId": "UpdateIconSettings",
				"responses": {
					"200": {
						"description": "Icon database imported",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/UpdateIconSettingsResult"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"413": {
						"description": "Upload too large",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"415": {
						"description": "Unsupported upload",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Invalid icon database",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces installation-wide PNG icons using raw WinTAK SQLite bytes (10 MiB). Requires settings.manage.",
				"tags": [
					"Map"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "query",
						"name": "version",
						"required": true,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 0
						}
					}
				]
			},
			"delete": {
				"operationId": "ClearSettings",
				"responses": {
					"200": {
						"description": "Icon database removed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/IconSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Clears shared icons without changing stored marker paths. Requires settings.manage.",
				"tags": [
					"Map"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "query",
						"name": "version",
						"required": true,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 0
						}
					}
				]
			}
		},
		"/map/icons": {
			"get": {
				"operationId": "GetCatalogue",
				"responses": {
					"200": {
						"description": "Icon catalogue",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/InstanceIconCatalogue"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Original TAK icon paths and fallback types, shared by all signed-in editors.",
				"tags": [
					"Map"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			}
		},
		"/map/icons/{version}/{iconId}/image": {
			"get": {
				"operationId": "GetImage",
				"responses": {
					"200": {
						"description": "Icon image",
						"content": {
							"application/json": {
								"schema": {
									"type": "string",
									"format": "byte"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "One PNG from the current library; stale versions and unknown IDs return 404.",
				"tags": [
					"Map"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "version",
						"required": true,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1
						}
					},
					{
						"in": "path",
						"name": "iconId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/health": {
			"get": {
				"operationId": "GetHealth",
				"responses": {
					"200": {
						"description": "Healthy",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/HealthResponse"
								}
							}
						}
					}
				},
				"description": "Reports that the API process completed startup, including its database connection.",
				"tags": [
					"Operations"
				],
				"security": [],
				"parameters": []
			}
		},
		"/events": {
			"get": {
				"operationId": "ListEvents",
				"responses": {
					"200": {
						"description": "Events",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventPage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists the events the caller may read, ordered by creation time, oldest first.",
				"tags": [
					"Events"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Only return events in this lifecycle state.",
						"in": "query",
						"name": "status",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/EventStatus"
						}
					}
				]
			},
			"post": {
				"operationId": "CreateEvent",
				"responses": {
					"201": {
						"description": "Event created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Slug already in use; Idempotency-Key conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Creates a new event in the `draft` state. Requires instance-wide `events.manage`.",
				"tags": [
					"Events"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"description": "Makes retries safe: a repeated request returns the original response.",
						"in": "header",
						"name": "Idempotency-Key",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateEventRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}": {
			"get": {
				"operationId": "GetEvent",
				"responses": {
					"200": {
						"description": "Event",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Events"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"put": {
				"operationId": "UpdateEvent",
				"responses": {
					"200": {
						"description": "Event updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, slug conflict or archived event",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces the editable event settings. Requires the current `version`. The lifecycle state is\nchanged only through dedicated transitions, and archived events are read-only.",
				"tags": [
					"Events"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateEventRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/activate": {
			"post": {
				"operationId": "ActivateEvent",
				"responses": {
					"200": {
						"description": "Event activated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, invalid transition or event not ready",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Moves a draft event to `active`. Requires `events.manage` and at least one event role and\none event group; unmet requirements are listed in the problem's `errors`.",
				"tags": [
					"Events"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/EventTransitionRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/archive": {
			"post": {
				"operationId": "ArchiveEvent",
				"responses": {
					"200": {
						"description": "Event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict or invalid transition",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Moves an active event to the read-only `archived` state. Requires `events.manage`. Its event\naccounts are deleted with their sign-in, sessions and TAK certificates; accounts that are still\nmembers of another unarchived event move to that event instead.",
				"tags": [
					"Events"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/EventTransitionRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/reactivate": {
			"post": {
				"operationId": "ReactivateEvent",
				"responses": {
					"200": {
						"description": "Event reactivated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, invalid transition or event not ready",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Returns an archived event to `active` after repeating activation validation. Requires\n`events.reactivate`. Revoked or expired credentials, artifacts and download grants stay\ninvalid; clients regenerate what they need.",
				"tags": [
					"Events"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/EventTransitionRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/make-accounts-permanent": {
			"post": {
				"operationId": "MakeEventAccountsPermanent",
				"responses": {
					"200": {
						"description": "Event accounts made permanent",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventAccountsMadePermanentResponse"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Turns every current event account of the event into a permanent account, so archiving no\nlonger deletes them. Requires `event-accounts.manage` for the event.",
				"tags": [
					"Events"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/roles": {
			"get": {
				"operationId": "ListEventRoles",
				"responses": {
					"200": {
						"description": "Event roles",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventRolePage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists the event's roles ordered by creation time, oldest first.",
				"tags": [
					"Event roles"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			},
			"post": {
				"operationId": "CreateEventRole",
				"responses": {
					"201": {
						"description": "Event role created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventRoleDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Slug already in use or event archived; Idempotency-Key conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Event roles"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"description": "Makes retries safe: a repeated request returns the original response.",
						"in": "header",
						"name": "Idempotency-Key",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateEventRoleRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/roles/{roleId}": {
			"get": {
				"operationId": "GetEventRole",
				"responses": {
					"200": {
						"description": "Event role",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventRoleDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Event roles"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "roleId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"put": {
				"operationId": "UpdateEventRole",
				"responses": {
					"200": {
						"description": "Event role updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventRoleDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, slug conflict or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces name, slug and description. Requires the current `version`.",
				"tags": [
					"Event roles"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "roleId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateEventRoleRequest"
							}
						}
					}
				}
			},
			"delete": {
				"operationId": "DeleteEventRole",
				"responses": {
					"204": {
						"description": "Event role deleted"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event archived or role still assigned to members",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Event roles"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "roleId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/sync-issues": {
			"get": {
				"operationId": "ListSyncIssues",
				"responses": {
					"200": {
						"description": "Sync issues",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/SyncIssuePage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists synchronizations that could not be resolved, oldest first. Requires `members.read`.",
				"tags": [
					"Event members"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"description": "Only return issues in this state.",
						"in": "query",
						"name": "status",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/SyncIssueStatus"
						}
					}
				]
			}
		},
		"/events/{eventId}/sync-issues/{syncIssueId}/retry": {
			"post": {
				"operationId": "RetrySyncIssue",
				"responses": {
					"200": {
						"description": "Membership resolved or issue still open",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ExternalMemberSyncResult"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Issue not open or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Re-evaluates an open issue against the event's current roles and groups. Requires\n`members.manage`. A callsign override resolves a callsign conflict for this member.",
				"tags": [
					"Event members"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "syncIssueId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/RetrySyncIssueRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/groups/{groupId}/member-order": {
			"put": {
				"operationId": "ReorderGroupMembers",
				"responses": {
					"200": {
						"description": "Members in their new order",
						"content": {
							"application/json": {
								"schema": {
									"items": {
										"$ref": "#/components/schemas/EventMemberDto"
									},
									"type": "array"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Members changed meanwhile, short name too long or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Renumbers the group's short names `1..n` in the given order. Send every current member of\nthe group exactly once. Requires `members.manage`. Devices keep their old short name until\nthe member is provisioned again.",
				"tags": [
					"Event members"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "groupId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ReorderGroupMembersRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/external-members/{provider}/{externalId}": {
			"put": {
				"operationId": "SyncExternalMember",
				"responses": {
					"200": {
						"description": "Membership resolved or sync issue recorded",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ExternalMemberSyncResult"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Idempotently creates or updates the event membership of an external identity. Requires\n`members.sync` for the event. When the role or group slug does not exist, the response\ncontains a sync issue instead and nothing else changes. Synchronization never creates a\npassword, login, email address or session.",
				"tags": [
					"Event members"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "provider",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/ExternalProvider"
						}
					},
					{
						"in": "path",
						"name": "externalId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/ExternalId"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ExternalMemberSyncRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/members": {
			"get": {
				"operationId": "ListEventMembers",
				"responses": {
					"200": {
						"description": "Event members",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventMemberPage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists the event's members ordered by creation time, oldest first. Requires `members.read`.",
				"tags": [
					"Event members"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			},
			"post": {
				"operationId": "CreateEventMember",
				"responses": {
					"201": {
						"description": "Event member created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventMemberDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Already a member, callsign or short-name conflict, or event archived; Idempotency-Key conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Adds an existing OpenMeshTak user to the event. Members from external systems use the\nexternal-member upsert instead. Requires `members.manage`.",
				"tags": [
					"Event members"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"description": "Makes retries safe: a repeated request returns the original response.",
						"in": "header",
						"name": "Idempotency-Key",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateEventMemberRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/members/accounts": {
			"post": {
				"operationId": "CreateEventMemberAccount",
				"responses": {
					"201": {
						"description": "Account and member created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CreatedEventMemberAccountResponse"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Username taken, callsign or short-name conflict, or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Creates a new person and adds them to the event in one step. Returns a single-use setup link,\nvalid for seven days, so they choose their own password. The account is an event account that\nis deleted when the event is archived, unless the event keeps its accounts\n(`permanentAccounts`). Requires `member-accounts.create`.",
				"tags": [
					"Event members"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateEventMemberAccountRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/members/{memberId}": {
			"get": {
				"operationId": "GetEventMember",
				"responses": {
					"200": {
						"description": "Event member",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventMemberDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Event members"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "memberId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"put": {
				"operationId": "UpdateEventMember",
				"responses": {
					"200": {
						"description": "Event member updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventMemberDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, callsign or short-name conflict, or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces the member's event role, event group and callsign override. Requires the current\n`version` and `members.manage`. An integration sync may later set role and group again.",
				"tags": [
					"Event members"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "memberId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateEventMemberRequest"
							}
						}
					}
				}
			},
			"delete": {
				"operationId": "DeleteEventMember",
				"responses": {
					"204": {
						"description": "Event member removed"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Removes the member from this event only. The user and other event participations remain.\nRequires `members.manage`.",
				"tags": [
					"Event members"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "memberId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/groups": {
			"get": {
				"operationId": "ListEventGroups",
				"responses": {
					"200": {
						"description": "Event groups",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventGroupPage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists the event's groups ordered by creation time, oldest first.",
				"tags": [
					"Event groups"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			},
			"post": {
				"operationId": "CreateEventGroup",
				"responses": {
					"201": {
						"description": "Event group created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventGroupDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Slug already in use or event archived; Idempotency-Key conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Event groups"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"description": "Makes retries safe: a repeated request returns the original response.",
						"in": "header",
						"name": "Idempotency-Key",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateEventGroupRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/groups/{groupId}": {
			"get": {
				"operationId": "GetEventGroup",
				"responses": {
					"200": {
						"description": "Event group",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventGroupDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Event groups"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "groupId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"put": {
				"operationId": "UpdateEventGroup",
				"responses": {
					"200": {
						"description": "Event group updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EventGroupDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, slug conflict or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces name, slug and description. Requires the current `version`.",
				"tags": [
					"Event groups"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "groupId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateEventGroupRequest"
							}
						}
					}
				}
			},
			"delete": {
				"operationId": "DeleteEventGroup",
				"responses": {
					"204": {
						"description": "Event group deleted"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event archived or group still assigned to members",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Event groups"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "groupId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/configuration-revisions": {
			"get": {
				"operationId": "ListConfigurationRevisions",
				"responses": {
					"200": {
						"description": "Configuration revisions",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConfigurationRevisionPage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists revisions oldest first. Requires `events.read`.",
				"tags": [
					"Events"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			},
			"post": {
				"operationId": "PublishConfiguration",
				"responses": {
					"200": {
						"description": "Configuration published or unchanged",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PublishConfigurationResponse"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event not active; Idempotency-Key conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Publishes the current configuration of an active event. Returns the latest revision with\n`created: false` when nothing changed. Requires `events.manage`.",
				"tags": [
					"Events"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"description": "Makes retries safe: a repeated request returns the original response.",
						"in": "header",
						"name": "Idempotency-Key",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			}
		},
		"/events/{eventId}/configuration-revisions/pending-changes": {
			"get": {
				"operationId": "GetPendingConfigurationChanges",
				"responses": {
					"200": {
						"description": "Pending configuration changes",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PendingConfigurationChangesDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists what publishing would change compared with the published revision. Requires `events.read`.",
				"tags": [
					"Events"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/configuration-revisions/{revisionId}": {
			"get": {
				"operationId": "GetConfigurationRevision",
				"responses": {
					"200": {
						"description": "Configuration revision",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ConfigurationRevisionDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Events"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "revisionId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/email/settings": {
			"get": {
				"operationId": "GetEmailSettings",
				"responses": {
					"200": {
						"description": "Email settings",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EmailSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Email"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": []
			},
			"put": {
				"operationId": "UpdateEmailSettings",
				"responses": {
					"200": {
						"description": "Email settings updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/EmailSettingsDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces the settings. The SMTP password is write-only: omit it to keep the stored one.",
				"tags": [
					"Email"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateEmailSettingsRequest"
							}
						}
					}
				}
			}
		},
		"/email/settings/test": {
			"post": {
				"operationId": "SendTestEmail",
				"responses": {
					"204": {
						"description": "Test email sent"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"502": {
						"description": "Delivery failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Sends a test email with the stored settings.",
				"tags": [
					"Email"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/SendTestEmailRequest"
							}
						}
					}
				}
			}
		},
		"/me/download-grants": {
			"post": {
				"operationId": "CreateDownloadGrant",
				"responses": {
					"201": {
						"description": "Download link created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DownloadGrantDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "An iTAK package certificate is still valid",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Creates a link that downloads one artifact the signed-in user may download right now, valid\nfor 5 minutes and at most 3 downloads. Access is checked again when the link is used.",
				"tags": [
					"Downloads"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateDownloadGrantRequest"
							}
						}
					}
				}
			}
		},
		"/downloads/{token}": {
			"get": {
				"operationId": "DownloadWithGrant",
				"responses": {
					"200": {
						"description": "The artifact",
						"content": {
							"application/json": {
								"schema": {
									"type": "string",
									"format": "byte"
								}
							}
						}
					},
					"404": {
						"description": "Link invalid, used up or expired",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Downloads the artifact of a download link without a session.",
				"tags": [
					"Downloads"
				],
				"security": [],
				"parameters": [
					{
						"in": "path",
						"name": "token",
						"required": true,
						"schema": {
							"type": "string"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/revisions": {
			"get": {
				"operationId": "ListPackageRevisions",
				"responses": {
					"200": {
						"description": "Package revisions",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PackageRevisionPage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists published revisions, oldest first, without their snapshots.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			},
			"post": {
				"operationId": "PublishDataPackage",
				"responses": {
					"200": {
						"description": "Published, or the unchanged latest revision",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PublishDataPackageResponse"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event archived; Idempotency-Key conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Publishes the current draft. Requires `data-packages.publish`.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"description": "Makes retries safe: a repeated request returns the original response.",
						"in": "header",
						"name": "Idempotency-Key",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/revisions/{number}": {
			"get": {
				"operationId": "GetPackageRevision",
				"responses": {
					"200": {
						"description": "Package revision",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PackageRevisionDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Returns one revision with its snapshot.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "number",
						"required": true,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/presentation-report": {
			"get": {
				"operationId": "Report",
				"responses": {
					"200": {
						"description": "Presentation differences",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PresentationReport"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Reports source-confirmed presentation differences before downloading an export.\nOmit revision for the current draft. This is not a real-client acceptance result.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "format",
						"required": true,
						"schema": {
							"type": "string",
							"enum": [
								"cot",
								"kml"
							]
						}
					},
					{
						"in": "query",
						"name": "revision",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1
						}
					},
					{
						"in": "query",
						"name": "layerId",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-package-order": {
			"put": {
				"operationId": "ReorderDataPackages",
				"responses": {
					"200": {
						"description": "Data packages in their new order",
						"content": {
							"application/json": {
								"schema": {
									"items": {
										"$ref": "#/components/schemas/DataPackageDto"
									},
									"type": "array"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Packages changed meanwhile or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces the order with the complete list of package IDs, bottom first.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/ReorderDataPackagesRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/data-packages/{packageId}/objects/batch": {
			"post": {
				"operationId": "BatchPackageObjects",
				"responses": {
					"200": {
						"description": "Batch saved",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/BatchPackageObjectsResponse"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, locked layer or archived event",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Invalid batch or geometry",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Atomically edits/deletes/restores up to 500 objects; failures leave the draft unchanged.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "header",
						"name": "Idempotency-Key",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/BatchPackageObjectsRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/data-packages/{packageId}/objects": {
			"get": {
				"operationId": "ListPackageObjects",
				"responses": {
					"200": {
						"description": "Package objects",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PackageObjectPage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists the data package's objects in creation order, optionally only those of one layer.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "layerId",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			},
			"post": {
				"operationId": "CreatePackageObject",
				"responses": {
					"201": {
						"description": "Package object created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PackageObjectDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Layer locked, too many objects or event archived; Idempotency-Key conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Invalid geometry or other validation failure",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"description": "Makes retries safe: a repeated request returns the original response.",
						"in": "header",
						"name": "Idempotency-Key",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreatePackageObjectRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/data-packages/{packageId}/objects/{objectId}": {
			"get": {
				"operationId": "GetPackageObject",
				"responses": {
					"200": {
						"description": "Package object",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PackageObjectDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "objectId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"put": {
				"operationId": "UpdatePackageObject",
				"responses": {
					"200": {
						"description": "Package object updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PackageObjectDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, layer locked or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Invalid geometry or other validation failure",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces the object. Requires the current `version`.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "objectId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdatePackageObjectRequest"
							}
						}
					}
				}
			},
			"delete": {
				"operationId": "DeletePackageObject",
				"responses": {
					"204": {
						"description": "Package object deleted"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Layer locked or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "objectId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-package-imports/atak": {
			"post": {
				"operationId": "ImportAtakAsNewPackage",
				"responses": {
					"201": {
						"description": "Data package created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ImportedDataPackage"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Too many objects or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"413": {
						"description": "Upload too large",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"415": {
						"description": "Unsupported upload",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Unreadable archive",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Creates a data package from an ATAK Data Package (`application/zip`) or a CoT file\n(`application/xml`) and imports it into the first layer. The name comes from the package\nmanifest, otherwise from `fileName`. A failed import leaves no package behind.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "fileName",
						"required": false,
						"schema": {
							"type": "string",
							"maxLength": 255
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/layers": {
			"get": {
				"operationId": "ListPackageLayers",
				"responses": {
					"200": {
						"description": "Package layers",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PackageLayerPage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists the data package's layers in creation order; sort by `sortOrder` for display.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			},
			"post": {
				"operationId": "CreatePackageLayer",
				"responses": {
					"201": {
						"description": "Package layer created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PackageLayerDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Too many layers or event archived; Idempotency-Key conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Adds a layer on top of the existing ones.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"description": "Makes retries safe: a repeated request returns the original response.",
						"in": "header",
						"name": "Idempotency-Key",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreatePackageLayerRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/data-packages/{packageId}/layers/{layerId}": {
			"put": {
				"operationId": "UpdatePackageLayer",
				"responses": {
					"200": {
						"description": "Package layer updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PackageLayerDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces name, order, visibility and lock state. Requires the current `version`.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "layerId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdatePackageLayerRequest"
							}
						}
					}
				}
			},
			"delete": {
				"operationId": "DeletePackageLayer",
				"responses": {
					"204": {
						"description": "Package layer deleted"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Deletes the layer and all of its objects.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "layerId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/kml": {
			"get": {
				"operationId": "ExportPackageDraftKml",
				"responses": {
					"200": {
						"description": "KML of the draft",
						"content": {
							"application/json": {
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Exports the current draft as KML; `layerId` limits it to one layer. Circles and ellipses become labelled 64-sided footprints; parametric metadata is retained in ExtendedData.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "layerId",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/revisions/{number}/kml": {
			"get": {
				"operationId": "ExportPackageRevisionKml",
				"responses": {
					"200": {
						"description": "KML of the revision",
						"content": {
							"application/json": {
								"schema": {
									"type": "string"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Exports a published revision as KML; `layerId` limits it to one layer.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "number",
						"required": true,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1
						}
					},
					{
						"in": "query",
						"name": "layerId",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/layers/{layerId}/import": {
			"post": {
				"operationId": "ImportPackageGeoJson",
				"responses": {
					"200": {
						"description": "Import report",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ImportReport"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Layer locked, too many objects or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Imports a GeoJSON FeatureCollection, Feature or geometry into the layer. Points, lines and\npolygons are supported; multi-geometries are split. The report lists every adjustment, every\nskipped and every rejected feature. Request bodies are limited to 1 MB.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "layerId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/GeoJsonDocument"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/data-packages/{packageId}/geojson": {
			"get": {
				"operationId": "ExportPackageDraftGeoJson",
				"responses": {
					"200": {
						"description": "GeoJSON of the draft",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/GeoJsonFeatureCollection"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Exports the current draft as a GeoJSON FeatureCollection with simplestyle properties.\n`layerId` limits the export to one layer.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "layerId",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/revisions/{number}/geojson": {
			"get": {
				"operationId": "ExportPackageRevisionGeoJson",
				"responses": {
					"200": {
						"description": "GeoJSON of the revision",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/GeoJsonFeatureCollection"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Exports a published revision as a GeoJSON FeatureCollection; `layerId` limits it to one layer.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "number",
						"required": true,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1
						}
					},
					{
						"in": "query",
						"name": "layerId",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-package-copies": {
			"post": {
				"operationId": "CreateDataPackageCopy",
				"responses": {
					"201": {
						"description": "Data package draft created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DataPackageDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event archived, nothing published or package limits exceeded; Idempotency-Key conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Copies selected layers with new UUIDs. Published provenance is retained; explicit draft copies are audited by snapshot hash.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"description": "Makes retries safe: a repeated request returns the original response.",
						"in": "header",
						"name": "Idempotency-Key",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateDataPackageCopyRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/data-packages/{packageId}/contents": {
			"get": {
				"operationId": "ListPackageContents",
				"responses": {
					"200": {
						"description": "Map content",
						"content": {
							"application/json": {
								"schema": {
									"items": {
										"$ref": "#/components/schemas/PackageContentDto"
									},
									"type": "array"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Offline maps, nested map packages and rubber sheets kept from imports.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/contents/{contentId}/tiles/{z}/{x}/{y}": {
			"get": {
				"operationId": "GetOfflineMapTile",
				"responses": {
					"200": {
						"description": "Tile image",
						"content": {
							"application/json": {
								"schema": {
									"type": "string",
									"format": "byte"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "One XYZ tile of an offline map for display on the map; `404` where the cache has no tile.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "contentId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "z",
						"required": true,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 0,
							"maximum": 24
						}
					},
					{
						"in": "path",
						"name": "x",
						"required": true,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 0
						}
					},
					{
						"in": "path",
						"name": "y",
						"required": true,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 0
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/contents/{contentId}/image": {
			"get": {
				"operationId": "GetRubberSheetImage",
				"responses": {
					"200": {
						"description": "Rubber-sheet image",
						"content": {
							"application/json": {
								"schema": {
									"type": "string",
									"format": "byte"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "The image of a rubber sheet for display on the map.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "contentId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/contents/{contentId}": {
			"put": {
				"operationId": "UpdatePackageContent",
				"responses": {
					"200": {
						"description": "Map content updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PackageContentDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, layer locked or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Renames, moves to another layer, shows/hides or changes the opacity of map content in the\ndraft. Requires `data-packages.edit` and the current `version`.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "contentId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdatePackageContentRequest"
							}
						}
					}
				}
			},
			"delete": {
				"operationId": "DeletePackageContent",
				"responses": {
					"204": {
						"description": "Map content removed"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Layer locked or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Removes map content from the draft; published revisions keep it. Requires `data-packages.edit`.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "contentId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/layers/{layerId}/import/atak": {
			"post": {
				"operationId": "ImportAtakDataPackage",
				"responses": {
					"200": {
						"description": "Import report",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ImportReport"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Layer locked, too many objects or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"413": {
						"description": "Upload too large",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"415": {
						"description": "Unsupported upload",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Unreadable archive",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Imports an ATAK Data Package (`application/zip`, at most 10 MB) or a single CoT event\n(`application/xml`) into the layer. Markers, freeform shapes, rectangles, circles, ellipses and routes are\nsupported; the report lists every adjusted, skipped and rejected item.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "layerId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/revisions/{number}/atak": {
			"get": {
				"operationId": "ExportAtakDataPackage",
				"responses": {
					"200": {
						"description": "ATAK Data Package",
						"content": {
							"application/json": {
								"schema": {
									"type": "string",
									"format": "byte"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Downloads a published revision as an ATAK Data Package (ZIP with `MANIFEST/manifest.xml`).\n`layerId` exports only that layer, as its own package.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "number",
						"required": true,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1
						}
					},
					{
						"in": "query",
						"name": "layerId",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/layers/{layerId}/import/icons": {
			"post": {
				"operationId": "ImportPackageIcons",
				"responses": {
					"200": {
						"description": "Icon library imported",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/IconLibraryImportResult"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Layer locked, event archived or too many libraries",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"413": {
						"description": "Upload too large",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"415": {
						"description": "Unsupported upload",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Invalid icon database",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Imports PNG icons from WinTAK iconsets.sqlite (raw bytes, 10 MB maximum). Requires data-packages.edit; icons are editor-only and do not ship in TAK exports.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "layerId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/contents/{contentId}/icons": {
			"get": {
				"operationId": "ListIcons",
				"responses": {
					"200": {
						"description": "Icons",
						"content": {
							"application/json": {
								"schema": {
									"items": {
										"$ref": "#/components/schemas/PackageIconDto"
									},
									"type": "array"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "The library's original TAK paths and safe image identifiers. Requires data-packages.read.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "contentId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/contents/{contentId}/icons/{iconId}/image": {
			"get": {
				"operationId": "GetIconImage",
				"responses": {
					"200": {
						"description": "Icon image",
						"content": {
							"application/json": {
								"schema": {
									"type": "string",
									"format": "byte"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "One validated PNG, served only to an authorized package reader.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "contentId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "iconId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages": {
			"get": {
				"operationId": "ListDataPackages",
				"responses": {
					"200": {
						"description": "Data packages",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DataPackagePage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists the event's data packages and missions ordered by creation time, oldest first; `kind`\nlimits the list to one kind.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					},
					{
						"in": "query",
						"name": "kind",
						"required": false,
						"schema": {
							"$ref": "#/components/schemas/DataPackageKind"
						}
					}
				]
			},
			"post": {
				"operationId": "CreateDataPackage",
				"responses": {
					"201": {
						"description": "Data package created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DataPackageDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event archived; Idempotency-Key conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Creates a data package with one empty layer.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"description": "Makes retries safe: a repeated request returns the original response.",
						"in": "header",
						"name": "Idempotency-Key",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateDataPackageRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/data-packages/{packageId}": {
			"get": {
				"operationId": "GetDataPackage",
				"responses": {
					"200": {
						"description": "Data package",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DataPackageDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"put": {
				"operationId": "UpdateDataPackage",
				"responses": {
					"200": {
						"description": "Data package updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DataPackageDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces name and description. Requires the current `version`.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateDataPackageRequest"
							}
						}
					}
				}
			},
			"delete": {
				"operationId": "DeleteDataPackage",
				"responses": {
					"204": {
						"description": "Data package deleted"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Deletes the data package with its layers, objects and published revisions.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/events/{eventId}/data-packages/{packageId}/audience": {
			"put": {
				"operationId": "UpdateDataPackageAudience",
				"responses": {
					"200": {
						"description": "Audience updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DataPackageDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Sets who receives the package's published revisions: all members or selected groups, roles\nand members. Requires `data-packages.publish` and the current `version`.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdatePackageAudienceRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/data-packages/{packageId}/writers": {
			"put": {
				"operationId": "UpdateMissionWriters",
				"responses": {
					"200": {
						"description": "Writers updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DataPackageDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict, not a mission or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Missions only: sets the groups, roles and members that may change the mission from a TAK app.\nRequires `data-packages.publish` and the current `version`.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdatePackageWritersRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/data-packages/{packageId}/tak-delivery": {
			"put": {
				"operationId": "UpdateDataPackageTakDelivery",
				"responses": {
					"200": {
						"description": "TAK delivery updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/DataPackageDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict or event archived",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Chooses whether the built-in TAK server installs the package by itself on enrollment and/or\non every connection. Requires `data-packages.publish` and the current `version`.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "packageId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdatePackageTakDeliveryRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/data-package-exports/atak/preview": {
			"post": {
				"operationId": "PreviewCombinedExport",
				"responses": {
					"200": {
						"description": "Export report",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CombinedExportReport"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Reports which packages and revisions an export would include, skip or name twice.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CombinedExportRequest"
							}
						}
					}
				}
			}
		},
		"/events/{eventId}/data-package-exports/atak": {
			"post": {
				"operationId": "ExportCombinedDataPackage",
				"responses": {
					"200": {
						"description": "ATAK Data Package",
						"content": {
							"application/json": {
								"schema": {
									"type": "string",
									"format": "byte"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Nothing published to export",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Builds the combined ATAK Data Package. Audited with the exported revisions.",
				"tags": [
					"Data packages"
				],
				"security": [
					{
						"sessionCookie": []
					},
					{
						"apiClientBearer": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "eventId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CombinedExportRequest"
							}
						}
					}
				}
			}
		},
		"/api-clients": {
			"get": {
				"operationId": "ListApiClients",
				"responses": {
					"200": {
						"description": "API clients",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiClientPage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists API clients ordered by creation time, oldest first.",
				"tags": [
					"API clients"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			},
			"post": {
				"operationId": "CreateApiClient",
				"responses": {
					"201": {
						"description": "API client created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiClientDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Creates an API client with explicit permission grants.",
				"tags": [
					"API clients"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateApiClientRequest"
							}
						}
					}
				}
			}
		},
		"/api-clients/{apiClientId}": {
			"get": {
				"operationId": "GetApiClient",
				"responses": {
					"200": {
						"description": "API client",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiClientDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"tags": [
					"API clients"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "apiClientId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			},
			"put": {
				"operationId": "UpdateApiClient",
				"responses": {
					"200": {
						"description": "API client updated",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiClientDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Version conflict",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Replaces name, description, status and grants. Requires the current `version`.",
				"tags": [
					"API clients"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "apiClientId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/UpdateApiClientRequest"
							}
						}
					}
				}
			}
		},
		"/api-clients/{apiClientId}/api-keys": {
			"get": {
				"operationId": "ListApiKeys",
				"responses": {
					"200": {
						"description": "API keys",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiKeyPage"
								}
							}
						}
					},
					"400": {
						"description": "Invalid cursor",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Lists safe API-key metadata. Key secrets are never returned after creation.",
				"tags": [
					"API clients"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "apiClientId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "query",
						"name": "limit",
						"required": false,
						"schema": {
							"format": "int32",
							"type": "integer",
							"minimum": 1,
							"maximum": 100
						}
					},
					{
						"in": "query",
						"name": "cursor",
						"required": false,
						"schema": {
							"type": "string"
						}
					}
				]
			},
			"post": {
				"operationId": "CreateApiKey",
				"responses": {
					"201": {
						"description": "API key created",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/CreatedApiKeyResponse"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"422": {
						"description": "Validation failed",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"429": {
						"description": "Too many new API keys",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Creates an API key and returns its complete value exactly once. Creating a key while another\nis active is a rotation. Requires a recent sign-in.",
				"tags": [
					"API clients"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "apiClientId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/CreateApiKeyRequest"
							}
						}
					}
				}
			}
		},
		"/api-clients/{apiClientId}/api-keys/{apiKeyId}/revoke": {
			"post": {
				"operationId": "RevokeApiKey",
				"responses": {
					"200": {
						"description": "API key revoked",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ApiKeyDto"
								}
							}
						}
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Access denied",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"404": {
						"description": "Not found",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Revokes an API key immediately. Repeating the request is harmless.",
				"tags": [
					"API clients"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [
					{
						"in": "path",
						"name": "apiClientId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					},
					{
						"in": "path",
						"name": "apiKeyId",
						"required": true,
						"schema": {
							"$ref": "#/components/schemas/Uuid"
						}
					}
				]
			}
		},
		"/me/account-setup": {
			"post": {
				"operationId": "CompleteAccountSetup",
				"responses": {
					"204": {
						"description": "Account set up"
					},
					"401": {
						"description": "Authentication required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"403": {
						"description": "Recent sign-in required",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					},
					"409": {
						"description": "Password already set or username taken",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/ProblemDetails"
								}
							}
						}
					}
				},
				"description": "Completes an account without a password, for example right after signing in with an access\nlink: optionally picks the username and sets the first password, used for sign-in and the TAK\nlogin. Accounts that already have a password change it through the authentication API.",
				"tags": [
					"Account"
				],
				"security": [
					{
						"sessionCookie": []
					}
				],
				"parameters": [],
				"requestBody": {
					"required": true,
					"content": {
						"application/json": {
							"schema": {
								"$ref": "#/components/schemas/AccountSetupRequest"
							}
						}
					}
				}
			}
		}
	},
	"servers": [
		{
			"url": "/api/v1"
		}
	]
}