swagger updates
[optf/osdf.git] / docs / sections / swaggerdoc / oof-osdf-has-api.json
index 16e9ab1..aa48e39 100644 (file)
@@ -26,6 +26,9 @@
   "paths": {
     "/v2/placement": {
       "post": {
+        "tags": [
+          "Placement Optimization"
+        ],
         "summary": "create/update a placement",
         "operationId": "createPlacement",
         "description": "create/update a placement",
@@ -75,6 +78,9 @@
     },
     "/api/oof/v1/pci": {
       "post": {
+        "tags": [
+          "PCI/ANR Optimization"
+        ],
         "summary": "Initiate PCI/ANR Optimization",
         "operationId": "initiatePCIOptRequest",
         "description": "Initiate PCI/ANR Optimization",
     },
     "/api/oof/pci/v1": {
       "$ref": "#/paths/~1api~1oof~1v1~1pci"
+    },
+    "/api/oof/selection/nst/v1": {
+      "post": {
+        "tags": [
+          "NST Selection"
+        ],
+        "summary": "NST selection",
+        "operationId": "selectNstRequest",
+        "description": "Request for NST selection",
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "in": "body",
+            "name": "NSTSelectionRequest",
+            "description": "nst selection request",
+            "schema": {
+              "$ref": "#/definitions/NSTSelectionRequest"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "description": "An optimization request is accepted",
+            "schema": {
+              "$ref": "#/definitions/SynchronousResponse"
+            }
+          },
+          "400": {
+            "description": "bad request"
+          },
+          "401": {
+            "description": "Request body is not compliant with the API definition"
+          },
+          "404": {
+            "description": "The server cannot find the requested URI"
+          },
+          "405": {
+            "description": "The requested method is not supported by a server."
+          },
+          "500": {
+            "description": "The server encountered an internal server error or timed out"
+          }
+        }
+      }
+    },
+    "/api/oof/selection/nsi/v1": {
+      "post": {
+        "tags": [
+          "NSI Selection"
+        ],
+        "summary": "NSI selection",
+        "operationId": "selectNsiRequest",
+        "description": "Request for NSI selection",
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "in": "body",
+            "name": "NSISelectionRequest",
+            "description": "NSI selection request",
+            "schema": {
+              "$ref": "#/definitions/NSISelectionRequest"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "description": "An optimization request is accepted",
+            "schema": {
+              "$ref": "#/definitions/SynchronousResponse"
+            }
+          },
+          "400": {
+            "description": "bad request"
+          },
+          "401": {
+            "description": "Request body is not compliant with the API definition"
+          },
+          "404": {
+            "description": "The server cannot find the requested URI"
+          },
+          "405": {
+            "description": "The requested method is not supported by a server."
+          },
+          "500": {
+            "description": "The server encountered an internal server error or timed out"
+          }
+        }
+      }
+    },
+    "/api/oof/selection/nssi/v1": {
+      "post": {
+        "tags": [
+          "NSSI Selection"
+        ],
+        "summary": "NSSI selection",
+        "operationId": "selectNssiRequest",
+        "description": "Request for NSSI selection",
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "in": "body",
+            "name": "NSSISelectionRequest",
+            "description": "NSSI selection request",
+            "schema": {
+              "$ref": "#/definitions/NSSISelectionRequest"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "description": "An optimization request is accepted",
+            "schema": {
+              "$ref": "#/definitions/SynchronousResponse"
+            }
+          },
+          "400": {
+            "description": "bad request"
+          },
+          "401": {
+            "description": "Request body is not compliant with the API definition"
+          },
+          "404": {
+            "description": "The server cannot find the requested URI"
+          },
+          "405": {
+            "description": "The requested method is not supported by a server."
+          },
+          "500": {
+            "description": "The server encountered an internal server error or timed out"
+          }
+        }
+      }
+    },
+    "/api/oof/route/v1": {
+      "post": {
+        "tags": [
+          "Route Select"
+        ],
+        "summary": "Find the optimistic route between OTN domains",
+        "description": "",
+        "operationId": "getRoute",
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "in": "body",
+            "name": "body",
+            "description": "Source and Destination nodes across which optmistic route have to be obtained.",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/RouteRequest"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "successful operation",
+            "schema": {
+              "type": "array",
+              "items": {
+                "$ref": "#/definitions/routeResponseBody"
+              }
+            }
+          },
+          "405": {
+            "description": "Invalid input"
+          }
+        }
+      }
     }
   },
   "definitions": {
+    "RouteRequest": {
+      "type": "object",
+      "properties": {
+        "requestInfo": {
+          "$ref": "#/definitions/requestInfo"
+        },
+        "routeInfo": {
+          "$ref": "#/definitions/routeInfo"
+        }
+      }
+    },
+    "requestInfo": {
+      "type": "object",
+      "properties": {
+        "transactionId": {
+          "type": "string",
+          "description": "A unique ID to track an ONAP transaction."
+        },
+        "requestId": {
+          "type": "string",
+          "description": "A unique ID to track multiple requests associated with a transaction."
+        },
+        "callbackUrl": {
+          "type": "string",
+          "description": "The end point of a callback service where recommendations are posted."
+        },
+        "callbackHeader": {
+          "type": "string",
+          "description": "The header information a client expecting in a async callback."
+        },
+        "sourceId": {
+          "type": "string",
+          "description": "The unique ID of a client making an optimization call."
+        },
+        "requestType": {
+          "type": "string",
+          "format": "string",
+          "description": "The type of request being placed.",
+          "enum": [
+            "create",
+            "update",
+            "delete"
+          ]
+        },
+        "numSolutions": {
+          "type": "integer",
+          "format": "int32",
+          "description": "Expected number of solutions. numSolution can also be specified using an optimization query policies, where the default configured value is 1. The value from a request gets higher precedence over the value defined in a policy."
+        },
+        "optimizers": {
+          "description": "A list of optimization services that can be used to resolve the route",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "timeout": {
+          "type": "integer",
+          "format": "int32",
+          "description": "A tolerance window (in secs) for expecting solutions. Default is 600 secs."
+        }
+      }
+    },
+    "routeInfo": {
+      "type": "object",
+      "properties": {
+        "routeRequest": {
+          "$ref": "#/definitions/routeRequest"
+        }
+      }
+    },
+    "routeRequest": {
+      "type": "object",
+      "properties": {
+        "srcPort": {
+          "$ref": "#/definitions/routePortInfo"
+        },
+        "destPort": {
+          "$ref": "#/definitions/routePortInfo"
+        }
+      }
+    },
+    "routePortInfo": {
+      "type": "object",
+      "properties": {
+        "accessTopologyId": {
+          "type": "string",
+          "description": "A unique ID of the Access Topology."
+        },
+        "accessClientId": {
+          "type": "string",
+          "format": "string",
+          "description": "A unique ID of the client which provides the access."
+        },
+        "accessProviderId": {
+          "type": "string",
+          "format": "string",
+          "description": "A unique ID of the access provider"
+        },
+        "accessNodeId": {
+          "type": "string",
+          "format": "string",
+          "description": "A unique ID of the node to/from which the route has to be established."
+        },
+        "accessLtpId": {
+          "type": "integer",
+          "format": "int32",
+          "description": "A unique ID of the Termination Point to/from which the route has to be established."
+        }
+      }
+    },
+    "routeResponseBody": {
+      "type": "object",
+      "properties": {
+        "requestId": {
+          "type": "string",
+          "description": "A unique Id for an ONAP transaction."
+        },
+        "transactionId": {
+          "type": "string",
+          "description": "A unique ID to track multiple requests associated with a transaction."
+        },
+        "statusMessage": {
+          "type": "string",
+          "description": "Reasoning if a requestStatus is failure."
+        },
+        "requestStatus": {
+          "type": "string",
+          "description": "The status of a request."
+        },
+        "solutions": {
+          "$ref": "#/definitions/RouteSolutionInfo"
+        }
+      }
+    },
+    "RouteSolutionInfo": {
+      "type": "object",
+      "properties": {
+        "startTime": {
+          "type": "string",
+          "format": "date-time",
+          "description": "start time of the operation in  RFC 3339 notation for example, 2017-07-21T17:32:28Z."
+        },
+        "finishTime": {
+          "type": "string",
+          "format": "date-time",
+          "description": "end time of the operation in  RFC 3339 notation for example, 2017-07-21T17:32:28Z."
+        },
+        "links": {
+          "description": "A list of vpn info that can be used to establish the route between source and destination port/node.",
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/link"
+          }
+        }
+      }
+    },
+    "link": {
+      "type": "object",
+      "properties": {
+        "linkId": {
+          "type": "string",
+          "description": "Id or name identifies a link uniquely."
+        }
+      }
+    },
     "PlacementRequest": {
       "type": "object",
       "required": [
           },
           "description": "A list of ANR Input."
         },
-        "trigger": {
-          "type": "string",
-          "description": "Type of trigger causing need for PCI optimization",
-          "example": "NbrListChange"
-        }
-      }
-    },
-    "PCIAsynchronousResponse": {
+        "fixedPCICells": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "List of blacklisted cells whose PCI values should not be changed",
+          "example": [
+            "cell0007",
+            "cell0009"
+          ]
+        },
+        "priorityTreatmentCells": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "List of cells which should be given special treatment during optimization",
+          "example": [
+            "cell0010",
+            "cell0003"
+          ]
+        },
+        "trigger": {
+          "type": "string",
+          "description": "Type of trigger causing need for PCI optimization",
+          "example": "NbrListChange"
+        }
+      }
+    },
+    "PCIAsynchronousResponse": {
       "type": "object",
       "required": [
         "requestId",
           ]
         }
       }
+    },
+    "NSTSelectionRequest": {
+      "type": "object",
+      "required": [
+        "requestInfo",
+        "serviceProfile"
+      ],
+      "properties": {
+        "requestInfo": {
+          "$ref": "#/definitions/RequestInfo2"
+        },
+        "serviceProfile": {
+          "$ref": "#/definitions/ServiceProfileNst"
+        }
+      }
+    },
+    "NSISelectionRequest": {
+      "type": "object",
+      "required": [
+        "requestInfo",
+        "serviceProfile",
+        "NSTInfo"
+      ],
+      "properties": {
+        "serviceProfile": {
+          "$ref": "#/definitions/ServiceProfile"
+        },
+        "requestInfo": {
+          "$ref": "#/definitions/RequestInfo2"
+        },
+        "NSTInfo": {
+          "type": "array",
+          "description": "List of NST(s)",
+          "items": {
+            "$ref": "#/definitions/NSTInfo"
+          }
+        }
+      }
+    },
+    "NSSISelectionRequest": {
+      "type": "object",
+      "required": [
+        "requestInfo",
+        "NSSTInfo",
+        "sliceProfile"
+      ],
+      "properties": {
+        "sliceProfile": {
+          "$ref": "#/definitions/SliceProfile"
+        },
+        "requestInfo": {
+          "$ref": "#/definitions/RequestInfo2"
+        },
+        "NSSTInfo": {
+          "$ref": "#/definitions/NSSTInfo"
+        }
+      }
+    },
+    "NSTInfo": {
+      "type": "object",
+      "required": [
+        "UUID",
+        "invariantUUID"
+      ],
+      "properties": {
+        "UUID": {
+          "type": "string",
+          "format": "uuid",
+          "description": "UUID of NST"
+        },
+        "invariantUUID": {
+          "type": "string",
+          "format": "uuid",
+          "description": "Invariant UUID"
+        }
+      }
+    },
+    "NSSTInfo": {
+      "type": "object",
+      "required": [
+        "UUID",
+        "invariantUUID"
+      ],
+      "properties": {
+        "UUID": {
+          "type": "string",
+          "format": "uuid",
+          "description": "UUID of NSST"
+        },
+        "invariantUUID": {
+          "type": "string",
+          "format": "uuid",
+          "description": "Invariant UUID"
+        }
+      }
+    },
+    "ServiceProfile": {
+      "type": "string",
+      "description": "JSON blob. Containing service profile parameters. The contents are based on 3GPP TS 23.541 Release 16 contents, and will be in the form of attribute value pairs.",
+      "example": {
+        "blob": "content"
+      }
+    },
+    "ServiceProfileNst": {
+      "type": "object",
+      "required": [
+          "serviceProfileParameters"
+      ],
+      "properties": {
+        "serviceProfileParameters":{
+          "$ref": "#/definitions/ServiceProfile"
+        }
+      }
+    },
+    "SliceProfile": {
+      "type": "string",
+      "description": "JSON blob. Containing slice profile parameters. The contents are based on 3GPP TS 23.541 Release 16 contents, and will be in the form of attribute value pairs.",
+      "example": {
+        "blob": "content"
+      }
+    },
+    "RequestInfo2": {
+      "type": "object",
+      "required": [
+        "transactionId",
+        "requestId",
+        "callbackUrl",
+        "sourceId"
+      ],
+      "properties": {
+        "transactionId": {
+          "type": "string",
+          "format": "uuid",
+          "description": "unique ID to track an ONAP transaction",
+          "example": "d290f1ee-6c54-4b01-90e6-d701748f0851"
+        },
+        "requestId": {
+          "type": "string",
+          "format": "uuid",
+          "description": "A unique ID to track multiple requests associated with a transaction",
+          "example": "d290f1ee-6c54-4b01-90e6-d701748f0851"
+        },
+        "callbackUrl": {
+          "type": "string",
+          "format": "url",
+          "description": "The end point of a callback service where recommendations are posted.",
+          "example": "myDomain.com/myCallback"
+        },
+        "callbackHeader": {
+          "type": "string",
+          "description": "JSON blob. The header information a client expecting in a async callback.",
+          "example": {
+            "blob": "content"
+          }
+        },
+        "sourceId": {
+          "type": "string",
+          "description": "The unique ID of a client making an optimization call.",
+          "example": "d290f1ee-6c54-4b01-90e6-d701748f0851"
+        },
+        "timeout": {
+          "type": "integer",
+          "description": "A tolerance window (in second) for expecting solutions.",
+          "example": 5
+        }
+      }
+    },
+    "NSTAsynchronousResponse": {
+      "type": "object",
+      "required": [
+        "transactionId",
+        "requestId",
+        "requestStatus",
+        "solutions"
+      ],
+      "properties": {
+        "transactionId": {
+          "type": "string",
+          "format": "uuid",
+          "description": "unique ID to track an ONAP transaction",
+          "example": "d290f1ee-6c54-4b01-90e6-d701748f0851"
+        },
+        "requestId": {
+          "type": "string",
+          "format": "uuid",
+          "description": "A unique ID to track multiple requests associated with a transaction",
+          "example": "d290f1ee-6c54-4b01-90e6-d701748f0851"
+        },
+        "statusMessage": {
+          "type": "string",
+          "description": "Reasoning if a requestStatus is failed."
+        },
+        "requestStatus": {
+          "type": "string",
+          "enum": [
+            "completed",
+            "failed",
+            "pending"
+          ],
+          "description": "The status of a request."
+        },
+        "solutions": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/NSTSolution"
+          },
+          "description": "A list of NST solutions"
+        }
+      }
+    },
+    "NSTSolution": {
+      "type": "object",
+      "required": [
+        "UUID",
+        "NSTName",
+        "invariantUUID",
+        "matchLevel"
+      ],
+      "properties": {
+        "invariantUUID": {
+          "type": "string",
+          "format": "uuid",
+          "description": "Invariant UUID of NST"
+        },
+        "UUID": {
+          "type": "string",
+          "format": "UUID of NST"
+        },
+        "NSTName": {
+          "type": "string",
+          "description": "NST name"
+        },
+        "matchLevel": {
+          "type": "string",
+          "description": "JSON blob. Containing details of match of requirements in slice profile and percentage of fit"
+        }
+      }
+    },
+    "NSIAsynchronousResponse": {
+      "type": "object",
+      "required": [
+        "transactionId",
+        "requestId",
+        "requestStatus",
+        "solutions"
+      ],
+      "properties": {
+        "transactionId": {
+          "type": "string",
+          "format": "uuid",
+          "description": "unique ID to track an ONAP transaction",
+          "example": "d290f1ee-6c54-4b01-90e6-d701748f0851"
+        },
+        "requestId": {
+          "type": "string",
+          "format": "uuid",
+          "description": "A unique ID to track multiple requests associated with a transaction",
+          "example": "d290f1ee-6c54-4b01-90e6-d701748f0851"
+        },
+        "statusMessage": {
+          "type": "string",
+          "description": "Reasoning if a requestStatus is failed."
+        },
+        "requestStatus": {
+          "type": "string",
+          "enum": [
+            "completed",
+            "failed",
+            "pending"
+          ],
+          "description": "The status of a request."
+        },
+        "solutions": {
+          "$ref": "#/definitions/NSISolution"
+        }
+      }
+    },
+    "NSISolution": {
+      "type": "object",
+      "properties": {
+        "sharedNSIsolutions": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/SharedNSISolution"
+          },
+          "description": "A list of shared NSI solutions"
+        },
+        "newNSISolutions": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/NewNSISolution"
+          },
+          "description": "A list of new NSI solutions"
+        }
+      }
+    },
+    "SharedNSISolution": {
+      "type": "object",
+      "required": [
+        "invariantUUID",
+        "UUID",
+        "NSIName",
+        "NSIId",
+        "matchLevel"
+      ],
+      "properties": {
+        "invariantUUID": {
+          "type": "string",
+          "format": "uuid",
+          "description": "Invariant UUID of NST"
+        },
+        "UUID": {
+          "type": "string",
+          "format": "uuid",
+          "description": "UUID of NST"
+        },
+        "NSIName": {
+          "type": "string",
+          "description": "Name of NSI"
+        },
+        "NSIId": {
+          "type": "string",
+          "format": "uuid",
+          "description": "Id of NSI"
+        },
+        "NSSIs": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/NSSI"
+          },
+          "description": "A list of NSSIs"
+        },
+      }
+    },
+    "NSSI":{
+      "type": "object",
+      "required": [
+        "NSSIName",
+        "NSSIId",
+        "UUID",
+        "invariantUUID"
+      ],
+      "properties": {
+        "NSSIName": {
+          "type": "string",
+          "description": "Name of NSSI"
+        },
+        "NSSIId": {
+          "type": "string",
+          "description": "Id of NSSI"
+        },
+        "UUID": {
+          "type": "string",
+          "description": "UUID of NSST"
+        },
+        "invariantUUID": {
+          "type": "string",
+          "description": "invariantUUID of NSST"
+        },
+        "sliceProfile": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/SliceProfile"
+          },
+          "description": "list of SliceProfiles",
+        }
+      }
+    },
+    "NewNSISolution": {
+      "type": "object",
+      "required": [
+        "NSSISolutions",
+        "matchLevel"
+      ],
+      "properties": {
+        "NSTInfo": {
+          "$ref": "#/definitions/NSTResponseInfo"
+        },
+        "NSSISolutions": {
+          "type": "array",
+          "description": "List of NSSIs which when concatenated shall form the NSI, in case NSSI is not present, only the sliceProfile will be included",
+          "items": {
+            "$ref": "#/definitions/NSSIInfo"
+          }
+        },
+        "matchLevel": {
+          "type": "string",
+          "description": "JSON blob. Containing details of match of requirements in service profile, and recommendation rank"
+        }
+      }
+    },
+    "NSTResponseInfo": {
+      "type": "object",
+      "required": [
+        "UUID",
+        "invariantUUID",
+        "NSTName"
+      ],
+      "properties": {
+        "NSTName": {
+          "type": "string",
+          "description": "NST name"
+        },
+        "UUID": {
+          "type": "string",
+          "format": "uuid",
+          "description": "UUID of NST"
+        },
+        "invariantUUID": {
+          "type": "string",
+          "format": "uuid",
+          "description": "Invariant UUID"
+        }
+      }
+    },
+    "NSSIInfo": {
+      "type": "object",
+      "required": [
+        "sliceProfile"
+      ],
+      "properties": {
+        "sliceProfile": {
+          "type": "string",
+          "description": "JSON blob. Containing details of match of requirements in slice profile and percentage of fit"
+        },
+        "NSSTInfo": {
+          "$ref": "#/definitions/NSSTResponseInfo"
+        },
+        "NSSISolution": {
+          "$ref": "#/definitions/NSSIObject"
+        }
+      }
+    },
+    "NSSTResponseInfo": {
+      "type": "object",
+      "required": [
+        "NSSTName",
+        "UUID",
+        "invariantUUID"
+      ],
+      "properties": {
+        "NSSTName": {
+          "type": "string",
+          "description": "Name of the NSST"
+        },
+        "UUID": {
+          "type": "string",
+          "format": "uuid",
+          "description": "UUID of NSST"
+        },
+        "invariantUUID": {
+          "type": "string",
+          "format": "uuid",
+          "description": "Invariant UUID"
+        }
+      }
+    },
+    "NSSIObject": {
+      "type": "object",
+      "required": [
+        "NSSIName",
+        "NSSIId",
+        "matchLevel"
+      ],
+      "properties": {
+        "NSSIName": {
+          "type": "string",
+          "description": "Name of NSSI"
+        },
+        "NSSIId": {
+          "type": "string",
+          "description": "Id of NSSI"
+        },
+        "matchLevel": {
+          "type": "string",
+          "description": "JSON blob. Containing details of match of requirements in slice profile and percentage of fit"
+        }
+      }
+    },
+    "NSSIAsynchronousResponse": {
+      "type": "object",
+      "required": [
+        "transactionId",
+        "requestId",
+        "requestStatus",
+        "solutions"
+      ],
+      "properties": {
+        "transactionId": {
+          "type": "string",
+          "format": "uuid",
+          "description": "unique ID to track an ONAP transaction",
+          "example": "d290f1ee-6c54-4b01-90e6-d701748f0851"
+        },
+        "requestId": {
+          "type": "string",
+          "format": "uuid",
+          "description": "A unique ID to track multiple requests associated with a transaction",
+          "example": "d290f1ee-6c54-4b01-90e6-d701748f0851"
+        },
+        "statusMessage": {
+          "type": "string",
+          "description": "Reasoning if a requestStatus is failed."
+        },
+        "requestStatus": {
+          "type": "string",
+          "enum": [
+            "completed",
+            "failed",
+            "pending"
+          ],
+          "description": "The status of a request."
+        },
+        "solutions": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/NSSISolution"
+          },
+          "description": "A list of NSSI solutions"
+        }
+      }
+    },
+    "NSSISolution": {
+      "type": "object",
+      "required": [
+        "invariantUUID",
+        "UUID",
+        "NSSIName",
+        "NSSIId",
+        "matchLevel"
+      ],
+      "properties": {
+        "invariantUUID": {
+          "type": "string",
+          "format": "uuid",
+          "description": "Invariant UUID of NSST"
+        },
+        "UUID": {
+          "type": "string",
+          "format": "uuid",
+          "description": "UUID of NSST"
+        },
+        "NSSIName": {
+          "type": "string",
+          "description": "Name of NSSI"
+        },
+        "NSSIId": {
+          "type": "string",
+          "description": "Id of NSSI"
+        },
+        "matchLevel": {
+          "type": "string",
+          "description": "JSON blob. Containing details of match of requirements in slice profile and percentage of fit"
+        }
+      }
     }
   },
   "schemes": [
   ],
   "host": "virtserver.swaggerhub.com",
   "basePath": "/oof-osdf/v1"
-}
\ No newline at end of file
+}