Compare commits

...

8 Commits

Author SHA1 Message Date
Developer 02
a0696c5e22 feat(Application.Abstraction): Erstellt, um Schnittstellen von Core.Application zu behandeln 2025-05-20 16:30:31 +02:00
Developer 02
01025ff36f refactor: update efcore 2025-05-20 16:14:52 +02:00
Developer 02
831f91ce16 Update EntityFrameworkCore to version 9.0.5
Updated the `Microsoft.EntityFrameworkCore` package version
from `9.0.4` to `9.0.5` for the target framework `net9.0`
in the `DigitalData.Core.Infrastructure.csproj` file.
2025-05-20 12:47:49 +02:00
Developer 02
980e21f27f Bump version to 3.3.1 in project file
Updated the version number, assembly version, and file version for the DigitalData.Core.Application project from 3.3.0 to 3.3.1 in DigitalData.Core.Application.csproj.
2025-05-20 12:44:54 +02:00
Developer 02
d49aaf61dc Update CreateAsync to return DataResult<TReadDto>
Modified the CreateAsync method in CRUDService.cs and ICRUDService.cs to change the return type from DataResult<TId> to DataResult<TReadDto>. The implementation now maps the created entity to a read DTO, providing the caller with the complete entity representation instead of just its ID.
2025-05-20 12:44:43 +02:00
Developer 02
b95baaef5f Enforce ID retrieval in UpdateAsync method
Updated the `UpdateAsync<TUpdateDto>` method in `CRUDService.cs` to replace the use of `GetIdOrDefault<TId>()` with `GetId<TId>()`. This change ensures that an ID must be present in the `updateDto`, enhancing the reliability of the update process.
2025-05-20 12:38:03 +02:00
Developer 02
68d78afafe Refactor GetId method and update ICRUDService comments
Modified the `GetId<TId>` method in the `EntityExtensions` class to change its return type from nullable `TId?` to non-nullable `TId`, ensuring stricter type safety by throwing an `InvalidOperationException` when the `Id` property is not readable.

Removed a summary comment in the `ICRUDService` interface related to the `CreateAsync` method, which may indicate ongoing documentation updates for clarity on the method's functionality and parameters.
2025-05-20 12:37:36 +02:00
Developer 02
dd679b79b4 Update target frameworks and version to 2.1.0
- Added support for net8.0 and net9.0 frameworks.
- Incremented package, assembly, and file versions to 2.1.0.
- Updated `Microsoft.Extensions.Options` to 7.0.1 for net7.0, 8.0.2 for net8.0, and 9.0.5 for net9.0.
- Updated `Microsoft.Extensions.Options.ConfigurationExtensions` to 8.0.0 for net8.0 and 9.0.5 for net9.0.
- Maintained existing project reference to `DigitalData.Core.Abstractions.csproj`.
2025-05-20 11:37:03 +02:00
37 changed files with 124 additions and 61 deletions

View File

@ -1,4 +1,4 @@
namespace DigitalData.Core.Application.DTO
namespace DigitalData.Core.Application.Abstraction.DTO
{
/// <summary>
/// Represents a base Data Transfer Object (DTO) with an identifier.

View File

@ -1,4 +1,4 @@
namespace DigitalData.Core.Application.DTO
namespace DigitalData.Core.Application.Abstraction.DTO
{
/// <summary>
/// Represents settings related to user cookie consent dialogs. Designed to be serialized into JSON format for use with JavaScript frontend libraries,

View File

@ -2,7 +2,7 @@
using Microsoft.Extensions.DependencyInjection;
using System.Configuration;
namespace DigitalData.Core.Application.DTO
namespace DigitalData.Core.Application.Abstraction.DTO
{
/// <summary>
/// Provides extension methods for dependency injection.

View File

@ -1,7 +1,7 @@
using Microsoft.Extensions.Logging;
using System.Text;
namespace DigitalData.Core.Application.DTO
namespace DigitalData.Core.Application.Abstraction.DTO
{
/// <summary>
/// Provides extension methods for data transfer objects (DTOs).

View File

@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
namespace DigitalData.Core.Application.DTO
namespace DigitalData.Core.Application.Abstraction.DTO
{
/// <summary>
/// Represents a result of an operation that includes data, inheriting from <see cref="Result"/>.

View File

@ -1,4 +1,4 @@
namespace DigitalData.Core.Application.DTO
namespace DigitalData.Core.Application.Abstraction.DTO
{
/// <summary>
/// Defines flags that indicate specific types of status or conditions in a service operation.

View File

@ -1,6 +1,6 @@
using Microsoft.Extensions.Logging;
namespace DigitalData.Core.Application.DTO
namespace DigitalData.Core.Application.Abstraction.DTO
{
/// <summary>
/// Represents a notice for logging purposes, containing a flag, log level, and associated messages.

View File

@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
namespace DigitalData.Core.Application.DTO
namespace DigitalData.Core.Application.Abstraction.DTO
{
/// <summary>
/// Represents the result of an operation, containing information about its success or failure,

View File

@ -0,0 +1,37 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net7.0;net8.0;net9.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="7.0.16" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.0.0" />
<PackageReference Include="System.DirectoryServices.AccountManagement" Version="7.0.1" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.5.1" />
<PackageReference Include="System.Security.Cryptography.Cng" Version="5.0.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
<PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="7.0.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
<PackageReference Include="AutoMapper" Version="14.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="8.0.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
<PackageReference Include="AutoMapper" Version="14.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.5" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="9.0.5" />
</ItemGroup>
</Project>

View File

@ -1,4 +1,4 @@
namespace DigitalData.Core.Application;
namespace DigitalData.Core.Application.Abstraction;
/// <summary>
/// Provides extension methods for retrieving the value of an 'Id' property from objects.
@ -28,7 +28,7 @@ public static class EntityExtensions
/// <exception cref="InvalidOperationException">
/// Thrown if the object does not have a readable 'Id' property of type <typeparamref name="TId"/>.
/// </exception>
public static TId? GetId<TId>(this object? obj)
public static TId GetId<TId>(this object? obj)
=> obj.GetIdOrDefault<TId>()
?? throw new InvalidOperationException($"The object of type '{obj?.GetType().FullName ?? "null"}' does not have a readable 'Id' property of type '{typeof(TId).FullName}'.");

View File

@ -1,4 +1,4 @@
namespace DigitalData.Core.Application.Interfaces
namespace DigitalData.Core.Application.Abstraction
{
/// <summary>
/// Implements a simplified CRUD service interface that uses a single Data Transfer Object (DTO) type for all CRUD operations,

View File

@ -1,6 +1,6 @@
using DigitalData.Core.Application.DTO;
using DigitalData.Core.Application.Abstraction.DTO;
namespace DigitalData.Core.Application.Interfaces
namespace DigitalData.Core.Application.Abstraction
{
[Obsolete("Use MediatR")]
public interface ICRUDService<TCreateDto, TReadDto, TEntity, TId> : IReadService<TReadDto, TEntity, TId>
@ -12,8 +12,7 @@ namespace DigitalData.Core.Application.Interfaces
/// </summary>
/// <param name="createDto">The data transfer object containing the information for the new entity.</param>
/// <returns>A task representing the asynchronous operation, with a <see cref="DataResult{TId}"/> containing the identifier of the created entity or an error message.</returns>
Task<DataResult<TId>> CreateAsync(TCreateDto createDto);
Task<DataResult<TReadDto>> CreateAsync(TCreateDto createDto);
/// <summary>
/// Updates an existing entity based on the provided updateDTO and returns the result wrapped in an IServiceMessage,

View File

@ -1,7 +1,7 @@
using DigitalData.Core.Application.DTO;
using DigitalData.Core.Application.Abstraction.DTO;
using System.DirectoryServices;
namespace DigitalData.Core.Application.Interfaces
namespace DigitalData.Core.Application.Abstraction
{
public interface IDirectorySearchService
{

View File

@ -2,7 +2,7 @@
using System.IdentityModel.Tokens.Jwt;
using System.Security.Cryptography;
namespace DigitalData.Core.Application.Interfaces
namespace DigitalData.Core.Application.Abstraction
{
/// <summary>
/// Defines the operations for JWT service handling claims of type <typeparamref name="TClaimValue"/>.

View File

@ -1,6 +1,6 @@
using DigitalData.Core.Application.DTO;
using DigitalData.Core.Application.Abstraction.DTO;
namespace DigitalData.Core.Application.Interfaces
namespace DigitalData.Core.Application.Abstraction
{
[Obsolete("Use MediatR")]
public interface IReadService<TReadDto, TEntity, TId>

View File

@ -1,6 +1,6 @@
using System.Linq.Expressions;
namespace DigitalData.Core.Application.Interfaces.Repository;
namespace DigitalData.Core.Application.Abstraction.Repository;
public static class Extensions
{

View File

@ -1,4 +1,4 @@
namespace DigitalData.Core.Application.Interfaces.Repository
namespace DigitalData.Core.Application.Abstraction.Repository
{
/// <summary>
/// Defines the contract for CRUD operations on a repository for entities of type TEntity.

View File

@ -1,4 +1,4 @@
namespace DigitalData.Core.Application.Interfaces.Repository
namespace DigitalData.Core.Application.Abstraction.Repository
{
/// <summary>
/// Defines methods for mapping between entities and Data Transfer Objects (DTOs).

View File

@ -1,6 +1,6 @@
using System.Linq.Expressions;
namespace DigitalData.Core.Application.Interfaces.Repository;
namespace DigitalData.Core.Application.Abstraction.Repository;
/// <summary>
/// Provides methods for executing common queries on a given entity type.

View File

@ -1,6 +1,6 @@
using System.Linq.Expressions;
namespace DigitalData.Core.Application.Interfaces.Repository;
namespace DigitalData.Core.Application.Abstraction.Repository;
public interface IRepository<TEntity>
{

View File

@ -1,6 +1,6 @@
using System.Linq.Expressions;
namespace DigitalData.Core.Application.Interfaces.Repository;
namespace DigitalData.Core.Application.Abstraction.Repository;
public static class RepositoryExtensions
{

View File

@ -1,6 +1,6 @@
using AutoMapper;
using DigitalData.Core.Application.Interfaces;
using DigitalData.Core.Application.Interfaces.Repository;
using DigitalData.Core.Application.Abstraction;
using DigitalData.Core.Application.Abstraction.Repository;
namespace DigitalData.Core.Application
{

View File

@ -1,8 +1,8 @@
using AutoMapper;
using Microsoft.Extensions.Logging;
using DigitalData.Core.Application.Interfaces.Repository;
using DigitalData.Core.Application.Interfaces;
using DigitalData.Core.Application.DTO;
using DigitalData.Core.Application.Abstraction.DTO;
using DigitalData.Core.Application.Abstraction.Repository;
using DigitalData.Core.Application.Abstraction;
namespace DigitalData.Core.Application
{
@ -33,11 +33,12 @@ namespace DigitalData.Core.Application
/// </summary>
/// <param name="createDto">The DTO to create an entity from.</param>
/// <returns>A service result indicating success or failure, including the entity DTO.</returns>
public virtual async Task<DataResult<TId>> CreateAsync(TCreateDto createDto)
public virtual async Task<DataResult<TReadDto>> CreateAsync(TCreateDto createDto)
{
var entity = _mapper.Map<TEntity>(createDto);
var createdEntity = await _repository.CreateAsync(entity);
return createdEntity is null ? Result.Fail<TId>() : Result.Success(createdEntity.GetIdOrDefault<TId>());
var dto = _mapper.Map<TReadDto>(createdEntity);
return createdEntity is null ? Result.Fail<TReadDto>() : Result.Success(dto);
}
/// <summary>
@ -47,7 +48,7 @@ namespace DigitalData.Core.Application
/// <returns>A service message indicating success or failure.</returns>
public virtual async Task<Result> UpdateAsync<TUpdateDto>(TUpdateDto updateDto)
{
var currentEntitiy = await _repository.ReadByIdAsync(updateDto.GetIdOrDefault<TId>());
var currentEntitiy = await _repository.ReadByIdAsync(updateDto.GetId<TId>());
if (currentEntitiy is null)
return Result.Fail().Notice(LogLevel.Warning, Flag.NotFound, $"{updateDto.GetIdOrDefault<TId>()} is not found in update process of {GetType()} entity.");

View File

@ -1,4 +1,4 @@
using DigitalData.Core.Application.Interfaces;
using DigitalData.Core.Application.Abstraction;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;

View File

@ -14,9 +14,9 @@
<PackageIcon>core_icon.png</PackageIcon>
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
<PackageTags>digital data core application clean architecture</PackageTags>
<Version>3.3.0</Version>
<AssemblyVersion>3.3.0</AssemblyVersion>
<FileVersion>3.3.0</FileVersion>
<Version>3.3.1</Version>
<AssemblyVersion>3.3.1</AssemblyVersion>
<FileVersion>3.3.1</FileVersion>
</PropertyGroup>
<ItemGroup>
@ -54,4 +54,8 @@
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="9.0.5" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DigitalData.Core.Application.Abstraction\DigitalData.Core.Application.Abstraction.csproj" />
</ItemGroup>
</Project>

View File

@ -3,8 +3,8 @@ using System.DirectoryServices;
using Microsoft.Extensions.Caching.Memory;
using System.DirectoryServices.AccountManagement;
using Microsoft.Extensions.Options;
using DigitalData.Core.Application.Interfaces;
using DigitalData.Core.Application.DTO;
using DigitalData.Core.Application.Abstraction.DTO;
using DigitalData.Core.Application.Abstraction;
namespace DigitalData.Core.Application
{

View File

@ -1,4 +1,4 @@
using DigitalData.Core.Application.Interfaces;
using DigitalData.Core.Application.Abstraction;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Cryptography;

View File

@ -1,7 +1,7 @@
using AutoMapper;
using DigitalData.Core.Application.DTO;
using DigitalData.Core.Application.Interfaces;
using DigitalData.Core.Application.Interfaces.Repository;
using DigitalData.Core.Application.Abstraction;
using DigitalData.Core.Application.Abstraction.DTO;
using DigitalData.Core.Application.Abstraction.Repository;
namespace DigitalData.Core.Application;

View File

@ -6,7 +6,6 @@
<Nullable>enable</Nullable>
<Description>This package provides HTTP client extension methods for the DigitalData.Core library, offering simplified and asynchronous methods for fetching and handling HTTP responses. It includes utility methods for sending GET requests, reading response content as text or JSON, and deserializing JSON into dynamic or strongly-typed objects using Newtonsoft.Json. These extensions facilitate efficient and easy-to-read HTTP interactions in client applications.</Description>
<PackageId>DigitalData.Core.Client</PackageId>
<Version>2.0.3</Version>
<Authors>Digital Data GmbH</Authors>
<Company>Digital Data GmbH</Company>
<Product>Digital Data GmbH</Product>
@ -15,8 +14,9 @@
<PackageIcon>core_icon.png</PackageIcon>
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
<PackageTags>digital data core http client json serilization</PackageTags>
<AssemblyVersion>2.0.3</AssemblyVersion>
<FileVersion>2.0.3</FileVersion>
<Version>2.1.0</Version>
<AssemblyVersion>2.1.0</AssemblyVersion>
<FileVersion>2.1.0</FileVersion>
</PropertyGroup>
<ItemGroup>
@ -26,13 +26,27 @@
</None>
</ItemGroup>
<ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Options" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Options" Version="7.0.1" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Options" Version="8.0.2" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.5" />
<PackageReference Include="Microsoft.Extensions.Options" Version="9.0.5" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="9.0.5" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DigitalData.Core.Abstractions\DigitalData.Core.Abstractions.csproj" />
</ItemGroup>

View File

@ -1,6 +1,5 @@
using DigitalData.Core.Abstractions;
using DigitalData.Core.Application;
using DigitalData.Core.Application.Interfaces.Repository;
using DigitalData.Core.Application.Abstraction;
using DigitalData.Core.Application.Abstraction.Repository;
using Microsoft.EntityFrameworkCore;
namespace DigitalData.Core.Infrastructure

View File

@ -1,4 +1,4 @@
using DigitalData.Core.Application.Interfaces.Repository;
using DigitalData.Core.Application.Abstraction.Repository;
using Microsoft.EntityFrameworkCore;
using System.Linq.Expressions;

View File

@ -1,4 +1,4 @@
using DigitalData.Core.Application.Interfaces.Repository;
using DigitalData.Core.Application.Abstraction.Repository;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;

View File

@ -36,12 +36,11 @@
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.5" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DigitalData.Core.Abstractions\DigitalData.Core.Abstractions.csproj" />
<ProjectReference Include="..\DigitalData.Core.Application\DigitalData.Core.Application.csproj" />
<ProjectReference Include="..\DigitalData.Core.Application.Abstraction\DigitalData.Core.Application.Abstraction.csproj" />
</ItemGroup>
<ItemGroup>

View File

@ -1,4 +1,4 @@
using DigitalData.Core.Application.Interfaces.Repository;
using DigitalData.Core.Application.Abstraction.Repository;
using Microsoft.Extensions.DependencyInjection;
namespace DigitalData.Core.Infrastructure;

View File

@ -1,4 +1,4 @@
using DigitalData.Core.Application.Interfaces.Repository;
using DigitalData.Core.Application.Abstraction.Repository;
using Microsoft.EntityFrameworkCore;
using System.Linq.Expressions;

View File

@ -42,7 +42,7 @@
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="9.0.4" />
</ItemGroup>

View File

@ -51,6 +51,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "assets", "assets", "{0A27EA
Assets\core_legacy_icon.png = Assets\core_legacy_icon.png
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.Core.Application.Abstraction", "DigitalData.Core.Application.Abstraction\DigitalData.Core.Application.Abstraction.csproj", "{420C35A7-0EDE-4E2E-8500-484B57B0367A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Application", "Application", "{E18417C2-D9F5-437A-9ED5-473DD6260066}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -120,13 +124,17 @@ Global
{2336AE61-A21D-437E-A11B-367D008A64B2}.Debug|Any CPU.Build.0 = Release|Any CPU
{2336AE61-A21D-437E-A11B-367D008A64B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2336AE61-A21D-437E-A11B-367D008A64B2}.Release|Any CPU.Build.0 = Release|Any CPU
{420C35A7-0EDE-4E2E-8500-484B57B0367A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{420C35A7-0EDE-4E2E-8500-484B57B0367A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{420C35A7-0EDE-4E2E-8500-484B57B0367A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{420C35A7-0EDE-4E2E-8500-484B57B0367A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{A765EBEA-3D1E-4F36-869B-6D72F87FF3F6} = {41795B74-A757-4E93-B907-83BFF04EEE5C}
{DB404CD9-CBB8-4771-AB1B-FD4FDE2C28CC} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
{DB404CD9-CBB8-4771-AB1B-FD4FDE2C28CC} = {E18417C2-D9F5-437A-9ED5-473DD6260066}
{C57B2480-F632-4691-9C4C-8CC01237203C} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
{B54DEF90-C30C-44EA-9875-76F1B330CBB7} = {EDF84A84-1E01-484E-B073-383F7139C891}
{0B051A5F-BD38-47D1-BAFF-D44BA30D3FB7} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
@ -144,6 +152,8 @@ Global
{BAEF6CC9-4FE2-4E3F-9D32-911C9E8CCFB4} = {8C3AF25D-81D9-4651-90CA-BF0BD2A03EA7}
{2336AE61-A21D-437E-A11B-367D008A64B2} = {8C3AF25D-81D9-4651-90CA-BF0BD2A03EA7}
{8C3AF25D-81D9-4651-90CA-BF0BD2A03EA7} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
{420C35A7-0EDE-4E2E-8500-484B57B0367A} = {E18417C2-D9F5-437A-9ED5-473DD6260066}
{E18417C2-D9F5-437A-9ED5-473DD6260066} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8E2C3187-F848-493A-9E79-56D20DDCAC94}