From 0801279ea58383cac14feda8332fde53d187f716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Novotn=C3=BD?= Date: Tue, 13 Aug 2024 17:11:14 +0200 Subject: [PATCH] feat(#625): extending server status for the sake of evitaLab usage --- .idea/compiler.xml | 85 +- .idea/vcs.xml | 2 +- .../externalApi/configuration/ApiOptions.java | 17 + .../externalApi/http/ExternalApiProvider.java | 12 + .../externalApi/grpc/GrpcProvider.java | 9 +- .../grpc/GrpcProviderRegistrar.java | 2 +- .../grpc/services/EvitaManagementService.java | 98 +- .../grpc/services/EvitaService.java | 12 + .../ServerSessionInterceptor.java | 1 + .../server/src/main/java/module-info.java | 2 + .../evita_external_api_grpc/shared/pom.xml | 9 + .../grpc/generated/EvitaServiceGrpc.java | 108 +- .../GetMutationsHistoryPageRequest.java | 32 +- ...tMutationsHistoryPageRequestOrBuilder.java | 4 +- .../GetMutationsHistoryPageResponse.java | 10 +- ...MutationsHistoryPageResponseOrBuilder.java | 4 +- .../generated/GetMutationsHistoryRequest.java | 24 +- .../GetMutationsHistoryRequestOrBuilder.java | 4 +- .../GetMutationsHistoryResponse.java | 10 +- .../GetMutationsHistoryResponseOrBuilder.java | 4 +- ...pcAllowCurrencyInEntitySchemaMutation.java | 10 +- ...rrencyInEntitySchemaMutationOrBuilder.java | 4 +- ...GrpcAllowLocaleInEntitySchemaMutation.java | 10 +- ...LocaleInEntitySchemaMutationOrBuilder.java | 4 +- .../grpc/generated/GrpcApiStatus.java | 1322 +++++++++++++++++ .../generated/GrpcApiStatusOrBuilder.java | 142 ++ .../GrpcApplyDeltaAttributeMutation.java | 24 +- .../grpc/generated/GrpcAssociatedData.java | 4 +- .../GrpcAssociatedDataMutations.java | 4 +- .../generated/GrpcAssociatedDataSchema.java | 44 +- .../GrpcAssociatedDataSchemaMutations.java | 16 +- .../GrpcAssociatedDataSchemaOrBuilder.java | 4 +- .../grpc/generated/GrpcAttribute.java | 4 +- .../grpc/generated/GrpcAttributeElement.java | 24 +- .../grpc/generated/GrpcAttributeMutation.java | 6 +- .../generated/GrpcAttributeMutations.java | 8 +- .../grpc/generated/GrpcAttributeSchema.java | 82 +- .../GrpcAttributeSchemaMutation.java | 28 +- .../GrpcAttributeSchemaMutations.java | 34 +- .../GrpcAttributeSchemaOrBuilder.java | 4 +- .../generated/GrpcBackupCatalogRequest.java | 8 +- .../generated/GrpcBackupCatalogResponse.java | 4 +- .../grpc/generated/GrpcBigDecimal.java | 12 +- .../grpc/generated/GrpcBigDecimalArray.java | 10 +- .../GrpcBigDecimalArrayOrBuilder.java | 4 +- .../generated/GrpcBigDecimalNumberRange.java | 12 +- .../GrpcBigDecimalNumberRangeArray.java | 10 +- ...pcBigDecimalNumberRangeArrayOrBuilder.java | 4 +- .../grpc/generated/GrpcBinaryEntity.java | 32 +- .../grpc/generated/GrpcCancelTaskRequest.java | 4 +- .../generated/GrpcCancelTaskResponse.java | 4 +- .../grpc/generated/GrpcCaptureCriteria.java | 10 +- .../grpc/generated/GrpcCaptureDataSite.java | 8 +- .../grpc/generated/GrpcCaptureSchemaSite.java | 4 +- .../grpc/generated/GrpcCatalogSchema.java | 32 +- .../generated/GrpcCatalogSchemaMutation.java | 4 +- .../generated/GrpcCatalogSchemaMutations.java | 20 +- .../generated/GrpcCatalogSchemaOrBuilder.java | 4 +- .../GrpcCatalogSchemaOuterClass.java | 6 +- .../generated/GrpcCatalogSchemaResponse.java | 4 +- .../generated/GrpcCatalogStateResponse.java | 6 +- .../grpc/generated/GrpcCatalogStatistics.java | 52 +- .../GrpcCatalogStatisticsOrBuilder.java | 4 +- .../GrpcCatalogVersionAtRequest.java | 4 +- .../GrpcCatalogVersionAtResponse.java | 8 +- .../grpc/generated/GrpcChangeCapture.java | 8 +- .../generated/GrpcChangeCatalogCapture.java | 30 +- .../grpc/generated/GrpcCloseRequest.java | 6 +- .../grpc/generated/GrpcCloseResponse.java | 4 +- ...rpcCreateAssociatedDataSchemaMutation.java | 34 +- .../GrpcCreateAttributeSchemaMutation.java | 60 +- .../GrpcCreateCatalogSchemaMutation.java | 12 +- .../GrpcCreateEntitySchemaMutation.java | 12 +- ...pcCreateGlobalAttributeSchemaMutation.java | 66 +- .../GrpcCreateReferenceSchemaMutation.java | 58 +- ...rtableAttributeCompoundSchemaMutation.java | 30 +- ...ributeCompoundSchemaMutationOrBuilder.java | 4 +- .../grpc/generated/GrpcCurrency.java | 12 +- .../grpc/generated/GrpcCurrencyArray.java | 10 +- .../generated/GrpcCurrencyArrayOrBuilder.java | 4 +- .../grpc/generated/GrpcDataChunk.java | 62 +- .../generated/GrpcDataChunkOrBuilder.java | 12 +- .../grpc/generated/GrpcDateTimeRange.java | 8 +- .../generated/GrpcDateTimeRangeArray.java | 10 +- .../GrpcDateTimeRangeArrayOrBuilder.java | 4 +- .../generated/GrpcDefineCatalogRequest.java | 12 +- .../generated/GrpcDefineCatalogResponse.java | 4 +- .../GrpcDefineEntitySchemaRequest.java | 12 +- .../GrpcDefineEntitySchemaResponse.java | 4 +- .../GrpcDeleteCatalogIfExistsRequest.java | 12 +- .../GrpcDeleteCatalogIfExistsResponse.java | 4 +- .../GrpcDeleteCollectionRequest.java | 12 +- .../GrpcDeleteCollectionResponse.java | 4 +- .../generated/GrpcDeleteEntitiesRequest.java | 24 +- .../GrpcDeleteEntitiesRequestOrBuilder.java | 4 +- .../generated/GrpcDeleteEntitiesResponse.java | 14 +- .../GrpcDeleteEntitiesResponseOrBuilder.java | 4 +- ...pcDeleteEntityAndItsHierarchyResponse.java | 8 +- .../generated/GrpcDeleteEntityRequest.java | 40 +- .../GrpcDeleteEntityRequestOrBuilder.java | 4 +- .../generated/GrpcDeleteEntityResponse.java | 4 +- .../GrpcDeleteFileToFetchRequest.java | 4 +- .../GrpcDeleteFileToFetchResponse.java | 4 +- ...isallowCurrencyInEntitySchemaMutation.java | 10 +- ...rrencyInEntitySchemaMutationOrBuilder.java | 4 +- ...cDisallowLocaleInEntitySchemaMutation.java | 10 +- ...LocaleInEntitySchemaMutationOrBuilder.java | 4 +- .../grpc/generated/GrpcEndpoint.java | 863 +++++++++++ .../grpc/generated/GrpcEndpointOrBuilder.java | 93 ++ .../grpc/generated/GrpcEntity.java | 22 +- .../GrpcEntityCollectionSizeRequest.java | 12 +- .../GrpcEntityCollectionSizeResponse.java | 4 +- .../GrpcEntityCollectionStatistics.java | 24 +- .../grpc/generated/GrpcEntityMutation.java | 4 +- .../GrpcEntityMutationOuterClass.java | 6 +- .../grpc/generated/GrpcEntityMutations.java | 4 +- .../grpc/generated/GrpcEntityReference.java | 20 +- .../GrpcEntityReferenceWithParent.java | 24 +- .../generated/GrpcEntityRemoveMutation.java | 16 +- .../grpc/generated/GrpcEntityRequest.java | 40 +- .../generated/GrpcEntityRequestOrBuilder.java | 4 +- .../grpc/generated/GrpcEntityResponse.java | 4 +- .../grpc/generated/GrpcEntitySchema.java | 78 +- .../generated/GrpcEntitySchemaMutation.java | 88 +- .../GrpcEntitySchemaMutationOuterClass.java | 2 +- .../generated/GrpcEntitySchemaMutations.java | 22 +- .../generated/GrpcEntitySchemaOrBuilder.java | 12 +- .../generated/GrpcEntitySchemaOuterClass.java | 24 +- .../generated/GrpcEntitySchemaRequest.java | 16 +- .../generated/GrpcEntitySchemaResponse.java | 4 +- .../generated/GrpcEntityUpsertMutation.java | 32 +- .../GrpcEntityUpsertMutationOrBuilder.java | 4 +- .../externalApi/grpc/generated/GrpcEnums.java | 11 +- .../grpc/generated/GrpcEvitaAPI.java | 216 +-- .../GrpcEvitaAssociatedDataValue.java | 18 +- .../GrpcEvitaCatalogStatisticsResponse.java | 10 +- ...itaCatalogStatisticsResponseOrBuilder.java | 4 +- .../GrpcEvitaConfigurationResponse.java | 12 +- .../grpc/generated/GrpcEvitaDataTypes.java | 78 +- .../generated/GrpcEvitaManagementAPI.java | 330 ++-- .../GrpcEvitaServerStatusResponse.java | 832 ++++++++++- ...rpcEvitaServerStatusResponseOrBuilder.java | 122 ++ .../grpc/generated/GrpcEvitaSessionAPI.java | 114 +- .../generated/GrpcEvitaSessionRequest.java | 22 +- .../generated/GrpcEvitaSessionResponse.java | 42 +- .../GrpcEvitaSessionTerminationRequest.java | 12 +- .../GrpcEvitaSessionTerminationResponse.java | 4 +- .../grpc/generated/GrpcEvitaValue.java | 62 +- .../grpc/generated/GrpcExtraResults.java | 26 +- .../generated/GrpcExtraResultsOrBuilder.java | 4 +- .../generated/GrpcExtraResultsOuterClass.java | 24 +- .../generated/GrpcFacetGroupStatistics.java | 34 +- .../GrpcFacetGroupStatisticsOrBuilder.java | 4 +- .../grpc/generated/GrpcFacetStatistics.java | 28 +- .../grpc/generated/GrpcFetchFileRequest.java | 4 +- .../grpc/generated/GrpcFetchFileResponse.java | 8 +- .../externalApi/grpc/generated/GrpcFile.java | 44 +- .../generated/GrpcFileToFetchRequest.java | 4 +- .../generated/GrpcFileToFetchResponse.java | 4 +- .../generated/GrpcFilesToFetchRequest.java | 12 +- .../generated/GrpcFilesToFetchResponse.java | 22 +- .../GrpcFilesToFetchResponseOrBuilder.java | 4 +- .../GrpcGetCatalogSchemaRequest.java | 4 +- .../generated/GrpcGlobalAttributeSchema.java | 76 +- .../GrpcGlobalAttributeSchemaOrBuilder.java | 4 +- .../generated/GrpcGoLiveAndCloseResponse.java | 8 +- .../grpc/generated/GrpcHealthProblem.java | 212 +++ .../grpc/generated/GrpcHierarchy.java | 2 +- .../grpc/generated/GrpcHistogram.java | 34 +- .../generated/GrpcHistogramOrBuilder.java | 4 +- .../GrpcInsertReferenceMutation.java | 26 +- .../generated/GrpcIntegerNumberRange.java | 8 +- .../GrpcIntegerNumberRangeArray.java | 10 +- .../GrpcIntegerNumberRangeArrayOrBuilder.java | 4 +- .../grpc/generated/GrpcLevelInfo.java | 30 +- .../generated/GrpcLevelInfoOrBuilder.java | 4 +- .../grpc/generated/GrpcLevelInfos.java | 10 +- .../generated/GrpcLevelInfosOrBuilder.java | 4 +- .../GrpcLocalCatalogSchemaMutation.java | 42 +- .../grpc/generated/GrpcLocalMutation.java | 30 +- .../GrpcLocalMutationOuterClass.java | 2 +- .../grpc/generated/GrpcLocale.java | 12 +- .../grpc/generated/GrpcLocaleArray.java | 10 +- .../generated/GrpcLocaleArrayOrBuilder.java | 4 +- .../GrpcLocalizedAssociatedData.java | 2 +- .../generated/GrpcLocalizedAttribute.java | 2 +- .../GrpcLocalizedAttributeMutationValue.java | 2 +- .../grpc/generated/GrpcLongNumberRange.java | 8 +- .../generated/GrpcLongNumberRangeArray.java | 10 +- .../GrpcLongNumberRangeArrayOrBuilder.java | 4 +- ...edDataSchemaDeprecationNoticeMutation.java | 16 +- ...sociatedDataSchemaDescriptionMutation.java | 16 +- ...odifyAssociatedDataSchemaNameMutation.java | 24 +- ...odifyAssociatedDataSchemaTypeMutation.java | 18 +- ...fyAttributeSchemaDefaultValueMutation.java | 16 +- ...ributeSchemaDeprecationNoticeMutation.java | 16 +- ...ifyAttributeSchemaDescriptionMutation.java | 16 +- ...GrpcModifyAttributeSchemaNameMutation.java | 24 +- ...GrpcModifyAttributeSchemaTypeMutation.java | 22 +- ...odifyCatalogSchemaDescriptionMutation.java | 4 +- .../GrpcModifyCatalogSchemaNameMutation.java | 28 +- ...EntitySchemaDeprecationNoticeMutation.java | 4 +- ...ModifyEntitySchemaDescriptionMutation.java | 4 +- .../GrpcModifyEntitySchemaMutation.java | 22 +- ...pcModifyEntitySchemaMutationOrBuilder.java | 4 +- .../GrpcModifyEntitySchemaNameMutation.java | 28 +- ...odifyReferenceAttributeSchemaMutation.java | 16 +- ...ifyReferenceSchemaCardinalityMutation.java | 18 +- ...erenceSchemaDeprecationNoticeMutation.java | 16 +- ...ifyReferenceSchemaDescriptionMutation.java | 16 +- ...GrpcModifyReferenceSchemaNameMutation.java | 24 +- ...renceSchemaRelatedEntityGroupMutation.java | 20 +- ...yReferenceSchemaRelatedEntityMutation.java | 28 +- ...rtableAttributeCompoundSchemaMutation.java | 16 +- ...mpoundSchemaDeprecationNoticeMutation.java | 16 +- ...buteCompoundSchemaDescriptionMutation.java | 16 +- ...leAttributeCompoundSchemaNameMutation.java | 24 +- .../grpc/generated/GrpcNameVariant.java | 18 +- .../grpc/generated/GrpcOffsetDateTime.java | 16 +- .../generated/GrpcOffsetDateTimeArray.java | 10 +- .../GrpcOffsetDateTimeArrayOrBuilder.java | 4 +- .../grpc/generated/GrpcPaginatedList.java | 8 +- .../grpc/generated/GrpcPredecessor.java | 8 +- .../externalApi/grpc/generated/GrpcPrice.java | 48 +- .../grpc/generated/GrpcPriceMutations.java | 6 +- .../grpc/generated/GrpcPriceOuterClass.java | 2 +- .../grpc/generated/GrpcQueryListResponse.java | 30 +- .../GrpcQueryListResponseOrBuilder.java | 12 +- .../grpc/generated/GrpcQueryOneResponse.java | 12 +- .../grpc/generated/GrpcQueryParam.java | 64 +- .../grpc/generated/GrpcQueryRequest.java | 24 +- .../generated/GrpcQueryRequestOrBuilder.java | 4 +- .../grpc/generated/GrpcQueryResponse.java | 8 +- .../grpc/generated/GrpcQueryTelemetry.java | 24 +- .../GrpcQueryTelemetryOrBuilder.java | 4 +- .../generated/GrpcQueryUnsafeRequest.java | 12 +- .../grpc/generated/GrpcReadiness.java | 217 +++ .../grpc/generated/GrpcReadyResponse.java | 531 +++++++ .../generated/GrpcReadyResponseOrBuilder.java | 42 + .../grpc/generated/GrpcReference.java | 38 +- .../GrpcReferenceAttributeMutation.java | 20 +- .../generated/GrpcReferenceMutations.java | 14 +- .../grpc/generated/GrpcReferenceSchema.java | 100 +- .../GrpcReferenceSchemaMutations.java | 24 +- .../GrpcReferenceSchemaOrBuilder.java | 12 +- .../GrpcRemoveAssociatedDataMutation.java | 16 +- ...rpcRemoveAssociatedDataSchemaMutation.java | 12 +- .../GrpcRemoveAttributeMutation.java | 16 +- .../GrpcRemoveAttributeSchemaMutation.java | 12 +- .../GrpcRemoveCatalogSchemaMutation.java | 12 +- .../GrpcRemoveEntitySchemaMutation.java | 12 +- .../generated/GrpcRemovePriceMutation.java | 20 +- .../GrpcRemoveReferenceGroupMutation.java | 16 +- .../GrpcRemoveReferenceMutation.java | 16 +- .../GrpcRemoveReferenceSchemaMutation.java | 12 +- ...rtableAttributeCompoundSchemaMutation.java | 12 +- .../generated/GrpcRenameCatalogRequest.java | 24 +- .../generated/GrpcRenameCatalogResponse.java | 4 +- .../GrpcRenameCollectionRequest.java | 24 +- .../GrpcRenameCollectionResponse.java | 4 +- .../generated/GrpcReplaceCatalogRequest.java | 24 +- .../generated/GrpcReplaceCatalogResponse.java | 4 +- .../GrpcReplaceCollectionRequest.java | 24 +- .../GrpcReplaceCollectionResponse.java | 4 +- ...pcRestoreCatalogFromServerFileRequest.java | 16 +- .../generated/GrpcRestoreCatalogRequest.java | 16 +- .../generated/GrpcRestoreCatalogResponse.java | 8 +- .../grpc/generated/GrpcSealedEntity.java | 84 +- .../generated/GrpcSealedEntityOrBuilder.java | 12 +- ...AssociatedDataSchemaLocalizedMutation.java | 16 +- ...tAssociatedDataSchemaNullableMutation.java | 16 +- ...cSetAttributeSchemaFilterableMutation.java | 16 +- ...AttributeSchemaGloballyUniqueMutation.java | 18 +- ...pcSetAttributeSchemaLocalizedMutation.java | 16 +- ...rpcSetAttributeSchemaNullableMutation.java | 16 +- ...AttributeSchemaRepresentativeMutation.java | 16 +- ...rpcSetAttributeSchemaSortableMutation.java | 16 +- .../GrpcSetAttributeSchemaUniqueMutation.java | 18 +- ...SchemaWithGeneratedPrimaryKeyMutation.java | 4 +- ...cSetEntitySchemaWithHierarchyMutation.java | 4 +- .../GrpcSetEntitySchemaWithPriceMutation.java | 8 +- .../grpc/generated/GrpcSetParentMutation.java | 4 +- ...pcSetPriceInnerRecordHandlingMutation.java | 6 +- .../GrpcSetReferenceGroupMutation.java | 24 +- ...GrpcSetReferenceSchemaFacetedMutation.java | 16 +- ...cSetReferenceSchemaFilterableMutation.java | 16 +- .../GrpcSortableAttributeCompoundSchema.java | 40 +- ...rtableAttributeCompoundSchemaMutation.java | 10 +- ...tableAttributeCompoundSchemaMutations.java | 12 +- ...tableAttributeCompoundSchemaOrBuilder.java | 8 +- .../GrpcSpecifiedTaskStatusesRequest.java | 10 +- ...SpecifiedTaskStatusesRequestOrBuilder.java | 4 +- .../GrpcSpecifiedTaskStatusesResponse.java | 10 +- ...pecifiedTaskStatusesResponseOrBuilder.java | 4 +- .../grpc/generated/GrpcStripList.java | 8 +- .../grpc/generated/GrpcTaskStatus.java | 60 +- .../grpc/generated/GrpcTaskStatusRequest.java | 4 +- .../generated/GrpcTaskStatusResponse.java | 4 +- .../generated/GrpcTaskStatusesRequest.java | 8 +- .../generated/GrpcTaskStatusesResponse.java | 22 +- .../GrpcTaskStatusesResponseOrBuilder.java | 4 +- .../GrpcTopLevelCatalogSchemaMutation.java | 6 +- .../generated/GrpcTransactionResponse.java | 8 +- ...pcUpdateAndFetchCatalogSchemaResponse.java | 4 +- ...rpcUpdateAndFetchEntitySchemaResponse.java | 4 +- .../GrpcUpdateCatalogSchemaRequest.java | 10 +- ...pcUpdateCatalogSchemaRequestOrBuilder.java | 4 +- .../GrpcUpdateCatalogSchemaResponse.java | 4 +- .../GrpcUpdateEntitySchemaRequest.java | 4 +- .../GrpcUpdateEntitySchemaResponse.java | 4 +- .../generated/GrpcUpdateEvitaRequest.java | 10 +- .../GrpcUpdateEvitaRequestOrBuilder.java | 4 +- .../GrpcUpsertAssociatedDataMutation.java | 20 +- .../GrpcUpsertAttributeMutation.java | 20 +- .../generated/GrpcUpsertEntityRequest.java | 28 +- .../GrpcUpsertEntityRequestOrBuilder.java | 4 +- .../generated/GrpcUpsertEntityResponse.java | 4 +- .../generated/GrpcUpsertPriceMutation.java | 44 +- .../GrpcUseGlobalAttributeSchemaMutation.java | 12 +- .../externalApi/grpc/generated/GrpcUuid.java | 8 +- .../grpc/generated/GrpcUuidArray.java | 10 +- .../generated/GrpcUuidArrayOrBuilder.java | 4 +- .../requestResponse/EvitaEnumConverter.java | 34 + .../shared/src/main/java/module-info.java | 1 + .../evitadb/externalApi/grpc/GrpcEnums.proto | 55 + .../externalApi/grpc/GrpcEvitaAPI.proto | 8 + .../grpc/GrpcEvitaManagementAPI.proto | 27 + .../metric/ObservabilityProbesDetector.java | 65 +- .../externalApi/system/SystemProvider.java | 138 +- .../system/SystemProviderRegistrar.java | 69 +- .../parser/grammar/EvitaQLBaseListener.java | 23 - .../parser/grammar/EvitaQLBaseVisitor.java | 23 - .../query/parser/grammar/EvitaQLLexer.java | 39 +- .../query/parser/grammar/EvitaQLListener.java | 23 - .../query/parser/grammar/EvitaQLParser.java | 48 +- .../query/parser/grammar/EvitaQLVisitor.java | 23 - 336 files changed, 7658 insertions(+), 3006 deletions(-) create mode 100644 evita_external_api/evita_external_api_grpc/shared/src/main/java/io/evitadb/externalApi/grpc/generated/GrpcApiStatus.java create mode 100644 evita_external_api/evita_external_api_grpc/shared/src/main/java/io/evitadb/externalApi/grpc/generated/GrpcApiStatusOrBuilder.java create mode 100644 evita_external_api/evita_external_api_grpc/shared/src/main/java/io/evitadb/externalApi/grpc/generated/GrpcEndpoint.java create mode 100644 evita_external_api/evita_external_api_grpc/shared/src/main/java/io/evitadb/externalApi/grpc/generated/GrpcEndpointOrBuilder.java create mode 100644 evita_external_api/evita_external_api_grpc/shared/src/main/java/io/evitadb/externalApi/grpc/generated/GrpcHealthProblem.java create mode 100644 evita_external_api/evita_external_api_grpc/shared/src/main/java/io/evitadb/externalApi/grpc/generated/GrpcReadiness.java create mode 100644 evita_external_api/evita_external_api_grpc/shared/src/main/java/io/evitadb/externalApi/grpc/generated/GrpcReadyResponse.java create mode 100644 evita_external_api/evita_external_api_grpc/shared/src/main/java/io/evitadb/externalApi/grpc/generated/GrpcReadyResponseOrBuilder.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml index a3026a8af..62c084d94 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -28,6 +28,11 @@ + + + + + @@ -39,22 +44,15 @@ - - - - - - - @@ -69,7 +67,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +