neuroglia-python 0.6.13__tar.gz → 0.6.14__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/PKG-INFO +1 -1
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/pyproject.toml +1 -1
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/__init__.py +1 -1
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/event_sourcing/event_sourcing_repository.py +18 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/LICENSE +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/README.md +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/application/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/application/background_scheduler.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/coordination/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/coordination/abstractions.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/coordination/leader_election.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/coordination/redis_backend.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/core/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/core/module_loader.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/core/operation_result.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/core/problem_details.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/core/type_extensions.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/core/type_finder.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/core/type_registry.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/abstractions.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/exceptions.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/abstractions.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/event_sourcing/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/event_sourcing/abstractions.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/event_sourcing/event_store/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/event_sourcing/event_store/event_store.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/event_sourcing/read_model_reconciliator.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/filesystem/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/filesystem/filesystem_repository.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/memory/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/memory/memory_repository.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/mongo/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/mongo/enhanced_mongo_repository.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/mongo/mongo_repository.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/mongo/motor_repository.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/mongo/serialization_helper.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/mongo/typed_mongo_query.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/resources/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/resources/in_memory_storage_backend.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/resources/postgres_resource_store.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/resources/redis_resource_store.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/resources/resource_repository.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/tracing_mixin.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/queries/generic/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/queries/generic/get_by_id_query.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/queries/generic/list_query.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/queryable.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/resources/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/resources/abstractions.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/resources/controller.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/resources/serializers/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/resources/serializers/xml_serializer.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/resources/serializers/yaml_serializer.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/resources/state_machine.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/resources/watcher.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/unit_of_work.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/dependency_injection/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/dependency_injection/service_provider.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/dependency_injection/service_provider_backup.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/eventing/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/eventing/cloud_events/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/eventing/cloud_events/cloud_event.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/eventing/cloud_events/decorators.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/eventing/cloud_events/infrastructure/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_bus.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_ingestor.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_middleware.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_publisher.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/eventing/tracing.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/expressions/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/expressions/javascript_expression_translator.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/extensions/cqrs_metrics_extensions.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/extensions/mediator_extensions.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/extensions/state_persistence_extensions.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/hosting/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/hosting/abstractions.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/hosting/configuration/data_access_layer.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/hosting/web.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/integration/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/integration/cache_repository.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/integration/http_service_client.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/integration/models.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/logging/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/logging/logger.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/mapping/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/mapping/mapper.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/mediation/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/mediation/behaviors/domain_event_cloudevent_behavior.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/mediation/behaviors/domain_event_dispatching_middleware.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/mediation/mediator.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/mediation/metrics_middleware.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/mediation/pipeline_behavior.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/mediation/simple.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/mediation/tracing_middleware.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/mvc/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/mvc/controller_base.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/observability/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/observability/framework.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/observability/logging.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/observability/metrics.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/observability/otel_sdk.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/observability/settings.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/observability/tracing.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/py.typed +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/reactive/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/reactive/rx_async.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/serialization/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/serialization/abstractions.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/serialization/aggregate_serializer.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/serialization/json.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/utils/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/utils/camel_model.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/utils/case_conversion.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/validation/__init__.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/validation/business_rules.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/validation/exceptions.py +0 -0
- {neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/validation/validators.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "neuroglia-python"
|
|
3
|
-
version = "0.6.
|
|
3
|
+
version = "0.6.14"
|
|
4
4
|
description = "Port from .NET to Python of the Neuroglia Framework"
|
|
5
5
|
authors = ["Charles d'Avernas <charles.davernas@neuroglia.io>", "Bruno van de Werve <bvandewe@gmail.com>"]
|
|
6
6
|
license = "Apache"
|
|
@@ -72,6 +72,24 @@ class EventSourcingRepository(Generic[TAggregate, TKey], Repository[TAggregate,
|
|
|
72
72
|
"""Removes the aggregate root with the specified key, if any"""
|
|
73
73
|
raise NotImplementedError("Event sourcing repositories do not support hard deletes")
|
|
74
74
|
|
|
75
|
+
async def _publish_domain_events(self, entity: TAggregate) -> None:
|
|
76
|
+
"""
|
|
77
|
+
Override base class event publishing for event-sourced aggregates.
|
|
78
|
+
|
|
79
|
+
Event sourcing repositories DO NOT publish events directly because:
|
|
80
|
+
1. Events are already persisted to the EventStore
|
|
81
|
+
2. ReadModelReconciliator subscribes to EventStore and publishes ALL events
|
|
82
|
+
3. Publishing here would cause DOUBLE PUBLISHING (once here, once from ReadModelReconciliator)
|
|
83
|
+
|
|
84
|
+
For event-sourced aggregates:
|
|
85
|
+
- Events are persisted to EventStore by _do_add_async/_do_update_async
|
|
86
|
+
- ReadModelReconciliator.on_event_record_stream_next_async() publishes via mediator
|
|
87
|
+
- This ensures single, reliable event publishing from the source of truth (EventStore)
|
|
88
|
+
|
|
89
|
+
State-based repositories still use the base class _publish_domain_events() correctly.
|
|
90
|
+
"""
|
|
91
|
+
# Do nothing - ReadModelReconciliator handles event publishing from EventStore
|
|
92
|
+
|
|
75
93
|
def _build_stream_id_for(self, aggregate_id: TKey):
|
|
76
94
|
"""Builds a new stream id for the specified aggregate"""
|
|
77
95
|
aggregate_name = self.__orig_class__.__args__[0].__name__
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/coordination/abstractions.py
RENAMED
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/coordination/leader_election.py
RENAMED
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/coordination/redis_backend.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/infrastructure/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/queries/generic/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/queries/generic/list_query.py
RENAMED
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/resources/__init__.py
RENAMED
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/resources/abstractions.py
RENAMED
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/resources/controller.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/data/resources/state_machine.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/dependency_injection/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/eventing/cloud_events/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/extensions/mediator_extensions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/integration/cache_repository.py
RENAMED
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/integration/http_service_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/mediation/metrics_middleware.py
RENAMED
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/mediation/pipeline_behavior.py
RENAMED
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/mediation/tracing_middleware.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/observability/framework.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/serialization/abstractions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{neuroglia_python-0.6.13 → neuroglia_python-0.6.14}/src/neuroglia/validation/business_rules.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|