diff --git a/specification/communication/data-plane/Rooms/readme.md b/specification/communication/data-plane/Rooms/readme.md index cf1df1c91250..56a410287521 100644 --- a/specification/communication/data-plane/Rooms/readme.md +++ b/specification/communication/data-plane/Rooms/readme.md @@ -24,18 +24,29 @@ For other options on installation see [Installing AutoRest](https://aka.ms/autor These are the global settings for the communicationservices. -```yaml +``` yaml openapi-type: data-plane -tag: package-rooms-2023-10-30-preview +tag: package-rooms-2024-04-15 input-file: - - preview/2023-10-30-preview/communicationservicesrooms.json + - stable/2024-04-15/communicationservicesrooms.json +``` + +### Tag: package-rooms-2024-04-15 + +These settings apply only when `--tag=package-rooms-2024-04-15` is specified on the command line. + +```yaml $(tag) == 'package-rooms-2024-04-15' +input-file: + - stable/2024-04-15/communicationservicesrooms.json +title: + Azure Communication Services ``` ### Tag: package-rooms-2023-10-30-preview These settings apply only when `--tag=package-rooms-2023-10-30-preview` is specified on the command line. -```yaml $(tag) == 'package-rooms-2023-10-30-preview' +``` yaml $(tag) == 'package-rooms-2023-10-30-preview' input-file: - preview/2023-10-30-preview/communicationservicesrooms.json title: @@ -46,7 +57,7 @@ title: These settings apply only when `--tag=package-rooms-2023-06-14` is specified on the command line. -```yaml $(tag) == 'package-rooms-2023-06-14' +``` yaml $(tag) == 'package-rooms-2023-06-14' input-file: - stable/2023-06-14/communicationservicesrooms.json title: @@ -57,7 +68,7 @@ title: These settings apply only when `--tag=package-rooms-2023-03-31-preview` is specified on the command line. -```yaml $(tag) == 'package-rooms-2023-03-31-preview' +``` yaml $(tag) == 'package-rooms-2023-03-31-preview' input-file: - preview/2023-03-31-preview/communicationservicesrooms.json title: @@ -68,7 +79,7 @@ title: These settings apply only when `--tag=package-rooms-2022-02-01-preview` is specified on the command line. -```yaml $(tag) == 'package-rooms-2022-02-01-preview' +``` yaml $(tag) == 'package-rooms-2022-02-01-preview' input-file: - preview/2022-02-01-preview/communicationservicesrooms.json title: diff --git a/specification/communication/data-plane/Rooms/stable/2024-04-15/communicationservicesrooms.json b/specification/communication/data-plane/Rooms/stable/2024-04-15/communicationservicesrooms.json new file mode 100644 index 000000000000..df51e72c0a41 --- /dev/null +++ b/specification/communication/data-plane/Rooms/stable/2024-04-15/communicationservicesrooms.json @@ -0,0 +1,643 @@ +{ + "swagger": "2.0", + "info": { + "title": "Azure Communication Room Service", + "description": "Azure Communication Room Service", + "version": "2024-04-15" + }, + "paths": { + "/rooms": { + "post": { + "tags": [ + "Rooms" + ], + "summary": "Creates a new room.", + "operationId": "Rooms_Create", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "in": "header", + "name": "Repeatability-Request-ID", + "description": "If specified, the client directs that the request is repeatable; that is, that the client can make the request multiple times with the same Repeatability-Request-ID and get back an appropriate response without the server executing the request multiple times. The value of the Repeatability-Request-ID is an opaque string representing a client-generated, globally unique for all time, identifier for the request. It is recommended to use version 4 (random) UUIDs.", + "type": "string", + "format": "uuid" + }, + { + "in": "header", + "name": "Repeatability-First-Sent", + "description": "If Repeatability-Request-ID header is specified, then Repeatability-First-Sent header must also be specified. The value should be the date and time at which the request was first created, expressed using the IMF-fixdate form of HTTP-date.", + "type": "string", + "format": "date-time-rfc1123" + }, + { + "in": "body", + "name": "createRoomRequest", + "description": "The create room request body.", + "schema": { + "$ref": "#/definitions/CreateRoomRequest" + }, + "required": true + } + ], + "responses": { + "201": { + "description": "Request successful. The action returns a new room.", + "schema": { + "$ref": "#/definitions/RoomModel" + } + }, + "default": { + "description": "Error response", + "schema": { + "$ref": "#/definitions/CommunicationErrorResponse" + }, + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + } + } + }, + "x-ms-examples": { + "Create a new meeting room.": { + "$ref": "./examples/Rooms_Create.json" + } + } + }, + "get": { + "tags": [ + "Rooms" + ], + "summary": "Retrieves all created rooms.", + "operationId": "Rooms_List", + "produces": [ + "application/json" + ], + "parameters": [ + { + "$ref": "#/parameters/ApiVersionParameter" + } + ], + "responses": { + "200": { + "description": "Request successful. The action returns a collection of rooms.", + "schema": { + "$ref": "#/definitions/RoomsCollection" + } + }, + "default": { + "description": "Error response", + "schema": { + "$ref": "#/definitions/CommunicationErrorResponse" + }, + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + } + } + }, + "x-ms-examples": { + "List all rooms.": { + "$ref": "./examples/Rooms_List.json" + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink", + "itemName": "value" + } + } + }, + "/rooms/{roomId}": { + "get": { + "tags": [ + "Rooms" + ], + "summary": "Retrieves an existing room by id.", + "operationId": "Rooms_Get", + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "path", + "name": "roomId", + "description": "The id of the room requested.", + "required": true, + "type": "string" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + } + ], + "responses": { + "200": { + "description": "Request successful. The action returns a room.", + "schema": { + "$ref": "#/definitions/RoomModel" + } + }, + "default": { + "description": "Error response", + "schema": { + "$ref": "#/definitions/CommunicationErrorResponse" + }, + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + } + } + }, + "x-ms-examples": { + "Get meeting room.": { + "$ref": "./examples/Rooms_Get.json" + } + } + }, + "patch": { + "tags": [ + "Rooms" + ], + "summary": "Update a room with given changes.", + "operationId": "Rooms_Update", + "consumes": [ + "application/merge-patch+json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "path", + "name": "roomId", + "description": "The id of the room requested.", + "required": true, + "type": "string" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "in": "body", + "name": "updateRoomRequest", + "description": "The update room request.", + "required": true, + "schema": { + "$ref": "#/definitions/UpdateRoomRequest" + } + } + ], + "responses": { + "200": { + "description": "Request successful. The action returns an updated room.", + "schema": { + "$ref": "#/definitions/RoomModel" + } + }, + "default": { + "description": "Error response", + "schema": { + "$ref": "#/definitions/CommunicationErrorResponse" + }, + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + } + } + }, + "x-ms-examples": { + "Update meeting room's properties.": { + "$ref": "./examples/Rooms_Update.json" + } + } + }, + "delete": { + "tags": [ + "Rooms" + ], + "summary": "Delete a room.", + "operationId": "Rooms_Delete", + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "path", + "name": "roomId", + "description": "The id of the room to be deleted.", + "required": true, + "type": "string" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + } + ], + "responses": { + "204": { + "description": "The room was successfully deleted." + }, + "default": { + "description": "Error response", + "schema": { + "$ref": "#/definitions/CommunicationErrorResponse" + }, + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + } + } + }, + "x-ms-examples": { + "Delete a meeting room.": { + "$ref": "./examples/Rooms_Delete.json" + } + } + } + }, + "/rooms/{roomId}/participants": { + "get": { + "tags": [ + "Participants" + ], + "summary": "Get participants in a room.", + "operationId": "Participants_List", + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "path", + "name": "roomId", + "description": "The id of the room to get participants from.", + "required": true, + "type": "string" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + } + ], + "responses": { + "200": { + "description": "Request successful. The action returns the participants of the room.", + "schema": { + "$ref": "#/definitions/ParticipantsCollection" + } + }, + "default": { + "description": "Error response", + "schema": { + "$ref": "#/definitions/CommunicationErrorResponse" + }, + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + } + } + }, + "x-ms-examples": { + "Get participants": { + "$ref": "./examples/Participants_List.json" + } + }, + "x-ms-pageable": { + "nextLinkName": "nextLink", + "itemName": "value" + } + }, + "patch": { + "tags": [ + "Participants" + ], + "summary": "Update participants in a room.", + "operationId": "Participants_Update", + "consumes": [ + "application/merge-patch+json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "path", + "name": "roomId", + "description": "The id of the room to update the participants in.", + "required": true, + "type": "string" + }, + { + "$ref": "#/parameters/ApiVersionParameter" + }, + { + "in": "body", + "name": "updateParticipantsRequest", + "description": "An updated set of participants of the room.", + "required": true, + "schema": { + "$ref": "#/definitions/UpdateParticipantsRequest" + } + } + ], + "responses": { + "200": { + "description": "The participants were successfully updated.", + "schema": { + "$ref": "#/definitions/UpdateParticipantsResult" + } + }, + "default": { + "description": "Error response", + "schema": { + "$ref": "#/definitions/CommunicationErrorResponse" + }, + "headers": { + "x-ms-error-code": { + "x-ms-client-name": "ErrorCode", + "type": "string" + } + } + } + }, + "x-ms-examples": { + "Update participants": { + "$ref": "./examples/Participants_Update.json" + } + } + } + } + }, + "definitions": { + "CommunicationError": { + "$ref": "../../../Common/stable/2023-11-15/common.json#/definitions/CommunicationError" + }, + "CommunicationErrorResponse": { + "$ref": "../../../Common/stable/2023-11-15/common.json#/definitions/CommunicationErrorResponse" + }, + "CreateRoomRequest": { + "description": "Request payload for creating new room.", + "type": "object", + "properties": { + "validFrom": { + "format": "date-time", + "description": "The timestamp from when the room is open for joining. The timestamp is in RFC3339 format: `yyyy-MM-ddTHH:mm:ssZ`. The default value is the current date time.", + "type": "string", + "example": "2021-09-07T07:55:41Z" + }, + "validUntil": { + "format": "date-time", + "description": "The timestamp from when the room can no longer be joined. The timestamp is in RFC3339 format: `yyyy-MM-ddTHH:mm:ssZ`. The default value is the current date time plus 180 days.", + "type": "string", + "example": "2021-09-08T15:55:41Z" + }, + "pstnDialOutEnabled": { + "description": "Set this flag to true if, at the time of the call, dial out to a PSTN number is enabled in a particular room. By default, this flag is set to false.", + "type": "boolean" + }, + "participants": { + "description": "(Optional) Participants to be invited to the room.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ParticipantProperties" + }, + "example": { + "rawId1": { + "role": "Presenter" + }, + "rawId2": { + "role": "Attendee" + }, + "rawId3": null + } + } + } + }, + "ParticipantProperties": { + "required": [ + "role" + ], + "type": "object", + "properties": { + "role": { + "$ref": "#/definitions/Role" + } + } + }, + "ParticipantsCollection": { + "description": "A collection of participants in a room.", + "required": [ + "value" + ], + "type": "object", + "properties": { + "value": { + "description": "A collection of participants.", + "type": "array", + "items": { + "$ref": "#/definitions/RoomParticipant" + } + }, + "nextLink": { + "description": "If there are more participants that can be retrieved, the next link will be populated.", + "type": "string" + } + } + }, + "Role": { + "description": "The role of a room participant. The default value is Attendee.", + "enum": [ + "Presenter", + "Attendee", + "Consumer" + ], + "type": "string", + "x-ms-enum": { + "name": "Role", + "modelAsString": true + } + }, + "RoomModel": { + "description": "The meeting room.", + "type": "object", + "required": [ + "createdAt", + "id", + "validFrom", + "validUntil", + "pstnDialOutEnabled" + ], + "properties": { + "id": { + "description": "Unique identifier of a room. This id is server generated.", + "type": "string", + "example": "99199690362660524" + }, + "createdAt": { + "format": "date-time", + "description": "The timestamp when the room was created at the server. The timestamp is in RFC3339 format: `yyyy-MM-ddTHH:mm:ssZ`.", + "type": "string", + "example": "2021-09-06T05:55:41Z" + }, + "validFrom": { + "format": "date-time", + "description": "The timestamp from when the room is open for joining. The timestamp is in RFC3339 format: `yyyy-MM-ddTHH:mm:ssZ`.", + "type": "string", + "example": "2021-09-07T07:55:41Z" + }, + "validUntil": { + "format": "date-time", + "description": "The timestamp from when the room can no longer be joined. The timestamp is in RFC3339 format: `yyyy-MM-ddTHH:mm:ssZ`.", + "type": "string", + "example": "2021-09-08T15:55:41Z" + }, + "pstnDialOutEnabled": { + "description": "Set this flag to true if, at the time of the call, dial out to a PSTN number is enabled in a particular room. By default, this flag is set to false.", + "type": "boolean" + } + } + }, + "RoomParticipant": { + "description": "A participant of the room.", + "required": [ + "rawId", + "role" + ], + "type": "object", + "properties": { + "rawId": { + "description": "Raw ID representation of the communication identifier. Please refer to the following document for additional information on Raw ID.
https://learn.microsoft.com/azure/communication-services/concepts/identifiers?pivots=programming-language-rest#raw-id-representation", + "type": "string" + }, + "role": { + "$ref": "#/definitions/Role" + } + } + }, + "RoomsCollection": { + "description": "A collection of rooms.", + "required": [ + "value" + ], + "type": "object", + "properties": { + "value": { + "description": "A collection of rooms", + "type": "array", + "items": { + "$ref": "#/definitions/RoomModel" + } + }, + "nextLink": { + "description": "If there are more rooms that can be retrieved, the next link will be populated.", + "type": "string" + } + } + }, + "UpdateParticipantsRequest": { + "description": "Participants to be updated in the room.", + "type": "object", + "properties": { + "participants": { + "description": "Participants to be updated.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ParticipantProperties" + }, + "example": { + "rawId1": { + "role": "Presenter" + }, + "rawId2": { + "role": "Attendee" + }, + "rawId3": null + } + } + } + }, + "UpdateParticipantsResult": { + "description": "Request response for updating participants.", + "type": "object" + }, + "UpdateRoomRequest": { + "description": "Request payload for updating a room.", + "type": "object", + "properties": { + "validFrom": { + "format": "date-time", + "description": "(Optional) The timestamp from when the room is open for joining. The timestamp is in RFC3339 format: `yyyy-MM-ddTHH:mm:ssZ`.", + "type": "string", + "example": "2021-09-07T07:55:41Z" + }, + "validUntil": { + "format": "date-time", + "description": "(Optional) The timestamp from when the room can no longer be joined. The timestamp is in RFC3339 format: `yyyy-MM-ddTHH:mm:ssZ`.", + "type": "string", + "example": "2021-09-08T15:55:41Z" + }, + "pstnDialOutEnabled": { + "description": "Set this flag to true if, at the time of the call, dial out to a PSTN number is enabled in a particular room. By default, this flag is set to false.", + "type": "boolean" + } + } + } + }, + "parameters": { + "ApiVersionParameter": { + "in": "query", + "name": "api-version", + "description": "Version of API to invoke.", + "required": true, + "type": "string", + "x-ms-parameter-location": "method" + }, + "Endpoint": { + "in": "path", + "name": "endpoint", + "description": "The endpoint of the Azure Communication resource.", + "required": true, + "type": "string", + "format": "url", + "x-ms-skip-url-encoding": true, + "x-ms-parameter-location": "client" + } + }, + "securityDefinitions": { + "Authorization": { + "type": "apiKey", + "name": "Authorization", + "in": "header", + "description": "An authentication string containing a signature generated using HMAC-SHA256 scheme." + } + }, + "security": [ + { + "Authorization": [] + } + ], + "x-ms-parameterized-host": { + "hostTemplate": "{endpoint}", + "useSchemePrefix": false, + "parameters": [ + { + "$ref": "#/parameters/Endpoint" + } + ] + } +} diff --git a/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Participants_List.json b/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Participants_List.json new file mode 100644 index 000000000000..b21c98b4c30e --- /dev/null +++ b/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Participants_List.json @@ -0,0 +1,27 @@ +{ + "parameters": { + "endpoint": "https://contoso.communication.azure.com/", + "api-version": "2024-04-15", + "roomId": "99199690362660524" + }, + "responses": { + "200": { + "body": { + "value": [ + { + "rawId": "8:acs:db75ed0c-e801-41a3-99a4-66a0a119a06c_00000010-ce28-064a-83fe-084822000333", + "role": "Presenter" + }, + { + "rawId": "8:acs:db75ed0c-e801-41a3-99a4-66a0a119a06c_00000010-ce28-064a-83fe-084822000444", + "role": "Attendee" + }, + { + "rawId": "8:acs:db75ed0c-e801-41a3-99a4-66a0a119a06c_00000010-ce28-064a-83fe-084822000555", + "role": "Attendee" + } + ] + } + } + } +} diff --git a/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Participants_Update.json b/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Participants_Update.json new file mode 100644 index 000000000000..72b35d4920b5 --- /dev/null +++ b/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Participants_Update.json @@ -0,0 +1,23 @@ +{ + "parameters": { + "endpoint": "https://contoso.communication.azure.com/", + "api-version": "2024-04-15", + "roomId": "99199690362660524", + "updateParticipantsRequest": { + "participants": { + "8:acs:db75ed0c-e801-41a3-99a4-66a0a119a06c_00000010-ce28-064a-83fe-084822000666": { + "role": "Attendee" + }, + "8:acs:db75ed0c-e801-41a3-99a4-66a0a119a06c_00000010-ce28-064a-83fe-084822000777": { + "role": "Presenter" + }, + "8:acs:db75ed0c-e801-41a3-99a4-66a0a119a06c_00000010-ce28-064a-83fe-084822000888": null + } + } + }, + "responses": { + "200": { + "body": {} + } + } +} diff --git a/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Rooms_Create.json b/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Rooms_Create.json new file mode 100644 index 000000000000..aca8e649798f --- /dev/null +++ b/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Rooms_Create.json @@ -0,0 +1,30 @@ +{ + "parameters": { + "endpoint": "https://contoso.communication.azure.com/", + "api-version": "2024-04-15", + "createRoomRequest": { + "validFrom": "2023-06-30T00:00:00Z", + "validUntil": "2023-07-30T00:00:00Z", + "pstnDialOutEnabled": true, + "participants": { + "8:acs:db75ed0c-e801-41a3-99a4-66a0a119a06c_00000010-ce28-064a-83fe-084822000666": { + "role": "Attendee" + }, + "8:acs:db75ed0c-e801-41a3-99a4-66a0a119a06c_00000010-ce28-064a-83fe-084822000777": { + "role": "Presenter" + } + } + } + }, + "responses": { + "201": { + "body": { + "id": "99117812428622880", + "createdAt": "2023-06-26T05:46:17.8159131+00:00", + "validFrom": "2023-06-30T00:00:00+00:00", + "validUntil": "2023-07-30T00:00:00+00:00", + "pstnDialOutEnabled": true + } + } + } +} diff --git a/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Rooms_Delete.json b/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Rooms_Delete.json new file mode 100644 index 000000000000..d81d3ba515c0 --- /dev/null +++ b/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Rooms_Delete.json @@ -0,0 +1,10 @@ +{ + "parameters": { + "endpoint": "https://contoso.communication.azure.com/", + "api-version": "2024-04-15", + "roomId": "99199690362660524" + }, + "responses": { + "204": {} + } +} diff --git a/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Rooms_Get.json b/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Rooms_Get.json new file mode 100644 index 000000000000..79d7ca4f70ce --- /dev/null +++ b/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Rooms_Get.json @@ -0,0 +1,18 @@ +{ + "parameters": { + "endpoint": "https://contoso.communication.azure.com/", + "api-version": "2024-04-15", + "roomId": "99117812428622880" + }, + "responses": { + "200": { + "body": { + "id": "99117812428622880", + "createdAt": "2023-06-26T05:46:17.8159131+00:00", + "validFrom": "2023-06-30T00:00:00+00:00", + "validUntil": "2023-07-30T00:00:00+00:00", + "pstnDialOutEnabled": true + } + } + } +} diff --git a/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Rooms_List.json b/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Rooms_List.json new file mode 100644 index 000000000000..32a8655630d2 --- /dev/null +++ b/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Rooms_List.json @@ -0,0 +1,29 @@ +{ + "parameters": { + "endpoint": "https://contoso.communication.azure.com/", + "api-version": "2024-04-15" + }, + "responses": { + "200": { + "body": { + "value": [ + { + "id": "999058871389949120", + "createdAt": "2023-06-06T05:55:41Z", + "validFrom": "2023-06-07T07:55:41Z", + "validUntil": "2023-06-08T15:55:41Z", + "pstnDialOutEnabled": true + }, + { + "id": "99199690362660524", + "createdAt": "2023-06-06T05:55:41Z", + "validFrom": "2023-06-07T07:55:41Z", + "validUntil": "2023-06-08T15:55:41Z", + "pstnDialOutEnabled": false + } + ], + "nextLink": "string" + } + } + } +} diff --git a/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Rooms_Update.json b/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Rooms_Update.json new file mode 100644 index 000000000000..ad64779de3a2 --- /dev/null +++ b/specification/communication/data-plane/Rooms/stable/2024-04-15/examples/Rooms_Update.json @@ -0,0 +1,23 @@ +{ + "parameters": { + "endpoint": "https://contoso.communication.azure.com/", + "api-version": "2024-04-15", + "roomId": "99199690362660524", + "updateRoomRequest": { + "validFrom": "2023-06-30T00:00:00Z", + "validUntil": "2023-07-30T00:00:00Z", + "pstnDialOutEnabled": true + } + }, + "responses": { + "200": { + "body": { + "id": "99199690362660524", + "createdAt": "2023-06-26T01:37:00.659722+00:00", + "validFrom": "2023-06-30T00:00:00+00:00", + "validUntil": "2023-07-30T00:00:00+00:00", + "pstnDialOutEnabled": true + } + } + } +}