From d99ce293f078a724f26b2c08d558e49737a2a64a Mon Sep 17 00:00:00 2001 From: alexandre-spieser Date: Sun, 29 Oct 2017 15:09:57 +0000 Subject: [PATCH] Big cleanup and adding IdentityBuilder extensions the same way as the EF IdentityBuilder extensions do, allowing customer Identity setup. --- src/AspNetCore.Identity.MongoDbCore.nuspec | 4 +- src/Extensions/ClaimHolderExtensions.cs | 26 ++- .../MongoDbIdentityBuilderExtensions.cs | 160 +++++++++++++++++ src/Extensions/ServiceCollectionExtension.cs | 130 ++++++++------ src/GlobalVariables.cs | 6 + .../MongoDbIdentityConfigurationcs.cs | 20 +++ src/Infrastructure/MongoDbSettings.cs | 17 ++ src/Infrastructure/MongoRepository.cs | 42 ++++- src/Interfaces/IClaimHolder.cs | 3 + src/Models/MongoClaim.cs | 21 +++ src/Models/MongoIdentityRole.cs | 37 +++- src/Models/MongoIdentityUser.cs | 56 +++--- src/Models/Token.cs | 20 +++ ...MongoIdentityServiceCollectionExensions.cs | 59 ------- src/MongoUserOnlyStore.cs | 18 +- src/PasswordHasherOptionsAccessor.cs | 21 +++ src/Resources.Designer.cs | 4 +- src/Resources.resx | 8 +- .../AspNetCore.Identity.MongoDbCore.dll | Bin 107520 -> 108032 bytes .../AspNetCore.Identity.MongoDbCore.xml | 108 ++++++++++-- src/lib/netcoreapp2.0/Resources.resx | 8 +- .../AspNetCore.Identity.MongoDbCore.dll | Bin 107008 -> 107520 bytes .../AspNetCore.Identity.MongoDbCore.xml | 108 ++++++++++-- src/lib/netstandard2.0/Resources.resx | 8 +- ...entity.MongoDbCore.IntegrationTests.csproj | 2 +- .../CustomPocoTest.cs | 150 ---------------- ...oreTestBase.cs => MongoDbStoreTestBase.cs} | 6 +- .../UserStoreGuidKeyTest.cs | 4 +- .../UserStoreIntKeyTest.cs | 4 +- .../UserStoreStringKeyTest.cs | 2 +- .../UserStoreWithGenericsTest.cs | 1 - .../Utilities/SqlServerTestStore.cs | 165 ------------------ 32 files changed, 697 insertions(+), 521 deletions(-) create mode 100644 src/Extensions/MongoDbIdentityBuilderExtensions.cs create mode 100644 src/Infrastructure/MongoDbIdentityConfigurationcs.cs create mode 100644 src/Infrastructure/MongoDbSettings.cs create mode 100644 src/Models/MongoClaim.cs create mode 100644 src/Models/Token.cs delete mode 100644 src/MongoIdentityServiceCollectionExensions.cs create mode 100644 src/PasswordHasherOptionsAccessor.cs delete mode 100644 test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/CustomPocoTest.cs rename test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/{SqlStoreTestBase.cs => MongoDbStoreTestBase.cs} (97%) delete mode 100644 test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/Utilities/SqlServerTestStore.cs diff --git a/src/AspNetCore.Identity.MongoDbCore.nuspec b/src/AspNetCore.Identity.MongoDbCore.nuspec index 73f1da2..b8633a4 100644 --- a/src/AspNetCore.Identity.MongoDbCore.nuspec +++ b/src/AspNetCore.Identity.MongoDbCore.nuspec @@ -2,7 +2,7 @@ AspNetCore.Identity.MongoDbCore - 1.0.4 + 1.0.5 AspNetCore.Identity.MongoDbCore Alexandre Spieser Alexandre Spieser @@ -10,7 +10,7 @@ https://github.com/alexandre-spieser/AspNetCore.Identity.MongoDbCore false A MongoDb UserStore and RoleStore adapter for Microsoft.AspNetCore.Identity 2.0. - Target both netstandard2.0 and netcoreapp2 + Added .AddMongoDbStores IdentityBuilder extensions. Copyright 2017 (c) Alexandre Spieser. All rights reserved. aspnetcore mongo mongodb identity membership diff --git a/src/Extensions/ClaimHolderExtensions.cs b/src/Extensions/ClaimHolderExtensions.cs index 9decc35..ea890d6 100644 --- a/src/Extensions/ClaimHolderExtensions.cs +++ b/src/Extensions/ClaimHolderExtensions.cs @@ -12,6 +12,11 @@ namespace AspNetCore.Identity.MongoDbCore.Extensions /// public static class ClaimHolderExtensions { + /// + /// Creates a object from a + /// + /// The . + /// A . public static MongoClaim ToMongoClaim(this Claim claim) { return new MongoClaim @@ -22,9 +27,14 @@ namespace AspNetCore.Identity.MongoDbCore.Extensions }; } - public static Claim ToClaim(this MongoClaim claim) + /// + /// Creates a object from a + /// + /// A . + /// A . + public static Claim ToClaim(this MongoClaim mongoClaim) { - return new Claim(claim.Type, claim.Value, null, claim.Issuer); + return new Claim(mongoClaim.Type, mongoClaim.Value, null, mongoClaim.Issuer); } /// @@ -85,6 +95,12 @@ namespace AspNetCore.Identity.MongoDbCore.Extensions return claimHolder.Claims.Any(e => e.Value == claim.Value && e.Type == claim.Type); } + /// + /// Removes a from the . + /// + /// The holder of the claim. + /// The to remove. + /// True is the claim was successfully removed. public static bool RemoveClaim(this IClaimHolder claimHolder, Claim claim) { if (claim == null) @@ -102,6 +118,12 @@ namespace AspNetCore.Identity.MongoDbCore.Extensions return false; } + /// + /// Removes an IEnumerable of s from the . + /// + /// The holder of the claims. + /// The s to remove. + /// True is the claims were successfully removed. public static bool RemoveClaims(this IClaimHolder claimHolder, IEnumerable claims) { var someClaimsRemoved = false; diff --git a/src/Extensions/MongoDbIdentityBuilderExtensions.cs b/src/Extensions/MongoDbIdentityBuilderExtensions.cs new file mode 100644 index 0000000..342c359 --- /dev/null +++ b/src/Extensions/MongoDbIdentityBuilderExtensions.cs @@ -0,0 +1,160 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Reflection; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.DependencyInjection.Extensions; +using MongoDbGenericRepository; +using AspNetCore.Identity.MongoDbCore; +using AspNetCore.Identity.MongoDbCore.Models; +using AspNetCore.Identity.MongoDbCore.Infrastructure; + +namespace Microsoft.Extensions.DependencyInjection +{ + /// + /// Contains extension methods to for adding MongoDb stores. + /// + public static class MongoDbIdentityBuilderExtensions + { + /// + /// Adds an MongoDb implementation of identity information stores. + /// + /// The MongoDb database context to use. + /// The instance this method extends. + /// A mongoDbContext + /// The instance this method extends. + public static IdentityBuilder AddMongoDbStores(this IdentityBuilder builder, IMongoDbContext mongoDbContext) + where TContext : IMongoDbContext + { + if(mongoDbContext == null) + { + throw new ArgumentNullException(nameof(mongoDbContext)); + } + + builder.Services.TryAddSingleton(mongoDbContext); + builder.Services.TryAddSingleton(new MongoRepository(mongoDbContext)); + + AddStores(builder.Services, builder.UserType, builder.RoleType, typeof(TContext)); + return builder; + } + + /// + /// Adds an MongoDb implementation of identity information stores. + /// + /// The type representing a user. + /// The type representing a role. + /// The type of the primary key of the identity document. + /// The instance this method extends. + /// + /// + public static IdentityBuilder AddMongoDbStores(this IdentityBuilder builder, string connectionString, string databaseName) + where TUser : MongoIdentityUser, new() + where TRole : MongoIdentityRole, new() + where TKey : IEquatable + { + if (string.IsNullOrEmpty(connectionString)) + { + throw new ArgumentNullException(nameof(connectionString)); + } + + if (string.IsNullOrEmpty(databaseName)) + { + throw new ArgumentNullException(nameof(databaseName)); + } + builder.Services.TryAddSingleton(new MongoDbSettings + { + ConnectionString = connectionString, + DatabaseName = databaseName + }); + builder.AddMongoDbStores(new MongoDbContext(connectionString, databaseName)); + return builder; + } + + /// + /// Adds an MongoDb implementation of identity information stores. + /// + /// The type representing a user. + /// The type representing a role. + /// The type of the primary key of the identity document. + /// The instance this method extends. + /// + public static IdentityBuilder AddMongoDbStores(this IdentityBuilder builder, IMongoDbContext mongoDbContext) + where TUser : MongoIdentityUser, new() + where TRole : MongoIdentityRole, new() + where TKey : IEquatable + { + if (mongoDbContext == null) + { + throw new ArgumentNullException(nameof(mongoDbContext)); + } + + builder.Services.TryAddSingleton(mongoDbContext); + builder.Services.TryAddSingleton(new MongoRepository(mongoDbContext)); + builder.Services.TryAddScoped>(provider => + { + return new MongoUserStore(provider.GetService()); + }); + + builder.Services.TryAddScoped>(provider => + { + return new MongoRoleStore(provider.GetService()); + }); + return builder; + } + + private static void AddStores(IServiceCollection services, Type userType, Type roleType, Type contextType) + { + var identityUserType = FindGenericBaseType(userType, typeof(MongoIdentityUser<>)); + if (identityUserType == null) + { + throw new InvalidOperationException(Resources.NotIdentityUser); + } + + var keyType = identityUserType.GenericTypeArguments[0]; + + if (roleType != null) + { + var identityRoleType = FindGenericBaseType(roleType, typeof(MongoIdentityRole<>)); + if (identityRoleType == null) + { + throw new InvalidOperationException(Resources.NotIdentityRole); + } + + Type userStoreType = null; + Type roleStoreType = null; + + // If its a custom DbContext, we can only add the default POCOs + userStoreType = typeof(MongoUserStore<,,,>).MakeGenericType(userType, roleType, contextType, keyType); + roleStoreType = typeof(MongoRoleStore<,,>).MakeGenericType(roleType, contextType, keyType); + + services.TryAddSingleton(typeof(IUserStore<>).MakeGenericType(userType), userStoreType); + services.TryAddSingleton(typeof(IRoleStore<>).MakeGenericType(roleType), roleStoreType); + } + else + { // No Roles + Type userStoreType = null; + // If its a custom DbContext, we can only add the default POCOs + userStoreType = typeof(MongoUserStore<,,,>).MakeGenericType(userType, roleType, contextType, keyType); + services.TryAddSingleton(typeof(IUserStore<>).MakeGenericType(userType), userStoreType); + } + + } + + private static TypeInfo FindGenericBaseType(Type currentType, Type genericBaseType) + { + var type = currentType; + while (type != null) + { + var typeInfo = type.GetTypeInfo(); + var genericType = type.IsGenericType ? type.GetGenericTypeDefinition() : null; + if (genericType != null && genericType == genericBaseType) + { + return typeInfo; + } + type = type.BaseType; + } + return null; + } + } +} \ No newline at end of file diff --git a/src/Extensions/ServiceCollectionExtension.cs b/src/Extensions/ServiceCollectionExtension.cs index 10b3a52..8c96b20 100644 --- a/src/Extensions/ServiceCollectionExtension.cs +++ b/src/Extensions/ServiceCollectionExtension.cs @@ -7,88 +7,118 @@ using System; namespace AspNetCore.Identity.MongoDbCore.Extensions { - public class MongoDbSettings - { - public string ConnectionString { get; set; } - public string DatabaseName { get; set; } - } - - public class MongoDbIdentityConfiguration - { - public MongoDbSettings MongoDbSettings { get; set; } - public Action IdentityOptionsAction { get; set; } - } - + /// + /// Contains extension methods to for adding mongoDb Identity. + /// public static class ServiceCollectionExtension { - public static void ConfigureMongoDbIdentity( - this IServiceCollection services, - MongoDbIdentityConfiguration mongoDbIdentityConfiguration, - IMongoRepository mongoRepository = null) + /// + /// Configures the MongoDb Identity store adapters for the types of TUser only from . + /// + /// The type representing a user. + /// The type of the primary key of the identity document. + /// The collection of service descriptors. + /// A configuration object of the AspNetCore.Identity.MongoDbCore package. + public static void ConfigureMongoDbIdentityUserOnly( + this IServiceCollection services, + MongoDbIdentityConfiguration mongoDbIdentityConfiguration) where TUser : MongoIdentityUser, new() where TKey : IEquatable { - services.AddSingleton(mongoDbIdentityConfiguration.MongoDbSettings); - services.AddSingleton(provider => - { - var options = provider.GetService(); - return mongoRepository ?? new MongoRepository(options.ConnectionString, options.DatabaseName); - }); - + ValidateMongoDbSettings(mongoDbIdentityConfiguration.MongoDbSettings); CommonMongoDbSetup, TKey>(services, mongoDbIdentityConfiguration); } + + /// + /// Configures the MongoDb Identity store adapters for the types of TUser only inheriting from . + /// + /// The type representing a user. + /// The collection of service descriptors. + /// A configuration object of the AspNetCore.Identity.MongoDbCore package. public static void ConfigureMongoDbIdentity(this IServiceCollection services, MongoDbIdentityConfiguration mongoDbIdentityConfiguration) where TUser : MongoIdentityUser, new() { - services.AddSingleton(mongoDbIdentityConfiguration.MongoDbSettings); - services.AddSingleton(provider => - { - var options = provider.GetService(); - return new MongoRepository(options.ConnectionString, options.DatabaseName); - }); - + ValidateMongoDbSettings(mongoDbIdentityConfiguration.MongoDbSettings); CommonMongoDbSetup(services, mongoDbIdentityConfiguration); } + /// + /// Validates the MongoDbSettings + /// + /// + private static void ValidateMongoDbSettings(MongoDbSettings mongoDbSettings) + { + if (mongoDbSettings == null) + { + throw new ArgumentNullException(nameof(mongoDbSettings)); + } + if (string.IsNullOrEmpty(mongoDbSettings.ConnectionString)) + { + throw new ArgumentNullException(nameof(mongoDbSettings.ConnectionString)); + } + + if (string.IsNullOrEmpty(mongoDbSettings.DatabaseName)) + { + throw new ArgumentNullException(nameof(mongoDbSettings.DatabaseName)); + } + } + + /// + /// Configures the MongoDb Identity store adapters for the types of TUser and TRole. + /// + /// The type representing a user. + /// The type representing a role. + /// The type of the primary key of the identity document. + /// The collection of service descriptors. + /// A configuration object of the AspNetCore.Identity.MongoDbCore package. + /// An object representing a MongoDb connection. public static void ConfigureMongoDbIdentity(this IServiceCollection services, MongoDbIdentityConfiguration mongoDbIdentityConfiguration, IMongoDbContext mongoDbContext = null) where TUser : MongoIdentityUser, new() where TRole : MongoIdentityRole, new() where TKey : IEquatable { - services.AddSingleton(mongoDbIdentityConfiguration.MongoDbSettings); - services.AddSingleton(provider => - { - var options = provider.GetService(); - return mongoDbContext == null ? new MongoRepository(options.ConnectionString, options.DatabaseName) : new MongoRepository(mongoDbContext); - }); + ValidateMongoDbSettings(mongoDbIdentityConfiguration.MongoDbSettings); - CommonMongoDbSetup(services, mongoDbIdentityConfiguration); + if(mongoDbContext == null) + { + services.AddIdentity() + .AddMongoDbStores( + mongoDbIdentityConfiguration.MongoDbSettings.ConnectionString, + mongoDbIdentityConfiguration.MongoDbSettings.DatabaseName) + .AddDefaultTokenProviders(); + } + else + { + services.AddIdentity() + .AddMongoDbStores(mongoDbContext) + .AddDefaultTokenProviders(); + } + + if (mongoDbIdentityConfiguration.IdentityOptionsAction != null) + { + services.Configure(mongoDbIdentityConfiguration.IdentityOptionsAction); + } } + private static void CommonMongoDbSetup(this IServiceCollection services, MongoDbIdentityConfiguration mongoDbIdentityConfiguration) where TUser : MongoIdentityUser, new() where TRole : MongoIdentityRole, new() where TKey : IEquatable { - services.AddScoped>(provider => - { - var userStore = new MongoUserStore(provider.GetService().Context); - return userStore; - }); - - services.AddScoped>(provider => - { - return new MongoRoleStore(provider.GetService().Context); - }); - services.AddIdentity() + .AddMongoDbStores( + mongoDbIdentityConfiguration.MongoDbSettings.ConnectionString, + mongoDbIdentityConfiguration.MongoDbSettings.DatabaseName) .AddDefaultTokenProviders(); - services.Configure(mongoDbIdentityConfiguration.IdentityOptionsAction); + if (mongoDbIdentityConfiguration.IdentityOptionsAction != null) + { + services.Configure(mongoDbIdentityConfiguration.IdentityOptionsAction); + } } - } } diff --git a/src/GlobalVariables.cs b/src/GlobalVariables.cs index 83f619d..0d91c46 100644 --- a/src/GlobalVariables.cs +++ b/src/GlobalVariables.cs @@ -2,8 +2,14 @@ namespace AspNetCore.Identity.MongoDbCore { + /// + /// A class holding global variables. + /// public static class GlobalVariables { + /// + /// A random number generator. + /// public static Random Random = new Random(); } } diff --git a/src/Infrastructure/MongoDbIdentityConfigurationcs.cs b/src/Infrastructure/MongoDbIdentityConfigurationcs.cs new file mode 100644 index 0000000..1d6803e --- /dev/null +++ b/src/Infrastructure/MongoDbIdentityConfigurationcs.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Identity; +using System; + +namespace AspNetCore.Identity.MongoDbCore.Infrastructure +{ + /// + /// A class used to perform a full configuration of the AspNetCore.Identity.MongoDbCore package. + /// + public class MongoDbIdentityConfiguration + { + /// + /// The settings for the MongoDb server. + /// + public MongoDbSettings MongoDbSettings { get; set; } + /// + /// An action against an to change the default identity settings. + /// + public Action IdentityOptionsAction { get; set; } + } +} diff --git a/src/Infrastructure/MongoDbSettings.cs b/src/Infrastructure/MongoDbSettings.cs new file mode 100644 index 0000000..3330db6 --- /dev/null +++ b/src/Infrastructure/MongoDbSettings.cs @@ -0,0 +1,17 @@ +namespace AspNetCore.Identity.MongoDbCore.Infrastructure +{ + /// + /// A class representing the settings for the MongoDb server. + /// + public class MongoDbSettings + { + /// + /// The connection string for the MongoDb server. + /// + public string ConnectionString { get; set; } + /// + /// The name of the MongoDb database where the identity data will be stored. + /// + public string DatabaseName { get; set; } + } +} diff --git a/src/Infrastructure/MongoRepository.cs b/src/Infrastructure/MongoRepository.cs index a510851..f9481a0 100644 --- a/src/Infrastructure/MongoRepository.cs +++ b/src/Infrastructure/MongoRepository.cs @@ -2,34 +2,74 @@ namespace AspNetCore.Identity.MongoDbCore.Infrastructure { + /// + /// The repository used in the MongoDb identity stores. + /// public interface IMongoRepository : IBaseMongoRepository { + /// + /// Drops a collections. + /// + /// The type of the document used to define the collection name. void DropCollection(); + + /// + /// Drops a partitioned collection. + /// + /// The type of the document used to define the collection name. + /// The partition key of the collection. void DropCollection(string partitionKey); + + /// + /// The MongoDb context. + /// IMongoDbContext Context { get; } } - + /// + /// The repository used in the MongoDb identity stores. + /// public class MongoRepository : BaseMongoRepository, IMongoRepository { + /// + /// The constructor for requiring a connection string and a database name. + /// + /// The connection string. + /// The database name. public MongoRepository(string connectionString, string databaseName) : base(connectionString, databaseName) { } + /// + /// The constructor for requiring a . + /// + /// A . public MongoRepository(IMongoDbContext mongoDbContext) : base(mongoDbContext) { } + /// + /// Drops a collections. + /// + /// The type of the document used to define the collection name. public void DropCollection() { MongoDbContext.DropCollection(); } + /// + /// Drops a partitioned collection. + /// + /// The type of the document used to define the collection name. + /// The partition key of the collection. public void DropCollection(string partitionKey) { MongoDbContext.DropCollection(partitionKey); } + /// + /// The MongoDb context. + /// public IMongoDbContext Context => MongoDbContext; } } diff --git a/src/Interfaces/IClaimHolder.cs b/src/Interfaces/IClaimHolder.cs index dce1f8e..134a8a7 100644 --- a/src/Interfaces/IClaimHolder.cs +++ b/src/Interfaces/IClaimHolder.cs @@ -8,6 +8,9 @@ namespace AspNetCore.Identity.MongoDbCore.Interfaces /// public interface IClaimHolder { + /// + /// The claims the has. + /// List Claims { get; set; } } } diff --git a/src/Models/MongoClaim.cs b/src/Models/MongoClaim.cs new file mode 100644 index 0000000..245b306 --- /dev/null +++ b/src/Models/MongoClaim.cs @@ -0,0 +1,21 @@ +namespace AspNetCore.Identity.MongoDbCore.Models +{ + /// + /// A class representing the claims a can have. + /// + public class MongoClaim + { + /// + /// The type of the claim. + /// + public string Type { get; set; } + /// + /// The value of the claim. + /// + public string Value { get; set; } + /// + /// The issuer of the claim. + /// + public string Issuer { get; set; } + } +} diff --git a/src/Models/MongoIdentityRole.cs b/src/Models/MongoIdentityRole.cs index 380c160..9769bfc 100644 --- a/src/Models/MongoIdentityRole.cs +++ b/src/Models/MongoIdentityRole.cs @@ -3,32 +3,55 @@ using Microsoft.AspNetCore.Identity; using MongoDbGenericRepository.Models; using System; using System.Collections.Generic; -using System.Security.Claims; namespace AspNetCore.Identity.MongoDbCore.Models { + /// + /// A where TKey is a + /// public class MongoDbIdentityRole : MongoIdentityRole { + /// + /// The constructor for a + /// public MongoDbIdentityRole() : base() { } + /// + /// The constructor for a , taking a role name. + /// + /// The name of the role. public MongoDbIdentityRole(string roleName) : base(roleName) { } } + /// + /// A where TKey is a + /// public class MongoIdentityRole : MongoIdentityRole { + /// + /// The constructor for a + /// public MongoIdentityRole() : base() { } + /// + /// The constructor for a , taking a role name. + /// + /// The name of the role. public MongoIdentityRole(string roleName) : base(roleName) { } } + /// + /// A document representing an document. + /// + /// The type of the primary key. public class MongoIdentityRole : IdentityRole, IDocument, IClaimHolder where TKey : IEquatable { @@ -53,17 +76,29 @@ namespace AspNetCore.Identity.MongoDbCore.Models } } + /// + /// The constructor for a + /// public MongoIdentityRole() { InitializeFields(); } + /// + /// The constructor for a , taking a role name. + /// + /// The name of the role. public MongoIdentityRole(string roleName) { Name = roleName; InitializeFields(); } + /// + /// The constructor for a , taking a role name and a primary key value. + /// + /// The name of the role. + /// The value of the primary key public MongoIdentityRole(string name, TKey key) { InitializeFields(); diff --git a/src/Models/MongoIdentityUser.cs b/src/Models/MongoIdentityUser.cs index 2490875..4043eac 100644 --- a/src/Models/MongoIdentityUser.cs +++ b/src/Models/MongoIdentityUser.cs @@ -8,58 +8,62 @@ using Microsoft.AspNetCore.Identity; namespace AspNetCore.Identity.MongoDbCore.Models { - public class Token - { - /// - /// Gets or sets the LoginProvider this token is from. - /// - public string LoginProvider { get; set; } - /// - /// Gets or sets the name of the token. - public string Name { get; set; } - /// - /// Gets or sets the token value. - /// - public string Value { get; set; } - } - - public class MongoClaim { - public string Type { get; set; } - public string Value { get; set; } - public string Issuer { get; set; } - } - - public class UserRole - { - public object UserId { get; set; } - public object RoleId { get; set; } - } + /// + /// A where TKey is a + /// public class MongoDbIdentityUser : MongoIdentityUser { + /// + /// The constructor for a + /// public MongoDbIdentityUser() : base() { } + /// + /// The constructor for a , taking a username. + /// + /// The name of the user. public MongoDbIdentityUser(string userName) : base(userName) { } + /// + /// The constructor for a , taking a username and an email address. + /// + /// The name of the user. + /// The email address of the user. public MongoDbIdentityUser(string userName, string email) : base(userName, email) { } } + /// + /// A where TKey is a + /// public class MongoIdentityUser : MongoIdentityUser { + /// + /// The constructor for a + /// public MongoIdentityUser() : base() { } + /// + /// The constructor for a , taking a username. + /// + /// The name of the user. public MongoIdentityUser(string userName) : base(userName) { } + /// + /// The constructor for a , taking a username and an email address. + /// + /// The name of the user. + /// The email address of the user. public MongoIdentityUser(string userName, string email) : base(userName, email) { } diff --git a/src/Models/Token.cs b/src/Models/Token.cs new file mode 100644 index 0000000..729981c --- /dev/null +++ b/src/Models/Token.cs @@ -0,0 +1,20 @@ +namespace AspNetCore.Identity.MongoDbCore.Models +{ + /// + /// A class representing the tokens a can have. + /// + public class Token + { + /// + /// Gets or sets the LoginProvider this token is from. + /// + public string LoginProvider { get; set; } + /// + /// Gets or sets the name of the token. + public string Name { get; set; } + /// + /// Gets or sets the token value. + /// + public string Value { get; set; } + } +} diff --git a/src/MongoIdentityServiceCollectionExensions.cs b/src/MongoIdentityServiceCollectionExensions.cs deleted file mode 100644 index 1690382..0000000 --- a/src/MongoIdentityServiceCollectionExensions.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Options; -using Microsoft.AspNetCore.Identity; - -namespace AspNetCore.Identity.MongoDbCore -{ - /// - /// Represents the password hashing options - /// - public sealed class PasswordHasherOptionsAccessor : IOptions - { - /// - /// Gets options which use the IdentityV3 compat mode, and set the iteration count to 200000 PBKDF2-SHA256 iterations - /// (roughly 200ms of work) - /// - public PasswordHasherOptions Value { get; } = new PasswordHasherOptions - { - CompatibilityMode = PasswordHasherCompatibilityMode.IdentityV3, - IterationCount = 200000 - }; - } - - public static class MongoIdentityServiceCollectionExtensions - { - public static IdentityBuilder AddIdentity(this IServiceCollection services) - where TUser : class => services.AddIdentity(null); - - public static IdentityBuilder AddIdentity(this IServiceCollection services, Action setupAction) - where TUser : class - { - // Hosting doesn't add IHttpContextAccessor by default - services.TryAddSingleton(); - - // Identity services - services.TryAddScoped, UserValidator>(); - services.TryAddScoped, PasswordValidator>(); - - services.TryAddScoped, PasswordHasher>(); - services.TryAddScoped(); - - // No interface for the error describer so we can add errors without rev'ing the interface - services.TryAddScoped(); - services.TryAddScoped>(); - services.TryAddScoped, UserClaimsPrincipalFactory>(); - services.TryAddScoped, AspNetUserManager>(); - services.TryAddScoped, SignInManager>(); - - if (setupAction != null) - { - services.Configure(setupAction); - } - - return new IdentityBuilder(typeof(TUser), services); - } - } -} diff --git a/src/MongoUserOnlyStore.cs b/src/MongoUserOnlyStore.cs index f235cc2..6f0ef23 100644 --- a/src/MongoUserOnlyStore.cs +++ b/src/MongoUserOnlyStore.cs @@ -24,9 +24,9 @@ namespace AspNetCore.Identity.MongoDbCore where TUser : MongoIdentityUser, new() { /// - /// Constructs a new instance of . + /// Constructs a new instance of . /// - /// The . + /// The . /// The . public MongoUserOnlyStore(IMongoDbContext context, IdentityErrorDescriber describer = null) : base(context, describer) { } } @@ -41,9 +41,9 @@ namespace AspNetCore.Identity.MongoDbCore where TContext : IMongoDbContext { /// - /// Constructs a new instance of . + /// Constructs a new instance of . /// - /// The . + /// The . /// The . public MongoUserOnlyStore(TContext context, IdentityErrorDescriber describer = null) : base(context, describer) { } } @@ -60,9 +60,9 @@ namespace AspNetCore.Identity.MongoDbCore where TKey : IEquatable { /// - /// Constructs a new instance of . + /// Constructs a new instance of . /// - /// The . + /// The . /// The . public MongoUserOnlyStore(TContext context, IdentityErrorDescriber describer = null) : base(context, describer) { } } @@ -74,10 +74,8 @@ namespace AspNetCore.Identity.MongoDbCore /// The type of the data context class used to access the store. /// The type of the primary key for a role. /// The type representing a claim. - /// The type representing a user role. /// The type representing a user external login. /// The type representing a user token. - /// The type representing a role claim. public class MongoUserOnlyStore : UserStoreBase, IUserAuthenticationTokenStore @@ -543,10 +541,6 @@ namespace AspNetCore.Identity.MongoDbCore #region Token Management - public class TokenProjection - { - public List Tokens { get; set; } - } /// /// Find a user token if it exists. /// diff --git a/src/PasswordHasherOptionsAccessor.cs b/src/PasswordHasherOptionsAccessor.cs new file mode 100644 index 0000000..26fd35f --- /dev/null +++ b/src/PasswordHasherOptionsAccessor.cs @@ -0,0 +1,21 @@ +using Microsoft.Extensions.Options; +using Microsoft.AspNetCore.Identity; + +namespace AspNetCore.Identity.MongoDbCore +{ + /// + /// Represents the password hashing options + /// + public sealed class PasswordHasherOptionsAccessor : IOptions + { + /// + /// Gets options which use the IdentityV3 compat mode, and set the iteration count to 200000 PBKDF2-SHA256 iterations + /// (roughly 200ms of work) + /// + public PasswordHasherOptions Value { get; } = new PasswordHasherOptions + { + CompatibilityMode = PasswordHasherCompatibilityMode.IdentityV3, + IterationCount = 200000 + }; + } +} \ No newline at end of file diff --git a/src/Resources.Designer.cs b/src/Resources.Designer.cs index c31033d..9b276df 100644 --- a/src/Resources.Designer.cs +++ b/src/Resources.Designer.cs @@ -61,7 +61,7 @@ namespace AspNetCore.Identity.MongoDbCore { } /// - /// Recherche une chaîne localisée semblable à AddEntityFrameworkStores can only be called with a role that derives from IdentityRole<TKey, TUserRole, TRoleClaim>.. + /// Recherche une chaîne localisée semblable à AddMongoDbCoreStores can only be called with a role that derives from MongoIdentityRole<TKey, TUserRole, TRoleClaim>.. /// internal static string NotIdentityRole { get { @@ -70,7 +70,7 @@ namespace AspNetCore.Identity.MongoDbCore { } /// - /// Recherche une chaîne localisée semblable à AddEntityFrameworkStores can only be called with a user that derives from IdentityUser<TKey, TUserClaim, TUserRole, TUserLogin, TUserToken>.. + /// Recherche une chaîne localisée semblable à AddMongoDbCoreStores can only be called with a user that derives from MongoIdentityUser<TKey, TUserClaim, TUserRole, TUserLogin, TUserToken>.. /// internal static string NotIdentityUser { get { diff --git a/src/Resources.resx b/src/Resources.resx index eb19639..bf5a4ec 100644 --- a/src/Resources.resx +++ b/src/Resources.resx @@ -118,12 +118,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - AddEntityFrameworkStores can only be called with a role that derives from IdentityRole<TKey, TUserRole, TRoleClaim>. - error when the role does not derive from IdentityRole + AddMongoDbCoreStores can only be called with a role that derives from MongoIdentityRole<TKey, TUserRole, TRoleClaim>. + error when the role does not derive from MongoIdentityRole - AddEntityFrameworkStores can only be called with a user that derives from IdentityUser<TKey, TUserClaim, TUserRole, TUserLogin, TUserToken>. - error when the user does not derive from IdentityUser + AddMongoDbCoreStores can only be called with a user that derives from MongoIdentityUser<TKey, TUserClaim, TUserRole, TUserLogin, TUserToken>. + error when the user does not derive from MongoIdentityUser Role {0} does not exist. diff --git a/src/lib/netcoreapp2.0/AspNetCore.Identity.MongoDbCore.dll b/src/lib/netcoreapp2.0/AspNetCore.Identity.MongoDbCore.dll index 0940ed2ee93ff7153358a0949227d386eec53e02..ad80e86b5d7b9f8c68d65c7564d36df498f5db3c 100644 GIT binary patch literal 108032 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 Ov0(AThe claim you want to replace. Returns true if the claim is present, false otherwise. + + + Validates the MongoDbSettings + + + + + + Configures the MongoDb Identity store adapters for + + + + + + + + + + + A class used to perform a full configuration of the AspNetCore.Identity.MongoDbCore package. + + + + + The settings for the MongoDb server. + + + + + An action against an to change the default identity settings. + + + + + A class representing the settings for the MongoDb server. + + + + + The connection string for the MongoDb server. + + + + + The name of the MongoDb database where the identity data will be stored. + + The interface for an object that holds claims. @@ -69,17 +116,6 @@ The new claim you want to set. Returns true if the claim was replaced. - - - Represents the password hashing options - - - - - Gets options which use the IdentityV3 compat mode, and set the iteration count to 200000 PBKDF2-SHA256 iterations - (roughly 200ms of work) - - Creates a new instance of a persistence store for roles. @@ -1335,6 +1371,17 @@ The used to propagate notifications that the operation should be canceled. True if the recovery code was found for the user. + + + Represents the password hashing options + + + + + Gets options which use the IdentityV3 compat mode, and set the iteration count to 200000 PBKDF2-SHA256 iterations + (roughly 200ms of work) + + Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées. @@ -1353,12 +1400,12 @@ - Recherche une chaîne localisée semblable à AddEntityFrameworkStores can only be called with a role that derives from IdentityRole<TKey, TUserRole, TRoleClaim>.. + Recherche une chaîne localisée semblable à AddMongoDbCoreStores can only be called with a role that derives from MongoIdentityRole<TKey, TUserRole, TRoleClaim>.. - Recherche une chaîne localisée semblable à AddEntityFrameworkStores can only be called with a user that derives from IdentityUser<TKey, TUserClaim, TUserRole, TUserLogin, TUserToken>.. + Recherche une chaîne localisée semblable à AddMongoDbCoreStores can only be called with a user that derives from MongoIdentityUser<TKey, TUserClaim, TUserRole, TUserLogin, TUserToken>.. @@ -1371,5 +1418,40 @@ Recherche une chaîne localisée semblable à Value cannot be null or empty.. + + + Contains extension methods to for adding MongoDb stores. + + + + + Adds an MongoDb implementation of identity information stores. + + The MongoDb database context to use. + The instance this method extends. + A mongoDbContext + The instance this method extends. + + + + Adds an MongoDb implementation of identity information stores. + + + + + The instance this method extends. + + + + + + Adds an MongoDb implementation of identity information stores. + + + + + The instance this method extends. + + diff --git a/src/lib/netcoreapp2.0/Resources.resx b/src/lib/netcoreapp2.0/Resources.resx index eb19639..bf5a4ec 100644 --- a/src/lib/netcoreapp2.0/Resources.resx +++ b/src/lib/netcoreapp2.0/Resources.resx @@ -118,12 +118,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - AddEntityFrameworkStores can only be called with a role that derives from IdentityRole<TKey, TUserRole, TRoleClaim>. - error when the role does not derive from IdentityRole + AddMongoDbCoreStores can only be called with a role that derives from MongoIdentityRole<TKey, TUserRole, TRoleClaim>. + error when the role does not derive from MongoIdentityRole - AddEntityFrameworkStores can only be called with a user that derives from IdentityUser<TKey, TUserClaim, TUserRole, TUserLogin, TUserToken>. - error when the user does not derive from IdentityUser + AddMongoDbCoreStores can only be called with a user that derives from MongoIdentityUser<TKey, TUserClaim, TUserRole, TUserLogin, TUserToken>. + error when the user does not derive from MongoIdentityUser Role {0} does not exist. diff --git a/src/lib/netstandard2.0/AspNetCore.Identity.MongoDbCore.dll b/src/lib/netstandard2.0/AspNetCore.Identity.MongoDbCore.dll index 0f63b71ac133d80c4dc35f5f9948830a97e143f2..a7de6d44c0fecfb162f7508a0c6e1a835f31e6ea 100644 GIT binary patch literal 107520 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 literal 107008 zcmeFad0-Sp_6J_o(=#~;kc8X>2oOS(JBkO22Z$HqjdxVQc!0n_g6Cuq6cH6v6j2m! zbUpAwR8%}SpeVXg&{Y>%54?5PgWXk^jla+5RrgF!G6}fH@B91X7oDnlN4ebOz z)y<(NUZVm^DI33Ee^qJ~V*c$bVb{SdkbCrdx`$es_Im$Sdd%zn$DTE@sbpGX_{_%f zQ%X)7KXqz&M#+TJOB&CaS~78J$*9ARE}0T;IK8@i_w-U%^bz|jHAV;2-}kh>@k;wp z4JhfRYn8fDE0t=n6P`r61nCzLE0rl}%jiu6^*4V&;(z`H)V`OJmH)?M7bFUQJs|gR zCLnkBxDaB@--lXdAT{<0&^_Fa#3eD+g*z4SLB4#|GfqE$2H>-9aO=gox_WzT$TF_F zv8nMiAVfFTJp|w;#J<0M(OlJyr%w)pk-94AEV6Fzz&FyDO_C#NSNu^oO9j=^$CWz% zpGtW-w?3lPxS+7?P*B~Jt5o_dWVg$U9C%i!{GE$nSNkGV&b|l;d*)6E236&k&8$PB zEmW>ms3{M*2F)VHLEefoWJal>@?N#J+65&8nblN4ro5&?MByT)n|gc6^hR(@3+1$h zV4zS_G4M_w1my=!k%dCLy^e3&a6+y8!Vh21GjKNWn z$T84xI;d81ju-{9$Pr1Q%xkTtQsf+zA0EW0WZ&)q6)r-2q{mgy|A?lMw9=e0K?ZNZ3TGSvz=SxA+&?y6L8v4z!C z!SbZ)l}znn1?KMts_j(82-QrzYUM|3kT4nss=76ffT^3%KhrM^IB3Ik3(XlSYeMU# zJ3AvNFPb@&QD1A8#Emo2gy~g19h9El)D!JJiwMEeJSdhm4@4ya1d9`dBxr|&X#@B` zwz8t=hw0fW5FIA59o<7>XHP`Y;gZgc?u9rMA=E8fXDcTgwa-?~L^%5(@a#*uXkn4N zFYuI$>LIqHBPBL+_mgyPbQI!HgpiTj%g807gIxHB$lYJ^2BHT@Y)222*vLh{Ls_{| z=mEKejNBX}mk1+wb5F||4ajm1K^T~i3id`*92sj0G#_!{F(8KzWj^%8it@GF%jaf0 zJeC7~m!fWhUEsZ0Jp)~r>dS3AM?gm9c!RRTP%Yg#3PGTiiiy`Xo&fSA-m93Pl?yW4i6&~p`O8$Z-V~^H-iI8av3&*#qKyw@lOYBTT6rC>V+-M`> zP=t^fCom0iTqDAnfdJyfHVYB6|8_cD*cd#Zt~ZX$*kL=l7@I4P>0lA~U#!=jgHl>C z6#E>seXs2erQBXi?r<^SvOLbmv3ZT-Zn|6F^N?hH&zIPaULdh^A);tR(z(%Q#Gwcw zQ*U$v)|&`tCW7(BNB>Yp~m4MA0+HQ`V&m2WF(f4Fdlz8sUs{mHzI9DT*iPubw z#0se#?Wh&z0o4t55;j<=Ee~^KZ>c6{PO2air6h{X$mq?N8LoY=0Tb;DpFnI!ua(%$ zKi5e*H@XOMC_>2CcYv`k5gq2W?ylVHC2t_QSYkVRgTzMejgrodERB#_ZCU#MsGzNiV!k#v9h8+5aE*>P^gED^|2xDHgI5&z8z7z za|gmu4%cIJOmBSb2|b$bA_K<9Wr!0pOQudn^}E5`dPv8<5o#SxWPIeNRD;`*@o`tn zxd$0szlNS^3KivJO;*$IK%k!YBJN7H`&eQU)w-T=&|&;)vk*>Qy`7laT}?R9u~%(| zdR0SF>UzJc>jQ{Gc62$TVDv#m?KMBi8*nmGTmL=H4^7mZMYamAo#r{MWoUipVbEm- zQs7RusjZmi(_5i>`+@GxLHVsCxmICwHpYg=?rE)$0uh%aqhiPu8gF@4x}732Gp4n! z*n!-%RkGa9V<32QQrex)VARR9Oadj_Sa6mNEBWA7hVk-i!4`#=pymUMKEQMASri7nEBEw`!H7f=? zls_&#CHy=HRe#=`o>Cb~3BLefQ)t*M6eP~ze+s~yXVw$wG%tcLSvT|S2;=rfCEOXD z+_IjiDsRN(G|feGjOb;NkLhf)iU~id6+nxv=^WD0)f`PVuQ(`;%mc+s628nyv(T$QY#(=_L z&W*l>|{mh(r+8i>9tu^oL+V&{EC(LYH#H@XRNC_>1Htu#z*GMZCAOmy9x4 zu^s(ZV&^Z2qJNciZuC3Ep$H*U=bcQQiEw^EP(H!+y}1G&2zSMY4SE2J2SVRDCe z16<~UBK87@JL?(B5 zSln{#J4yDBy4LgVBzpdHdwMd{j_XP8|5(p$N%Z{J_Vi??9oLiG9re8ax3zm4^{kF< z#r?WH70JIH6*0nkO-}Cc9{wi(ciJ3#`W<{z1J|W*GShYx_4y{bJK7S@Qop4SaiDGA zhpg@C+1covybqDv=;_VSQo!**mz(~y4m$VQ@qQnGe(82MY<$~DWowD51NjyGTvSyc zuc8;yK|^Nbgb>8HZ&QfsbcKNDGM3R*Q(ytSXWVDV9Uk7nXYiP<`m$c$?sg~RL{B}a zEpIQ*3aJp39?C!71=G4z6Y~K1yHXSL0OWeEP44jCRMQ#fu=1`FQT^SP!`o;-z|L5aG26b$A zw$OchiZau76!nc0?8_uN0?JS$MJ++x>J8JtZOK!hq*@u3kU9+iW+^)U0ry%*aqoB{O-LviKth9 zx152JH4rV8*p3d8I2bLH808F>gySHJ4v}b6LLdcYZoiJ912&WQ3`B7G&5l;xy z8sSOP>|nTx$iotl;cDXK8H>*u16+M-fTf*lCAOn=5<5E~ita4w+~`omp$H*U{C=i* zBAi_jV7i3dkb*7MK*((bWt#2m1`@V?jbZ?%gSZWkgJWSXh3IAcj0e}PMfHLvG z{Xpg@nt2c-9I#6~cjmzWahNa~kz_K53B(EsXMg4_A%uDg7i#HlmcY$-rK@#oG8V0%cI|NL$-x!JQ=%Esuz5Bx?of|zIaVSE_*zEvgHzIs{_vXyM%$0kD z*D8`bc{Y>I01t9BYooSICvDIUL3je=SQ z*QsiUK&c#FYM_tyR0Axes7r&Z%jt-*=X?gD_SQPdvlbSsXR@Ru)@nVA1Q^R_#`t-A zI8j}e)hf7{x@MC-hkNo#4-qCZOL2mDITzp|!Zc4hZ+OM_Lw}1xtaVa_ytc*W>0!{U z^P>QtbH&ZoTJLG*OhO3-3oe)Y2d!tbxc&*1>D;o;WN@>ZQ#$4f8KvVsnxrBozcUrN zz1rZ3;&9X^Cwv4#9A8k)%9IqdkHj+yB5+0#+gCE@WR>)nX^=zTosPJ@qxgOI-*c4d zF@s5$VZ3Rz+PKU0s_H!?$NJ3P#UC)L!#=n|0n0UAuT=qUJ2J zRdDSz@BG;2TxRLS#j!fr(Q~qPim=k{6zS^Nrd@8@Dp~H%k8Khtv9p^ajid3wGk#7c z?Ga%S;qwsOja|py&Qai$b238kL4nz>=9~-Gq8aV^p;u^o*{9E{GC z*estfl5}o#7UEEZkeTC;Mss3WON6(4mh~!>#0ip-KU?w!q8CeSM=y~$7@Z@rk$}J{B2iP{_T=C5WPcUJ9?+YM($mb&W$cZ9EuP!a`8M# zKPJK_H_7>A7tQ!KtnFSWHrLR?cS9VGciJ}#hSu0Mw9aN7uUQh$C&|q_ogL06v49ny zy$1}m?e8SEqxVW2jNT_Po`vt1gfYeglFp4TM;wX}GR8o&(ilW|#_-N3cX!KqP_hQ1 z4@qoCAC}m89}W?HMAEs@M-hi2gpAmejaVW&oKNE5Mf6`Gc>~eMB(|d~B@RX(m)M+7 zJ|XGc=#z*;5kf}(DMmgK9nL4Q%b(S>3KY&;Pa#ftxM@Fo`4>`8gE`rXJJdQWapIv= zgG-!vyp~L|Rx;0qd%AUh1_Ic2t0lIh&q{30C!dpaZuEJ?p$H*UXK2c%BEp+?wt zuLWaH7|&@P&pq*=z;jPBcXsai3TR!8S1>0!ym#(N?r;O(Wapkcrqk*FZ|HOr+9il~ ziJg0PGM>2m?ysU+?RPd`1Fp*nncg_+tZVo zc3e+#|Hpd1o2GqZ z36q?4cdg@_)Un;J`&-*nl$o}psLwaa-O-l!{I)*C0ldAQ8@8t>GwryZn_CD{z%*_ zOtQ?4pL@Q;s>RPe|JbFP*dHW+S88G&@SP=+J3NtUx+5qNU7dS&?c>ZHKlkifSIlJF z(>3wjGp=hF=bl~b_b&AFjT7&&vNGHG_QU+EP4ahT%*1m~a{uS!#QW5--8k{5?J3Gk z+fmdvPLR9fIPn|D+)dOoKIVR~Jr&8n9Tk0JF1eG~^4=XB%aWdZZl=cVEc@r}sm)B= zQQK!(a{Dct^xU&+AN`P8#_jsi_7o)lb`Q`V)!m=oX2C z(N87DGtp-z5sZE=3G;CDg`{(%Um^}g2$_}fBn&QCaTDP_9C_!Sd%NX*B{>7puO+sl z-$)#cek(D``->z@F@KdbE*>Jr#Y2Rqn6phWMEIYhlY*wDUhD zwxio5Hs_xIl5}pg4RI(!$P|x56BbXzZ$0-E#k_OR5v~ruN;!cjE=WTcJE|oPMlFfW zo=`y2xltQ&C_>2Sf|DNVLWJ29!dufNoWdWPS%^2AtNJz`jT6^a^bYeHb~p&mrVxTz zqze;HG>iC>G)^=nKGt~c70v^Pu<=|spSk(=wIqNj@DP#!0t+x(I3xiCRxSo1 z2_X7;2uXPD4+8waa7qG*{vJXSKn(B@lJI36=n*6VPMpyjS(1ozI)$#nP7xFGN_%gn zz*6jy`ou_m4Jp#kB}FAcT|I;(sH=yN1aobQ!D_QMdq-)pQhaEaPazu`f%P-F>N2RE0Abc#ssvaJMhEFH?R(@&X)0pMaw8w)|Y2}q$&Iyw5 zMB(Ik9Zlsb@W6!w6fP44~;01P<<#RFpTi6Ya`76%1uE{s$DE@)hon zWHpTglJdqQ#+ls&L@}|a0We~*tB(We%3Yfpfby()I@2lPN70JmGfetSMB%ecdIj-t zIhtDPfb$c6hb60N5|AwOY{Zr`86oO01yR#f1kQ9*SXzo5UV}-J#*+Nh8S9FyrZBje ze;RYz(dmd{Vj2M?h}pHN2`EqJ8BEK|TcI%Ao@sbtD15F-w=jJk(w@$=`)HPVK9DT) z0>rVxE(Bl-Yoy)5%kd6rg=-yIXwnE60^w$aP830UsIq@3JX4Si%^JOj6$%K_xd^!O zP!%RV8l`D1v>9ZCgkLmiiVFYUq$xox6rP2Ym`Tb%2Icb)U(DE*+p)7jHGbujDkRa* z6>Shc`3BLx5XhxJVqae2(n?m-#Sl)rT!J`empK6ZjZh_C&C*lCmm);}kXdXl(y~;! zjESAB$UMYhJecyHjsSu13__S!NGiX->2=oKGB38jV$zq=(Oxy_D=A<-(&cAZ;g=Cx z;dKaetnh1yn&wl;3U&`TlRN%m_|E5N0jMLdFoyz8FNEO*;LSH}8jx=&9m@JX2NLUx z!%-W)cQK2Gd%fuurytT+|D`B-8mNlu-I)6H7%ri*CGf-n8o<@?yx0pv1B!2 zBVJ_VfYp^&)y=HT!s#Hz3cyCaTfliV4%-85K^?Q2urn_*aPn%)fo$T35Mna0vG2+_ zA2QIldm2(o_&TU316Xg!y%KV98zn0bZu~6l+^u3#6E^xo8L8$yNgn*Vx~8^;u(RL3 z=HW#U*S(^5cEGtFsa`H~mTk)6ixd$s=Q^CB!Ix(1hcM^M0{Pv&+r(6B*2N2Z-bD8$4UEQ zead$!vzl&zrW|x`M2rsJ4>fi!fCbAewDC~7Vp0B`o}`$Js87ZjG#37>nRkIt6j+8t zTj*|PyN9@0r0}^C%Fn!)7=FjfaNS3)`-O`X=OW>9W+8Hx1Hsivf0`qUg!1a9ApmC8 z(WIUw`|`_CAxsB~zV#M#!Tg(LMKEpS`f3CnA-!9u@+_-)52T#Y2vX#8Kvo3fjaf9H z>!KapuIs=g$VXy$HcAaY1UoHQRH{1jNCPb2UlWsPl4?PHH$;b*`jW({{o^T~%e;?IKd&l~j$ zWrhB&kNl*y{*H4J9<1E!n^fN5#uGOIL8pSvJwKGp>LmM6PwQ%`|1f08g;DROV~0X% ziFSo1xkH%cZhIP=0|YH#s2wxE?2jJ^Pr)r?he zdUnuq=Fr`mtq8Hbf>tx*w%q$*2=O;&f|wV94Znn-syKhabtq_1UW)U3B3lsL>8wGR zvAKWDB~$5pQlJ!+mFjcJI6CH%Y6Qkj{&CRk51+$hjVeUi^-n6B)IYI)RajG?pJMez z|J)xD{1fwlYFZ1W=$}}erbk}}U^O3zWP*PZozy>L1mmBtfG;f)L;fH6=lzNPNp)HU z_rLVdc7@Us?F#L}KYfmgwNOR)Rpb`Od<_ZLG1+u<%=JK7%~*zuW6pIQlUO@HHpVFR5!gzx2k>>ZU(Ht68lGVq(x&G{MZjE%@-$;YZvowvbZriVB-#d!x~~o0vERLi{NB8X#aq&fTmXFHDmM~iwIZZC1+dbvMzwqVs#&=PpjBLw!53xHZvp!a8^nG9~ z`NmbYWjR;S7muD;W!`iwVkAGN;}1aD+>5OcM?0H=Ecg3Y z5H`i?-aqbPi3Yp>nVeVxe#n@+g_7_b4ZdWn1CZ}{X^%z7g7&xu5!Nd+L-~8Y4Le%R z*8<^=d|1VTVh-#m7C}6mij|ESs1#peDUFoq2DM;&!EYUJ6 z=$nw@=%oD~&o>GV>2DWSv|YbvpEm2I6QmuMfCW~*9+9_R+Cp1kK3WW1^iu#<^9@M) zS|u$)bjMb~dMQQ-e+HK5=Lmerr1Q}i;BoFi2|KV}x({s0-rVcz8&zqokFnpy*GtsV z;Ks9F6DYGY!LjuctCO_k&eluq3Z*65723soWNfxW>m{}zr=>4ZfYp2>Ag-6@b11-i ziC9icjD71RX6kIc^c7gUS}#d~Qc%LQ6i3J0b9?J0Dx1_l@r=Z8!(iOL6)f=2n-IZ2 z3xRL?8v4;cZw4;<4FIcoDUu2PNpuqbjKuKVvPlnr3$`>L@-KkHe{F}v0Gb~Dt{w6p zM1D`CKfn0=4~eY*M?SwY(dSw5R>A!*eZF0xv_!i?yYTrPS%c9X={6f%E)B>m$lh{c-B%#}|A=;-xUB!(BSpZRwPmNgkmXbb%Vp}Qs{rQ@1xHN;x- zfiVA?EROARP4(S;9}tR7i+PS%y81#VvQBWV(lkb*J^$R02gal zxr;Sou~=i|TdXll`^B1wk^BjZwK&==)?i1!FZM-6D)B1>erL0fLKWQg8rK76oow3V z4Uk~5R}sb5$)-)P`FdJ)si{0XLyqjzYX%>1!+vQq*GXIOIjV?};}5^_19GCL4n z0g@H@r-$P4jXaC-S>t5sJFVbIZ`uZqZdjVW1t>}hNN-@8S*_-cNXoS64G?bvk*r_E z@L^7NDQ%&DA%FbbDkBvKvym86YPb#L&H3HASbYZ>tY$3U)6;wp5OHkGC(V9din?fS z?0Jp3e12%D8K~bWQolcf1i9}aN~poRKqRX{3@>?EgH5n?&1GH%PoaPBKK=-^){z>eBL@8lTIl_7eCh!jy-A*Tm;jM3xhRHrAf zFl)kCg$+~H8$aJzMKc7POft8hC)p<5)F{le-__)h6};2A4z_FUjV3c+fX&6^ zBroNQ0F2k6_y()I>)q+5>uS`|_vAuVTLm|swU|IvE@djVUu#|+mruMyS4@2W&7!bp zo4lxmcQ|Q)MKC}Z50w?Y>~@cKS$2+tC(8=oY7bAB72$kTtyd^J+7eFiCyBm!RDemGd7l@7{ z7X}CttO%AT2yu*xka@%XP)xW40Z(K4Bd#)A87v7~83TZ^@%4_j^;F${SF}0Fvf(?cAa49m$_Y{YHjx5riCZDg5G{yRe zon>$L%ZgdHdBwyeyHBY&*wWuP~JD!Vc!z;@!~rJKtih*BQm~If>eU<^Z_EN?~s7Yb`s(s6=~+} z)OT1Ce5VXHw3>0!DBEE0gNhISASNdPzQf4pJIs~nJC*0)${(7<(hSw%i4beZLP2%WeZ36SCs>C*-1$=E1ly4qSkTxj?3Dz8l2yJq%)jSxfgf=M! zB59kDfLnbMmPyFGN!rAmuCgSw$zW-dApqE)Z{`@+U`2>UgD~0E#6PcOMVM2*^AxT^Njyb$s*!NVeip>VPz_L4^Ui>{7+OlZ z%tZN;!)j*SmWwAyvnXLEh^YgX|K3m|DmblsT6ibGd3AYd`3qoIoC)^Z^Oo?=z+E*l zV{@N8T1>jS6e&f)t%ibbEEY$nI=cW1n|No_uf7|z88r+zyOQp$Q+5sDA1(qy?kJVh zj_<*a4PwW=!45m_jtFZN?3>`0)}9R@TTQzoOLQ0l9Lr0%2biK1WHs-JWP-Ja0nyRg zCZ`mRl?}}6ZJUFD4E|Q2#AK~tmZVgZt+0obz84_20`@X0KFFl95fZp0W$bGR=4;;& z?XAys87pXPgdLTNVOPQqF19VS7idj;Bj5yD(XsgT|QgC!V5}Ax^ z#L=nFe!#*t64tY~z(xPx$P#|1qz+?iBF$g<4LyCN^$xwIXtc1m3Kso@bS59ib%U`%4< zGaYkbOyZ3Xw2`QGAUF~aW6W7erv>n=WV_N6&q_p=Xqj+U5=ST9pG${r+ntrLqV4wQ zIQE&dk~5?o#)1V_J^~T?tlTX*h_-;o9tm9ZU;tM0QAqk)B`rd9$5z3S%D|v6eMY9GwY{ot3aUNlWhR ztfXC`v_!i?yVy52Hrt`I61E_>j}JuwR`bz-xP5#l2L+s!5X&cB#=f%>X6o#$oPq{z-Ha|BS@&;U&o8o|VLr6Nx+$dDDEH=MrhoO5&XI1p)W0B#srIKPoZ*|B=tX zn&|V?u~l&YOP_C7C@s;h&@O!5_w3AS6 zl+n6%H_yX-_y72yd>W)C`wpU!+lt+D|6t5w3@+xF3EyetWA!0uU-LD@@Cjh&=D~@G z-OU4<0dxCFz*zF>D$ec8kmZA)Wo{<{b33E9T zn~`eqs(N~K0syOd4w4C;bukbfJu5XrcGs!6zZUwBohr2zPx*d-VhIK}-kaPz@u%Ox zrroVbOw}~;0@I|YK}zKrZj+KDd@s1=(vs{nzlSBE`%p&&L7QHN2yNO3eA5|Fk8|og;G$e?M8wH`Aj}pPO z*4D&Uqilm4@3mTMXPu>WBAIbk=DT<1UFpUCFuP>3;m6E8-rY2A=yF&|I*M^id{QT3 z`~n_;fSmAhgyG3xm&g4nNVuLsJM%$vDo|GQm4Nu5`5@Rg*IN-{`IO1HEf*&(W?W(> zJY`M;7Poqvrc3O4hzJxx@Q_AO%oAH2o$53JTb|JGe}|@c96w*brz!zw23fti=fa-a zikt&Xyc4wLO@mV5v%p-AfwVXN{k=BGIa_=PBLscuYDDm%{eicd&PDd-h^9nKy>sblQY6RoeUF}VToQKB`_4V%i4QeeDjvA+1Z@b$svU)qjdv) ztS=pM9D-JAWpLv?Cr$2DzPU<#LMAJ-`9QnTCoZJ=&DQ~O2H$tq{d;>!Ny^lDy%X=TpmT(uB|(P zUc|_^D-%o~M|WIj1YvVNU-Nh~4|R1WL5K_c6yqCEWX%Dt+f3h)Qp|6db(w zaW9}KB_Mqt)68l$-;bnBAl?9hc`a!h#_(Z2xZ~c(T;y+m?<2;P8omr<_uj{HWU%Bz zmi~Jmacs;dy?YhDdmq>m_3Xj9(%kz9OZ^@M334Aslu(0*fJo+rF}&0u;oiri$buKs z5c=<`(U09_dYPeZImT_dxawk-Kg@@DZa%QM_kl^gx7_<+ zBD{dIB2w;ENG84aVag3guO_c47pw8d*hz5jgIKP{8T;;iNTHqH`w)>LD&gKo9KFN$ zK4^yR-usv?ZSp)=QQ2n@VeI-7`d-sDP?~G>)xbp;O8uTi(zmKgix8bKsdRnsV|$as zfA!u624MecimJ8>ZoIde`mf#l*ny({y?Y-V^W)ppzvbQs8#deb9=$NW}G^RdzFv_qAx>3$bn|e{?Z3MHohIKv0HJ zg&C{}<%DkpO7?i#ubZh0$CD+@-u!z&98VtScya|bijctZgt2ek%zW{6GmA}&vRtg2 zjV4q|G?53NVW|*i9wqRGuyNP;KXxszxBfeirKaw!?|UN6^91!UxOflP!Kc@d_fJ~m z_{zO!#8*xWAQ2CryZ~nm7L4A^${K@VAbgVkhKEmLIS?}T`I}fP=-xBxFW;EqNwORl zia-&ByTaNp>2q zYZIx4=%3Igadfga=?8mPCAJAI;A<0e-)M&P=YN0%%YKgtZG!toe?uyvO@06(X`7H> zMShfUtAxy(q)p6yBbJ0VStf1rcK~b?ydfg@jfh2qF!D7Bv$zc+UD>;DbT`;y_l-oZ zeC;sdzEK?A`F$g5(c!+)IbxSKkWjl{5E;8*m`t?GKY>VU7ZUt8U6?ccGlMGVEt6(7 z67B{h3*w}C4^WnTHIb9%Gqelt8xhMHldOmDp^#y=DC6j^ z?i>9JMJKs$^gD=2yl-@_*wM!BIqdi=a$$XvaNp=&WQpE~0MC#TYVbxW$ZEy~*Fk}q9y&H60;2ltJL z<(ieT@6wE@o$S7mNE0au_l@G{*!E(={xvqm+TS;#4P*C>oD!@t%8%my^})dVKJyma za1`Rvoe)=eZ>!XUL0()**t!VFiz|Y{)`hoJj%{^}N2UaRD>A`D`S{lc!Y|0N;@K=D z;&D{w2f{DK@y#CImlGwKoYOoaU#2mcrh6zKKfViO{+$TS|H{jI0T_Ly)_4L0A1jsG z;MyS$KLtNCiS)mC5+6dNo1=nwWr{tqabiriPea&Zos=>gABhU%sNXdpO6T2vIc&7U z@_d#F6_8WDbu^L{!XGXmUd)VS2;;4f>%gJ^fi29$0u`l2}hfavW?GZG?psMV$ zP`C*1qlLo72%CB!z=xI|1#Q*}1hEQ>Z*V>3lhHA!S4r@(%&J6wYyv@KWrm66AKWbO zD5JV*B};$YU;5~P^E|Yc$LE};CrC;}JxP=rdGzR!TA|b9F9W}GhgR2C?_9fc-7sQ; z3TFkXelGr<)0s-Wf_O|F(nrr|oH+GNECrRy!8#tNacbZ(N2^(w>oS2Gc;GPyk3xJ6 z;8*qmJaTe)0-5n=;ko3ves^|D>j&T$y|c;#0!a*}3hkg40C*EWEDF`$fT5)tkGKXf z?5J|^+XKIo@H+y(E%<>XxBC!{_q{$fB#O_uOV35Q5{fP}9|_*if9++1~GzmT#^F6@`CqJ1Bz45^kv zVs`7zQk>9*{d%aoYDU&(t0z+W4i2f4fyq-VQ$MRLQu|bGs4Y@iWgBYys$T{?3~3Lh zT-dKj9Rqw1btiHasmehcY6qyxLky2dA^)>T7pX@OhSYm`r!Gy!5Sg;w%G8Gz-OyX3NeS#ImXekMEPNjv4qs zWx6Vta90WMsU@aaTCgCWR=qZFLv5M5Y4Ag(Wm8dz#Or8VP9(duC&*SMf5Zq zTA{rLGJT%lZ%<)s{xq1@*iy#uQNe#FJm14NLTZ9w-jc9isdzQyXR8$zY{BzFpOMFM5M}x`#Mjk!k<-s@7lOv`U~C zO1>O24FCGc3j)2_k5GwvS)j|2Zy095Hw3z%?8_m0;~Tge1X=*-9zgF1w14WCL+%Ik zp1K3tRF_pacyd)~n$StL#}yIkrfHW;0UfHVR1eM8{Ji3x@?oI$6569f3{)gg$pAt% zs-JKc_a{`RN_C)rrur9rf)L)Ug_IDW7qR12ArSU{K!a3)_7~cos#>6*g*HOf3baIM z`>8sCa0dvv4puu0goi0Wqt#Gfd55T7gmzJoEqQQzHe!P9*Z3p+*T*D4Lz6_7})#Jyjhj(9W37hQS98 z66g+rrs2I}T4Jo!p-GMQX?>15L}=rryz|sy0#!;05p{$>#|w0^I!d6^&}zffJT+Dz zY>J@{SEyqJx?bwOP#rJOE>ic!coU7KzbCrfs_F%rB)Z(DP8R5gbV|8hog&cQ0^Os= z3Di?Gdss~n=xTwUR1E?>Amu%;&JZXlGS{fH1Ug!ztW}eImj8pAEHvX2ttu>#@rifT zbb*XdysH`oGS=O!W(Z__;zM~{-T-%>S+`DPDKS;E|&jZ%@oL3{%18yAea+2`vqeZt&7z<@@ajEK$FBS zmYyTf!D9JTJy)O-X_a(6&*ufb^c6zuE;h^63j{h>Y+b0Y7U*4pO7ud3UKg#)^mPJF z7d;()y+AJsRHJVYXsGBpR4)1XPD1-epXPSN)Zbg4+0s+SA&qiA-X zen_Bmg!6p;h@pvRU7%M8gkw@@cA;J=&?f>l>n8*nB<&Z~s|310WL~777APgee6#dw zf%XxZv-NWV-6PN({h~l=BJ)!Hdx1s^G*_h+x40$P>kGVhw)`V(K zZZpyk=3a{M`rNA#?jkZ@6`A$9w?WQ5Im@bdRqtjjug+7mtVgRuYEbWh9a8zwhzBuG{gzNJ^fE`q5bg@Z?)J~<@p+tW2_;Zmz1FLO=-!c9*eA38T5Dcj_*ps^b z+$T@nt;(>H^K?56<;Jy&<9}+0|GD3{u$T(n)Yn)b&grk+jd0D!%Hp+SI$7-u-m}S# zDPHY<3qNc3J?e$$2dSe8H^7Tv^IC@SH0$28Bu_nKb*#ImbG$~T?r}Wp9#Y@MEYLaU zr1BH_$`-8TFFlbzu2sB!<7Ij6(zjbz)N|WW<1$(LUj5XH zm_++Of;G3tLkq;IrcJ#X?Nvyb2lZhOQlS9@cRW{n{`>K?)>SF(`SW{p1eUcOeJ1$QkqxoD-)*j-_dj_39J^WPxnxBK(odQd)l>yG)e;g9=sf$PSjl)+%$&NjeT|-{+ZGzb;myI)g><3^w~Imdwn*}`S14G zxCF0u{yy80>hH6p#@mtgJ)-=#^;zRH?6Zj$X77%-g|Rk$es%?I%aFEZS)KLwxaLN~ z#QuH&p3=Sg`bUXmxmcE;-{0SNgx}xaJ$}mEk^Ua%|15YKk2jIa^mq0t&PpcC>VJNr zzb&xSQMD?DF?C;CLd@C{dUD*aLMlJ|GRQF)f4CT{9eVE}z4P#Nx_57kMKy~9#M}x@ zZ)*XIi`@yTQeyA5{vHD9kq08tltwt2$r4 zkQx@tcUfvkjqv3Qse^s_Lh5KAXR10W#`%7Asya=e&(aF|d;;j~SU!z?k81>4tkUbg z0Bvau`mP#F)&X9PrUbgF^cb{PN_SNlgQf&}s)0TzOC2lF!qh8jZVL2LC%e$%nkxXE z?n0Am-?MYn#U@{BXwc9;IqC`*Djal8AV*#2Le7w{(sI?!E;M||7%NvT6KJij=-Gx9 z;5HZP2dF@e9Z0R$>fHbpsry{0xO(DK%eRLIBTd@a|Bwev$A%rsa6|Z=;oe>)YPgO*ll4Qo&mJ8T4$iNaYIh1*;V~X zpcef=ztaE}4IwAJZc1QxRT_i#O4&nI`=H@!cOSI3nj{e0Xk5y^YPt(8t~nOa1un!k z8ljd7G&^-g)n%z8)M|m|rm|H=s1_GutBg>u3p7WK8dA`2q}nLZTE#ZnPgRynjTGBx ze>KO2*hUAcO)f<19;`Ad3@5F7h`QTAsWYois5w-v6sSe5$eaRbTqQYMR6}NS&EabI zY7bgabF^AkW2Df!$EvL^^j+rCn&Z_rT&RO})qOo5t~p87pYt^;zp7Yh%U5%9U07cX`7uv69am`G% zY&SzYw|iCXY<1A?2AT%i9QB*yA}B@j)-BOMTEw>PdmvAD-yZ zqMmc1#WjxrTI)jW4{OvH0-64>Mx~CVF0)g|4SBzMjdBDsy;Nr@nI`_Kw%oLHn87vUj|$&UYd9jz6fZQ9_g6@un&fs6{>9{icdH z)p8f=-eX4X2DRw`a~Y_yrFd70H1@c^s%{~M@Fk2ete-yq%MLhOHo^;stv8v7qU z$aJEC*#D~ZN*7}PtJP=m=oFS<|Jzw-)EkKXZ&%&yLhOHg>MbtB{O$;)2k03t#Qt}XUhhKef1~wJF2w$Ks6OTtO1T6xkjCEg$pT%MdSKa)wMXd7U1)C6 zV`WF^Yh38sqMt##(S=s!tGXlgLoRe%8KD*z+9{9F`!1AMN9a3&*x$7}QvVc#G6CsR zsf(c ze-QiUSuS*7`JB*ky3mD=DnFp$I6Xk1xv5JAt+S8UvXh5G#?8zTvAgTLF`ec`OL*Y96Bz?LI-CmffPSR6dh*IkH zxh_O0_4*!r^lA*s#A(5X81%3nuRn-ESe5HfV^Aibzr>)2b%Xv%Ak!*m zXf{fu8v)u+XvhxJrF zD+Xn%Y5H}6*6Lt(QQdU?M;AK0|Az&Q`Xd+m1bbFZ`YRXG0|@=-LMP!`Mw8y=LK6iF zp2pJG>Vf?-LF?l}e=5kt3Ck`nGzETrj^5ja#`eur=jsDp=J}GD?SFpyO#L?(db^~xnFlHJl~>3IUpRnL|Li!Ro$xX{XyJ{fcL z@H5CcS3OXYRWw&mbD{gHvWhO#-?`Atl93tn^w={E=gojF*G$7^-RUn^#31@h3<`E1 zxJMCBH-r<=K5?k~6*aYW^Ys!V6aDC6Jzw7ygN7DerI!oznWmJh^;0ouA3!e~D2-CC z(SHzVvHC;5T>$;!LNE8*t8SsrIg6z)RJG^d@zTJgB2ki#E#f6>$ zv_ub|X!4z0USD^!{!XB|sSjbaxkdlvLchmobBorK$T>H4Xu&%BR-NWT`@?%~)!7D; zapE?OgK^|;aKcMFdWP02K`YM4gQI}iY>K@QH z3iOdaAHMs5o;R6NKGGK!UIS>cKqlXEeY;B|=W@+|QrF{Lu6Gs4a6YK_b!p^$P`@xe z&iSBzLm1_fTtsmC+HpWYMSg&#+mi~w? znGvTwqN@d(o61q@QN61Rag=&g?_(gb{0e=Ln~zdf=vC*$rL53v1u}JbO!J>Uq9w@r zm_GjeIOk*f41o;iN-HkL#HUw7CLZ zqSjbD^?h7lBaqSa2|c_yUiuSyj0;h-Cv|HyPJ2>+=t88e(g$4>r>)Y*3S_i?N}nRo zCF*qh{Pd^vJeQOCp4P|DisyS;pXEZNJ)?i}(Vo$%vkfO{t9A3m@qDZG6#|*^p4HbT zKucXt=6hDBUK-E$tS)dN(w@_!E{oHi(_>wTwCDA^^WwDU^%pKg+6(%-%j2{cG%g+B z&)D-tU3z7l_M+ZNAfx9?dJlmvQG41g#V_fDTu#dTy&kh5p6~biM1hQdw&)2iME`8j zXB$ZTbB&(i=A)D~ddpRDDQol(0-4g+>TNEKoNM)*g>lZc`dWbu=gWGjOC#sYdfK8m z=gWGgK!)=bJvRZmDgj!Y0Nt7Z-ID-4lmM*~$k_80ZQl?t{S}=pkSTqgE_P|ubDe(o z#yICX{h2_9^Hu$wOC#s2dfQEL&R2E%&4di+YdTw?OVp9}+sQ9neyJ$#|mV6+?#rq%gKCi=_Brp=X*6XDo~7 z+o&%V$dvcCz9IoyAQTikM#pC?I-)i!jJU^AMF#p$)$Y> z+9$g1vA8Z<^e}-gQ5!(pqR;WsKGji|cALGb?o<7U3w;}WuI@A4=HvWahgMSNC8`CS zpX=QPGPV6e@9WZ5fcAxM^wGZ57rM0FgRAPk)XROeuk=cnc1Unr(O3EtflQD4TL0C@ z`L+JZ<;>RGioVu;9*@`W8_idOsTrkwqsI$mq$_^}0DrO$OpWoW7J0O733#H$PY4cgK4K`2GzoID<`&!>d(CB*#p zG&QLx$jl755@z?J950MZP6JQ!QYe8`PeP&&r2gE`PwfoDa^L+AtYIwhSXo@p&eCmJ zah~se^=iwaZbpttZ$P^QaPI^E2DOVP#uAKI-^5Z#om3vL?_*`AzLfJF?BK~U_>P=e z{oCjDbnxem>+k6k&(#a1c(tJAy|gLONZSh@>uIu9JjaBF$1aRZGZ=sS8cajq_B?;g zZjY(-wY$kh-QsqmW%}g#F@A0RX>v~MAisH#KQDPY>Tqvqd!CMR{5E0F3c77=boNs{ zA7fda;j7>+iFNen@~68EY0tSLFOK=GeZkM~A0NCD{q{_r?yO%FU`+G8$n=Yk&{MoR z{=2<~G7Eg;hOu@c#;<2b{`S<4z3JzE)bszg-?2uX^*ZyY|Gy9Vd(;1S`k?7Y6*8y$ zLyn(#-wi!IaW3}vyB$f}vT|T(sY>`N-t_B$*%3K@o{rLto+tLFd{fHzQln;Bbu{!P z{-#of1vLzRDPqVzo)~^pLQIy(F=@7%nGH2=xG-%rF?d=DPnD9ZV`w;eUY)phS|J#N zXaCh$KQP=gHk10(?A@JHJf4rSC0QXu3Aa>LmNLZsP@vFtJ4!@o8+XcVf@Y@T&z46-zzY+M2#BV?R z4#4j~{0_qJVEjhoHwM4M@H+y(qwqTszk2*m!EYRX6Yx6?zXtry!0$}_&cg3({HEYH z6~8ck)9{;)UlV?5iYJ9x2!p5t)BO>qL(i{q;)QoQ5RQ=WU61Hf*2XJ|Sb#KwUne{#J8fo6W zYSDa?phfddf)>qNTrHaK6Rg*~y}n-aUi^AJ9=Gf_>a^Z}MVj~S*K6KY+^7$$2_d|_ zZ;8E0_%{jvCgI;CoSTGmi%_=+b&F892z854N9cWfQ6Ju%+Nz(;deCmsyo+_D-luw% zy;bw%bYWmk?FOWIZrY-GJ7Y;;RoS2II|6&AAOIx&P-v6>K-sN8sm|49r_)(xd|0bk=&bG?b{x&2Q!2}!{UAat@;z_vn23L-&~~sF8c7DjOpsd!u}y`Q`-jI~Z>Yc3JQYLDi6;D==;f#2q=GpLMRf$uY8EE~z zQsziFU&5glJ!BEm*93-Iycagq;(H`REqcXJi}%KcL#rDR@}BZ=i~cYi`uvQL`iv6l zD4~uL>L{U(66zSCjuGk@p^g#i7@;nb8*_`)O?^hD4z<{_3$0<@4@w;?HXm#8U4(k; zL7XTJwRkVBLGTS0-%F^s=q-~4Gg&Z`E#9u3Z1L`PoxOMMm#OrSKw5_4sce?T6Z$Mm z*Rlo6OLJlKafJgx<>}xIkuyUi%n%99qIt7u-VB{j3pI<*bF2-6|Cl!4y0iL0dzgKG z%~xrKa?>xvv}0gV)nC$c5MIvF5NLVDTxya%h4~rn}Cxo;fdO2*nRCtzJyf=+^ zen4F+)C|Ql&Sk>0On8=whRa05WnxdH!M{xSmkZ}|;ao1%mEwEL!PB?fa^YDizPD0* zZ?*8R7MZI>=4#2+BDsJmJGa|v$<-pcS|rzcvDJEuZ$i{tU-w;SZxlHjrH&g#!X}Zh z5fc8{ZKFuoBoa1>gbc+~*VXC^wBSOkTlTPw48_yc48_x@48^n6dh0s0d%bl#P7v#@ z772GkS@qU_ICZYKF3SEYt=_sedyG|Y{Za5A3I10T=3bNWjkRZ=uhQ_ZpQEMvTWe~U zL1vGTcvfjiUqa_|2E;@Cj8rkf17Y_6V7eIX$R;Pc7Q$3 z4$!OZ043W2_P&e&#}hlyzwG|*c7R@#5#V@|5#V^TNN(gUQoQ?;0Ut~X^b!d-n1JU;9F=z12Vz{coT0pO8gr_8DXTX;V1Y(Pes07sa5%!arb9^ly05RkDYz_Der;3o(8 zF2#%h$N6T#Gza*mNOOR1jWh%}=4_SOWQ*cGkR^c+Yc^(P=pQlaE(th!n~>%Ryd?0q zsxLAZTE`UXtob5mzQ|c5=|yguExRbd@oI~VQCnmzS|&Wpq}`VZb-C1WxzusFXt-Qz zx*RqADYRT_x>9&n3eQU6St&d#g=eMktQMZt!n0baEz+i|!ShP?YT;>-Hf@nMT`&CW zg@3)sTrauSga4c!>xF-#@N5*GjliE4+9>!fG9GRc>L#IX3UEf-6yO-RNwnHzIE816 z@N5Zi4BR5rEv_7nf!_$vH^TFcSmqnC%r~MB(y+rf!oO8Gw+iQ0p>74WZ?~;N-6qs+ zB4L|I*d{zkW31aIJT_)lO-!g3aXNFDvGi>RDHb=G$o4p`Ms5v%0Cr79` zLd_BC78&b`HOIOwGRkd{QErQjat#5Fat#5Fat#5Fat#5Fat#5Fat#5Fat#5Fat#5F zat#5Fat#5FatJZXH3T@OH3T@OH3T@OH3T@OH3T@OH3T@OA&oJuA;2-MA;2-MA;2-M zA;2-MA;2-MA;2-MRO(V{vnQ6?^v_b8BTuQ#F|AZ;SBlzUH6pdE6#h!#uN3}D;ja|V zO5v;&&Y{9NR5*tU=TPAsDx5>Xd4Knz!Z|j;JB?!l9KnW5uHlkvxNr^!XMT_2!Z}K) zql7xj=14V4ct(NeoF1cu=WTa6~jz?C7o%8nQDy9du3y# z^~cz}!*ic*?sa6r!oX8le-70x=+_sh=9=RQhDxq6Ht!e?m38S*S*eb(`OfPYn{T)_ zODPQT)e3|U>oF#mDGTAlx?cF}ZN4L0Z}T15dYkXa){BICoA1ch+k8j1-sT&1^`cdS zXjpH{?J_sbTWB-fG|$Axine2=#LKNMH5-tZH{mr-u>Qcch zmAp%Bo+3`R59`D5vT}yKvZ({_g4Nqx^)(1)ndDk#^Ub7XHqRHAOIZz)ccoBQichYz zIU29DdCs_6@T;Zt)i!T*W?9{_u3l{q!n%63omGqH5#edE`G!-y&DBeb&2z~0B7dV$ zH;Uwq;_Vx4o*v!n;#nD&8n#xKGhU%{!tK zq1FCHV@29GqJN$JMqzzXojtZDQnXbtW9^c@i@-yhkF_@pZYkPkb0xe@R>F2rM$RDL z*1Ev{WZ*YNc918G8NindCaZT&kneBh1oVc;lPZ>8(qWnys9uTD+iu~aBTH%DI4V(f4FEeJjkcEt$I(4ki&y~FMO*$ z0)DY$9xp+*F@;5<#MxQak(Xhi)`l0IDJ}sJWI(@H36%Fe% zOrM{Ad}%{>;vij>nJa<)Lunm!F8=S5v!Q~Uq4_buR2Rp;7k_GBg( z!jMeDC6I&(;cgNMcNCET0ixW5fJ#v^Oa>B}%!HW<7mGE6m!sBtP&us^w4i9!0~Rfc zTJ%ssD;6!aXw{+xMSIg$TW$4t>HmJ;`u5D8$xf~MKhOU^|9=Ae+iQR8UGKWz_g+&L zVpk!g!^bewSLPuXz2z0>Sl4FVQC(kNYEUdn4T?pnL2svRWX{W(bFe|*n6BZtU(U>H zIM!q4J7@oC1eA1@?jGjEaK> z<^Ew#fjvC$*n)2){1rzTc}$S>h4(SW9AxH$%zTiUPqObPT{H%G$Mwok_n;44!^_7G zD$J_xvwYB@tks1Z2Yt$HS#By7N8#`8LC4tNEH{;nW6XJsIgd$b-{|G2%y&~6C}vk5 zz}2A2V#aS#-}cR{%;)!2KV^NElWg;y6qkL9=Jokb%KdyN<$k`CaNYgR5b~4|2L~VSg#Du+qipbCA>LAg9k( zH+^lqm2D3rF1HTf%3(O{r0=#5bI7;4>D{Xxz>G9@GIFPzzU1ENrZ2g7y6K&&V;s(t zEcdvn*6eX}U&i=7ZmKmWxz;o~sgCU9&>rN_ehOC$MjqsF7V}88(Mh%AQ{-u9#bF&b zw;ugcsXoe@;w<_G`g-S>+W64oEcz1qD97bf{xYdJi_-jhLmNy=%mtql1qCP>&LPz<(_Ub%r8{F!{zfG_I(C?4^+<(J(bBuCzZn) z@awG758TuPzMr+C&!Os1-P9jtWpm$@P5n-OHuW{dtSN@(_5r0ZU+)8&sPU+&YADQgY@VSSpqZ^Mf~J8r=fT#4wd)3GE?`X)+Xi9wVy&8F2g^%XUd{4m zmfKn0%km+XkFz|)@&8-mK#`J!SZ^Rcv~87 z?`8QA%g0$h#q#$oKV<1J2-%Zm3CkfYYgtZWS;ulN%kxSiaBlW0tNg_KRh2mSrsKSk7g6 zKFc7>H7qY-c{R)HS>DX@E|w3le4OPWmM^mWj+^}24q1bpmn%ls;GDN>AP1-$AuH8` zkf*30Lyl2@fjnLH9aDpSlEIK?t1}=Msk0!z!L|X&?b!9WV)Rc~o?z*85VOxg`U;kQ zmI;>ISZ-%|f@PCINI%PM2D#nN=KX9wVBDy#JoA8YEA$6g-{8Cx;cRlUE0(RS>11<) z<#v|)S^k9Oah4}osw{HrVCiF7!E$O=Of4Q$$L1!OZy)1lb0CXC)d|gS$0S&@o#jth z9$?!OY<`oa!$tf~mK7{3S=OC7fqK9-d%r?Q;RGQjdOmfKj~$#Or-11#TUsd8fK z*|AQ1yZ|x$HJKrXCnq$>!-So1k%w53sot z=Em`tv3WntKNx?2&BtN>c>J4e#?jcSVS+P{*eY30h33`?)7czgc^S()Ssq|{g5{em zojuqs%jqlwEH7huC(8pY-(=~`XFSX4ECVb%^JD5S6E0)(Hkj)s-pS_uFyA=w0Gr=r z>FmjI?-^5XOsr({be2ufjF}W*^JOgWWO;z)n=G9kcFVGo<`&k}f zd7R~&ESw&X@|h z_l(Zsn97;54RXS#D#w zpXG6us*LbWgL*)AvfRdUKg;7RRVCT_SWc~EJj+g&+gKiFsRom+kL6UBorB5kHkSKY z9%tD(FG^qs;Qmd9E8s#wEv z8_VNbQ%(BL>eb{6OI5>2mit*AKb167N0Hpd(pO97{VWwe-GD92{VdfO*09{q(l?eg zO)R&uJkHWLj`Z7D&NA+Fj?7w_^<360*9zCWuA%N{+`;UNvY*ISIZJXj=RBG-JvWy7 zSndb8wRzj}UdyZNabu5tJ!ui*vj z3aSeIg?AO6C>-Uz)ca>|UC}K?`-*xLw-!HAT-dw0_szZE?|o&T7yAtEySDE$eMj~C zN59@B3rbd&{9DP6k{3&UU-C&wY5%$XZ|}dO|IYp|^}ld{uXJN+Ls?#VxcqQ=#lUY5 z9ORqoyW96G--o^(6|WCkU3ph!&%r+%>>09oNdKWHhBgmdGraeRNh9`-cy~nM$XiEN zpVG7H`l?@5jjcXVorU*OTzKEqjZiq%ENmXz3{$8F^^Q*$h-*;K8~ zZ$UGy>`#zKPW>w*KY|=PQ$r>}PAnlgt&HSBi@EPG()_*f z49HhmYPV&+I%xjbe-`8?1MeMjWPh{F|ap~lLMhS4bs2}umW;2#)byop&0@_oz-iodNmAk zjT!+>6w<(3E~h}oaq6ytImM}vYcW%C;B@s`n7;*XL+wIoG1UEhUhxkh4YeD-8R`M} zW2gt=gQ0$ecXSN34|5uP4F+kbColrV7haHt+7F){>L-wfdJ=E$;7cq>17{~Rz)bJ( z7&y`NY?z;cG}IxKN_;^CX{ev6`7j@bG;sFtIWYem(ojb*s&%MeKpHq{crnbcLK^DV zIByqUlRz5kHFZABuR|K@HyHmq)Nx2doxr@xq27Qr)SGHK%qJlY^%gz`$0=NphWahu z7ILWHK_UkoL74L(k#~+&kX}bCWPitM=m$U=s?sWTuAoJ`vRa~tGvwZs?*d7e>$db$kek?KO2tJDgZt5h@0qf|T0qf`{;S`~-6 zR;`7349>M52-ykqIGlAq5b{cxC#Y*+o}jLU`3$uc<}=joFi%n2V4kAxfcZ?d1LiZ; z-7wdwoiNv_`(d7@cEdbPJqYu3wFlS35?s(moeR8PP>OYMhwmUhV|Zcxv{e3m*4^I7V7nCGaYFwaph!8}jB4)Z*99Oeb;B+Luc+b}Owe}H+RdI#pE z>Qk7Ps?T9wrVQsm$Sh|C-sZ}I`9k~#Nd?~ODuB63d0}3m`op|JmBJiQhS94%)SMy+AqZYutMlFOnrp|*ork29o8@0F+d0LD5Qit*#0Dnw< zQ*Bb;Q`_+w*8?cUC)DrN`|4wy=$q>(!e{k0jtg*7!D>eo=k{*K$-3Wn`~c_39>htn zM;*U*yy^I(c&PC6!nxiZ-hJL)MJ+|I6b&!FviLW}qkAWM|5xw6eH!}Q+2=2PX7v4T-{19} z&~Hk=mHlq&x2xa&et+m!S#nBAL&=3D?Io9#Y$@4Vvb*G`B_~S$S~9Z#qW<6M|9t;9 z`nv{<9}pUl81Tq|_Xg}KeXrD6mMHsC*}k&hmz`FAZTXGmkCneue!;+>4t!7-v{$UJc&Fm?imE~19dzd)Z)N|=gOxw4{G@Wt;0=R+G_{rhlA2D_0?2&&S*?P+Oswq{a)sI%cP<^cWWc7R1pH}DAWOdT} zpw_=0c(2#6D2i*Q<9h?rW#OOs_sdE$rMsMlw_-DK<-@d&r2Z?bdAo{CRzJ#WeupA|r6oTcM}m zs=`%`i{2JJ71tCaGi$hbX=2hoq=l#t}}5>#Z`xE z8m{TMX5gyFH51n?T(faC;5rM}*|_H5nv42JZ==q~wE)*SxaiH)MYtMqEylG3*SWaP z!*xEcrMSLx3oyRa{+5crrNUb-&*kF2TzGw=_le#oygqeoAo2Rt37?DaF(2^{X8r=i zlHx^o9WSH+!e4;0ruD-`KOA}|;xU~4D?l04_9Ml9q}Y#yJ^42h{*r$q5ik6f2<|6* z^otO1=gZ+c#WM@#nBtj*a;)P!TH-TB?h7Qn7D&7nKu_tlK+<3D7Z$!H43g#aE*dnBDf`jTOzn6f?FcE^8|OE;La1=d4fAna7zWZRB%fLw^VRT z1-DFa%LKPfaLWX@OmG(p?n1#`D7Xs+ccI{#1lJ_ECc!lcu1Rn!1h+zPD+ISfa4Q7Y z%=xZRH+8vg7F@HGvt}u0z@eNe)LmU~RtkQl;8zNMrQm^Me2d^)1m7a~7Qwd&9yrEd zB>0O2f05uX68uGi2afR}!G{DN5`0MTA;AO3_^{x^f)5KmEcmeCfn$8T;M)b?F8FrA zw+kLP#zzGo6?|0iQNc$A4;DzgF;T1rHqK*9(5V z;MWU&z2Mgi9yrEdEclBBf3e^%7W~D62afR@1;0`78wI~n@EZjW9OJ(w_-_gRTY~?V z;J+n!;27U2_)fuh3cgeDoq`9B@tXv{N${Hlze(_$1P>hJFBkmfg1=nwmka)K!2`$m zD+Pb0;I9u4a z-ynG47{5jETLiyF@LL4GMex8e{=0(5IZE6Qe^>C|75sMv4;*EpSKu;4N@R{opNVN2wpY1@5UIggfpBZ{c>eKy4MCt-`Za zc(w}9R^izyJX?ha?wDt*@Z2suw+qkh!gIUu+%7z~3(xJs19!}GyYOrio^8UjO?b8m z&o<%NCOq4O2kw|>oABHrJa-7s9l~>m@Z2FhcL>iN!UK2AbBFNk5S|^vvqN}x2+t1T z*&#eTga_`JXNU0IEj)J%&)vdvxA5F8Ja-Gv-NFNR%yYN!+#@{q2+uvjbC2-cBRuyA z&ppBecg%B-@Z2Xn_X*E^!gHVS+$TKu3D14P19!}GpYZGyo}I$8Q+Rd?&radlDLgxc z2kw|>r|{e_JogLF{las<@Z2vv_Y2Sc!UK2AbHDKH7M|V0vs-v}3(s!h!FjS=FLnzL z+%eB?;dxMa9u%Gjh37%xc~E#B6rKl#2kw~XLE+gWJbQ#^kMQgfo;|{|M|k!K58N@& z9^rXdcpes>hlS^1;dxki9u}U5g$M4K=V9S_M0g$%o=1e|5#f16cped+M}!CNnCB7U zc}#d76Q0L}=P}`VOn4p>p2vg-?wIE>;n^oV`-Eqo@az+weZsR(c=ibo+%eBS;dw%M zo)DfVgy#w2c|v%e5S}N52kw~X3E|l2kw~XS>ZV>Jcotnu<#rfp2Na(Sa=Q#58N@&Vc~gRc%B!Y=Y{8a;dx$o zo)@0yg$M4K=Xv2dB0NWg=ZNqe5uPK$b3}NK2oKyb&k^ByL3myeo)?7Y1>t!?cwP{m z7la4ynCAuIIVwCyh3Ba792K6U!gEx3jtURlG0#!qc}aL)5}ucY=Oy8JNqAloo|l9N z?wIE#;dxnjUKXC0h394Ad0BW~7M_=d2kw~XW#M^McwQBrSB2+Q;dxbfUKO5Kg$M4K z=T+f3COpT4=a}#u6P{zjb4+-S2@l*c&oSY7U3gv>p4Wxvb>VqkcwQHt*M$e}nCErj zIW9cMh3B~N92cJB!gE}BjtdXmG0$<~c|&;K5S}-L=MCX`LwMd0o;QRC?wIEd;W;Th zCxz#v@SGH$lfrXScuoor+%eBd;dxtl-WHy>h39SId0Tki7M{0-2kw~XZRSzfxzX!i ze~|k-a{rUu-;?`ao+c>MXH$i{34I zH|v$^W$5vHq1^i#H`Tx!RU-EaxmWTX>zIc2x53ceaV#ZN{}7*WE@H_I2iC59b{9Q(Q0O`aQ1yHWpz|@b6a7)O`V$kTXlEtC#o#(6V;rzOI@1x zuDTxPLwP@TRQGt!acPe?9l80psjB=x0{^a~Du0(+l>e@3&VL`~cM*e=fO<;V3%)TI7?p*su)j@hEBr+D@qVI$-T}@Ry_Xupihip)i{4fD7k#4M z$2GP1UA46M6Lov>j~#z6e$H`L?>8O4!gXq&+ti#se+0+BJLmLySDn-6M!qkHc@?e* zu5b1EMEw|7Uf*+#Wqns0_xHUNhxpu@wcWTi>$99&vyPNp;5brJksod*YP)yj45hQS-$Ph|~sJ(ac2 zy>)QF^**lfkbvu>A$wgn3`Ln4`mXxr&{ju#!6Em_UVB|LhW)}#X?|qbuiV+gf8!oI ze4TsG@E;;=_qvvk*z3AuRq$ z$Ng}X-~DOTI`_tE_*uO?`)~c1XIJ9<=k?e(abs5^539Ex<-&@!8&@_~+;gDI#XXPr z;PbFn-ho|s5B`l-y?8fbiYmme1HETk1Xsnl_l9jBnES%q59Si=8uZ6b!2s+Ilmc6Z zs~j3y(f6q+cHr0IU5gH^+Fy*d>?ro%*J2I31N$TwV~u(f_DQb9TJtqnU%n3eBsXAx z~-D%LA4&7wv&VX(TbZ0_06}md;ra?Cy zx*5>bLpKw;SpVt?d9?2q7g z#-U#geF*wC=)=%Qpl^qM4fIjyv3H97kqe=5Bjq}L>@{aW>H=&yzTJJ4ST z{l7!M8T#v?zXAFiq2B`ie?b3T=)VX3P0-&A{VmYn3jJ2-Z-f4J=)VvBHt4rQe+Tq; zLcat0yP&@t`X4}l5A^p!e;@S!3H?s!cR_zY^go1tH}nrc{~+`~f_@M54?+Jh^n0Oy z1o}sze+>E`L%$FD$Dw}$`u~D{KlDF={z>Q$Kz|VWr=Wit`kzAo4D^Sfe-`?mL4O$f z=b(Qc`kzC81o~e<{{r;Cg#IY>FGBwk^uL1sW$0gl{#EFI4gE3bUxWU2=zjzKap+G# z{|5ALLVptax1fI;`rktTJLrE8{U4zJBlPb;|1R`@g8t9YzX$#M(EkPcze4{3^dCb1 zH|YNk{YTJ$4E=vY{|WS;LjM``pF{r-=oP(F;qai3UZR|irRbY4R4zwUxgBd&Htcd7 z7vo)yO?Z>zO8f%#H7eh69p2}-0lz;TRlR^I0HzQaFEB;G6a&*6m_ESt1*RV`CBXCt zW&kjyz?1<~4$MGce85xyGYFVUUEWCJTMc0nF!1zU`_+(bYLa}a|SR|fH@PGsle0$GYy#Oz{~)q9+;WH z%mQXMFb%+*1#g}^KarU@87Fe`uw0MiUi5SW#~tOBM5m{wpe0%kQZAz<2o2?G-WrX83yz(j$G z0TTzN1DLhItOI5}FdKlm7?^JYvk{m}fcX|MmjcrXOahoqz+48*<-lA4%$30W8!%S^ zb2Tv60P}5Nt_9{hz+4B+zXP)wnCpSL0hk+s*#gXe0P|g7z6Z=rz}yVXEx_Cg%vNA- z1Lk&Mz7NbcV73Eu2QYU6vjdpBfVmr(9{_U?F!us;A29z3%uZl-0dqevKLlnsFb@Fp zATU1yW)CnA0rN00dx3cbm`8zm445ASvk#cZfq4R${{m(|Fh2q2Nnj2Da}b!PfO#62 zp91p?Fo%G77MPy_a~PQCfO#I6p96CQm|p<%0x-V><|r^P0`n3uzXIlEU|s>{RbYM% z%rRhI1Lk#Legn*LU`_z@1~6{|a}t=hfO#93-vaYHU~m$x`U5b31m+!J-Ua4Q!2B7Q z_kejHn7;t?S71H>=0jlq2F%}q`3RVgf%$J>J^|)aU_Jxpb71}fj52Oe4kM}zW36%; z9V*MXShC-S(-RmEFui~&0HzQaFEB;G6a&*6m_ESt z1*RV`CBXCtW&kjyz?1<~4$MGce85xyGYFVUUY5-_I$b2>1SfjI-1DZrcw%v50NfSCr& zbYNxxQxD8cU}ga`8<+-Q&I0CaVCDcb7npg#%m-!xFy{cX5ST^4Gy=02m?glR3(R@I zoDa-WV7>v&GGHzM=0aeW1JeYIAD9)u1b}Ha?odHoD{-yD)q<-P*G0Hi;|dw~t2X0l z6*it#5o0~xadWFRMjqaB^QaiiahN+`UJKkhTpNuC)g{Kmc;{`sy3}|KZ@ppl&UjL7 zg84F-FNc}`CNB)OMb-vqMk8$tBcWhjY(qFOrFr@CF{6}N&55jP4X5d6wuYOhZAjOT z1%7&@BOIR|X%5Dc@Ci^)2`pbeqczqZ@^6?P^2cIhMlH9|j#B}uaBd{LDl%h5Lvt`3Z;fx50?%ySj~;Co zpE0)Dv9{WAw%Q4{+RqQ=PTU|5_1 zWPL=Du|A?yTOVOd?m5IM_tr;CC}M(0mR*~MLr0DxmTDWv)OIPk)bMI8`<0HhXA#BW0B~hNJlgf zgmPX-DCA!eB4a~+xT7r?O+KyZ@W;)Eb2@_24dw$UQJO|tSu_7Z#u&5prKBSd=)Nc( ziSk2|z^Y|uRt3A^0+Mt{zSMQZTc~9Z_~WgSFz0@nz4^d=YV?Hj6$#9GrW7`^OE%Bwb z>j>dkSapfbI4EsmGoIDtDHrynr=-t}9!5P)q8qM!ijs%KH8Vk}CtHm0&3 z#NB4kn6c)NH$9N!pf|gVRLIBbkfj0w)bwc3A5V>;Ysc9o>1b%J4RMlkjD}};J}xr_ z#;K&A)BLeu6I?BBN1d|xJKl^4XR)Oh8J`MtDzSjh4EO{!c}6f4v~oga8|u-p$n<|= zH~x=KT5$W8iuuHhI02XG|0FfJuDQ7}LPa6za5S{Yn#|4;+9~*6kH+uGv}%HKZlt*b zgAFyu-?pOJPeo5H+7OEe+iFs6X{=^eFdU4w1{8?Nvxa8&4y`85ddw$SrXHvotc&Od zq&`f2oVbC-oJe4Gq$8fGu5a_VhIqsfZL^>kv_!(ec^z#l&{fbpBxRXVt2j8xv`~6D zk~WJ|X-yZ!hSI`Xi&c7pG9_VBv~V;p5^Y1HeQ~gv)bsppI`z?dcWWgHmxlc(j>*e3 zY`Q|HdkTO+&ksu=q(mm4bwNx%>N1pkM7WaXhA@0hJz6uWd4^e;l%-%ROC3>`!bu5X z_HNW8>cWziI-J)@z2!+q&7wdE>p~$7MLbh2G%`3fbkp{h5vW$cG3Rhvzr&fDYEq=2 zSQPMvTv;?3ll}z3hLHT>D1#er?-UcC__cm zmU5767#VA85ir|M)fnA?2rUXk+Jnt1bB#eYwnQWA8dlQkR3rw#@@CV-W7oyun15w( zei$>WcIpjvdNjmR&q6TW9}WaD3!-u9!r+>YAUYM(y9OGN>lRck=h3-5%nPoY)zR9F zzLN83%If9Ir}+b`Tf?hnwgyAc>s;!pr?#-G7Oj?l1qKB6wv8LwZQLYthugfaoEU_6 z*f>KDg!Rm0Q5?hPRb3tG#u5#6S1a9i+FC6^|AZ9m>c$+%$;e+%gu24&qtOWFK(Roy z6&+|-d#=i;No!j%5$bB)5Q|}s+EtGl8Cm4VfVssVUKNaW1yBassCfV~V+E>L9EoHD z&@D|@K5koW@VY7LibsCX#HOo-9y|w8xLav%(*=-LX?07IDiSJW4qcknG_>K|l_Z;) zd6D=`toJsna4;T=`@_xtXfuW!v=}fydTt9Qev8_%azo9^qF{7wD~!5Opyve~kJN5a zO+u|%(Hg=;5W};evi7Ak2+Fh%5QwT^crDG|BjLLC_7EoV7<8e2o2w6)4suOqbzLmE zP@ooKiMq8d$Te&>LJe1<(zE1r9n~7qARg?9##kwpc9gCoM;1*Zl@4lE`K~)xHa1fI zW)rxRW+^mgiD!G(rD-VRkOOJDDEY${XdgIrsVUH!{Xhg+0qoD&kSJR7u`S$gzeV3=CjSdCeFG(@lU5ISWcg;7(aO{Xxd z8aGDhwn^1DQ$sloqkm7Im>$ux&+XLt|^)is$j8wM3;{H2R}RxtUQE zSFGEuPFa|Nn%&xrb<31KSw>PS(^sq=2Bn+sYKd&6W`tU0f2doOS#lWHl|=X7yu_EX z)Cn%*tB`*^n_?+@GkBFyYe= zYiXb)(+OPxbu5*vFJPP)^fzM^pynd;f>G*E=}D|5Fg229WCQo8y=dX7E78L&T~9K` zUK~Jx(*|TJkf})0HAaMN7BxULdNaKuj~c>j{n1u`*tEi2vK|eVst*O*=KA9>QM9dn zH2a^XK+Bf)+-_Mf)|E3DUKMXq4IC!!!xv!OYZ)AK?oxeaI4vbh)MXgXntE(5gvb4_F3=bv#Au#GaOkv&0-oyhQns18R1cvsh>kV{X~{-WuoffGAvN6}3VmTq*9=VN zw1c)bCE&>ksfvX3%oK$vHPcr-c;G@OqbKT)^|NLEuNos-*BIdzTOPQfq1|$Ya;kOV z;5uyxu)Z-0%Y_&QMcQ-<^8zNu=DJiRpD68;<94=7J(-O(rlv@e)I5lLbQS2L;bD)q z#Gr`6s2_9-oO;e!hM+iTAPTNFAZN58PWyb6lsrI|YN*ZZn>MzY9hiOu4SA*?K&}lT zdfP#r6@gf!hpnll!DO?@X(e@)Q^PbPM5YmymwH*$ciMcRvXa`%kw(CxSm3AD8Ji^* zoo*>;`e;$2&Y&j>TUD4xS^#KS{Lu{-gMP+?J#CWuss+?{}tHK5T-Q} ziWZj(8Hdrc+0F)6%9fdG=#sr^Ml{l%%556ES)MGd6^eOVFf<)w4r&(B=+G!J)tIS< zRcJ$k4J&CbWKqvwL7|gTN^|}CK#)5*RTo{w8&?ERX{jZ~UfKM1Y^PF`Qa02eb#a{1 z=q#I7Gc88xpqD?;%47Wk&pd^pZW=|9$|W0REXC$zl@JhhR&1;bH`j$?5o)I}%4loX z?L}(nrf4DCmzW%;}>XmGrd(4q=AMERq>&yzZpe8<@tj9K{^gXN1f8*q&P2 zOqND-n!#M$A|*AHwCNh`HwL2^X{Bqq1xvbWKo5=)S@OAERzJ{j;Z3hDyTi#1Y}r}G z*f+j>`3k*tj2@eMjoByy!KmUMM9kDbU~QBK>#|d9raz5zXGCa+MGu)3x5$zs$(O6B z*lC@a%B&$?%QTmD9Ry9bm)4DDs|lcPraF*eD4Bt7m8qNyPV${SW6r3s)n|=A^ApWVh*&SmF96q zs~=5Q4DUqX%;982xy`_Fzx*yhxAQ~H>5z~svE&mo>C92Bnf21*#*oCkAd~`1(fMLe zLai%mu;3Ix`|59RA6>J2RE=5gVm0PSc|K-o#gYRG%UqmywY9@kbH?k3Op&RZJZ0?iS3m=|r`9*4EUu+) zi>uV2!UExhH`|AQ2F!f-$HHMcm$utt!x^I6YKyjuH>noEiqbpe)Mp~m%-4~+DaLjw zUAF=&J$ShWgBYtTOQup&SCa;la+XRevuNsZO$~z1dn!CMLf>L82FH?3x>c7NH>BcK zBbmah+NL?VD{LxcLs`FYr0Q0!iUwCJho!s$ zp-VgUY1*`?gEtnH?y;2~E~0SKh?OQc^P?C*a7)B)=pnVA#0jAndXh_$^H;7!ZB%iZ z9W`QqE3Ot{sXUIMpB~l0h|Yo+Fy_;%V-!LpM>G~sJ<4npYnf;>$zD(V&jNydDZQ5 z=67u!@_ctf{6hPO$Bn4z5MlK(8=mDwnrW zFJwU>va;Eu2W-&|D$>53dp2wvk+~s^T~`c;@RX|TmKMe=iB#ll-|nXhmIP6vaJ9gC zMmQ3mhBtC(SF66Q9sK4VmwrN8VaNwH{?4q!x0pEL7GHA4@l|OAUuOn!qGtoX?hN9~ z%{ad3jN_}!8hl9_!SgD}8TbO!M5~cHcYY={^o++Cc?An#8o5@JxXvVj;aq#(|Y33&@+O#vdeE4c~6uuZ$JwkA^3ciJ5 zj)B1sf5BY&4SYYFitSYJ*4#3N57vr5NI{$m)lgPXBs})+pkRfv*G10nIsZ9-iY}a%Ca3oYvjgn=w=+CQ|dv zWcDyZtZJ7aej)gUtxlN2_(wiX!}C07L-;oz;i%^nq>`X=XF=aeZhJHU9mluKqmhr4 ziunEynpH{_nt3u0oNeGzJ%YGX2?!}Qg#3u|a|oJ?Vc)FGuqItJm>M6xs@6F>3?-oj zEHN$-A#eoo)QnL1P$q-;7lw)Qfl`IaWHU;xqpS`7>9T8b&VfcsNMRVbb%=ekg!VQ= zpVA>;9V(Y{oY+;5RI1s>CY9b2e^j-*{_dOb*7qmO-E{j+>vkM{XpeIGlq1XMaOAik z3VV~$R<=qNI9Yu2~(_3Z+O*Pq+lTjeZL-g7)Ivi8Vxk;Busw|A5aC(8rd+j|Mi z&IE4Ry}g}RIEobAua^7uxPzWhq$U{o@2z)}?0gEWlgXD3@?|6YLeKDJU~lhKx9Lmg z@3lAY>f8Ic^#a|86bz%tS(H`eBKnWT*U#imu1HVL=uYn7<7@}}<>~ERkX58Ob_hTZ z{YcUB)b#c?=4#K2oNx#t+z<(YMS0!LQ4D!_lEpp^9G%9-aV&B}Io z>!|D)oPh~{4g&m^;jK4%;WKHEH_>K3XDj4#VPZ`-KB4s1d+T#YIgr$g!IPEe@UAD( zgrF58pjmEj=jBkq1mV!J?tr;mxeIXmhqpB+&+sNTcoUZt+iJgyaV>sjD1ysh5W z-rhDm5#<`ATxBEa5Z6||cX&4#D95SFLgmzO8!m-VbZ{-$;BO9)%=8rWWQo zGAMI>NYT!lkq0^$_jD5st6sBMHQMd&Zrob++O1V%a7m^DZe;mzRt8eYQ)J{L(>P$| zI1&RT(1Ui&<3cIy+~q>a@_1ZGzRt^YlmU&m-h474UF-HG3O z>roX-JqRgSijjTZ&OMg6!xL(ytSUgkh5Rxo#EExHz4aW*_X`srrib`_R48xaV;%Z3 z+*08+`i(NkFDl*E;2Iux9s*Ki=%75(H7Hh<;ns=u8GG>@(%f5L&P8y)#UU3S`1Jr% z{2?lbR?D7gw&+f%yqaL0!&W$#u|#i&H&l>JdxW19eUJk-iQiKvzJQSZ9JRvEgO(5$ zc0NksvZ|;-c?bmqR#Yt>)j_c$T!?Mwy+vFoHudCmq^8NcsnAv6KuM#9D9b3yqH2nA ziF#dxR-+)*C+SXy>T;0-+37$nhCu0X4B#|8EPa>8al)V?7s8NkQ;4c;_H!Cr#C0BAkoL5Wh|vMF6{g$EdW#-x+t}`=|JuHQ#;4$ zN^~%k+6auMNw-C3j&?4WYM^dx0p^tVSgUp-m%U45*?5P? z>~+61U@Cgr|8(1Yt94IHyKIIe9j;3`jTt>2qsT>#pDQ~XT?vAd!?gl+-HovW>PNB> zZ^>-LThdzV7U?*R-q}t>y{DrvLFvSI&{7?gCk$G&8oy*^0EPcO(CnI8OVJUWS#;#l zoo(cR5#>H7)ko%t_c`b^a&+M;O-n#s5fbT2olWUF?bv7MI9;h7r|Wn?lo*`mnDfR% ziIJ|?+2qNVyQWKr^z^x?+d?*ZFxu-qo`l@+@7iJ;@QzazJc)Z&gL+k?f{Xve zD1ul?y?4Sc z4~kHdxes?ykn9i`RynCDa+*y}k-}U*>4%dC;hQS-2zt{94DvCO&Bw5MQ?++fMVWWg z5VLnjtLLh~2(uiW5T*d!6Jc0jeLw@3!#$F#NYdcE?$f}|O2>4Wjicmf#Z57_Ll{MF zil|$2G<_k59fESbFwtV;7A+lB5IZYf!0c=^U3>R*c2=6s&So%&ZoLg%s;9!jQenal z(!+wu*G&tu@BxQM`)B7wcbT2t`Dc(pDNl}cUR-PAwPdZGmG;oiM$>KXp3crn)7jbR-dMt#$kpsObv?NvD779UvHxkG<9|A^x z=a|!pddnoDJ}=vxPt>Po9`!vjHSs2nz!m)?U&*YOv@zHy#!><=2w2w=5OC}RDDCv9 z#VMI{;f*)(GE789cPvFEa$mb^F7%cEa7&79{OAI~O@;F(xkR6#Qp=hgt zmO~9MB^NQZ7^s8Z7VY3<(gB%t5Pk;}QP7<=%z=3xS|~PpkdUUiC;R&j=6hHHYe8TW z+DwaISf9qiy~9Nd$DV9o7Ir1D=8E;##CsB!kWr%7R&^?+Exb@DLs)v%g(jJnh*KLZ zkY})HLlBwp157!+iI2RYzSbTw@hOVYIY1Mh=8WfX)U>V#rS~Rx zk+1~yHld#M@ zl^gNdk+zEaA}C$~{55ozn9RZ*#oda*V!PoPT0r|$nDqjw_mfawQ)7Bs!)@T55W#Sv z0WsBU@qo8P*sBt3Cy5ew>rMt%6Y{dqGH&4Jac(YBsq;3>Ddu(;nVq(gIgu6_E2g5r zq4ylTohNMKVTr;CGvFtZ0Y8xn_z48ux{X4Kw$Bn4E+$sR0BZEC84U-#x{nm^Aq6vp zk!&{AnuolhJlLZIlB$1!xwMKBYOUxfRoGA?2-moWuvD6nZ<52v}~ zw&7mbpU#D}3n@H5lI8%lox^P{s1(F>)PS^tmA(|;y-zQ9<5Q{>kx%I;YUO)lWj*C1 zm55{MOmOvHn#N0ckgh7Da*-Z?V9b&+kaIM{n)8pR@z0qBl5+2(G_R~SpQhO$GB{!# zT`z*K_dZ5sV?`^&lS~XcPLxz`S`xY42AV;`v$MMt6nIDbs%Q}8hKA}nk5AXdA}24T zAx%+0i?V1Lmw;&TwV}UcE4j^B&Gqn30bC(EC{99wPMBTlm0)nGBn98r-GY>FUf z0llP9n7w0=dqC{hC@-35u1OJBeqWYZ!PxpdO&b*ASEWU&-WWqP$#atJSua1Oc5Om-!6 z2m~4H!@0gJ?cS3H@}*@>xlL8^B*XGtn#=U%-Ex~~!)TS!>!f3QE9C7P6SPWsc_(3 z2n6;m!$U8epnam@rtULP^rT&8D6LzYO>@Q~GOd=4wVCJ);Z$n0v9WdnrPAKpE)46M z)(r)`ooqvH*YHyi?XVTr=07pjhV6?&FvG@8Dg>zxfkI%1Me-_FSd)5G=@x6=O`!U zr5&Eqv=)n^W?g|Oa!%p4-Y!cKx{ytWW{9coD`q3wV@Fp)AVnAu!oOa2t|?G@(u=WE=w5QF_9C(VSUJ;sY~ zlruU2yu4~Y47Rqq)V!>>2|bmHjW+rb-6jS$2Ba+L=yLh7qev?uoi={ZoVdt|rVK4j zkrQhl-o)iLF!sRCqLPL@_C+Q+@EO9bxh;s2O@_4AqH(QF5Ulogi>MUzEjI4P(SXR- zb9=lV9DPB&cx+VDZT?^cBjX*p(FjSZv0JLK+pNa!WF`S@yIz_E(12%~O&k~Tu*W`< z$Oay8++*VoN!INUh|<%}%@Avm26JIzrw#Mz+&})45G6}+s_Mut4>u&cZ8*6Q+FA58 z2aXQv3zMlut>PXVo-)k5Qwnb7?Gg3#@~??Yu1GCbRNU6L!!hC{$RUvC-FbTMTRmOPs@Y zJXZe?+xU|ls@PeY%W-%;m)?5ZoP$mPqw2(Bz1~IB4dfE9N9lDZ(iHI;RB}Pde6!ix zQDk5`kN3Kk9y@!I`OgTDBq1>YBav(Uf$&lRwpk53xh z-ZKn$DQykj1euZ3$CGut!_NvZDjnuxC8G3;1yz8h{21V^zPPTyg+Ok zn#@Qdw7SJF=;E#!dr2L`01>atbZ$569NwJ3Qx6%CQvEY+FiF5uvA9Ep zCVS#a^=GdgVYQ>WSI+MZEU+`>VdZ@ph!+Pv-r_#9T3C0cB0oV z_?<5(l8YI5nF;eIUzWTFf`{}#;_W4hQ_>4P*-6827=cNK3(G}%-b+h9_ZGR#1fjqu z11DQKP?>3jm)r4_=R+TOZ%$ANu zPwa!&njxky`Yjl|U7r?lo=8&) z&ndCsUUqd%2$GFR35=Z%)7U~@cEAxeS)}BO?Lhs{ai|<>2e9^x&s-XfKIh^fd7S!{ zJfMS*42?N}GZ;7Cp-O7z)i>hfK|VyWN=}eDW9{e~>`gR!if5W9cUcdm8|+X6Z9Z_r zhuZwBHGE_nezr|zFT@9=_{dJ-H`!DX9kk?M74(^3`qJ4bjH;~}MgJ6j@lCn-LE%Tx z)bua#LVHJFxa-r{$DJ}+pX0-yL(>ll)lT@TM3%#snP}oyCDNa5rb0AHsk0qw=9iD! zthB>{`Dc=96@C{^&HnOSmXG6;A;TH`_@y~D>tAA{kAN+QxOYwXabJflGx5iN9kR>} zK#`d5P-lI$Xm-s6oT!f<;!|_K8lQaO%%8|7a{{N@e=W-7?<=GZ-^bzi_{l&u=c|U2 zDET~uWFYYyU0*L9_3;WRJ{0D!9zuPXc}58FHRBS8I_Im!89B{gy5ocR^xVNOHQ<*R z=~PYnd6MprB;mHOOFhAN;QSqaGT!*nimwrGU6C^wzg7Sd?+iK=@C6Qa_E(E9f16In z@TAHjemCfA5N7-o0kwnpA&-B(yPzD=-NmG?t=5<6F4BlHTdXhBU8E6ZwpL%JyGSF# zC*@s#uj0$4dor1HDdY1N(Ag%7E;RvXIaK|>Tr!e`C}eyvO^OO-;;T`m{m=yWim3Mg zau1u9WL+C~>Jz_IT~Ef)wqeJQtbAoUn?`*M`o({_|4)ml&d`kJ5@q%)r(0%Yj$-@O zLT1;Hk3~8AQeA8^7rJf4@oPw5u`ZaD)*qVFKS=Zy3vibn0YA$06%)^{H=xGxtJN&T zG`%MnkB;R_jS!RhVABiW$2q?unN1IXAFNV!4mBou(xN^ME>_bRiG*S`IBFIX6P#L% zgU6b2=n5YdCkGYf)Q&S}AODFt(euy#`3agyU5_i&h0b)l5a;OzqgB4P7!Cu&v0zm` zbKW#olU4cTT*EWM!44ci6sqzq=vaZH;&GG-C+Zn1CQR^;3yd3IJ88_=;HZg{D!Y27 zPm4GGL^+{38?W==zMyUf{r4`Oa=Z5@tuOZdUF(a1ofAKr2`l=m#1+65LS)Ln;Lr)c zx`CLdEUX2jU+O3XI#?og^n?puj7puO@UNXdF%XU%adcAkILg;EeH@ZzawF@|nk{P`5IfPMWFm@mYWL z3?tom7&oQHajoMkc-w(t!$0wsT34&L>{oga2*S;zsJR#*IQ=MWzHg4Y#Mc}_Y;fd@ zFSs5D1J*do`4|{V3sNE_!Z-=W7m50UbQVmF`k(TedAiO2lvlHw{NGq!(TJ!YES|Pi zIp!{)rfd_gYae!~Yj2_!H}zMLGO}smq8W=^@f&~rJ?C3zC9b;rduxLqeTQ63KW$la zaP6`$7=A8`MFYzsD=u0lYf;NAzZrr>t}k+4)84#7jo+IJ;Q})IGJ+_N(=0fpaEw-T zMkq8FhYKq1DT2WoI+9!e{bLANGNWow`+r>P;DGj1sxv((w91Ia-$qZk*|^Tz?@-6E zKy3aUb7ByomZ(K)Ib=P~NLqx`kmlozqUE^HL$@-Yp^s<%`Exp|M_;5OGmg1psk=cc zL)O0;cyNH#kMo3P@(D%wu@;;cv=XQN(BEM0JR4z4=Oe}VoFF< z#c5Wl5H!Kgbl=Wl+<+8GojdgP&ZAN|af$fN_;eQvjHD2{uW^zX(gMc;B>h=}*haya zO6OXfMftD_ zp@;+H!`05=q0_QRPbXnfc+7O8Cq4=5Yo=2wTuq!W3*aA}O4Wgq5x2zte@A{`qXwnW z%Ac7lsXS3?BIh5aI-Tv-hSDA4lexNgL;3kXfB#RVz;1`iM}(TOB=$dl|No`H{{kKd BEQ$aC diff --git a/src/lib/netstandard2.0/AspNetCore.Identity.MongoDbCore.xml b/src/lib/netstandard2.0/AspNetCore.Identity.MongoDbCore.xml index 8eea8d6..d913c2e 100644 --- a/src/lib/netstandard2.0/AspNetCore.Identity.MongoDbCore.xml +++ b/src/lib/netstandard2.0/AspNetCore.Identity.MongoDbCore.xml @@ -34,6 +34,53 @@ The claim you want to replace. Returns true if the claim is present, false otherwise. + + + Validates the MongoDbSettings + + + + + + Configures the MongoDb Identity store adapters for + + + + + + + + + + + A class used to perform a full configuration of the AspNetCore.Identity.MongoDbCore package. + + + + + The settings for the MongoDb server. + + + + + An action against an to change the default identity settings. + + + + + A class representing the settings for the MongoDb server. + + + + + The connection string for the MongoDb server. + + + + + The name of the MongoDb database where the identity data will be stored. + + The interface for an object that holds claims. @@ -69,17 +116,6 @@ The new claim you want to set. Returns true if the claim was replaced. - - - Represents the password hashing options - - - - - Gets options which use the IdentityV3 compat mode, and set the iteration count to 200000 PBKDF2-SHA256 iterations - (roughly 200ms of work) - - Creates a new instance of a persistence store for roles. @@ -1335,6 +1371,17 @@ The used to propagate notifications that the operation should be canceled. True if the recovery code was found for the user. + + + Represents the password hashing options + + + + + Gets options which use the IdentityV3 compat mode, and set the iteration count to 200000 PBKDF2-SHA256 iterations + (roughly 200ms of work) + + Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées. @@ -1353,12 +1400,12 @@ - Recherche une chaîne localisée semblable à AddEntityFrameworkStores can only be called with a role that derives from IdentityRole<TKey, TUserRole, TRoleClaim>.. + Recherche une chaîne localisée semblable à AddMongoDbCoreStores can only be called with a role that derives from MongoIdentityRole<TKey, TUserRole, TRoleClaim>.. - Recherche une chaîne localisée semblable à AddEntityFrameworkStores can only be called with a user that derives from IdentityUser<TKey, TUserClaim, TUserRole, TUserLogin, TUserToken>.. + Recherche une chaîne localisée semblable à AddMongoDbCoreStores can only be called with a user that derives from MongoIdentityUser<TKey, TUserClaim, TUserRole, TUserLogin, TUserToken>.. @@ -1371,5 +1418,40 @@ Recherche une chaîne localisée semblable à Value cannot be null or empty.. + + + Contains extension methods to for adding MongoDb stores. + + + + + Adds an MongoDb implementation of identity information stores. + + The MongoDb database context to use. + The instance this method extends. + A mongoDbContext + The instance this method extends. + + + + Adds an MongoDb implementation of identity information stores. + + + + + The instance this method extends. + + + + + + Adds an MongoDb implementation of identity information stores. + + + + + The instance this method extends. + + diff --git a/src/lib/netstandard2.0/Resources.resx b/src/lib/netstandard2.0/Resources.resx index eb19639..bf5a4ec 100644 --- a/src/lib/netstandard2.0/Resources.resx +++ b/src/lib/netstandard2.0/Resources.resx @@ -118,12 +118,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - AddEntityFrameworkStores can only be called with a role that derives from IdentityRole<TKey, TUserRole, TRoleClaim>. - error when the role does not derive from IdentityRole + AddMongoDbCoreStores can only be called with a role that derives from MongoIdentityRole<TKey, TUserRole, TRoleClaim>. + error when the role does not derive from MongoIdentityRole - AddEntityFrameworkStores can only be called with a user that derives from IdentityUser<TKey, TUserClaim, TUserRole, TUserLogin, TUserToken>. - error when the user does not derive from IdentityUser + AddMongoDbCoreStores can only be called with a user that derives from MongoIdentityUser<TKey, TUserClaim, TUserRole, TUserLogin, TUserToken>. + error when the user does not derive from MongoIdentityUser Role {0} does not exist. diff --git a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.IntegrationTests.csproj b/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.IntegrationTests.csproj index 2744b09..7820f4c 100644 --- a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.IntegrationTests.csproj +++ b/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.IntegrationTests.csproj @@ -7,7 +7,7 @@ - + diff --git a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/CustomPocoTest.cs b/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/CustomPocoTest.cs deleted file mode 100644 index 21efa8a..0000000 --- a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/CustomPocoTest.cs +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Linq; -using System.Threading.Tasks; -using Xunit; - -namespace AspNetCore.Identity.MongoDbCore.Test -{ - //public class CustomPocoTest : IClassFixture - //{ - // private readonly MongoDatabaseFixture _fixture; - - // public CustomPocoTest(MongoDatabaseFixture fixture) - // { - // _fixture = fixture; - // } - - // public class User where TKey : IEquatable - // { - // public TKey Id { get; set; } - // public string UserName { get; set; } - // } - - // public class CustomDbContext : DbContext where TKey : IEquatable - // { - // public CustomDbContext(DbContextOptions options) : base(options) - // { } - - // public DbSet> Users { get; set; } - - // } - - // public CustomDbContext GetContext() where TKey : IEquatable - // { - // return DbUtil.Create>(_fixture.ConnectionString); - // } - - // public CustomDbContext CreateContext(bool delete = false) where TKey : IEquatable - // { - // var db = GetContext(); - // if (delete) - // { - // db.Database.EnsureDeleted(); - // } - // db.Database.EnsureCreated(); - // return db; - // } - - // [Fact] - // public async Task CanUpdateNameGuid() - // { - // using (var db = CreateContext(true)) - // { - // var oldName = Guid.NewGuid().ToString(); - // var user = new User { UserName = oldName, Id = Guid.NewGuid() }; - // db.Users.Add(user); - // await db.SaveChangesAsync(); - // var newName = Guid.NewGuid().ToString(); - // user.UserName = newName; - // await db.SaveChangesAsync(); - // Assert.Null(db.Users.SingleOrDefault(u => u.UserName == oldName)); - // Assert.Equal(user, db.Users.Single(u => u.UserName == newName)); - // } - // } - - // [Fact] - // public async Task CanUpdateNameString() - // { - // using (var db = CreateContext(true)) - // { - // var oldName = Guid.NewGuid().ToString(); - // var user = new User { UserName = oldName, Id = Guid.NewGuid().ToString() }; - // db.Users.Add(user); - // await db.SaveChangesAsync(); - // var newName = Guid.NewGuid().ToString(); - // user.UserName = newName; - // await db.SaveChangesAsync(); - // Assert.Null(db.Users.SingleOrDefault(u => u.UserName == oldName)); - // Assert.Equal(user, db.Users.Single(u => u.UserName == newName)); - // } - // } - - // [Fact] - // public async Task CanCreateUserInt() - // { - // using (var db = CreateContext(true)) - // { - // var user = new User(); - // db.Users.Add(user); - // await db.SaveChangesAsync(); - // user.UserName = "Boo"; - // await db.SaveChangesAsync(); - // var fetch = db.Users.First(u => u.UserName == "Boo"); - // Assert.Equal(user, fetch); - // } - // } - - // [Fact] - // public async Task CanCreateUserIntViaSet() - // { - // using (var db = CreateContext(true)) - // { - // var user = new User(); - // var users = db.Set>(); - // users.Add(user); - // await db.SaveChangesAsync(); - // user.UserName = "Boo"; - // await db.SaveChangesAsync(); - // var fetch = users.First(u => u.UserName == "Boo"); - // Assert.Equal(user, fetch); - // } - // } - - // [Fact] - // public async Task CanUpdateNameInt() - // { - // using (var db = CreateContext(true)) - // { - // var oldName = Guid.NewGuid().ToString(); - // var user = new User { UserName = oldName }; - // db.Users.Add(user); - // await db.SaveChangesAsync(); - // var newName = Guid.NewGuid().ToString(); - // user.UserName = newName; - // await db.SaveChangesAsync(); - // Assert.Null(db.Users.SingleOrDefault(u => u.UserName == oldName)); - // Assert.Equal(user, db.Users.Single(u => u.UserName == newName)); - // } - // } - - // [Fact] - // public async Task CanUpdateNameIntWithSet() - // { - // using (var db = CreateContext(true)) - // { - // var oldName = Guid.NewGuid().ToString(); - // var user = new User { UserName = oldName }; - // db.Set>().Add(user); - // await db.SaveChangesAsync(); - // var newName = Guid.NewGuid().ToString(); - // user.UserName = newName; - // await db.SaveChangesAsync(); - // Assert.Null(db.Set>().SingleOrDefault(u => u.UserName == oldName)); - // Assert.Equal(user, db.Set>().Single(u => u.UserName == newName)); - // } - // } - //} -} \ No newline at end of file diff --git a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/SqlStoreTestBase.cs b/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/MongoDbStoreTestBase.cs similarity index 97% rename from test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/SqlStoreTestBase.cs rename to test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/MongoDbStoreTestBase.cs index ec145f2..68a7918 100644 --- a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/SqlStoreTestBase.cs +++ b/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/MongoDbStoreTestBase.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Data.SqlClient; using System.Linq; using System.Linq.Expressions; using System.Security.Claims; @@ -14,7 +13,6 @@ using Microsoft.Extensions.Logging; using Xunit; using AspNetCore.Identity.MongoDbCore.Models; using AspNetCore.Identity.MongoDbCore.Extensions; -using AspNetCore.Identity.MongoDbCore; using MongoDB.Driver; using AspNetCore.Identity.MongoDbCore.IntegrationTests.Infrastructure; using MongoDbGenericRepository; @@ -24,7 +22,7 @@ namespace AspNetCore.Identity.MongoDbCore.Test { // TODO: Add test variation with non IdentityDbContext - public abstract class SqlStoreTestBase : IdentitySpecificationTestBase, + public abstract class MongoDbStoreTestBase : IdentitySpecificationTestBase, IClassFixture> where TUser : MongoIdentityUser, new() where TRole : MongoIdentityRole, new() @@ -32,7 +30,7 @@ namespace AspNetCore.Identity.MongoDbCore.Test { private readonly MongoDatabaseFixture _fixture; - protected SqlStoreTestBase(MongoDatabaseFixture fixture) + protected MongoDbStoreTestBase(MongoDatabaseFixture fixture) { _fixture = fixture; } diff --git a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreGuidKeyTest.cs b/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreGuidKeyTest.cs index 565f7ed..2807434 100644 --- a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreGuidKeyTest.cs +++ b/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreGuidKeyTest.cs @@ -3,9 +3,7 @@ using System; using Microsoft.Extensions.DependencyInjection; -using Xunit; using AspNetCore.Identity.MongoDbCore.Models; -using AspNetCore.Identity.MongoDbCore; using MongoDbGenericRepository; using AspNetCore.Identity.MongoDbCore.IntegrationTests.Infrastructure; using Microsoft.AspNetCore.Identity; @@ -26,7 +24,7 @@ namespace AspNetCore.Identity.MongoDbCore.Test } } - public class UserStoreGuidTest : SqlStoreTestBase + public class UserStoreGuidTest : MongoDbStoreTestBase { public UserStoreGuidTest(MongoDatabaseFixture fixture) : base(fixture) diff --git a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreIntKeyTest.cs b/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreIntKeyTest.cs index f9ba8fe..795bc09 100644 --- a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreIntKeyTest.cs +++ b/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreIntKeyTest.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.Extensions.DependencyInjection; -using Xunit; using AspNetCore.Identity.MongoDbCore.Models; namespace AspNetCore.Identity.MongoDbCore.Test @@ -23,7 +21,7 @@ namespace AspNetCore.Identity.MongoDbCore.Test } } - public class UserStoreIntTest : SqlStoreTestBase + public class UserStoreIntTest : MongoDbStoreTestBase { public UserStoreIntTest(MongoDatabaseFixture fixture) : base(fixture) diff --git a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreStringKeyTest.cs b/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreStringKeyTest.cs index 5571bf4..d715a1b 100644 --- a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreStringKeyTest.cs +++ b/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreStringKeyTest.cs @@ -22,7 +22,7 @@ namespace AspNetCore.Identity.MongoDbCore.Test } } - public class UserStoreStringKeyTest : SqlStoreTestBase + public class UserStoreStringKeyTest : MongoDbStoreTestBase { public UserStoreStringKeyTest(MongoDatabaseFixture fixture) : base(fixture) diff --git a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreWithGenericsTest.cs b/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreWithGenericsTest.cs index 3f2e2a1..f526e70 100644 --- a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreWithGenericsTest.cs +++ b/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/UserStoreWithGenericsTest.cs @@ -222,7 +222,6 @@ namespace AspNetCore.Identity.MongoDbCore.Test { public IdentityUserWithGenerics() : base() { - } } diff --git a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/Utilities/SqlServerTestStore.cs b/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/Utilities/SqlServerTestStore.cs deleted file mode 100644 index 897f7a8..0000000 --- a/test/AspNetCore.Identity.MongoDbCore.IntegrationTests/AspNetCore.Identity.MongoDbCore.Test/Utilities/SqlServerTestStore.cs +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Data.Common; -using System.Data.SqlClient; -using System.IO; -using System.Threading; - -namespace AspNetCore.Identity.MongoDbCore.Test.Utilities -{ - //public class SqlServerTestStore : IDisposable - //{ - // public const int CommandTimeout = 90; - - // public static string CreateConnectionString(string name) - // { - // var connStrBuilder = new SqlConnectionStringBuilder(TestEnvironment.Config["Test:SqlServer:DefaultConnectionString"]) - // { - // InitialCatalog = name - // }; - - // return connStrBuilder.ConnectionString; - // } - - // public static SqlServerTestStore CreateScratch(bool createDatabase = true) - // => new SqlServerTestStore(GetScratchDbName()).CreateTransient(createDatabase); - - // private SqlConnection _connection; - // private readonly string _name; - // private bool _deleteDatabase; - - // private SqlServerTestStore(string name) - // { - // _name = name; - // } - - // private static string GetScratchDbName() - // { - // string name; - // do - // { - // name = "Scratch_" + Guid.NewGuid(); - // } while (DatabaseExists(name) - // || DatabaseFilesExist(name)); - - // return name; - // } - - // private static void WaitForExists(SqlConnection connection) - // { - // var retryCount = 0; - // while (true) - // { - // try - // { - // connection.Open(); - - // connection.Close(); - - // return; - // } - // catch (SqlException e) - // { - // if (++retryCount >= 30 - // || (e.Number != 233 && e.Number != -2 && e.Number != 4060)) - // { - // throw; - // } - - // SqlConnection.ClearPool(connection); - - // Thread.Sleep(100); - // } - // } - // } - - // private SqlServerTestStore CreateTransient(bool createDatabase) - // { - // _connection = new SqlConnection(CreateConnectionString(_name)); - - // if (createDatabase) - // { - // using (var master = new SqlConnection(CreateConnectionString("master"))) - // { - // master.Open(); - // using (var command = master.CreateCommand()) - // { - // command.CommandTimeout = CommandTimeout; - // command.CommandText = $"{Environment.NewLine}CREATE DATABASE [{_name}]"; - - // command.ExecuteNonQuery(); - - // WaitForExists(_connection); - // } - // } - // _connection.Open(); - // } - - // _deleteDatabase = true; - // return this; - // } - - // private static bool DatabaseExists(string name) - // { - // using (var master = new SqlConnection(CreateConnectionString("master"))) - // { - // master.Open(); - - // using (var command = master.CreateCommand()) - // { - // command.CommandTimeout = CommandTimeout; - // command.CommandText = $@"SELECT COUNT(*) FROM sys.databases WHERE name = N'{name}'"; - - // return (int) command.ExecuteScalar() > 0; - // } - // } - // } - - // private static bool DatabaseFilesExist(string name) - // { - // var userFolder = Environment.GetEnvironmentVariable("USERPROFILE") ?? - // Environment.GetEnvironmentVariable("HOME"); - // return userFolder != null - // && (File.Exists(Path.Combine(userFolder, name + ".mdf")) - // || File.Exists(Path.Combine(userFolder, name + "_log.ldf"))); - // } - - // private void DeleteDatabase(string name) - // { - // using (var master = new SqlConnection(CreateConnectionString("master"))) - // { - // master.Open(); - - // using (var command = master.CreateCommand()) - // { - // command.CommandTimeout = CommandTimeout; - // // Query will take a few seconds if (and only if) there are active connections - - // // SET SINGLE_USER will close any open connections that would prevent the drop - // command.CommandText - // = string.Format(@"IF EXISTS (SELECT * FROM sys.databases WHERE name = N'{0}') - // BEGIN - // ALTER DATABASE [{0}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; - // DROP DATABASE [{0}]; - // END", name); - - // command.ExecuteNonQuery(); - // } - // } - // } - - // public DbConnection Connection => _connection; - - // public void Dispose() - // { - // _connection.Dispose(); - - // if (_deleteDatabase) - // { - // DeleteDatabase(_name); - // } - // } - //} -}