From e9c207e89d73c84fd56d2f9ceec157517c69c7af Mon Sep 17 00:00:00 2001 From: damienbod Date: Tue, 10 Sep 2024 09:40:20 +0200 Subject: [PATCH 01/28] .NET 8 updates --- ...pNetCoreElasticsearchNestAuditTrail.csproj | 2 +- AuditTrail/AuditTrail.csproj | 18 +- AuditTrail/AuditTrailExtensions.cs | 50 ++- AuditTrail/AuditTrailProvider.cs | 314 +++++++++--------- AuditTrail/IAuditTrailProvider.cs | 15 +- AuditTrail/Model/AuditTrailLog.cs | 25 +- AuditTrail/Model/AuditTrailOptions.cs | 19 +- AuditTrail/Model/AuditTrailPaging.cs | 13 +- AuditTrail/Model/IAuditTrailLog.cs | 12 +- 9 files changed, 227 insertions(+), 241 deletions(-) diff --git a/AspNetCoreElasticsearchNestAuditTrail/AspNetCoreElasticsearchNestAuditTrail.csproj b/AspNetCoreElasticsearchNestAuditTrail/AspNetCoreElasticsearchNestAuditTrail.csproj index 9ae3c47..6cd9820 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/AspNetCoreElasticsearchNestAuditTrail.csproj +++ b/AspNetCoreElasticsearchNestAuditTrail/AspNetCoreElasticsearchNestAuditTrail.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net8 diff --git a/AuditTrail/AuditTrail.csproj b/AuditTrail/AuditTrail.csproj index 775da51..3f2f09c 100644 --- a/AuditTrail/AuditTrail.csproj +++ b/AuditTrail/AuditTrail.csproj @@ -1,19 +1,19 @@  - netcoreapp3.1 + net8 - - - + + + - - - - - + + + + + \ No newline at end of file diff --git a/AuditTrail/AuditTrailExtensions.cs b/AuditTrail/AuditTrailExtensions.cs index 4005c8a..0505af4 100644 --- a/AuditTrail/AuditTrailExtensions.cs +++ b/AuditTrail/AuditTrailExtensions.cs @@ -1,42 +1,40 @@ using System; using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Localization; using AuditTrail; using AuditTrail.Model; -namespace Microsoft.Extensions.DependencyInjection +namespace Microsoft.Extensions.DependencyInjection; + +public static class AuditTrailExtensions { - public static class AuditTrailExtensions + public static IServiceCollection AddAuditTrail(this IServiceCollection services) where T : class, IAuditTrailLog { - public static IServiceCollection AddAuditTrail(this IServiceCollection services) where T : class, IAuditTrailLog + if (services == null) { - if (services == null) - { - throw new ArgumentNullException(nameof(services)); - } - - return AddAuditTrail(services, setupAction: null); + throw new ArgumentNullException(nameof(services)); } - public static IServiceCollection AddAuditTrail( - this IServiceCollection services, - Action setupAction) where T : class, IAuditTrailLog + return AddAuditTrail(services, setupAction: null); + } + + public static IServiceCollection AddAuditTrail( + this IServiceCollection services, + Action setupAction) where T : class, IAuditTrailLog + { + if (services == null) { - if (services == null) - { - throw new ArgumentNullException(nameof(services)); - } + throw new ArgumentNullException(nameof(services)); + } - services.TryAdd(new ServiceDescriptor( - typeof(IAuditTrailProvider), - typeof(AuditTrailProvider), - ServiceLifetime.Transient)); + services.TryAdd(new ServiceDescriptor( + typeof(IAuditTrailProvider), + typeof(AuditTrailProvider), + ServiceLifetime.Transient)); - if (setupAction != null) - { - services.Configure(setupAction); - } - return services; + if (setupAction != null) + { + services.Configure(setupAction); } + return services; } } diff --git a/AuditTrail/AuditTrailProvider.cs b/AuditTrail/AuditTrailProvider.cs index 9657bdb..f11a3a6 100644 --- a/AuditTrail/AuditTrailProvider.cs +++ b/AuditTrail/AuditTrailProvider.cs @@ -2,212 +2,210 @@ using Elasticsearch.Net; using Microsoft.Extensions.Options; using Nest; -using Newtonsoft.Json.Converters; using System; using System.Collections.Generic; using System.Linq; -namespace AuditTrail +namespace AuditTrail; + +public class AuditTrailProvider : IAuditTrailProvider where T : class { - public class AuditTrailProvider : IAuditTrailProvider where T : class - { - private const string _alias = "auditlog"; - private string _indexName = $"{_alias}-{DateTime.UtcNow.ToString("yyyy-MM-dd")}"; - private static Field TimestampField = new Field("timestamp"); - private readonly IOptions _options; + private const string _alias = "auditlog"; + private string _indexName = $"{_alias}-{DateTime.UtcNow.ToString("yyyy-MM-dd")}"; + private static Field TimestampField = new Field("timestamp"); + private readonly IOptions _options; - private ElasticClient _elasticClient { get; } + private ElasticClient _elasticClient { get; } - public AuditTrailProvider( - IOptions auditTrailOptions) - { - _options = auditTrailOptions ?? throw new ArgumentNullException(nameof(auditTrailOptions)); - - if(_options.Value.IndexPerMonth) - { - _indexName = $"{_alias}-{DateTime.UtcNow.ToString("yyyy-MM")}"; - } + public AuditTrailProvider( + IOptions auditTrailOptions) + { + _options = auditTrailOptions ?? throw new ArgumentNullException(nameof(auditTrailOptions)); - var pool = new StaticConnectionPool(new List { new Uri("http://localhost:9200") }); + if(_options.Value.IndexPerMonth) + { + _indexName = $"{_alias}-{DateTime.UtcNow.ToString("yyyy-MM")}"; + } - var connectionSettings = new ConnectionSettings(pool) - .DefaultMappingFor(m => m - .IndexName(_indexName)); + var pool = new StaticConnectionPool(new List { new Uri("http://localhost:9200") }); - - //new HttpConnection(), - //new SerializerFactory((jsonSettings, nestSettings) => jsonSettings.Converters.Add(new StringEnumConverter()))) - //.DisableDirectStreaming(); + var connectionSettings = new ConnectionSettings(pool) + .DefaultMappingFor(m => m + .IndexName(_indexName)); - _elasticClient = new ElasticClient(connectionSettings); - } + + //new HttpConnection(), + //new SerializerFactory((jsonSettings, nestSettings) => jsonSettings.Converters.Add(new StringEnumConverter()))) + //.DisableDirectStreaming(); - public void AddLog(T auditTrailLog) - { - var indexRequest = new IndexRequest(auditTrailLog); + _elasticClient = new ElasticClient(connectionSettings); + } - var response = _elasticClient.Index(indexRequest); - if (!response.IsValid) - { - throw new ElasticsearchClientException("Add auditlog disaster!"); - } - } + public void AddLog(T auditTrailLog) + { + var indexRequest = new IndexRequest(auditTrailLog); - public long Count(string filter = "*") + var response = _elasticClient.Index(indexRequest); + if (!response.IsValid) { - EnsureAlias(); - var searchRequest = new SearchRequest(Indices.Parse(_alias)) - { - Size = 0, - Query = new QueryContainer( - new SimpleQueryStringQuery - { - Query = filter - } - ), - Sort = new List - { - new FieldSort { Field = TimestampField, Order = SortOrder.Descending } - } - }; - - var searchResponse = _elasticClient.Search(searchRequest); - - return searchResponse.Total; + throw new ElasticsearchClientException("Add auditlog disaster!"); } + } - public IEnumerable QueryAuditLogs(string filter = "*", AuditTrailPaging auditTrailPaging = null) + public long Count(string filter = "*") + { + EnsureAlias(); + var searchRequest = new SearchRequest(Indices.Parse(_alias)) { - var from = 0; - var size = 10; - EnsureAlias(); - if(auditTrailPaging != null) - { - from = auditTrailPaging.Skip; - size = auditTrailPaging.Size; - if(size > 1000) + Size = 0, + Query = new QueryContainer( + new SimpleQueryStringQuery { - // max limit 1000 items - size = 1000; + Query = filter } - } - var searchRequest = new SearchRequest(Indices.Parse(_alias)) - { - Size = size, - From = from, - Query = new QueryContainer( - new SimpleQueryStringQuery - { - Query = filter - } - ), - Sort = new List - { - new FieldSort { Field = TimestampField, Order = SortOrder.Descending } - } - }; - - var searchResponse = _elasticClient.Search(searchRequest); - - return searchResponse.Documents; - } - - private void CreateAliasForAllIndices() - { - var response = _elasticClient.Indices.AliasExists(new AliasExistsRequest(new Names(new List { _alias }))); - //if (!response.IsValid) - //{ - // throw response.OriginalException; - //} + ), + Sort = new List + { + new FieldSort { Field = TimestampField, Order = SortOrder.Descending } + } + }; - if (response.Exists) - { - _elasticClient.Indices.DeleteAlias(new DeleteAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); - } + var searchResponse = _elasticClient.Search(searchRequest); - var responseCreateIndex = _elasticClient.Indices.PutAlias(new PutAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); - if (!responseCreateIndex.IsValid) - { - throw response.OriginalException; - } - } + return searchResponse.Total; + } - private void CreateAlias() + public IEnumerable QueryAuditLogs(string filter = "*", AuditTrailPaging auditTrailPaging = null) + { + var from = 0; + var size = 10; + EnsureAlias(); + if(auditTrailPaging != null) { - if (_options.Value.AmountOfPreviousIndicesUsedInAlias > 0) + from = auditTrailPaging.Skip; + size = auditTrailPaging.Size; + if(size > 1000) { - CreateAliasForLastNIndices(_options.Value.AmountOfPreviousIndicesUsedInAlias); - } - else - { - CreateAliasForAllIndices(); + // max limit 1000 items + size = 1000; } } - - private void CreateAliasForLastNIndices(int amount) + var searchRequest = new SearchRequest(Indices.Parse(_alias)) { - var responseCatIndices = _elasticClient.Cat.Indices(new CatIndicesRequest(Indices.Parse($"{_alias}-*"))); - var records = responseCatIndices.Records.ToList(); - List indicesToAddToAlias = new List(); - for(int i = amount;i>0;i--) - { - if (_options.Value.IndexPerMonth) + Size = size, + From = from, + Query = new QueryContainer( + new SimpleQueryStringQuery { - var indexName = $"{_alias}-{DateTime.UtcNow.AddMonths(-i + 1).ToString("yyyy-MM")}"; - if(records.Exists(t => t.Index == indexName)) - { - indicesToAddToAlias.Add(indexName); - } + Query = filter } - else + ), + Sort = new List { - var indexName = $"{_alias}-{DateTime.UtcNow.AddDays(-i + 1).ToString("yyyy-MM-dd")}"; - if (records.Exists(t => t.Index == indexName)) - { - indicesToAddToAlias.Add(indexName); - } + new FieldSort { Field = TimestampField, Order = SortOrder.Descending } } - } + }; - var response = _elasticClient.Indices.AliasExists(new AliasExistsRequest(new Names(new List { _alias }))); - //if (!response.IsValid) - //{ - // throw response.OriginalException; - //} + var searchResponse = _elasticClient.Search(searchRequest); - if (response.Exists) - { - _elasticClient.Indices.DeleteAlias(new DeleteAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); - } + return searchResponse.Documents; + } - Indices multipleIndicesFromStringArray = indicesToAddToAlias.ToArray(); - var responseCreateIndex = _elasticClient.Indices.PutAlias(new PutAliasRequest(multipleIndicesFromStringArray, _alias)); - if (!responseCreateIndex.IsValid) - { - throw responseCreateIndex.OriginalException; - } + private void CreateAliasForAllIndices() + { + var response = _elasticClient.Indices.AliasExists(new AliasExistsRequest(new Names(new List { _alias }))); + //if (!response.IsValid) + //{ + // throw response.OriginalException; + //} + + if (response.Exists) + { + _elasticClient.Indices.DeleteAlias(new DeleteAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); + } + + var responseCreateIndex = _elasticClient.Indices.PutAlias(new PutAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); + if (!responseCreateIndex.IsValid) + { + throw response.OriginalException; } + } - private static DateTime aliasUpdated = DateTime.UtcNow.AddYears(-50); + private void CreateAlias() + { + if (_options.Value.AmountOfPreviousIndicesUsedInAlias > 0) + { + CreateAliasForLastNIndices(_options.Value.AmountOfPreviousIndicesUsedInAlias); + } + else + { + CreateAliasForAllIndices(); + } + } - private void EnsureAlias() + private void CreateAliasForLastNIndices(int amount) + { + var responseCatIndices = _elasticClient.Cat.Indices(new CatIndicesRequest(Indices.Parse($"{_alias}-*"))); + var records = responseCatIndices.Records.ToList(); + List indicesToAddToAlias = new List(); + for(int i = amount;i>0;i--) { if (_options.Value.IndexPerMonth) { - if (aliasUpdated.Date < DateTime.UtcNow.AddMonths(-1).Date) + var indexName = $"{_alias}-{DateTime.UtcNow.AddMonths(-i + 1).ToString("yyyy-MM")}"; + if(records.Exists(t => t.Index == indexName)) { - aliasUpdated = DateTime.UtcNow; - CreateAlias(); + indicesToAddToAlias.Add(indexName); } } else { - if (aliasUpdated.Date < DateTime.UtcNow.AddDays(-1).Date) + var indexName = $"{_alias}-{DateTime.UtcNow.AddDays(-i + 1).ToString("yyyy-MM-dd")}"; + if (records.Exists(t => t.Index == indexName)) { - aliasUpdated = DateTime.UtcNow; - CreateAlias(); + indicesToAddToAlias.Add(indexName); } - } + } + } + + var response = _elasticClient.Indices.AliasExists(new AliasExistsRequest(new Names(new List { _alias }))); + //if (!response.IsValid) + //{ + // throw response.OriginalException; + //} + + if (response.Exists) + { + _elasticClient.Indices.DeleteAlias(new DeleteAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); } + + Indices multipleIndicesFromStringArray = indicesToAddToAlias.ToArray(); + var responseCreateIndex = _elasticClient.Indices.PutAlias(new PutAliasRequest(multipleIndicesFromStringArray, _alias)); + if (!responseCreateIndex.IsValid) + { + throw responseCreateIndex.OriginalException; + } + } + + private static DateTime aliasUpdated = DateTime.UtcNow.AddYears(-50); + + private void EnsureAlias() + { + if (_options.Value.IndexPerMonth) + { + if (aliasUpdated.Date < DateTime.UtcNow.AddMonths(-1).Date) + { + aliasUpdated = DateTime.UtcNow; + CreateAlias(); + } + } + else + { + if (aliasUpdated.Date < DateTime.UtcNow.AddDays(-1).Date) + { + aliasUpdated = DateTime.UtcNow; + CreateAlias(); + } + } } } diff --git a/AuditTrail/IAuditTrailProvider.cs b/AuditTrail/IAuditTrailProvider.cs index 0ce9e3f..3e55192 100644 --- a/AuditTrail/IAuditTrailProvider.cs +++ b/AuditTrail/IAuditTrailProvider.cs @@ -1,14 +1,13 @@ using AuditTrail.Model; using System.Collections.Generic; -namespace AuditTrail -{ - public interface IAuditTrailProvider - { - void AddLog(T auditTrailLog); +namespace AuditTrail; - IEnumerable QueryAuditLogs(string filter = "*", AuditTrailPaging auditTrailPaging = null); + public interface IAuditTrailProvider + { + void AddLog(T auditTrailLog); - long Count(string filter); - } + IEnumerable QueryAuditLogs(string filter = "*", AuditTrailPaging auditTrailPaging = null); + + long Count(string filter); } diff --git a/AuditTrail/Model/AuditTrailLog.cs b/AuditTrail/Model/AuditTrailLog.cs index c28eaec..ad097dd 100644 --- a/AuditTrail/Model/AuditTrailLog.cs +++ b/AuditTrail/Model/AuditTrailLog.cs @@ -1,24 +1,23 @@ using Nest; using System; -namespace AuditTrail.Model +namespace AuditTrail.Model; + +public class AuditTrailLog : IAuditTrailLog { - public class AuditTrailLog : IAuditTrailLog + public AuditTrailLog() { - public AuditTrailLog() - { - Timestamp = DateTime.UtcNow; - } + Timestamp = DateTime.UtcNow; + } - public DateTime Timestamp { get; set; } + public DateTime Timestamp { get; set; } - [Keyword] - public string Action { get; set; } + [Keyword] + public string Action { get; set; } - public string Log { get; set; } + public string Log { get; set; } - public string Origin { get; set; } + public string Origin { get; set; } - public string User { get; set; } - } + public string User { get; set; } } diff --git a/AuditTrail/Model/AuditTrailOptions.cs b/AuditTrail/Model/AuditTrailOptions.cs index 8325bee..f7047ec 100644 --- a/AuditTrail/Model/AuditTrailOptions.cs +++ b/AuditTrail/Model/AuditTrailOptions.cs @@ -1,15 +1,14 @@ -namespace AuditTrail.Model +namespace AuditTrail.Model; + +public class AuditTrailOptions { - public class AuditTrailOptions - { - public bool IndexPerMonth { get; set; } + public bool IndexPerMonth { get; set; } - public int AmountOfPreviousIndicesUsedInAlias { get; set; } + public int AmountOfPreviousIndicesUsedInAlias { get; set; } - public void UseSettings(bool indexPerMonth, int amountOfPreviousIndicesUsedInAlias) - { - IndexPerMonth = indexPerMonth; - AmountOfPreviousIndicesUsedInAlias = amountOfPreviousIndicesUsedInAlias; - } + public void UseSettings(bool indexPerMonth, int amountOfPreviousIndicesUsedInAlias) + { + IndexPerMonth = indexPerMonth; + AmountOfPreviousIndicesUsedInAlias = amountOfPreviousIndicesUsedInAlias; } } diff --git a/AuditTrail/Model/AuditTrailPaging.cs b/AuditTrail/Model/AuditTrailPaging.cs index a9eb6ec..b4528ed 100644 --- a/AuditTrail/Model/AuditTrailPaging.cs +++ b/AuditTrail/Model/AuditTrailPaging.cs @@ -1,13 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Text; +namespace AuditTrail.Model; -namespace AuditTrail.Model +public class AuditTrailPaging { - public class AuditTrailPaging - { - public int Skip { get; set; } + public int Skip { get; set; } - public int Size { get; set; } - } + public int Size { get; set; } } diff --git a/AuditTrail/Model/IAuditTrailLog.cs b/AuditTrail/Model/IAuditTrailLog.cs index 14daf2f..08fb608 100644 --- a/AuditTrail/Model/IAuditTrailLog.cs +++ b/AuditTrail/Model/IAuditTrailLog.cs @@ -1,10 +1,8 @@ -using Nest; -using System; +using System; -namespace AuditTrail.Model +namespace AuditTrail.Model; + +public interface IAuditTrailLog { - public interface IAuditTrailLog - { - DateTime Timestamp { get; set; } - } + DateTime Timestamp { get; set; } } From 3b8cc0fbccb0746b91c92081d9c875e847dec34d Mon Sep 17 00:00:00 2001 From: damienbod Date: Tue, 10 Sep 2024 09:41:31 +0200 Subject: [PATCH 02/28] .NET 8 --- ...pNetCoreElasticsearchNestAuditTrail.csproj | 4 +- .../package-lock.json | 51 ++++++++++++++----- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/AspNetCoreElasticsearchNestAuditTrail/AspNetCoreElasticsearchNestAuditTrail.csproj b/AspNetCoreElasticsearchNestAuditTrail/AspNetCoreElasticsearchNestAuditTrail.csproj index 6cd9820..29d5456 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/AspNetCoreElasticsearchNestAuditTrail.csproj +++ b/AspNetCoreElasticsearchNestAuditTrail/AspNetCoreElasticsearchNestAuditTrail.csproj @@ -12,8 +12,8 @@ - - + + diff --git a/AspNetCoreElasticsearchNestAuditTrail/package-lock.json b/AspNetCoreElasticsearchNestAuditTrail/package-lock.json index ded1e2b..eb1914b 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/package-lock.json +++ b/AspNetCoreElasticsearchNestAuditTrail/package-lock.json @@ -1,50 +1,77 @@ { "name": "asp.net", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "bootstrap": { + "packages": { + "": { + "name": "asp.net", + "version": "1.0.0", + "devDependencies": { + "bootstrap": "4.4.1", + "jquery": "3.5.0", + "jquery-ajax-unobtrusive": "3.2.6", + "jquery-validation": "1.19.3", + "jquery-validation-unobtrusive": "3.2.11", + "popper.js": "^1.16.0" + } + }, + "node_modules/bootstrap": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + }, + "peerDependencies": { + "jquery": "1.9.1 - 3", + "popper.js": "^1.16.0" + } }, - "jquery": { + "node_modules/jquery": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.0.tgz", "integrity": "sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ==", "dev": true }, - "jquery-ajax-unobtrusive": { + "node_modules/jquery-ajax-unobtrusive": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/jquery-ajax-unobtrusive/-/jquery-ajax-unobtrusive-3.2.6.tgz", "integrity": "sha512-95pv3c2Fo94qqzI3nBYFhcnwYlz673jutDa5yvADHv9KnWqQOoE8kZVV+nBASSBZF75XnGBl4EfPzOWFw2i9wQ==", "dev": true, - "requires": { + "dependencies": { "jquery": ">=1.8" } }, - "jquery-validation": { + "node_modules/jquery-validation": { "version": "1.19.3", "resolved": "https://registry.npmjs.org/jquery-validation/-/jquery-validation-1.19.3.tgz", "integrity": "sha512-iXxCS5W7STthSTMFX/NDZfWHBLbJ1behVK3eAgHXAV8/0vRa9M4tiqHvJMr39VGWHMGdlkhrtrkBuaL2UlE8yw==", - "dev": true + "dev": true, + "peerDependencies": { + "jquery": "^1.7 || ^2.0 || ^3.1" + } }, - "jquery-validation-unobtrusive": { + "node_modules/jquery-validation-unobtrusive": { "version": "3.2.11", "resolved": "https://registry.npmjs.org/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-3.2.11.tgz", "integrity": "sha512-3FQPllaWdD+Aq55zJLGSW39+eXPDz1HhwAvrSwYi8zHQ8DVcu5IJ1HVeTiCl0BnCnrIBvfFU3zEB/DrGdcoRIQ==", "dev": true, - "requires": { + "dependencies": { "jquery": ">=1.8", "jquery-validation": ">=1.16" } }, - "popper.js": { + "node_modules/popper.js": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.0.tgz", "integrity": "sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", "dev": true } } From f6b78b4bd1a95c86c2159242bf094440df3de5a7 Mon Sep 17 00:00:00 2001 From: damienbod Date: Tue, 10 Sep 2024 09:57:32 +0200 Subject: [PATCH 03/28] Update NEST to new elastic client --- AuditTrail/AuditTrail.csproj | 5 +- AuditTrail/AuditTrailExtensions.cs | 1 + AuditTrail/AuditTrailProvider.cs | 75 ++++++++++++------------------ AuditTrail/IAuditTrailProvider.cs | 7 +-- 4 files changed, 36 insertions(+), 52 deletions(-) diff --git a/AuditTrail/AuditTrail.csproj b/AuditTrail/AuditTrail.csproj index 3f2f09c..57efda7 100644 --- a/AuditTrail/AuditTrail.csproj +++ b/AuditTrail/AuditTrail.csproj @@ -5,14 +5,11 @@ + - - - - diff --git a/AuditTrail/AuditTrailExtensions.cs b/AuditTrail/AuditTrailExtensions.cs index 0505af4..bf5ef47 100644 --- a/AuditTrail/AuditTrailExtensions.cs +++ b/AuditTrail/AuditTrailExtensions.cs @@ -35,6 +35,7 @@ public static IServiceCollection AddAuditTrail( { services.Configure(setupAction); } + return services; } } diff --git a/AuditTrail/AuditTrailProvider.cs b/AuditTrail/AuditTrailProvider.cs index f11a3a6..a3932ba 100644 --- a/AuditTrail/AuditTrailProvider.cs +++ b/AuditTrail/AuditTrailProvider.cs @@ -1,58 +1,51 @@ using AuditTrail.Model; -using Elasticsearch.Net; +using Elastic.Clients.Elasticsearch; using Microsoft.Extensions.Options; -using Nest; using System; using System.Collections.Generic; using System.Linq; +using Elastic.Transport; +using System.Threading.Tasks; namespace AuditTrail; public class AuditTrailProvider : IAuditTrailProvider where T : class { private const string _alias = "auditlog"; - private string _indexName = $"{_alias}-{DateTime.UtcNow.ToString("yyyy-MM-dd")}"; - private static Field TimestampField = new Field("timestamp"); + private string _indexName = $"{_alias}-{DateTime.UtcNow:yyyy-MM-dd}"; + private static Field TimestampField = new("timestamp"); private readonly IOptions _options; - private ElasticClient _elasticClient { get; } + private ElasticsearchClient _elasticsearchClient { get; } - public AuditTrailProvider( - IOptions auditTrailOptions) + public AuditTrailProvider(IOptions auditTrailOptions) { _options = auditTrailOptions ?? throw new ArgumentNullException(nameof(auditTrailOptions)); if(_options.Value.IndexPerMonth) { - _indexName = $"{_alias}-{DateTime.UtcNow.ToString("yyyy-MM")}"; + _indexName = $"{_alias}-{DateTime.UtcNow:yyyy-MM}"; } - var pool = new StaticConnectionPool(new List { new Uri("http://localhost:9200") }); + var settings = new ElasticsearchClientSettings(new Uri("https://localhost:9200")) + .Authentication(new BasicAuthentication("elastic", "Password1!")) + .DefaultMappingFor(m => m.IndexName(_indexName)); - var connectionSettings = new ConnectionSettings(pool) - .DefaultMappingFor(m => m - .IndexName(_indexName)); - - - //new HttpConnection(), - //new SerializerFactory((jsonSettings, nestSettings) => jsonSettings.Converters.Add(new StringEnumConverter()))) - //.DisableDirectStreaming(); - - _elasticClient = new ElasticClient(connectionSettings); + var _elasticsearchClient = new ElasticsearchClient(settings); } - public void AddLog(T auditTrailLog) + public async Task AddLog(T auditTrailLog) { var indexRequest = new IndexRequest(auditTrailLog); - var response = _elasticClient.Index(indexRequest); - if (!response.IsValid) + var response = await _elasticsearchClient.IndexAsync(indexRequest); + if (!response.IsValidResponse) { - throw new ElasticsearchClientException("Add auditlog disaster!"); + throw new ArgumentException("Add auditlog disaster!"); } } - public long Count(string filter = "*") + public async Task Count(string filter = "*") { EnsureAlias(); var searchRequest = new SearchRequest(Indices.Parse(_alias)) @@ -70,12 +63,12 @@ public long Count(string filter = "*") } }; - var searchResponse = _elasticClient.Search(searchRequest); + var searchResponse = await _elasticsearchClient.SearchAsync(searchRequest); return searchResponse.Total; } - public IEnumerable QueryAuditLogs(string filter = "*", AuditTrailPaging auditTrailPaging = null) + public async Task> QueryAuditLogs(string filter = "*", AuditTrailPaging auditTrailPaging = null) { var from = 0; var size = 10; @@ -106,26 +99,22 @@ public IEnumerable QueryAuditLogs(string filter = "*", AuditTrailPaging audit } }; - var searchResponse = _elasticClient.Search(searchRequest); + var searchResponse = await _elasticsearchClient.SearchAsync(searchRequest); return searchResponse.Documents; } private void CreateAliasForAllIndices() { - var response = _elasticClient.Indices.AliasExists(new AliasExistsRequest(new Names(new List { _alias }))); - //if (!response.IsValid) - //{ - // throw response.OriginalException; - //} + var response = _elasticsearchClient.Indices.AliasExists(new AliasExistsRequest(new Names(new List { _alias }))); if (response.Exists) { - _elasticClient.Indices.DeleteAlias(new DeleteAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); + _elasticsearchClient.Indices.DeleteAlias(new DeleteAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); } - var responseCreateIndex = _elasticClient.Indices.PutAlias(new PutAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); - if (!responseCreateIndex.IsValid) + var responseCreateIndex = _elasticsearchClient.Indices.PutAlias(new PutAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); + if (!responseCreateIndex.IsValidResponse) { throw response.OriginalException; } @@ -145,14 +134,14 @@ private void CreateAlias() private void CreateAliasForLastNIndices(int amount) { - var responseCatIndices = _elasticClient.Cat.Indices(new CatIndicesRequest(Indices.Parse($"{_alias}-*"))); + var responseCatIndices = _elasticsearchClient.Cat.Indices(new CatIndicesRequest(Indices.Parse($"{_alias}-*"))); var records = responseCatIndices.Records.ToList(); List indicesToAddToAlias = new List(); for(int i = amount;i>0;i--) { if (_options.Value.IndexPerMonth) { - var indexName = $"{_alias}-{DateTime.UtcNow.AddMonths(-i + 1).ToString("yyyy-MM")}"; + var indexName = $"{_alias}-{DateTime.UtcNow.AddMonths(-i + 1):yyyy-MM}"; if(records.Exists(t => t.Index == indexName)) { indicesToAddToAlias.Add(indexName); @@ -168,20 +157,16 @@ private void CreateAliasForLastNIndices(int amount) } } - var response = _elasticClient.Indices.AliasExists(new AliasExistsRequest(new Names(new List { _alias }))); - //if (!response.IsValid) - //{ - // throw response.OriginalException; - //} + var response = _elasticsearchClient.Indices.AliasExists(new AliasExistsRequest(new Names(new List { _alias }))); if (response.Exists) { - _elasticClient.Indices.DeleteAlias(new DeleteAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); + _elasticsearchClient.Indices.DeleteAlias(new DeleteAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); } Indices multipleIndicesFromStringArray = indicesToAddToAlias.ToArray(); - var responseCreateIndex = _elasticClient.Indices.PutAlias(new PutAliasRequest(multipleIndicesFromStringArray, _alias)); - if (!responseCreateIndex.IsValid) + var responseCreateIndex = _elasticsearchClient.Indices.PutAlias(new PutAliasRequest(multipleIndicesFromStringArray, _alias)); + if (!responseCreateIndex.IsValidResponse) { throw responseCreateIndex.OriginalException; } diff --git a/AuditTrail/IAuditTrailProvider.cs b/AuditTrail/IAuditTrailProvider.cs index 3e55192..9722a25 100644 --- a/AuditTrail/IAuditTrailProvider.cs +++ b/AuditTrail/IAuditTrailProvider.cs @@ -1,13 +1,14 @@ using AuditTrail.Model; using System.Collections.Generic; +using System.Threading.Tasks; namespace AuditTrail; public interface IAuditTrailProvider { - void AddLog(T auditTrailLog); + Task AddLog(T auditTrailLog); - IEnumerable QueryAuditLogs(string filter = "*", AuditTrailPaging auditTrailPaging = null); + Task > QueryAuditLogs(string filter = "*", AuditTrailPaging auditTrailPaging = null); - long Count(string filter); + Task Count(string filter); } From 30583f453a631876fb534e57b6f2648243e9e347 Mon Sep 17 00:00:00 2001 From: damienbod Date: Tue, 10 Sep 2024 13:26:17 +0200 Subject: [PATCH 04/28] elastic update --- AuditTrail/AuditTrailProvider.cs | 82 +++++++++++++++++-------------- AuditTrail/Model/AuditTrailLog.cs | 3 +- 2 files changed, 46 insertions(+), 39 deletions(-) diff --git a/AuditTrail/AuditTrailProvider.cs b/AuditTrail/AuditTrailProvider.cs index a3932ba..a8f8614 100644 --- a/AuditTrail/AuditTrailProvider.cs +++ b/AuditTrail/AuditTrailProvider.cs @@ -1,5 +1,7 @@ using AuditTrail.Model; using Elastic.Clients.Elasticsearch; +using Elastic.Clients.Elasticsearch.QueryDsl; +using Elastic.Clients.Elasticsearch.IndexManagement; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; @@ -47,20 +49,19 @@ public async Task AddLog(T auditTrailLog) public async Task Count(string filter = "*") { - EnsureAlias(); + await EnsureAlias(); + var searchRequest = new SearchRequest(Indices.Parse(_alias)) { - Size = 0, - Query = new QueryContainer( - new SimpleQueryStringQuery - { - Query = filter - } - ), - Sort = new List - { - new FieldSort { Field = TimestampField, Order = SortOrder.Descending } - } + Size = 0, + Query = new SimpleQueryStringQuery + { + Query = filter + }, + Sort = new List + { + new FieldSort { Field = TimestampField, Order = SortOrder.Desc } + } }; var searchResponse = await _elasticsearchClient.SearchAsync(searchRequest); @@ -72,7 +73,8 @@ public async Task> QueryAuditLogs(string filter = "*", AuditTrail { var from = 0; var size = 10; - EnsureAlias(); + await EnsureAlias(); + if(auditTrailPaging != null) { from = auditTrailPaging.Skip; @@ -87,16 +89,14 @@ public async Task> QueryAuditLogs(string filter = "*", AuditTrail { Size = size, From = from, - Query = new QueryContainer( - new SimpleQueryStringQuery - { - Query = filter - } - ), - Sort = new List - { - new FieldSort { Field = TimestampField, Order = SortOrder.Descending } - } + Query = new SimpleQueryStringQuery + { + Query = filter + }, + Sort = new List + { + new FieldSort { Field = TimestampField, Order = SortOrder.Desc } + } }; var searchResponse = await _elasticsearchClient.SearchAsync(searchRequest); @@ -104,39 +104,43 @@ public async Task> QueryAuditLogs(string filter = "*", AuditTrail return searchResponse.Documents; } - private void CreateAliasForAllIndices() + private async Task CreateAliasForAllIndicesAsync() { var response = _elasticsearchClient.Indices.AliasExists(new AliasExistsRequest(new Names(new List { _alias }))); if (response.Exists) { - _elasticsearchClient.Indices.DeleteAlias(new DeleteAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); + await _elasticsearchClient.Indices + .DeleteAliasAsync(new DeleteAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); } - var responseCreateIndex = _elasticsearchClient.Indices.PutAlias(new PutAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); + var responseCreateIndex = await _elasticsearchClient.Indices + .PutAliasAsync(new PutAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); + if (!responseCreateIndex.IsValidResponse) { throw response.OriginalException; } } - private void CreateAlias() + private async Task CreateAlias() { if (_options.Value.AmountOfPreviousIndicesUsedInAlias > 0) { - CreateAliasForLastNIndices(_options.Value.AmountOfPreviousIndicesUsedInAlias); + await CreateAliasForLastNIndicesAsync(_options.Value.AmountOfPreviousIndicesUsedInAlias); } else { - CreateAliasForAllIndices(); + await CreateAliasForAllIndicesAsync(); } } - private void CreateAliasForLastNIndices(int amount) + private async Task CreateAliasForLastNIndicesAsync(int amount) { var responseCatIndices = _elasticsearchClient.Cat.Indices(new CatIndicesRequest(Indices.Parse($"{_alias}-*"))); var records = responseCatIndices.Records.ToList(); - List indicesToAddToAlias = new List(); + var indicesToAddToAlias = new List(); + for(int i = amount;i>0;i--) { if (_options.Value.IndexPerMonth) @@ -149,7 +153,7 @@ private void CreateAliasForLastNIndices(int amount) } else { - var indexName = $"{_alias}-{DateTime.UtcNow.AddDays(-i + 1).ToString("yyyy-MM-dd")}"; + var indexName = $"{_alias}-{DateTime.UtcNow.AddDays(-i + 1):yyyy-MM-dd}"; if (records.Exists(t => t.Index == indexName)) { indicesToAddToAlias.Add(indexName); @@ -161,11 +165,15 @@ private void CreateAliasForLastNIndices(int amount) if (response.Exists) { - _elasticsearchClient.Indices.DeleteAlias(new DeleteAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); + await _elasticsearchClient.Indices + .DeleteAliasAsync(new DeleteAliasRequest(Indices.Parse($"{_alias}-*"), _alias)); } Indices multipleIndicesFromStringArray = indicesToAddToAlias.ToArray(); - var responseCreateIndex = _elasticsearchClient.Indices.PutAlias(new PutAliasRequest(multipleIndicesFromStringArray, _alias)); + + var responseCreateIndex = await _elasticsearchClient.Indices + .PutAliasAsync(new PutAliasRequest(multipleIndicesFromStringArray, _alias)); + if (!responseCreateIndex.IsValidResponse) { throw responseCreateIndex.OriginalException; @@ -174,14 +182,14 @@ private void CreateAliasForLastNIndices(int amount) private static DateTime aliasUpdated = DateTime.UtcNow.AddYears(-50); - private void EnsureAlias() + private async Task EnsureAlias() { if (_options.Value.IndexPerMonth) { if (aliasUpdated.Date < DateTime.UtcNow.AddMonths(-1).Date) { aliasUpdated = DateTime.UtcNow; - CreateAlias(); + await CreateAlias(); } } else @@ -189,7 +197,7 @@ private void EnsureAlias() if (aliasUpdated.Date < DateTime.UtcNow.AddDays(-1).Date) { aliasUpdated = DateTime.UtcNow; - CreateAlias(); + await CreateAlias(); } } } diff --git a/AuditTrail/Model/AuditTrailLog.cs b/AuditTrail/Model/AuditTrailLog.cs index ad097dd..b87043c 100644 --- a/AuditTrail/Model/AuditTrailLog.cs +++ b/AuditTrail/Model/AuditTrailLog.cs @@ -1,5 +1,4 @@ -using Nest; -using System; +using System; namespace AuditTrail.Model; From a1e7e09f82de3bcc48dd618c920c8afbbe27dfcc Mon Sep 17 00:00:00 2001 From: damienbod Date: Tue, 10 Sep 2024 13:28:28 +0200 Subject: [PATCH 05/28] elastic .NET update --- AuditTrail/AuditTrailProvider.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/AuditTrail/AuditTrailProvider.cs b/AuditTrail/AuditTrailProvider.cs index a8f8614..accd444 100644 --- a/AuditTrail/AuditTrailProvider.cs +++ b/AuditTrail/AuditTrailProvider.cs @@ -106,7 +106,8 @@ public async Task> QueryAuditLogs(string filter = "*", AuditTrail private async Task CreateAliasForAllIndicesAsync() { - var response = _elasticsearchClient.Indices.AliasExists(new AliasExistsRequest(new Names(new List { _alias }))); + var response = await _elasticsearchClient.Indices + .ExistsAliasAsync(new ExistsAliasRequest(new Names(new List { _alias }))); if (response.Exists) { @@ -161,7 +162,8 @@ private async Task CreateAliasForLastNIndicesAsync(int amount) } } - var response = _elasticsearchClient.Indices.AliasExists(new AliasExistsRequest(new Names(new List { _alias }))); + var response = await _elasticsearchClient.Indices + .ExistsAliasAsync(new ExistsAliasRequest(new Names(new List { _alias }))); if (response.Exists) { From dc58d98bfa4b1df7821f7e127e80b9ec7abbf25b Mon Sep 17 00:00:00 2001 From: damienbod Date: Tue, 10 Sep 2024 13:30:53 +0200 Subject: [PATCH 06/28] update elastic client --- AuditTrail/AuditTrailProvider.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/AuditTrail/AuditTrailProvider.cs b/AuditTrail/AuditTrailProvider.cs index accd444..94bb951 100644 --- a/AuditTrail/AuditTrailProvider.cs +++ b/AuditTrail/AuditTrailProvider.cs @@ -120,7 +120,8 @@ await _elasticsearchClient.Indices if (!responseCreateIndex.IsValidResponse) { - throw response.OriginalException; + var res = responseCreateIndex.TryGetOriginalException(out var ex); + throw ex; } } @@ -178,7 +179,8 @@ await _elasticsearchClient.Indices if (!responseCreateIndex.IsValidResponse) { - throw responseCreateIndex.OriginalException; + var res = responseCreateIndex.TryGetOriginalException(out var ex); + throw ex; } } From 2f7af1117dd9713c64c37f8b18b36418b50c0847 Mon Sep 17 00:00:00 2001 From: damienbod Date: Tue, 10 Sep 2024 13:42:02 +0200 Subject: [PATCH 07/28] elastic update --- AuditTrail/AuditTrailProvider.cs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/AuditTrail/AuditTrailProvider.cs b/AuditTrail/AuditTrailProvider.cs index 94bb951..3b73d3b 100644 --- a/AuditTrail/AuditTrailProvider.cs +++ b/AuditTrail/AuditTrailProvider.cs @@ -47,6 +47,20 @@ public async Task AddLog(T auditTrailLog) } } + private static List BuildSort() + { + var sorts = new List(); + + var sort= SortOptions.Field(TimestampField, new FieldSort + { + Order = SortOrder.Desc + }); + + sorts.Add(sort); + + return sorts; + } + public async Task Count(string filter = "*") { await EnsureAlias(); @@ -58,10 +72,7 @@ public async Task Count(string filter = "*") { Query = filter }, - Sort = new List - { - new FieldSort { Field = TimestampField, Order = SortOrder.Desc } - } + Sort = BuildSort() }; var searchResponse = await _elasticsearchClient.SearchAsync(searchRequest); @@ -93,10 +104,7 @@ public async Task> QueryAuditLogs(string filter = "*", AuditTrail { Query = filter }, - Sort = new List - { - new FieldSort { Field = TimestampField, Order = SortOrder.Desc } - } + Sort = BuildSort() }; var searchResponse = await _elasticsearchClient.SearchAsync(searchRequest); From d9ca7da33cfccd6f495d12a06060b718f3c970e6 Mon Sep 17 00:00:00 2001 From: damienbod Date: Tue, 10 Sep 2024 13:44:13 +0200 Subject: [PATCH 08/28] clean up --- .../Controllers/HomeController.cs | 3 +- .../CustomAuditTrailLog.cs | 1 - .../Program.cs | 3 +- .../Startup.cs | 5 +-- .../ViewModels/AuditTrailViewModel.cs | 7 ++-- AuditTrail/AuditTrailExtensions.cs | 6 ++-- AuditTrail/AuditTrailProvider.cs | 34 +++++++++---------- AuditTrail/IAuditTrailProvider.cs | 6 ++-- AuditTrail/Model/AuditTrailOptions.cs | 2 +- 9 files changed, 28 insertions(+), 39 deletions(-) diff --git a/AspNetCoreElasticsearchNestAuditTrail/Controllers/HomeController.cs b/AspNetCoreElasticsearchNestAuditTrail/Controllers/HomeController.cs index e08bffc..9e6731a 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Controllers/HomeController.cs +++ b/AspNetCoreElasticsearchNestAuditTrail/Controllers/HomeController.cs @@ -2,7 +2,6 @@ using AuditTrail; using AuditTrail.Model; using Microsoft.AspNetCore.Mvc; -using System; using System.Linq; namespace AspNetCoreElasticsearchNestAuditTrail.Controllers @@ -73,7 +72,7 @@ public IActionResult AuditTrailSearch(string searchString, int skip, int amount) }; auditTrailViewModel.AuditTrailLogs = _auditTrailProvider.QueryAuditLogs(searchString, paging).ToList(); - + return View(auditTrailViewModel); } diff --git a/AspNetCoreElasticsearchNestAuditTrail/CustomAuditTrailLog.cs b/AspNetCoreElasticsearchNestAuditTrail/CustomAuditTrailLog.cs index 61d65c5..6d1c55a 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/CustomAuditTrailLog.cs +++ b/AspNetCoreElasticsearchNestAuditTrail/CustomAuditTrailLog.cs @@ -1,5 +1,4 @@ using AuditTrail.Model; -using Nest; using System; namespace AspNetCoreElasticsearchNestAuditTrail diff --git a/AspNetCoreElasticsearchNestAuditTrail/Program.cs b/AspNetCoreElasticsearchNestAuditTrail/Program.cs index 38b1fd3..fc4f74f 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Program.cs +++ b/AspNetCoreElasticsearchNestAuditTrail/Program.cs @@ -1,5 +1,4 @@ -using Microsoft.AspNetCore; -using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; namespace AspNetCoreElasticsearchNestAuditTrail diff --git a/AspNetCoreElasticsearchNestAuditTrail/Startup.cs b/AspNetCoreElasticsearchNestAuditTrail/Startup.cs index be2ed95..68fd9e4 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Startup.cs +++ b/AspNetCoreElasticsearchNestAuditTrail/Startup.cs @@ -2,9 +2,6 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using AuditTrail; -using AuditTrail.Model; using Microsoft.Extensions.Hosting; namespace AspNetCoreElasticsearchNestAuditTrail @@ -21,7 +18,7 @@ public void ConfigureServices(IServiceCollection services) { var indexPerMonth = false; var amountOfPreviousIndicesUsedInAlias = 3; - services.AddAuditTrail(options => + services.AddAuditTrail(options => options.UseSettings(indexPerMonth, amountOfPreviousIndicesUsedInAlias) ); diff --git a/AspNetCoreElasticsearchNestAuditTrail/ViewModels/AuditTrailViewModel.cs b/AspNetCoreElasticsearchNestAuditTrail/ViewModels/AuditTrailViewModel.cs index f91b5db..4e45929 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/ViewModels/AuditTrailViewModel.cs +++ b/AspNetCoreElasticsearchNestAuditTrail/ViewModels/AuditTrailViewModel.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +using System.Collections.Generic; namespace AspNetCoreElasticsearchNestAuditTrail.ViewModels { @@ -13,6 +10,6 @@ public class AuditTrailViewModel public int Skip { get; set; } - public string Filter { get; set; } + public string Filter { get; set; } } } diff --git a/AuditTrail/AuditTrailExtensions.cs b/AuditTrail/AuditTrailExtensions.cs index bf5ef47..3263b8a 100644 --- a/AuditTrail/AuditTrailExtensions.cs +++ b/AuditTrail/AuditTrailExtensions.cs @@ -1,7 +1,7 @@ -using System; -using Microsoft.Extensions.DependencyInjection.Extensions; -using AuditTrail; +using AuditTrail; using AuditTrail.Model; +using Microsoft.Extensions.DependencyInjection.Extensions; +using System; namespace Microsoft.Extensions.DependencyInjection; diff --git a/AuditTrail/AuditTrailProvider.cs b/AuditTrail/AuditTrailProvider.cs index 3b73d3b..3c171c3 100644 --- a/AuditTrail/AuditTrailProvider.cs +++ b/AuditTrail/AuditTrailProvider.cs @@ -1,12 +1,12 @@ using AuditTrail.Model; using Elastic.Clients.Elasticsearch; -using Elastic.Clients.Elasticsearch.QueryDsl; using Elastic.Clients.Elasticsearch.IndexManagement; +using Elastic.Clients.Elasticsearch.QueryDsl; +using Elastic.Transport; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using System.Linq; -using Elastic.Transport; using System.Threading.Tasks; namespace AuditTrail; @@ -14,7 +14,7 @@ namespace AuditTrail; public class AuditTrailProvider : IAuditTrailProvider where T : class { private const string _alias = "auditlog"; - private string _indexName = $"{_alias}-{DateTime.UtcNow:yyyy-MM-dd}"; + private readonly string _indexName = $"{_alias}-{DateTime.UtcNow:yyyy-MM-dd}"; private static Field TimestampField = new("timestamp"); private readonly IOptions _options; @@ -24,7 +24,7 @@ public AuditTrailProvider(IOptions auditTrailOptions) { _options = auditTrailOptions ?? throw new ArgumentNullException(nameof(auditTrailOptions)); - if(_options.Value.IndexPerMonth) + if (_options.Value.IndexPerMonth) { _indexName = $"{_alias}-{DateTime.UtcNow:yyyy-MM}"; } @@ -51,7 +51,7 @@ private static List BuildSort() { var sorts = new List(); - var sort= SortOptions.Field(TimestampField, new FieldSort + var sort = SortOptions.Field(TimestampField, new FieldSort { Order = SortOrder.Desc }); @@ -67,7 +67,7 @@ public async Task Count(string filter = "*") var searchRequest = new SearchRequest(Indices.Parse(_alias)) { - Size = 0, + Size = 0, Query = new SimpleQueryStringQuery { Query = filter @@ -86,11 +86,11 @@ public async Task> QueryAuditLogs(string filter = "*", AuditTrail var size = 10; await EnsureAlias(); - if(auditTrailPaging != null) + if (auditTrailPaging != null) { from = auditTrailPaging.Skip; size = auditTrailPaging.Size; - if(size > 1000) + if (size > 1000) { // max limit 1000 items size = 1000; @@ -151,19 +151,19 @@ private async Task CreateAliasForLastNIndicesAsync(int amount) var records = responseCatIndices.Records.ToList(); var indicesToAddToAlias = new List(); - for(int i = amount;i>0;i--) + for (int i = amount; i > 0; i--) { if (_options.Value.IndexPerMonth) { var indexName = $"{_alias}-{DateTime.UtcNow.AddMonths(-i + 1):yyyy-MM}"; - if(records.Exists(t => t.Index == indexName)) + if (records.Exists(t => t.Index == indexName)) { indicesToAddToAlias.Add(indexName); } } else { - var indexName = $"{_alias}-{DateTime.UtcNow.AddDays(-i + 1):yyyy-MM-dd}"; + var indexName = $"{_alias}-{DateTime.UtcNow.AddDays(-i + 1):yyyy-MM-dd}"; if (records.Exists(t => t.Index == indexName)) { indicesToAddToAlias.Add(indexName); @@ -204,13 +204,11 @@ private async Task EnsureAlias() await CreateAlias(); } } - else + else if (aliasUpdated.Date < DateTime.UtcNow.AddDays(-1).Date) { - if (aliasUpdated.Date < DateTime.UtcNow.AddDays(-1).Date) - { - aliasUpdated = DateTime.UtcNow; - await CreateAlias(); - } - } + aliasUpdated = DateTime.UtcNow; + await CreateAlias(); + } + } } diff --git a/AuditTrail/IAuditTrailProvider.cs b/AuditTrail/IAuditTrailProvider.cs index 9722a25..9c731dc 100644 --- a/AuditTrail/IAuditTrailProvider.cs +++ b/AuditTrail/IAuditTrailProvider.cs @@ -4,11 +4,11 @@ namespace AuditTrail; - public interface IAuditTrailProvider - { +public interface IAuditTrailProvider +{ Task AddLog(T auditTrailLog); - Task > QueryAuditLogs(string filter = "*", AuditTrailPaging auditTrailPaging = null); + Task> QueryAuditLogs(string filter = "*", AuditTrailPaging auditTrailPaging = null); Task Count(string filter); } diff --git a/AuditTrail/Model/AuditTrailOptions.cs b/AuditTrail/Model/AuditTrailOptions.cs index f7047ec..e929884 100644 --- a/AuditTrail/Model/AuditTrailOptions.cs +++ b/AuditTrail/Model/AuditTrailOptions.cs @@ -4,7 +4,7 @@ public class AuditTrailOptions { public bool IndexPerMonth { get; set; } - public int AmountOfPreviousIndicesUsedInAlias { get; set; } + public int AmountOfPreviousIndicesUsedInAlias { get; set; } public void UseSettings(bool indexPerMonth, int amountOfPreviousIndicesUsedInAlias) { From 123d761b50978ac16e6d550c4db2b0541011a1b1 Mon Sep 17 00:00:00 2001 From: damienbod Date: Tue, 10 Sep 2024 14:25:36 +0200 Subject: [PATCH 09/28] Update audit log --- .../Controllers/HomeController.cs | 13 +++++++------ .../CustomAuditTrailLog.cs | 3 ++- AuditTrail/AuditTrailExtensions.cs | 10 ++-------- AuditTrail/AuditTrailProvider.cs | 18 ++++++++++-------- AuditTrail/Model/AuditTrailLog.cs | 3 ++- 5 files changed, 23 insertions(+), 24 deletions(-) diff --git a/AspNetCoreElasticsearchNestAuditTrail/Controllers/HomeController.cs b/AspNetCoreElasticsearchNestAuditTrail/Controllers/HomeController.cs index 9e6731a..4799e30 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Controllers/HomeController.cs +++ b/AspNetCoreElasticsearchNestAuditTrail/Controllers/HomeController.cs @@ -3,6 +3,7 @@ using AuditTrail.Model; using Microsoft.AspNetCore.Mvc; using System.Linq; +using System.Threading.Tasks; namespace AspNetCoreElasticsearchNestAuditTrail.Controllers { @@ -30,7 +31,7 @@ public IActionResult Index() return View(); } - public IActionResult AuditTrail() + public async Task AuditTrailAsync() { var auditTrailLog = new CustomAuditTrailLog() { @@ -40,12 +41,12 @@ public IActionResult AuditTrail() Log = "user clicked the audit trail nav." }; - _auditTrailProvider.AddLog(auditTrailLog); + await _auditTrailProvider.AddLog(auditTrailLog); ViewData["Message"] = "Your application description page."; var auditTrailViewModel = new AuditTrailViewModel { - AuditTrailLogs = _auditTrailProvider.QueryAuditLogs().ToList(), + AuditTrailLogs = (await _auditTrailProvider.QueryAuditLogs()).ToList(), Filter = "*", Skip = 0, Size = 10 @@ -53,7 +54,7 @@ public IActionResult AuditTrail() return View(auditTrailViewModel); } - public IActionResult AuditTrailSearch(string searchString, int skip, int amount) + public async Task AuditTrailSearchAsync(string searchString, int skip, int amount) { var auditTrailViewModel = new AuditTrailViewModel @@ -71,12 +72,12 @@ public IActionResult AuditTrailSearch(string searchString, int skip, int amount) Skip = skip }; - auditTrailViewModel.AuditTrailLogs = _auditTrailProvider.QueryAuditLogs(searchString, paging).ToList(); + auditTrailViewModel.AuditTrailLogs = (await _auditTrailProvider.QueryAuditLogs(searchString, paging)).ToList(); return View(auditTrailViewModel); } - auditTrailViewModel.AuditTrailLogs = _auditTrailProvider.QueryAuditLogs(searchString).ToList(); + auditTrailViewModel.AuditTrailLogs = (await _auditTrailProvider.QueryAuditLogs(searchString)).ToList(); return View(auditTrailViewModel); } diff --git a/AspNetCoreElasticsearchNestAuditTrail/CustomAuditTrailLog.cs b/AspNetCoreElasticsearchNestAuditTrail/CustomAuditTrailLog.cs index 6d1c55a..ad624ee 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/CustomAuditTrailLog.cs +++ b/AspNetCoreElasticsearchNestAuditTrail/CustomAuditTrailLog.cs @@ -12,7 +12,8 @@ public CustomAuditTrailLog() public DateTime Timestamp { get; set; } - [Keyword] + // TODO add elastic keyword definition for the property + //[Keyword] public string Action { get; set; } public string Log { get; set; } diff --git a/AuditTrail/AuditTrailExtensions.cs b/AuditTrail/AuditTrailExtensions.cs index 3263b8a..d82b9f4 100644 --- a/AuditTrail/AuditTrailExtensions.cs +++ b/AuditTrail/AuditTrailExtensions.cs @@ -9,10 +9,7 @@ public static class AuditTrailExtensions { public static IServiceCollection AddAuditTrail(this IServiceCollection services) where T : class, IAuditTrailLog { - if (services == null) - { - throw new ArgumentNullException(nameof(services)); - } + ArgumentNullException.ThrowIfNull(services); return AddAuditTrail(services, setupAction: null); } @@ -21,10 +18,7 @@ public static IServiceCollection AddAuditTrail( this IServiceCollection services, Action setupAction) where T : class, IAuditTrailLog { - if (services == null) - { - throw new ArgumentNullException(nameof(services)); - } + ArgumentNullException.ThrowIfNull(services); services.TryAdd(new ServiceDescriptor( typeof(IAuditTrailProvider), diff --git a/AuditTrail/AuditTrailProvider.cs b/AuditTrail/AuditTrailProvider.cs index 3c171c3..c43b80c 100644 --- a/AuditTrail/AuditTrailProvider.cs +++ b/AuditTrail/AuditTrailProvider.cs @@ -1,6 +1,7 @@ using AuditTrail.Model; using Elastic.Clients.Elasticsearch; using Elastic.Clients.Elasticsearch.IndexManagement; +using Elastic.Clients.Elasticsearch.Nodes; using Elastic.Clients.Elasticsearch.QueryDsl; using Elastic.Transport; using Microsoft.Extensions.Options; @@ -15,10 +16,9 @@ public class AuditTrailProvider : IAuditTrailProvider where T : class { private const string _alias = "auditlog"; private readonly string _indexName = $"{_alias}-{DateTime.UtcNow:yyyy-MM-dd}"; - private static Field TimestampField = new("timestamp"); + private readonly static Field TimestampField = new("timestamp"); private readonly IOptions _options; - - private ElasticsearchClient _elasticsearchClient { get; } + private readonly ElasticsearchClient _elasticsearchClient; public AuditTrailProvider(IOptions auditTrailOptions) { @@ -128,7 +128,7 @@ await _elasticsearchClient.Indices if (!responseCreateIndex.IsValidResponse) { - var res = responseCreateIndex.TryGetOriginalException(out var ex); + responseCreateIndex.TryGetOriginalException(out var ex); throw ex; } } @@ -147,8 +147,10 @@ private async Task CreateAlias() private async Task CreateAliasForLastNIndicesAsync(int amount) { - var responseCatIndices = _elasticsearchClient.Cat.Indices(new CatIndicesRequest(Indices.Parse($"{_alias}-*"))); - var records = responseCatIndices.Records.ToList(); + var responseCatIndices = await _elasticsearchClient + .Indices.GetAsync(new GetIndexRequest(Indices.Parse($"{_alias}-*"))); + var records = responseCatIndices.Indices.ToList(); + var indicesToAddToAlias = new List(); for (int i = amount; i > 0; i--) @@ -156,7 +158,7 @@ private async Task CreateAliasForLastNIndicesAsync(int amount) if (_options.Value.IndexPerMonth) { var indexName = $"{_alias}-{DateTime.UtcNow.AddMonths(-i + 1):yyyy-MM}"; - if (records.Exists(t => t.Index == indexName)) + if (records.Exists(t => t.Key == indexName)) { indicesToAddToAlias.Add(indexName); } @@ -164,7 +166,7 @@ private async Task CreateAliasForLastNIndicesAsync(int amount) else { var indexName = $"{_alias}-{DateTime.UtcNow.AddDays(-i + 1):yyyy-MM-dd}"; - if (records.Exists(t => t.Index == indexName)) + if (records.Exists(t => t.Key == indexName)) { indicesToAddToAlias.Add(indexName); } diff --git a/AuditTrail/Model/AuditTrailLog.cs b/AuditTrail/Model/AuditTrailLog.cs index b87043c..220f535 100644 --- a/AuditTrail/Model/AuditTrailLog.cs +++ b/AuditTrail/Model/AuditTrailLog.cs @@ -11,7 +11,8 @@ public AuditTrailLog() public DateTime Timestamp { get; set; } - [Keyword] + // TODO add elastic keyword definition for the property + //[Keyword] public string Action { get; set; } public string Log { get; set; } From c0eed3512ba662ccedc3dcde0aca9fd2799c9c6b Mon Sep 17 00:00:00 2001 From: damienbod Date: Tue, 10 Sep 2024 14:44:57 +0200 Subject: [PATCH 10/28] test --- AuditTrail/AuditTrailProvider.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/AuditTrail/AuditTrailProvider.cs b/AuditTrail/AuditTrailProvider.cs index c43b80c..ed4264e 100644 --- a/AuditTrail/AuditTrailProvider.cs +++ b/AuditTrail/AuditTrailProvider.cs @@ -18,7 +18,7 @@ public class AuditTrailProvider : IAuditTrailProvider where T : class private readonly string _indexName = $"{_alias}-{DateTime.UtcNow:yyyy-MM-dd}"; private readonly static Field TimestampField = new("timestamp"); private readonly IOptions _options; - private readonly ElasticsearchClient _elasticsearchClient; + private ElasticsearchClient _elasticsearchClient; public AuditTrailProvider(IOptions auditTrailOptions) { @@ -38,6 +38,12 @@ public AuditTrailProvider(IOptions auditTrailOptions) public async Task AddLog(T auditTrailLog) { + var settings = new ElasticsearchClientSettings(new Uri("https://localhost:9200")) + .Authentication(new BasicAuthentication("elastic", "Password1!")) + .DefaultMappingFor(m => m.IndexName(_indexName)); + + var _elasticsearchClient = new ElasticsearchClient(settings); + var indexRequest = new IndexRequest(auditTrailLog); var response = await _elasticsearchClient.IndexAsync(indexRequest); From 427758856a9962cb0f689da0f028e1e2dac4f236 Mon Sep 17 00:00:00 2001 From: damienbod Date: Tue, 10 Sep 2024 14:49:18 +0200 Subject: [PATCH 11/28] sln update --- AspNetCoreElasticsearchNestAuditTrail.sln | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/AspNetCoreElasticsearchNestAuditTrail.sln b/AspNetCoreElasticsearchNestAuditTrail.sln index 8646aaf..a9c49c6 100644 --- a/AspNetCoreElasticsearchNestAuditTrail.sln +++ b/AspNetCoreElasticsearchNestAuditTrail.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26206.0 +# Visual Studio Version 17 +VisualStudioVersion = 17.10.35201.131 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AspNetCoreElasticsearchNestAuditTrail", "AspNetCoreElasticsearchNestAuditTrail\AspNetCoreElasticsearchNestAuditTrail.csproj", "{EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}" EndProject @@ -9,6 +9,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AuditTrail", "AuditTrail\Au EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{00A97214-B91A-4C81-AB9D-7980AB63592C}" ProjectSection(SolutionItems) = preProject + .github\workflows\dotnet.yml = .github\workflows\dotnet.yml README.md = README.md EndProjectSection EndProject From e99e72711e08fa9613ac5b717c406fbc5fa01964 Mon Sep 17 00:00:00 2001 From: damienbod Date: Tue, 10 Sep 2024 14:50:09 +0200 Subject: [PATCH 12/28] readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 783a189..923a54a 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ https://damienbod.com/2017/02/28/implementing-an-audit-trail-using-asp-net-core- ## History +- 2024-09-10 Switched to Elastic.Clients.Elasticsearch, removed Nest, updated to .NET 8 - 2024-09-10 Updated build - 2020-01-12 Updating to .NET Core 3.1 - 2019-02-15 Updating to .NET Core 2.2, Updated NEST breaking changes \ No newline at end of file From a1948b2fea49f36088af8255479b56e93e6e1e3b Mon Sep 17 00:00:00 2001 From: damienbod Date: Tue, 10 Sep 2024 14:53:42 +0200 Subject: [PATCH 13/28] Small renaming --- .gitignore | 3 + ...n => AspNetCoreElasticsearchAuditTrail.sln | 114 ++++----- .../AspNetCoreElasticsearchAuditTrail.csproj | 66 ++--- .../Controllers/HomeController.cs | 232 +++++++++--------- .../CustomAuditTrailLog.cs | 54 ++-- .../Program.cs | 40 +-- .../Properties/launchSettings.json | 52 ++-- .../Startup.cs | 110 ++++----- .../ViewModels/AuditTrailViewModel.cs | 30 +-- .../Views/Home/AuditTrail.cshtml | 114 ++++----- .../Views/Home/AuditTrailSearch.cshtml | 106 ++++---- .../Views/Home/Contact.cshtml | 12 +- .../Views/Home/Index.cshtml | 16 +- .../Views/Shared/Error.cshtml | 28 +-- .../Views/Shared/_Layout.cshtml | 94 +++---- .../Shared/_ValidationScriptsPartial.cshtml | 0 .../Views/_ViewImports.cshtml | 4 +- .../Views/_ViewStart.cshtml | 6 +- .../appsettings.Development.json | 20 +- .../appsettings.json | 16 +- .../bundleconfig.json | 122 ++++----- .../package-lock.json | 0 .../package.json | 28 +-- .../wwwroot/css/vendor.min.css | 7 + .../wwwroot/js/vendor-validation.min.js | 8 + .../wwwroot/js/vendor.min.js | 8 + 26 files changed, 658 insertions(+), 632 deletions(-) rename AspNetCoreElasticsearchNestAuditTrail.sln => AspNetCoreElasticsearchAuditTrail.sln (93%) rename AspNetCoreElasticsearchNestAuditTrail/AspNetCoreElasticsearchNestAuditTrail.csproj => AspNetCoreElasticsearchAuditTrail/AspNetCoreElasticsearchAuditTrail.csproj (97%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/Controllers/HomeController.cs (96%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/CustomAuditTrailLog.cs (95%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/Program.cs (96%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/Properties/launchSettings.json (96%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/Startup.cs (96%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/ViewModels/AuditTrailViewModel.cs (95%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/Views/Home/AuditTrail.cshtml (95%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/Views/Home/AuditTrailSearch.cshtml (95%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/Views/Home/Contact.cshtml (94%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/Views/Home/Index.cshtml (88%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/Views/Shared/Error.cshtml (98%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/Views/Shared/_Layout.cshtml (97%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/Views/Shared/_ValidationScriptsPartial.cshtml (100%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/Views/_ViewImports.cshtml (98%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/Views/_ViewStart.cshtml (91%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/appsettings.Development.json (94%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/appsettings.json (92%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/bundleconfig.json (96%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/package-lock.json (100%) rename {AspNetCoreElasticsearchNestAuditTrail => AspNetCoreElasticsearchAuditTrail}/package.json (95%) create mode 100644 AspNetCoreElasticsearchAuditTrail/wwwroot/css/vendor.min.css create mode 100644 AspNetCoreElasticsearchAuditTrail/wwwroot/js/vendor-validation.min.js create mode 100644 AspNetCoreElasticsearchAuditTrail/wwwroot/js/vendor.min.js diff --git a/.gitignore b/.gitignore index aaef187..c1ef2c4 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ AuditTrail/obj .vs/AspNetCoreElasticsearchNestAuditTrail/v15/.suo .vs /AspNetCoreElasticsearchNestAuditTrail/node_modules/ +*/bin/** +*/obj/** +*/node_modules/** diff --git a/AspNetCoreElasticsearchNestAuditTrail.sln b/AspNetCoreElasticsearchAuditTrail.sln similarity index 93% rename from AspNetCoreElasticsearchNestAuditTrail.sln rename to AspNetCoreElasticsearchAuditTrail.sln index a9c49c6..f545349 100644 --- a/AspNetCoreElasticsearchNestAuditTrail.sln +++ b/AspNetCoreElasticsearchAuditTrail.sln @@ -1,57 +1,57 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.10.35201.131 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AspNetCoreElasticsearchNestAuditTrail", "AspNetCoreElasticsearchNestAuditTrail\AspNetCoreElasticsearchNestAuditTrail.csproj", "{EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AuditTrail", "AuditTrail\AuditTrail.csproj", "{C6225C51-6B38-429C-B9C3-CCE1716779AE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{00A97214-B91A-4C81-AB9D-7980AB63592C}" - ProjectSection(SolutionItems) = preProject - .github\workflows\dotnet.yml = .github\workflows\dotnet.yml - README.md = README.md - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Debug|x64.ActiveCfg = Debug|Any CPU - {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Debug|x64.Build.0 = Debug|Any CPU - {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Debug|x86.ActiveCfg = Debug|Any CPU - {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Debug|x86.Build.0 = Debug|Any CPU - {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Release|Any CPU.Build.0 = Release|Any CPU - {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Release|x64.ActiveCfg = Release|Any CPU - {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Release|x64.Build.0 = Release|Any CPU - {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Release|x86.ActiveCfg = Release|Any CPU - {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Release|x86.Build.0 = Release|Any CPU - {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Debug|x64.ActiveCfg = Debug|Any CPU - {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Debug|x64.Build.0 = Debug|Any CPU - {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Debug|x86.ActiveCfg = Debug|Any CPU - {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Debug|x86.Build.0 = Debug|Any CPU - {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Release|Any CPU.Build.0 = Release|Any CPU - {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Release|x64.ActiveCfg = Release|Any CPU - {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Release|x64.Build.0 = Release|Any CPU - {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Release|x86.ActiveCfg = Release|Any CPU - {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {2D2223FB-A41A-4CC2-B33B-4BB37B993AD2} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.10.35201.131 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AspNetCoreElasticsearchAuditTrail", "AspNetCoreElasticsearchAuditTrail\AspNetCoreElasticsearchAuditTrail.csproj", "{EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AuditTrail", "AuditTrail\AuditTrail.csproj", "{C6225C51-6B38-429C-B9C3-CCE1716779AE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{00A97214-B91A-4C81-AB9D-7980AB63592C}" + ProjectSection(SolutionItems) = preProject + .github\workflows\dotnet.yml = .github\workflows\dotnet.yml + README.md = README.md + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Debug|x64.ActiveCfg = Debug|Any CPU + {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Debug|x64.Build.0 = Debug|Any CPU + {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Debug|x86.ActiveCfg = Debug|Any CPU + {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Debug|x86.Build.0 = Debug|Any CPU + {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Release|Any CPU.Build.0 = Release|Any CPU + {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Release|x64.ActiveCfg = Release|Any CPU + {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Release|x64.Build.0 = Release|Any CPU + {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Release|x86.ActiveCfg = Release|Any CPU + {EDFF2892-F9D3-45BF-BFBE-8E690FCE3C6C}.Release|x86.Build.0 = Release|Any CPU + {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Debug|x64.ActiveCfg = Debug|Any CPU + {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Debug|x64.Build.0 = Debug|Any CPU + {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Debug|x86.ActiveCfg = Debug|Any CPU + {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Debug|x86.Build.0 = Debug|Any CPU + {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Release|Any CPU.Build.0 = Release|Any CPU + {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Release|x64.ActiveCfg = Release|Any CPU + {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Release|x64.Build.0 = Release|Any CPU + {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Release|x86.ActiveCfg = Release|Any CPU + {C6225C51-6B38-429C-B9C3-CCE1716779AE}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {2D2223FB-A41A-4CC2-B33B-4BB37B993AD2} + EndGlobalSection +EndGlobal diff --git a/AspNetCoreElasticsearchNestAuditTrail/AspNetCoreElasticsearchNestAuditTrail.csproj b/AspNetCoreElasticsearchAuditTrail/AspNetCoreElasticsearchAuditTrail.csproj similarity index 97% rename from AspNetCoreElasticsearchNestAuditTrail/AspNetCoreElasticsearchNestAuditTrail.csproj rename to AspNetCoreElasticsearchAuditTrail/AspNetCoreElasticsearchAuditTrail.csproj index 29d5456..c8b86bc 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/AspNetCoreElasticsearchNestAuditTrail.csproj +++ b/AspNetCoreElasticsearchAuditTrail/AspNetCoreElasticsearchAuditTrail.csproj @@ -1,33 +1,33 @@ - - - - net8 - - - - - PreserveNewest - - - - - - - - - - - - - - - - - - - - - - - - + + + + net8 + + + + + PreserveNewest + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AspNetCoreElasticsearchNestAuditTrail/Controllers/HomeController.cs b/AspNetCoreElasticsearchAuditTrail/Controllers/HomeController.cs similarity index 96% rename from AspNetCoreElasticsearchNestAuditTrail/Controllers/HomeController.cs rename to AspNetCoreElasticsearchAuditTrail/Controllers/HomeController.cs index 4799e30..8094d5c 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Controllers/HomeController.cs +++ b/AspNetCoreElasticsearchAuditTrail/Controllers/HomeController.cs @@ -1,116 +1,116 @@ -using AspNetCoreElasticsearchNestAuditTrail.ViewModels; -using AuditTrail; -using AuditTrail.Model; -using Microsoft.AspNetCore.Mvc; -using System.Linq; -using System.Threading.Tasks; - -namespace AspNetCoreElasticsearchNestAuditTrail.Controllers -{ - public class HomeController : Controller - { - private readonly IAuditTrailProvider _auditTrailProvider; - - public HomeController(IAuditTrailProvider auditTrailProvider) - { - _auditTrailProvider = auditTrailProvider; - } - - public IActionResult Index() - { - var auditTrailLog = new CustomAuditTrailLog() - { - User = User.ToString(), - Origin = "HomeController:Index", - Action = "Home GET", - Log = "home page called doing something important enough to be added to the audit log.", - Extra = "yep" - }; - - _auditTrailProvider.AddLog(auditTrailLog); - return View(); - } - - public async Task AuditTrailAsync() - { - var auditTrailLog = new CustomAuditTrailLog() - { - User = User.ToString(), - Origin = "HomeController:About", - Action = "About GET", - Log = "user clicked the audit trail nav." - }; - - await _auditTrailProvider.AddLog(auditTrailLog); - ViewData["Message"] = "Your application description page."; - - var auditTrailViewModel = new AuditTrailViewModel - { - AuditTrailLogs = (await _auditTrailProvider.QueryAuditLogs()).ToList(), - Filter = "*", - Skip = 0, - Size = 10 - }; - return View(auditTrailViewModel); - } - - public async Task AuditTrailSearchAsync(string searchString, int skip, int amount) - { - - var auditTrailViewModel = new AuditTrailViewModel - { - Filter = searchString, - Skip = skip, - Size = amount - }; - - if (skip > 0 || amount > 0) - { - var paging = new AuditTrailPaging - { - Size = amount, - Skip = skip - }; - - auditTrailViewModel.AuditTrailLogs = (await _auditTrailProvider.QueryAuditLogs(searchString, paging)).ToList(); - - return View(auditTrailViewModel); - } - - auditTrailViewModel.AuditTrailLogs = (await _auditTrailProvider.QueryAuditLogs(searchString)).ToList(); - return View(auditTrailViewModel); - } - - public IActionResult Contact() - { - var auditTrailLog = new CustomAuditTrailLog() - { - User = User.ToString(), - Origin = "HomeController:Contact", - Action = "Contact GET", - Log = "user clicked the contact nav." - }; - - _auditTrailProvider.AddLog(auditTrailLog); - ViewData["Message"] = "Your contact page."; - - return View(); - } - - - public IActionResult Error() - { - var auditTrailLog = new CustomAuditTrailLog() - { - User = User.ToString(), - Origin = "HomeController:Error", - Action = "Error GET", - Log = "something has gone wrong" - }; - - _auditTrailProvider.AddLog(auditTrailLog); - ViewData["Message"] = "Your contact page."; - return View(); - } - } -} +using AspNetCoreElasticsearchNestAuditTrail.ViewModels; +using AuditTrail; +using AuditTrail.Model; +using Microsoft.AspNetCore.Mvc; +using System.Linq; +using System.Threading.Tasks; + +namespace AspNetCoreElasticsearchNestAuditTrail.Controllers +{ + public class HomeController : Controller + { + private readonly IAuditTrailProvider _auditTrailProvider; + + public HomeController(IAuditTrailProvider auditTrailProvider) + { + _auditTrailProvider = auditTrailProvider; + } + + public IActionResult Index() + { + var auditTrailLog = new CustomAuditTrailLog() + { + User = User.ToString(), + Origin = "HomeController:Index", + Action = "Home GET", + Log = "home page called doing something important enough to be added to the audit log.", + Extra = "yep" + }; + + _auditTrailProvider.AddLog(auditTrailLog); + return View(); + } + + public async Task AuditTrailAsync() + { + var auditTrailLog = new CustomAuditTrailLog() + { + User = User.ToString(), + Origin = "HomeController:About", + Action = "About GET", + Log = "user clicked the audit trail nav." + }; + + await _auditTrailProvider.AddLog(auditTrailLog); + ViewData["Message"] = "Your application description page."; + + var auditTrailViewModel = new AuditTrailViewModel + { + AuditTrailLogs = (await _auditTrailProvider.QueryAuditLogs()).ToList(), + Filter = "*", + Skip = 0, + Size = 10 + }; + return View(auditTrailViewModel); + } + + public async Task AuditTrailSearchAsync(string searchString, int skip, int amount) + { + + var auditTrailViewModel = new AuditTrailViewModel + { + Filter = searchString, + Skip = skip, + Size = amount + }; + + if (skip > 0 || amount > 0) + { + var paging = new AuditTrailPaging + { + Size = amount, + Skip = skip + }; + + auditTrailViewModel.AuditTrailLogs = (await _auditTrailProvider.QueryAuditLogs(searchString, paging)).ToList(); + + return View(auditTrailViewModel); + } + + auditTrailViewModel.AuditTrailLogs = (await _auditTrailProvider.QueryAuditLogs(searchString)).ToList(); + return View(auditTrailViewModel); + } + + public IActionResult Contact() + { + var auditTrailLog = new CustomAuditTrailLog() + { + User = User.ToString(), + Origin = "HomeController:Contact", + Action = "Contact GET", + Log = "user clicked the contact nav." + }; + + _auditTrailProvider.AddLog(auditTrailLog); + ViewData["Message"] = "Your contact page."; + + return View(); + } + + + public IActionResult Error() + { + var auditTrailLog = new CustomAuditTrailLog() + { + User = User.ToString(), + Origin = "HomeController:Error", + Action = "Error GET", + Log = "something has gone wrong" + }; + + _auditTrailProvider.AddLog(auditTrailLog); + ViewData["Message"] = "Your contact page."; + return View(); + } + } +} diff --git a/AspNetCoreElasticsearchNestAuditTrail/CustomAuditTrailLog.cs b/AspNetCoreElasticsearchAuditTrail/CustomAuditTrailLog.cs similarity index 95% rename from AspNetCoreElasticsearchNestAuditTrail/CustomAuditTrailLog.cs rename to AspNetCoreElasticsearchAuditTrail/CustomAuditTrailLog.cs index ad624ee..68401c1 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/CustomAuditTrailLog.cs +++ b/AspNetCoreElasticsearchAuditTrail/CustomAuditTrailLog.cs @@ -1,27 +1,27 @@ -using AuditTrail.Model; -using System; - -namespace AspNetCoreElasticsearchNestAuditTrail -{ - public class CustomAuditTrailLog : IAuditTrailLog - { - public CustomAuditTrailLog() - { - Timestamp = DateTime.UtcNow; - } - - public DateTime Timestamp { get; set; } - - // TODO add elastic keyword definition for the property - //[Keyword] - public string Action { get; set; } - - public string Log { get; set; } - - public string Origin { get; set; } - - public string User { get; set; } - - public string Extra { get; set; } - } -} +using AuditTrail.Model; +using System; + +namespace AspNetCoreElasticsearchNestAuditTrail +{ + public class CustomAuditTrailLog : IAuditTrailLog + { + public CustomAuditTrailLog() + { + Timestamp = DateTime.UtcNow; + } + + public DateTime Timestamp { get; set; } + + // TODO add elastic keyword definition for the property + //[Keyword] + public string Action { get; set; } + + public string Log { get; set; } + + public string Origin { get; set; } + + public string User { get; set; } + + public string Extra { get; set; } + } +} diff --git a/AspNetCoreElasticsearchNestAuditTrail/Program.cs b/AspNetCoreElasticsearchAuditTrail/Program.cs similarity index 96% rename from AspNetCoreElasticsearchNestAuditTrail/Program.cs rename to AspNetCoreElasticsearchAuditTrail/Program.cs index fc4f74f..04a05a8 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Program.cs +++ b/AspNetCoreElasticsearchAuditTrail/Program.cs @@ -1,20 +1,20 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; - -namespace AspNetCoreElasticsearchNestAuditTrail -{ - public class Program - { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); - } -} +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace AspNetCoreElasticsearchNestAuditTrail +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }); + } +} diff --git a/AspNetCoreElasticsearchNestAuditTrail/Properties/launchSettings.json b/AspNetCoreElasticsearchAuditTrail/Properties/launchSettings.json similarity index 96% rename from AspNetCoreElasticsearchNestAuditTrail/Properties/launchSettings.json rename to AspNetCoreElasticsearchAuditTrail/Properties/launchSettings.json index 8ce3f42..39503e6 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Properties/launchSettings.json +++ b/AspNetCoreElasticsearchAuditTrail/Properties/launchSettings.json @@ -1,27 +1,27 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "https://localhost:44343/", - "sslPort": 44343 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "AspNetCoreElasticsearchNestAuditTrail": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:3787" - } - } +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "https://localhost:44343/", + "sslPort": 44343 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "AspNetCoreElasticsearchNestAuditTrail": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:3787" + } + } } \ No newline at end of file diff --git a/AspNetCoreElasticsearchNestAuditTrail/Startup.cs b/AspNetCoreElasticsearchAuditTrail/Startup.cs similarity index 96% rename from AspNetCoreElasticsearchNestAuditTrail/Startup.cs rename to AspNetCoreElasticsearchAuditTrail/Startup.cs index 68fd9e4..1f7c66c 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Startup.cs +++ b/AspNetCoreElasticsearchAuditTrail/Startup.cs @@ -1,55 +1,55 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -namespace AspNetCoreElasticsearchNestAuditTrail -{ - public class Startup - { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - public void ConfigureServices(IServiceCollection services) - { - var indexPerMonth = false; - var amountOfPreviousIndicesUsedInAlias = 3; - services.AddAuditTrail(options => - options.UseSettings(indexPerMonth, amountOfPreviousIndicesUsedInAlias) - ); - - services.AddControllersWithViews() - .AddNewtonsoftJson(); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - else - { - app.UseExceptionHandler("/Home/Error"); - } - - - app.UseDefaultFiles(); - app.UseStaticFiles(); - - app.UseRouting(); - - app.UseEndpoints(endpoints => - { - endpoints.MapControllerRoute( - name: "default", - pattern: "{controller=Home}/{action=Index}/{id?}"); - }); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace AspNetCoreElasticsearchNestAuditTrail +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + public void ConfigureServices(IServiceCollection services) + { + var indexPerMonth = false; + var amountOfPreviousIndicesUsedInAlias = 3; + services.AddAuditTrail(options => + options.UseSettings(indexPerMonth, amountOfPreviousIndicesUsedInAlias) + ); + + services.AddControllersWithViews() + .AddNewtonsoftJson(); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseExceptionHandler("/Home/Error"); + } + + + app.UseDefaultFiles(); + app.UseStaticFiles(); + + app.UseRouting(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllerRoute( + name: "default", + pattern: "{controller=Home}/{action=Index}/{id?}"); + }); + } + } +} diff --git a/AspNetCoreElasticsearchNestAuditTrail/ViewModels/AuditTrailViewModel.cs b/AspNetCoreElasticsearchAuditTrail/ViewModels/AuditTrailViewModel.cs similarity index 95% rename from AspNetCoreElasticsearchNestAuditTrail/ViewModels/AuditTrailViewModel.cs rename to AspNetCoreElasticsearchAuditTrail/ViewModels/AuditTrailViewModel.cs index 4e45929..046b7d9 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/ViewModels/AuditTrailViewModel.cs +++ b/AspNetCoreElasticsearchAuditTrail/ViewModels/AuditTrailViewModel.cs @@ -1,15 +1,15 @@ -using System.Collections.Generic; - -namespace AspNetCoreElasticsearchNestAuditTrail.ViewModels -{ - public class AuditTrailViewModel - { - public List AuditTrailLogs { get; set; } - - public int Size { get; set; } - - public int Skip { get; set; } - - public string Filter { get; set; } - } -} +using System.Collections.Generic; + +namespace AspNetCoreElasticsearchNestAuditTrail.ViewModels +{ + public class AuditTrailViewModel + { + public List AuditTrailLogs { get; set; } + + public int Size { get; set; } + + public int Skip { get; set; } + + public string Filter { get; set; } + } +} diff --git a/AspNetCoreElasticsearchNestAuditTrail/Views/Home/AuditTrail.cshtml b/AspNetCoreElasticsearchAuditTrail/Views/Home/AuditTrail.cshtml similarity index 95% rename from AspNetCoreElasticsearchNestAuditTrail/Views/Home/AuditTrail.cshtml rename to AspNetCoreElasticsearchAuditTrail/Views/Home/AuditTrail.cshtml index 2db6233..7951967 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Views/Home/AuditTrail.cshtml +++ b/AspNetCoreElasticsearchAuditTrail/Views/Home/AuditTrail.cshtml @@ -1,57 +1,57 @@ -@model AspNetCoreElasticsearchNestAuditTrail.ViewModels.AuditTrailViewModel - -@{ - ViewData["Title"] = "About"; -} - -

Audit Trail Logs

- - -@using (Html.BeginForm("AuditTrailSearch", "Home", FormMethod.Get)) -{ -

- Filter: -

-

- Skip: -

-

- Size: -

-

- -

-} - - - - - - - - - - - @foreach (var item in Model.AuditTrailLogs) - { - - - - - - } - -
- Action - - Log - - Timestamp -
- @Html.DisplayFor(modelItem => item.Action) - - @Html.DisplayFor(modelItem => item.Log) - - @Html.DisplayFor(modelItem => item.Timestamp) -
-
+@model AspNetCoreElasticsearchNestAuditTrail.ViewModels.AuditTrailViewModel + +@{ + ViewData["Title"] = "About"; +} + +

Audit Trail Logs

+ + +@using (Html.BeginForm("AuditTrailSearch", "Home", FormMethod.Get)) +{ +

+ Filter: +

+

+ Skip: +

+

+ Size: +

+

+ +

+} + + + + + + + + + + + @foreach (var item in Model.AuditTrailLogs) + { + + + + + + } + +
+ Action + + Log + + Timestamp +
+ @Html.DisplayFor(modelItem => item.Action) + + @Html.DisplayFor(modelItem => item.Log) + + @Html.DisplayFor(modelItem => item.Timestamp) +
+
diff --git a/AspNetCoreElasticsearchNestAuditTrail/Views/Home/AuditTrailSearch.cshtml b/AspNetCoreElasticsearchAuditTrail/Views/Home/AuditTrailSearch.cshtml similarity index 95% rename from AspNetCoreElasticsearchNestAuditTrail/Views/Home/AuditTrailSearch.cshtml rename to AspNetCoreElasticsearchAuditTrail/Views/Home/AuditTrailSearch.cshtml index 7b7984b..6896db0 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Views/Home/AuditTrailSearch.cshtml +++ b/AspNetCoreElasticsearchAuditTrail/Views/Home/AuditTrailSearch.cshtml @@ -1,53 +1,53 @@ -@model AspNetCoreElasticsearchNestAuditTrail.ViewModels.AuditTrailViewModel - -

Audit Trail Logs

- - -@using (Html.BeginForm("AuditTrailSearch", "Home", FormMethod.Get)) -{ -

- Filter: -

-

- Skip: -

-

- Size: -

-

- -

-} - - - - - - - - - - - @foreach (var item in Model.AuditTrailLogs) - { - - - - - - } - -
- Action - - Log - - Timestamp -
- @Html.DisplayFor(modelItem => item.Action) - - @Html.DisplayFor(modelItem => item.Log) - - @Html.DisplayFor(modelItem => item.Timestamp) -
-
+@model AspNetCoreElasticsearchNestAuditTrail.ViewModels.AuditTrailViewModel + +

Audit Trail Logs

+ + +@using (Html.BeginForm("AuditTrailSearch", "Home", FormMethod.Get)) +{ +

+ Filter: +

+

+ Skip: +

+

+ Size: +

+

+ +

+} + + + + + + + + + + + @foreach (var item in Model.AuditTrailLogs) + { + + + + + + } + +
+ Action + + Log + + Timestamp +
+ @Html.DisplayFor(modelItem => item.Action) + + @Html.DisplayFor(modelItem => item.Log) + + @Html.DisplayFor(modelItem => item.Timestamp) +
+
diff --git a/AspNetCoreElasticsearchNestAuditTrail/Views/Home/Contact.cshtml b/AspNetCoreElasticsearchAuditTrail/Views/Home/Contact.cshtml similarity index 94% rename from AspNetCoreElasticsearchNestAuditTrail/Views/Home/Contact.cshtml rename to AspNetCoreElasticsearchAuditTrail/Views/Home/Contact.cshtml index 6270d0b..ad2eed8 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Views/Home/Contact.cshtml +++ b/AspNetCoreElasticsearchAuditTrail/Views/Home/Contact.cshtml @@ -1,7 +1,7 @@ -@{ - ViewData["Title"] = "Contact"; -} -

@ViewData["Title"].

-

@ViewData["Message"]

- +@{ + ViewData["Title"] = "Contact"; +} +

@ViewData["Title"].

+

@ViewData["Message"]

+ Contact \ No newline at end of file diff --git a/AspNetCoreElasticsearchNestAuditTrail/Views/Home/Index.cshtml b/AspNetCoreElasticsearchAuditTrail/Views/Home/Index.cshtml similarity index 88% rename from AspNetCoreElasticsearchNestAuditTrail/Views/Home/Index.cshtml rename to AspNetCoreElasticsearchAuditTrail/Views/Home/Index.cshtml index c8b25ee..ad5d1be 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Views/Home/Index.cshtml +++ b/AspNetCoreElasticsearchAuditTrail/Views/Home/Index.cshtml @@ -1,8 +1,8 @@ -@{ - ViewData["Title"] = "Home Page"; -} - -

Home

- - - +@{ + ViewData["Title"] = "Home Page"; +} + +

Home

+ + + diff --git a/AspNetCoreElasticsearchNestAuditTrail/Views/Shared/Error.cshtml b/AspNetCoreElasticsearchAuditTrail/Views/Shared/Error.cshtml similarity index 98% rename from AspNetCoreElasticsearchNestAuditTrail/Views/Shared/Error.cshtml rename to AspNetCoreElasticsearchAuditTrail/Views/Shared/Error.cshtml index 6c6d047..e514139 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Views/Shared/Error.cshtml +++ b/AspNetCoreElasticsearchAuditTrail/Views/Shared/Error.cshtml @@ -1,14 +1,14 @@ -@{ - ViewData["Title"] = "Error"; -} - -

Error.

-

An error occurred while processing your request.

- -

Development Mode

-

- Swapping to Development environment will display more detailed information about the error that occurred. -

-

- Development environment should not be enabled in deployed applications, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the ASPNETCORE_ENVIRONMENT environment variable to Development, and restarting the application. -

+@{ + ViewData["Title"] = "Error"; +} + +

Error.

+

An error occurred while processing your request.

+ +

Development Mode

+

+ Swapping to Development environment will display more detailed information about the error that occurred. +

+

+ Development environment should not be enabled in deployed applications, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the ASPNETCORE_ENVIRONMENT environment variable to Development, and restarting the application. +

diff --git a/AspNetCoreElasticsearchNestAuditTrail/Views/Shared/_Layout.cshtml b/AspNetCoreElasticsearchAuditTrail/Views/Shared/_Layout.cshtml similarity index 97% rename from AspNetCoreElasticsearchNestAuditTrail/Views/Shared/_Layout.cshtml rename to AspNetCoreElasticsearchAuditTrail/Views/Shared/_Layout.cshtml index 08c57eb..1c1882d 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Views/Shared/_Layout.cshtml +++ b/AspNetCoreElasticsearchAuditTrail/Views/Shared/_Layout.cshtml @@ -1,47 +1,47 @@ - - - - - - @ViewData["Title"] - ASP.NET Core Elasticsearch Nest Audit Trail - - - - - - -
- @RenderBody() -
-
-

© 2020 - Audit Trail

-
-
- - - - @RenderSection("scripts", required: false) - - + + + + + + @ViewData["Title"] - ASP.NET Core Elasticsearch Nest Audit Trail + + + + + + +
+ @RenderBody() +
+
+

© 2020 - Audit Trail

+
+
+ + + + @RenderSection("scripts", required: false) + + diff --git a/AspNetCoreElasticsearchNestAuditTrail/Views/Shared/_ValidationScriptsPartial.cshtml b/AspNetCoreElasticsearchAuditTrail/Views/Shared/_ValidationScriptsPartial.cshtml similarity index 100% rename from AspNetCoreElasticsearchNestAuditTrail/Views/Shared/_ValidationScriptsPartial.cshtml rename to AspNetCoreElasticsearchAuditTrail/Views/Shared/_ValidationScriptsPartial.cshtml diff --git a/AspNetCoreElasticsearchNestAuditTrail/Views/_ViewImports.cshtml b/AspNetCoreElasticsearchAuditTrail/Views/_ViewImports.cshtml similarity index 98% rename from AspNetCoreElasticsearchNestAuditTrail/Views/_ViewImports.cshtml rename to AspNetCoreElasticsearchAuditTrail/Views/_ViewImports.cshtml index 2ade995..d356935 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Views/_ViewImports.cshtml +++ b/AspNetCoreElasticsearchAuditTrail/Views/_ViewImports.cshtml @@ -1,2 +1,2 @@ -@using AspNetCoreElasticsearchNestAuditTrail -@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@using AspNetCoreElasticsearchNestAuditTrail +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/AspNetCoreElasticsearchNestAuditTrail/Views/_ViewStart.cshtml b/AspNetCoreElasticsearchAuditTrail/Views/_ViewStart.cshtml similarity index 91% rename from AspNetCoreElasticsearchNestAuditTrail/Views/_ViewStart.cshtml rename to AspNetCoreElasticsearchAuditTrail/Views/_ViewStart.cshtml index 6e88aa3..a5f1004 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/Views/_ViewStart.cshtml +++ b/AspNetCoreElasticsearchAuditTrail/Views/_ViewStart.cshtml @@ -1,3 +1,3 @@ -@{ - Layout = "_Layout"; -} +@{ + Layout = "_Layout"; +} diff --git a/AspNetCoreElasticsearchNestAuditTrail/appsettings.Development.json b/AspNetCoreElasticsearchAuditTrail/appsettings.Development.json similarity index 94% rename from AspNetCoreElasticsearchNestAuditTrail/appsettings.Development.json rename to AspNetCoreElasticsearchAuditTrail/appsettings.Development.json index f334029..fa8ce71 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/appsettings.Development.json +++ b/AspNetCoreElasticsearchAuditTrail/appsettings.Development.json @@ -1,10 +1,10 @@ -{ - "Logging": { - "IncludeScopes": false, - "LogLevel": { - "Default": "Debug", - "System": "Information", - "Microsoft": "Information" - } - } -} +{ + "Logging": { + "IncludeScopes": false, + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} diff --git a/AspNetCoreElasticsearchNestAuditTrail/appsettings.json b/AspNetCoreElasticsearchAuditTrail/appsettings.json similarity index 92% rename from AspNetCoreElasticsearchNestAuditTrail/appsettings.json rename to AspNetCoreElasticsearchAuditTrail/appsettings.json index 5766595..5fff67b 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/appsettings.json +++ b/AspNetCoreElasticsearchAuditTrail/appsettings.json @@ -1,8 +1,8 @@ -{ - "Logging": { - "IncludeScopes": false, - "LogLevel": { - "Default": "Warning" - } - } -} +{ + "Logging": { + "IncludeScopes": false, + "LogLevel": { + "Default": "Warning" + } + } +} diff --git a/AspNetCoreElasticsearchNestAuditTrail/bundleconfig.json b/AspNetCoreElasticsearchAuditTrail/bundleconfig.json similarity index 96% rename from AspNetCoreElasticsearchNestAuditTrail/bundleconfig.json rename to AspNetCoreElasticsearchAuditTrail/bundleconfig.json index b7bb215..0193615 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/bundleconfig.json +++ b/AspNetCoreElasticsearchAuditTrail/bundleconfig.json @@ -1,61 +1,61 @@ -// Configure bundling and minification for the project. -// More info at https://go.microsoft.com/fwlink/?LinkId=808241 -[ - { - "outputFileName": "wwwroot/css/site.min.css", - // An array of relative input file paths. Globbing patterns supported - "inputFiles": [ - "wwwroot/css/site.css" - ], - "minify": { "enabled": true } - }, - { - "outputFileName": "wwwroot/js/site.min.js", - "inputFiles": [ - "wwwroot/js/site.js" - ], - // Optionally specify minification options - "minify": { - "enabled": true, - "renameLocals": true - }, - // Optinally generate .map file - "sourceMap": false - }, - // Vendor CSS - { - "outputFileName": "wwwroot/css/vendor.min.css", - "inputFiles": [ - "node_modules/bootstrap/dist/css/bootstrap.min.css" - ], - "minify": { "enabled": true } - }, - // Vendor JS - { - "outputFileName": "wwwroot/js/vendor.min.js", - "inputFiles": [ - "node_modules/jquery/dist/jquery.min.js", - "node_modules/bootstrap/dist/js/bootstrap.bundle.min.js" - ], - "minify": { - "enabled": true, - "renameLocals": true - }, - "sourceMap": false - }, - // Vendor Validation JS - { - "outputFileName": "wwwroot/js/vendor-validation.min.js", - "inputFiles": [ - "node_modules/jquery-validation/dist/jquery.validate.min.js", - "node_modules/jquery-validation/dist/additional-methods.min.js", - "node_modules/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js", - "node_modules/jquery-ajax-unobtrusive/dist/jquery.unobtrusive-ajax.min.js" - ], - "minify": { - "enabled": true, - "renameLocals": true - }, - "sourceMap": false - } -] +// Configure bundling and minification for the project. +// More info at https://go.microsoft.com/fwlink/?LinkId=808241 +[ + { + "outputFileName": "wwwroot/css/site.min.css", + // An array of relative input file paths. Globbing patterns supported + "inputFiles": [ + "wwwroot/css/site.css" + ], + "minify": { "enabled": true } + }, + { + "outputFileName": "wwwroot/js/site.min.js", + "inputFiles": [ + "wwwroot/js/site.js" + ], + // Optionally specify minification options + "minify": { + "enabled": true, + "renameLocals": true + }, + // Optinally generate .map file + "sourceMap": false + }, + // Vendor CSS + { + "outputFileName": "wwwroot/css/vendor.min.css", + "inputFiles": [ + "node_modules/bootstrap/dist/css/bootstrap.min.css" + ], + "minify": { "enabled": true } + }, + // Vendor JS + { + "outputFileName": "wwwroot/js/vendor.min.js", + "inputFiles": [ + "node_modules/jquery/dist/jquery.min.js", + "node_modules/bootstrap/dist/js/bootstrap.bundle.min.js" + ], + "minify": { + "enabled": true, + "renameLocals": true + }, + "sourceMap": false + }, + // Vendor Validation JS + { + "outputFileName": "wwwroot/js/vendor-validation.min.js", + "inputFiles": [ + "node_modules/jquery-validation/dist/jquery.validate.min.js", + "node_modules/jquery-validation/dist/additional-methods.min.js", + "node_modules/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js", + "node_modules/jquery-ajax-unobtrusive/dist/jquery.unobtrusive-ajax.min.js" + ], + "minify": { + "enabled": true, + "renameLocals": true + }, + "sourceMap": false + } +] diff --git a/AspNetCoreElasticsearchNestAuditTrail/package-lock.json b/AspNetCoreElasticsearchAuditTrail/package-lock.json similarity index 100% rename from AspNetCoreElasticsearchNestAuditTrail/package-lock.json rename to AspNetCoreElasticsearchAuditTrail/package-lock.json diff --git a/AspNetCoreElasticsearchNestAuditTrail/package.json b/AspNetCoreElasticsearchAuditTrail/package.json similarity index 95% rename from AspNetCoreElasticsearchNestAuditTrail/package.json rename to AspNetCoreElasticsearchAuditTrail/package.json index ad50591..7429599 100644 --- a/AspNetCoreElasticsearchNestAuditTrail/package.json +++ b/AspNetCoreElasticsearchAuditTrail/package.json @@ -1,14 +1,14 @@ -{ - "version": "1.0.0", - "name": "asp.net", - "private": true, - "devDependencies": { - "bootstrap": "4.4.1", - "jquery": "3.5.0", - "jquery-validation": "1.19.3", - "jquery-validation-unobtrusive": "3.2.11", - "jquery-ajax-unobtrusive": "3.2.6", - "popper.js": "^1.16.0" - }, - "dependencies": {} -} +{ + "version": "1.0.0", + "name": "asp.net", + "private": true, + "devDependencies": { + "bootstrap": "4.4.1", + "jquery": "3.5.0", + "jquery-validation": "1.19.3", + "jquery-validation-unobtrusive": "3.2.11", + "jquery-ajax-unobtrusive": "3.2.6", + "popper.js": "^1.16.0" + }, + "dependencies": {} +} diff --git a/AspNetCoreElasticsearchAuditTrail/wwwroot/css/vendor.min.css b/AspNetCoreElasticsearchAuditTrail/wwwroot/css/vendor.min.css new file mode 100644 index 0000000..16ef6bf --- /dev/null +++ b/AspNetCoreElasticsearchAuditTrail/wwwroot/css/vendor.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]){color:inherit;text-decoration:none}a:not([href]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media(min-width:576px){.container{max-width:540px}}@media(min-width:768px){.container{max-width:720px}}@media(min-width:992px){.container{max-width:960px}}@media(min-width:1200px){.container{max-width:1140px}}.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media(min-width:576px){.container,.container-sm{max-width:540px}}@media(min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media(min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media(min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media(min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media(min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media(min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media(min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media(max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media(max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media(max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media(max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media(min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media(min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media(min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media(min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media(min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 0%;flex:1 1 0%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media(prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media(prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media(prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media(max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media(min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media(max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media(min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media(max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media(min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media(max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media(min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media(min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media(min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media(min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media(min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media(prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media(prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal .list-group-item.active{margin-top:0}.list-group-horizontal .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media(min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm .list-group-item.active{margin-top:0}.list-group-horizontal-sm .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md .list-group-item.active{margin-top:0}.list-group-horizontal-md .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg .list-group-item.active{margin-top:0}.list-group-horizontal-lg .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl .list-group-item.active{margin-top:0}.list-group-horizontal-xl .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush .list-group-item{border-right-width:0;border-left-width:0;border-radius:0}.list-group-flush .list-group-item:first-child{border-top-width:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media(prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media(min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media(min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media(min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media(prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media(min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media(min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media(min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media(min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media(min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media(min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media(min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media(min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media(min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media(min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media(min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media(min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media(min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media(min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media(min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media(min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media(min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media(min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media(min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media(min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} \ No newline at end of file diff --git a/AspNetCoreElasticsearchAuditTrail/wwwroot/js/vendor-validation.min.js b/AspNetCoreElasticsearchAuditTrail/wwwroot/js/vendor-validation.min.js new file mode 100644 index 0000000..250be93 --- /dev/null +++ b/AspNetCoreElasticsearchAuditTrail/wwwroot/js/vendor-validation.min.js @@ -0,0 +1,8 @@ +/*! jQuery Validation Plugin - v1.19.3 - 1/9/2021 + * https://jqueryvalidation.org/ + * Copyright (c) 2021 Jörn Zaefferer; Licensed MIT */ +!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=n(require("jquery")):n(jQuery)}(function(n){var i,r,t;return n.extend(n.fn,{validate:function(t){if(!this.length)return void(t&&t.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var i=n.data(this[0],"validator");return i?i:(this.attr("novalidate","novalidate"),i=new n.validator(t,this[0]),n.data(this[0],"validator",i),i.settings.onsubmit&&(this.on("click.validate",":submit",function(t){i.submitButton=t.currentTarget;n(this).hasClass("cancel")&&(i.cancelSubmit=!0);void 0!==n(this).attr("formnovalidate")&&(i.cancelSubmit=!0)}),this.on("submit.validate",function(t){function r(){var r,u;return i.submitButton&&(i.settings.submitHandler||i.formSubmitted)&&(r=n("").attr("name",i.submitButton.name).val(n(i.submitButton).val()).appendTo(i.currentForm)),!(i.settings.submitHandler&&!i.settings.debug)||(u=i.settings.submitHandler.call(i,i.currentForm,t),r&&r.remove(),void 0!==u&&u)}return i.settings.debug&&t.preventDefault(),i.cancelSubmit?(i.cancelSubmit=!1,r()):i.form()?i.pendingRequest?(i.formSubmitted=!0,!1):r():(i.focusInvalid(),!1)})),i)},valid:function(){var t,i,r;return n(this[0]).is("form")?t=this.validate().form():(r=[],t=!0,i=n(this[0].form).validate(),this.each(function(){t=i.element(this)&&t;t||(r=r.concat(i.errorList))}),i.errorList=r),t},rules:function(t,i){var e,s,f,u,o,h,r=this[0],c="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=r&&(!r.form&&c&&(r.form=this.closest("form")[0],r.name=this.attr("name")),null!=r.form)){if(t)switch(e=n.data(r.form,"validator").settings,s=e.rules,f=n.validator.staticRules(r),t){case"add":n.extend(f,n.validator.normalizeRule(i));delete f.messages;s[r.name]=f;i.messages&&(e.messages[r.name]=n.extend(e.messages[r.name],i.messages));break;case"remove":return i?(h={},n.each(i.split(/\s/),function(n,t){h[t]=f[t];delete f[t]}),h):(delete s[r.name],f)}return u=n.validator.normalizeRules(n.extend({},n.validator.classRules(r),n.validator.attributeRules(r),n.validator.dataRules(r),n.validator.staticRules(r)),r),u.required&&(o=u.required,delete u.required,u=n.extend({required:o},u)),u.remote&&(o=u.remote,delete u.remote,u=n.extend(u,{remote:o})),u}}}),i=function(n){return n.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},n.extend(n.expr.pseudos||n.expr[":"],{blank:function(t){return!i(""+n(t).val())},filled:function(t){var r=n(t).val();return null!==r&&!!i(""+r)},unchecked:function(t){return!n(t).prop("checked")}}),n.validator=function(t,i){this.settings=n.extend(!0,{},n.validator.defaults,t);this.currentForm=i;this.init()},n.validator.format=function(t,i){return 1===arguments.length?function(){var i=n.makeArray(arguments);return i.unshift(t),n.validator.format.apply(this,i)}:void 0===i?t:(arguments.length>2&&i.constructor!==Array&&(i=n.makeArray(arguments).slice(1)),i.constructor!==Array&&(i=[i]),n.each(i,function(n,i){t=t.replace(new RegExp("\\{"+n+"\\}","g"),function(){return i})}),t)},n.extend(n.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:n([]),errorLabelContainer:n([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(n){this.lastActive=n;this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,n,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(n)))},onfocusout:function(n){!this.checkable(n)&&(n.name in this.submitted||!this.optional(n))&&this.element(n)},onkeyup:function(t,i){9===i.which&&""===this.elementValue(t)||n.inArray(i.keyCode,[16,17,18,20,35,36,37,38,39,40,45,144,225])!==-1||(t.name in this.submitted||t.name in this.invalid)&&this.element(t)},onclick:function(n){n.name in this.submitted?this.element(n):n.parentNode.name in this.submitted&&this.element(n.parentNode)},highlight:function(t,i,r){"radio"===t.type?this.findByName(t.name).addClass(i).removeClass(r):n(t).addClass(i).removeClass(r)},unhighlight:function(t,i,r){"radio"===t.type?this.findByName(t.name).removeClass(i).addClass(r):n(t).removeClass(i).addClass(r)}},setDefaults:function(t){n.extend(n.validator.defaults,t)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:n.validator.format("Please enter no more than {0} characters."),minlength:n.validator.format("Please enter at least {0} characters."),rangelength:n.validator.format("Please enter a value between {0} and {1} characters long."),range:n.validator.format("Please enter a value between {0} and {1}."),max:n.validator.format("Please enter a value less than or equal to {0}."),min:n.validator.format("Please enter a value greater than or equal to {0}."),step:n.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function i(t){var e="undefined"!=typeof n(this).attr("contenteditable")&&"false"!==n(this).attr("contenteditable");if(!this.form&&e&&(this.form=n(this).closest("form")[0],this.name=n(this).attr("name")),r===this.form){var u=n.data(this.form,"validator"),f="on"+t.type.replace(/^validate/,""),i=u.settings;i[f]&&!n(this).is(i.ignore)&&i[f].call(u,this,t)}}this.labelContainer=n(this.settings.errorLabelContainer);this.errorContext=this.labelContainer.length&&this.labelContainer||n(this.currentForm);this.containers=n(this.settings.errorContainer).add(this.settings.errorLabelContainer);this.submitted={};this.valueCache={};this.pendingRequest=0;this.pending={};this.invalid={};this.reset();var t,r=this.currentForm,u=this.groups={};n.each(this.settings.groups,function(t,i){"string"==typeof i&&(i=i.split(/\s/));n.each(i,function(n,i){u[i]=t})});t=this.settings.rules;n.each(t,function(i,r){t[i]=n.validator.normalizeRule(r)});n(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",i).on("click.validate","select, option, [type='radio'], [type='checkbox']",i);this.settings.invalidHandler&&n(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),n.extend(this.submitted,this.errorMap),this.invalid=n.extend({},this.errorMap),this.valid()||n(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var n=0,t=this.currentElements=this.elements();t[n];n++)this.check(t[n]);return this.valid()},element:function(t){var e,o,i=this.clean(t),r=this.validationTargetFor(i),u=this,f=!0;return void 0===r?delete this.invalid[i.name]:(this.prepareElement(r),this.currentElements=n(r),o=this.groups[r.name],o&&n.each(this.groups,function(n,t){t===o&&n!==r.name&&(i=u.validationTargetFor(u.clean(u.findByName(n))),i&&i.name in u.invalid&&(u.currentElements.push(i),f=u.check(i)&&f))}),e=this.check(r)!==!1,f=f&&e,this.invalid[r.name]=e?!1:!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),n(t).attr("aria-invalid",!e)),f},showErrors:function(t){if(t){var i=this;n.extend(this.errorMap,t);this.errorList=n.map(this.errorMap,function(n,t){return{message:n,element:i.findByName(t)[0]}});this.successList=n.grep(this.successList,function(n){return!(n.name in t)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){n.fn.resetForm&&n(this.currentForm).resetForm();this.invalid={};this.submitted={};this.prepareForm();this.hideErrors();var t=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(t)},resetElements:function(n){var t;if(this.settings.unhighlight)for(t=0;n[t];t++)this.settings.unhighlight.call(this,n[t],this.settings.errorClass,""),this.findByName(n[t].name).removeClass(this.settings.validClass);else n.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(n){var t,i=0;for(t in n)void 0!==n[t]&&null!==n[t]&&n[t]!==!1&&i++;return i},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(n){n.not(this.containers).text("");this.addWrapper(n).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{n(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(t){}},findLastActive:function(){var t=this.lastActive;return t&&1===n.grep(this.errorList,function(n){return n.element.name===t.name}).length&&t},elements:function(){var t=this,i={};return n(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var r=this.name||n(this).attr("name"),u="undefined"!=typeof n(this).attr("contenteditable")&&"false"!==n(this).attr("contenteditable");return!r&&t.settings.debug&&window.console&&console.error("%o has no name assigned",this),u&&(this.form=n(this).closest("form")[0],this.name=r),this.form===t.currentForm&&!(r in i||!t.objectLength(n(this).rules()))&&(i[r]=!0,!0)})},clean:function(t){return n(t)[0]},errors:function(){var t=this.settings.errorClass.split(" ").join(".");return n(this.settings.errorElement+"."+t,this.errorContext)},resetInternals:function(){this.successList=[];this.errorList=[];this.errorMap={};this.toShow=n([]);this.toHide=n([])},reset:function(){this.resetInternals();this.currentElements=n([])},prepareForm:function(){this.reset();this.toHide=this.errors().add(this.containers)},prepareElement:function(n){this.reset();this.toHide=this.errorsFor(n)},elementValue:function(t){var i,r,u=n(t),f=t.type,e="undefined"!=typeof u.attr("contenteditable")&&"false"!==u.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(t.name).filter(":checked").val():"number"===f&&"undefined"!=typeof t.validity?t.validity.badInput?"NaN":u.val():(i=e?u.text():u.val(),"file"===f?"C:\\fakepath\\"===i.substr(0,12)?i.substr(12):(r=i.lastIndexOf("/"),r>=0?i.substr(r+1):(r=i.lastIndexOf("\\"),r>=0?i.substr(r+1):i)):"string"==typeof i?i.replace(/\r/g,""):i)},check:function(t){t=this.validationTargetFor(this.clean(t));var u,f,r,e,i=n(t).rules(),c=n.map(i,function(n,t){return t}).length,s=!1,h=this.elementValue(t);"function"==typeof i.normalizer?e=i.normalizer:"function"==typeof this.settings.normalizer&&(e=this.settings.normalizer);e&&(h=e.call(t,h),delete i.normalizer);for(f in i){r={method:f,parameters:i[f]};try{if(u=n.validator.methods[f].call(this,h,t,r.parameters),"dependency-mismatch"===u&&1===c){s=!0;continue}if(s=!1,"pending"===u)return void(this.toHide=this.toHide.not(this.errorsFor(t)));if(!u)return this.formatAndAdd(t,r),!1}catch(o){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+t.id+", check the '"+r.method+"' method.",o),o instanceof TypeError&&(o.message+=". Exception occurred when checking element "+t.id+", check the '"+r.method+"' method."),o;}}if(!s)return this.objectLength(i)&&this.successList.push(t),!0},customDataMessage:function(t,i){return n(t).data("msg"+i.charAt(0).toUpperCase()+i.substring(1).toLowerCase())||n(t).data("msg")},customMessage:function(n,t){var i=this.settings.messages[n];return i&&(i.constructor===String?i:i[t])},findDefined:function(){for(var n=0;nWarning: No message defined for "+t.name+"<\/strong>"),u=/\$?\{(\d+)\}/g;return"function"==typeof r?r=r.call(this,i.parameters,t):u.test(r)&&(r=n.validator.format(r.replace(u,"{$1}"),i.parameters)),r},formatAndAdd:function(n,t){var i=this.defaultMessage(n,t);this.errorList.push({message:i,element:n,method:t.method});this.errorMap[n.name]=i;this.submitted[n.name]=i},addWrapper:function(n){return this.settings.wrapper&&(n=n.add(n.parent(this.settings.wrapper))),n},defaultShowErrors:function(){for(var i,t,n=0;this.errorList[n];n++)t=this.errorList[n],this.settings.highlight&&this.settings.highlight.call(this,t.element,this.settings.errorClass,this.settings.validClass),this.showLabel(t.element,t.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(n=0;this.successList[n];n++)this.showLabel(this.successList[n]);if(this.settings.unhighlight)for(n=0,i=this.validElements();i[n];n++)this.settings.unhighlight.call(this,i[n],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow);this.hideErrors();this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return n(this.errorList).map(function(){return this.element})},showLabel:function(t,i){var u,s,e,o,r=this.errorsFor(t),h=this.idOrName(t),f=n(t).attr("aria-describedby");r.length?(r.removeClass(this.settings.validClass).addClass(this.settings.errorClass),r.html(i)):(r=n("<"+this.settings.errorElement+">").attr("id",h+"-error").addClass(this.settings.errorClass).html(i||""),u=r,this.settings.wrapper&&(u=r.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(u):this.settings.errorPlacement?this.settings.errorPlacement.call(this,u,n(t)):u.insertAfter(t),r.is("label")?r.attr("for",h):0===r.parents("label[for='"+this.escapeCssMeta(h)+"']").length&&(e=r.attr("id"),f?f.match(new RegExp("\\b"+this.escapeCssMeta(e)+"\\b"))||(f+=" "+e):f=e,n(t).attr("aria-describedby",f),s=this.groups[t.name],s&&(o=this,n.each(o.groups,function(t,i){i===s&&n("[name='"+o.escapeCssMeta(t)+"']",o.currentForm).attr("aria-describedby",r.attr("id"))}))));!i&&this.settings.success&&(r.text(""),"string"==typeof this.settings.success?r.addClass(this.settings.success):this.settings.success(r,t));this.toShow=this.toShow.add(r)},errorsFor:function(t){var r=this.escapeCssMeta(this.idOrName(t)),u=n(t).attr("aria-describedby"),i="label[for='"+r+"'], label[for='"+r+"'] *";return u&&(i=i+", #"+this.escapeCssMeta(u).replace(/\s+/g,", #")),this.errors().filter(i)},escapeCssMeta:function(n){return n.replace(/([\\!"#$%&'()*+,.\/:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(n){return this.groups[n.name]||(this.checkable(n)?n.name:n.id||n.name)},validationTargetFor:function(t){return this.checkable(t)&&(t=this.findByName(t.name)),n(t).not(this.settings.ignore)[0]},checkable:function(n){return/radio|checkbox/i.test(n.type)},findByName:function(t){return n(this.currentForm).find("[name='"+this.escapeCssMeta(t)+"']")},getLength:function(t,i){switch(i.nodeName.toLowerCase()){case"select":return n("option:selected",i).length;case"input":if(this.checkable(i))return this.findByName(i.name).filter(":checked").length}return t.length},depend:function(n,t){return!this.dependTypes[typeof n]||this.dependTypes[typeof n](n,t)},dependTypes:{boolean:function(n){return n},string:function(t,i){return!!n(t,i.form).length},"function":function(n,t){return n(t)}},optional:function(t){var i=this.elementValue(t);return!n.validator.methods.required.call(this,i,t)&&"dependency-mismatch"},startRequest:function(t){this.pending[t.name]||(this.pendingRequest++,n(t).addClass(this.settings.pendingClass),this.pending[t.name]=!0)},stopRequest:function(t,i){this.pendingRequest--;this.pendingRequest<0&&(this.pendingRequest=0);delete this.pending[t.name];n(t).removeClass(this.settings.pendingClass);i&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(n(this.currentForm).submit(),this.submitButton&&n("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!i&&0===this.pendingRequest&&this.formSubmitted&&(n(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(t,i){return i="string"==typeof i&&i||"remote",n.data(t,"previousValue")||n.data(t,"previousValue",{old:null,valid:!0,message:this.defaultMessage(t,{method:i})})},destroy:function(){this.resetForm();n(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(t,i){t.constructor===String?this.classRuleSettings[t]=i:n.extend(this.classRuleSettings,t)},classRules:function(t){var i={},r=n(t).attr("class");return r&&n.each(r.split(" "),function(){this in n.validator.classRuleSettings&&n.extend(i,n.validator.classRuleSettings[this])}),i},normalizeAttributeRule:function(n,t,i,r){/min|max|step/.test(i)&&(null===t||/number|range|text/.test(t))&&(r=Number(r),isNaN(r)&&(r=void 0));r||0===r?n[i]=r:t===i&&"range"!==t&&(n[i]=!0)},attributeRules:function(t){var r,i,u={},f=n(t),e=t.getAttribute("type");for(r in n.validator.methods)"required"===r?(i=t.getAttribute(r),""===i&&(i=!0),i=!!i):i=f.attr(r),this.normalizeAttributeRule(u,e,r,i);return u.maxlength&&/-1|2147483647|524288/.test(u.maxlength)&&delete u.maxlength,u},dataRules:function(t){var i,r,u={},f=n(t),e=t.getAttribute("type");for(i in n.validator.methods)r=f.data("rule"+i.charAt(0).toUpperCase()+i.substring(1).toLowerCase()),""===r&&(r=!0),this.normalizeAttributeRule(u,e,i,r);return u},staticRules:function(t){var i={},r=n.data(t.form,"validator");return r.settings.rules&&(i=n.validator.normalizeRule(r.settings.rules[t.name])||{}),i},normalizeRules:function(t,i){return n.each(t,function(r,u){if(u===!1)return void delete t[r];if(u.param||u.depends){var f=!0;switch(typeof u.depends){case"string":f=!!n(u.depends,i.form).length;break;case"function":f=u.depends.call(i,i)}f?t[r]=void 0===u.param||u.param:(n.data(i.form,"validator").resetElements(n(i)),delete t[r])}}),n.each(t,function(n,r){t[n]="function"==typeof r&&"normalizer"!==n?r(i):r}),n.each(["minlength","maxlength"],function(){t[this]&&(t[this]=Number(t[this]))}),n.each(["rangelength","range"],function(){var n;t[this]&&(Array.isArray(t[this])?t[this]=[Number(t[this][0]),Number(t[this][1])]:"string"==typeof t[this]&&(n=t[this].replace(/[\[\]]/g,"").split(/[\s,]+/),t[this]=[Number(n[0]),Number(n[1])]))}),n.validator.autoCreateRanges&&(null!=t.min&&null!=t.max&&(t.range=[t.min,t.max],delete t.min,delete t.max),null!=t.minlength&&null!=t.maxlength&&(t.rangelength=[t.minlength,t.maxlength],delete t.minlength,delete t.maxlength)),t},normalizeRule:function(t){if("string"==typeof t){var i={};n.each(t.split(/\s/),function(){i[this]=!0});t=i}return t},addMethod:function(t,i,r){n.validator.methods[t]=i;n.validator.messages[t]=void 0!==r?r:n.validator.messages[t];i.length<3&&n.validator.addClassRules(t,n.validator.normalizeRule(t))},methods:{required:function(t,i,r){if(!this.depend(r,i))return"dependency-mismatch";if("select"===i.nodeName.toLowerCase()){var u=n(i).val();return u&&u.length>0}return this.checkable(i)?this.getLength(t,i)>0:void 0!==t&&null!==t&&t.length>0},email:function(n,t){return this.optional(t)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(n)},url:function(n,t){return this.optional(t)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[\/?#]\S*)?$/i.test(n)},date:function(){var n=!1;return function(t,i){return n||(n=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(i)||!/Invalid|NaN/.test(new Date(t).toString())}}(),dateISO:function(n,t){return this.optional(t)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(n)},number:function(n,t){return this.optional(t)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(n)},digits:function(n,t){return this.optional(t)||/^\d+$/.test(n)},minlength:function(n,t,i){var r=Array.isArray(n)?n.length:this.getLength(n,t);return this.optional(t)||r>=i},maxlength:function(n,t,i){var r=Array.isArray(n)?n.length:this.getLength(n,t);return this.optional(t)||r<=i},rangelength:function(n,t,i){var r=Array.isArray(n)?n.length:this.getLength(n,t);return this.optional(t)||r>=i[0]&&r<=i[1]},min:function(n,t,i){return this.optional(t)||n>=i},max:function(n,t,i){return this.optional(t)||n<=i},range:function(n,t,i){return this.optional(t)||n>=i[0]&&n<=i[1]},step:function(t,i,r){var u,f=n(i).attr("type"),h="Step attribute on input type "+f+" is not supported.",c=new RegExp("\\b"+f+"\\b"),l=f&&!c.test("text,number,range"),e=function(n){var t=(""+n).match(/(?:\.(\d+))?$/);return t&&t[1]?t[1].length:0},o=function(n){return Math.round(n*Math.pow(10,u))},s=!0;if(l)throw new Error(h);return u=e(r),(e(t)>u||o(t)%o(r)!=0)&&(s=!1),this.optional(i)||s},equalTo:function(t,i,r){var u=n(r);return this.settings.onfocusout&&u.not(".validate-equalTo-blur").length&&u.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){n(i).valid()}),t===u.val()},remote:function(t,i,r,u){if(this.optional(i))return"dependency-mismatch";u="string"==typeof u&&u||"remote";var f,o,s,e=this.previousValue(i,u);return this.settings.messages[i.name]||(this.settings.messages[i.name]={}),e.originalMessage=e.originalMessage||this.settings.messages[i.name][u],this.settings.messages[i.name][u]=e.message,r="string"==typeof r&&{url:r}||r,s=n.param(n.extend({data:t},r.data)),e.old===s?e.valid:(e.old=s,f=this,this.startRequest(i),o={},o[i.name]=t,n.ajax(n.extend(!0,{mode:"abort",port:"validate"+i.name,dataType:"json",data:o,context:f.currentForm,success:function(n){var r,s,h,o=n===!0||"true"===n;f.settings.messages[i.name][u]=e.originalMessage;o?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(i),f.formSubmitted=h,f.successList.push(i),f.invalid[i.name]=!1,f.showErrors()):(r={},s=n||f.defaultMessage(i,{method:u,parameters:t}),r[i.name]=e.message=s,f.invalid[i.name]=!0,f.showErrors(r));e.valid=o;f.stopRequest(i,o)}},r)),"pending")}}}),t={},n.ajaxPrefilter?n.ajaxPrefilter(function(n,i,r){var u=n.port;"abort"===n.mode&&(t[u]&&t[u].abort(),t[u]=r)}):(r=n.ajax,n.ajax=function(i){var f=("mode"in i?i:n.ajaxSettings).mode,u=("port"in i?i:n.ajaxSettings).port;return"abort"===f?(t[u]&&t[u].abort(),t[u]=r.apply(this,arguments),t[u]):r.apply(this,arguments)}),n}); +/*! jQuery Validation Plugin - v1.19.3 - 1/9/2021 + * https://jqueryvalidation.org/ + * Copyright (c) 2021 Jörn Zaefferer; Licensed MIT */ +!function(n){"function"==typeof define&&define.amd?define(["jquery","./jquery.validate.min"],n):"object"==typeof module&&module.exports?module.exports=n(require("jquery")):n(jQuery)}(function(n){return function(){function t(n){return n.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," ").replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g,"")}n.validator.addMethod("maxWords",function(n,i,r){return this.optional(i)||t(n).match(/\b\w+\b/g).length<=r},n.validator.format("Please enter {0} words or less."));n.validator.addMethod("minWords",function(n,i,r){return this.optional(i)||t(n).match(/\b\w+\b/g).length>=r},n.validator.format("Please enter at least {0} words."));n.validator.addMethod("rangeWords",function(n,i,r){var u=t(n),f=/\b\w+\b/g;return this.optional(i)||u.match(f).length>=r[0]&&u.match(f).length<=r[1]},n.validator.format("Please enter between {0} and {1} words."))}(),n.validator.addMethod("abaRoutingNumber",function(n){var r=0,i=n.split(""),u=i.length,t;if(9!==u)return!1;for(t=0;t9?"0":i,e="JABCDEFGHI".substr(i,1).toString(),o.match(/[ABEH]/)?f===i:o.match(/[KPQS]/)?f===e:f===i||f===e},"Please specify a valid CIF number."),n.validator.addMethod("cnhBR",function(n){if(n=n.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==n.length)return!1;var e,f,r,t,i,o,u=0,s=0;if(e=n.charAt(0),new Array(12).join(e)===n)return!1;for(t=0,i=9,o=0;t<9;++t,--i)u+=+(n.charAt(t)*i);for(f=u%11,f>=10&&(f=0,s=2),u=0,t=0,i=1,o=0;t<9;++t,++i)u+=+(n.charAt(t)*i);return r=u%11,r>=10?r=0:r-=s,String(f).concat(r)===n.substr(-2)},"Please specify a valid CNH number"),n.validator.addMethod("cnpjBR",function(n,t){"use strict";var f,e;if(this.optional(t))return!0;if((n=n.replace(/[^\d]+/g,""),14!==n.length)||"00000000000000"===n||"11111111111111"===n||"22222222222222"===n||"33333333333333"===n||"44444444444444"===n||"55555555555555"===n||"66666666666666"===n||"77777777777777"===n||"88888888888888"===n||"99999999999999"===n)return!1;for(var i=n.length-2,o=n.substring(0,i),h=n.substring(i),r=0,u=i-7,s=i;s>=1;s--)r+=o.charAt(i-s)*u--,u<2&&(u=9);if(f=r%11<2?0:11-r%11,f!==parseInt(h.charAt(0),10))return!1;for(i+=1,o=n.substring(0,i),r=0,u=i-7,e=i;e>=1;e--)r+=o.charAt(i-e)*u--,u<2&&(u=9);return f=r%11<2?0:11-r%11,f===parseInt(h.charAt(1),10)},"Please specify a CNPJ value number"),n.validator.addMethod("cpfBR",function(n,t){"use strict";if(this.optional(t))return!0;if(n=n.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==n.length)return!1;var f,e,u,i,r=0;if(f=parseInt(n.substring(9,10),10),e=parseInt(n.substring(10,11),10),u=function(n,t){var i=10*n%11;return 10!==i&&11!==i||(i=0),i===t},""===n||"00000000000"===n||"11111111111"===n||"22222222222"===n||"33333333333"===n||"44444444444"===n||"55555555555"===n||"66666666666"===n||"77777777777"===n||"88888888888"===n||"99999999999"===n)return!1;for(i=1;i<=9;i++)r+=parseInt(n.substring(i-1,i),10)*(11-i);if(u(r,f)){for(r=0,i=1;i<=10;i++)r+=parseInt(n.substring(i-1,i),10)*(12-i);return u(r,e)}return!1},"Please specify a valid CPF number"),n.validator.addMethod("creditcard",function(n,t){if(this.optional(t))return"dependency-mismatch";if(/[^0-9 \-]+/.test(n))return!1;var i,f,e=0,r=0,u=!1;if(n=n.replace(/\D/g,""),n.length<13||n.length>19)return!1;for(i=n.length-1;i>=0;i--)f=n.charAt(i),r=parseInt(f,10),u&&(r*=2)>9&&(r-=9),e+=r,u=!u;return e%10==0},"Please enter a valid credit card number."),n.validator.addMethod("creditcardtypes",function(n,t,i){if(/[^0-9\-]+/.test(n))return!1;n=n.replace(/\D/g,"");var r=0;return i.mastercard&&(r|=1),i.visa&&(r|=2),i.amex&&(r|=4),i.dinersclub&&(r|=8),i.enroute&&(r|=16),i.discover&&(r|=32),i.jcb&&(r|=64),i.unknown&&(r|=128),i.all&&(r=255),1&r&&(/^(5[12345])/.test(n)||/^(2[234567])/.test(n))?16===n.length:2&r&&/^(4)/.test(n)?16===n.length:4&r&&/^(3[47])/.test(n)?15===n.length:8&r&&/^(3(0[012345]|[68]))/.test(n)?14===n.length:16&r&&/^(2(014|149))/.test(n)?15===n.length:32&r&&/^(6011)/.test(n)?16===n.length:64&r&&/^(3)/.test(n)?16===n.length:64&r&&/^(2131|1800)/.test(n)?15===n.length:!!(128&r)},"Please enter a valid credit card number."),n.validator.addMethod("currency",function(n,t,i){var u,f="string"==typeof i,r=f?i:i[0],e=!!f||i[1];return r=r.replace(/,/g,""),r=e?r+"]":r+"]?",u="^["+r+"([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$",u=new RegExp(u),this.optional(t)||u.test(n)},"Please specify a valid currency"),n.validator.addMethod("dateFA",function(n,t){return this.optional(t)||/^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(n)},n.validator.messages.date),n.validator.addMethod("dateITA",function(n,t){var i,u,f,e,r,o=!1;return/^\d{1,2}\/\d{1,2}\/\d{4}$/.test(n)?(i=n.split("/"),u=parseInt(i[0],10),f=parseInt(i[1],10),e=parseInt(i[2],10),r=new Date(Date.UTC(e,f-1,u,12,0,0,0)),o=r.getUTCFullYear()===e&&r.getUTCMonth()===f-1&&r.getUTCDate()===u):o=!1,this.optional(t)||o},n.validator.messages.date),n.validator.addMethod("dateNL",function(n,t){return this.optional(t)||/^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(n)},n.validator.messages.date),n.validator.addMethod("extension",function(n,t,i){return i="string"==typeof i?i.replace(/,/g,"|"):"png|jpe?g|gif",this.optional(t)||n.match(new RegExp("\\.("+i+")$","i"))},n.validator.format("Please enter a value with a valid extension.")),n.validator.addMethod("giroaccountNL",function(n,t){return this.optional(t)||/^[0-9]{1,7}$/.test(n)},"Please specify a valid giro account number"),n.validator.addMethod("greaterThan",function(t,i,r){var u=n(r);return this.settings.onfocusout&&u.not(".validate-greaterThan-blur").length&&u.addClass("validate-greaterThan-blur").on("blur.validate-greaterThan",function(){n(i).valid()}),t>u.val()},"Please enter a greater value."),n.validator.addMethod("greaterThanEqual",function(t,i,r){var u=n(r);return this.settings.onfocusout&&u.not(".validate-greaterThanEqual-blur").length&&u.addClass("validate-greaterThanEqual-blur").on("blur.validate-greaterThanEqual",function(){n(i).valid()}),t>=u.val()},"Please enter a greater value."),n.validator.addMethod("iban",function(n,t){if(this.optional(t))return!0;var c,f,e,l,o,a,v,r,u,i=n.replace(/ /g,"").toUpperCase(),s="",y=!0,h="",p="";if(i.length<5||(c=i.substring(0,2),a={AL:"\\d{8}[\\dA-Z]{16}",AD:"\\d{8}[\\dA-Z]{12}",AT:"\\d{16}",AZ:"[\\dA-Z]{4}\\d{20}",BE:"\\d{12}",BH:"[A-Z]{4}[\\dA-Z]{14}",BA:"\\d{16}",BR:"\\d{23}[A-Z][\\dA-Z]",BG:"[A-Z]{4}\\d{6}[\\dA-Z]{8}",CR:"\\d{17}",HR:"\\d{17}",CY:"\\d{8}[\\dA-Z]{16}",CZ:"\\d{20}",DK:"\\d{14}",DO:"[A-Z]{4}\\d{20}",EE:"\\d{16}",FO:"\\d{14}",FI:"\\d{14}",FR:"\\d{10}[\\dA-Z]{11}\\d{2}",GE:"[\\dA-Z]{2}\\d{16}",DE:"\\d{18}",GI:"[A-Z]{4}[\\dA-Z]{15}",GR:"\\d{7}[\\dA-Z]{16}",GL:"\\d{14}",GT:"[\\dA-Z]{4}[\\dA-Z]{20}",HU:"\\d{24}",IS:"\\d{22}",IE:"[\\dA-Z]{4}\\d{14}",IL:"\\d{19}",IT:"[A-Z]\\d{10}[\\dA-Z]{12}",KZ:"\\d{3}[\\dA-Z]{13}",KW:"[A-Z]{4}[\\dA-Z]{22}",LV:"[A-Z]{4}[\\dA-Z]{13}",LB:"\\d{4}[\\dA-Z]{20}",LI:"\\d{5}[\\dA-Z]{12}",LT:"\\d{16}",LU:"\\d{3}[\\dA-Z]{13}",MK:"\\d{3}[\\dA-Z]{10}\\d{2}",MT:"[A-Z]{4}\\d{5}[\\dA-Z]{18}",MR:"\\d{23}",MU:"[A-Z]{4}\\d{19}[A-Z]{3}",MC:"\\d{10}[\\dA-Z]{11}\\d{2}",MD:"[\\dA-Z]{2}\\d{18}",ME:"\\d{18}",NL:"[A-Z]{4}\\d{10}",NO:"\\d{11}",PK:"[\\dA-Z]{4}\\d{16}",PS:"[\\dA-Z]{4}\\d{21}",PL:"\\d{24}",PT:"\\d{21}",RO:"[A-Z]{4}[\\dA-Z]{16}",SM:"[A-Z]\\d{10}[\\dA-Z]{12}",SA:"\\d{2}[\\dA-Z]{18}",RS:"\\d{18}",SK:"\\d{20}",SI:"\\d{15}",ES:"\\d{20}",SE:"\\d{20}",CH:"\\d{5}[\\dA-Z]{12}",TN:"\\d{20}",TR:"\\d{5}[\\dA-Z]{17}",AE:"\\d{3}\\d{16}",GB:"[A-Z]{4}\\d{14}",VG:"[\\dA-Z]{4}\\d{16}"},o=a[c],"undefined"!=typeof o&&(v=new RegExp("^[A-Z]{2}\\d{2}"+o+"$",""),!v.test(i))))return!1;for(f=i.substring(4,i.length)+i.substring(0,4),r=0;rr)},n.validator.format("Please select no more than {0} files.")),n.validator.addMethod("maxsize",function(t,i,r){if(this.optional(i))return!0;if("file"===n(i).attr("type")&&i.files&&i.files.length)for(var u=0;ur)return!1;return!0},n.validator.format("File size must not exceed {0} bytes each.")),n.validator.addMethod("maxsizetotal",function(t,i,r){if(this.optional(i))return!0;if("file"===n(i).attr("type")&&i.files&&i.files.length)for(var f=0,u=0;ur)return!1;return!0},n.validator.format("Total size of all files must not exceed {0} bytes.")),n.validator.addMethod("mobileNL",function(n,t){return this.optional(t)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test(n)},"Please specify a valid mobile number"),n.validator.addMethod("mobileRU",function(n,t){var i=n.replace(/\(|\)|\s+|-/g,"");return this.optional(t)||i.length>9&&/^((\+7|7|8)+([0-9]){10})$/.test(i)},"Please specify a valid mobile number"),n.validator.addMethod("mobileUK",function(n,t){return n=n.replace(/\(|\)|\s+|-/g,""),this.optional(t)||n.length>9&&n.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/)},"Please specify a valid mobile number"),n.validator.addMethod("netmask",function(n,t){return this.optional(t)||/^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)/i.test(n)},"Please enter a valid netmask."),n.validator.addMethod("nieES",function(n,t){"use strict";if(this.optional(t))return!0;var i,r=new RegExp(/^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi),u=n.substr(n.length-1).toUpperCase();return n=n.toString().toUpperCase(),!(n.length>10||n.length<9||!r.test(n))&&(n=n.replace(/^[X]/,"0").replace(/^[Y]/,"1").replace(/^[Z]/,"2"),i=9===n.length?n.substr(0,8):n.substr(0,9),"TRWAGMYFPDXBNJZSQVHLCKET".charAt(parseInt(i,10)%23)===u)},"Please specify a valid NIE number."),n.validator.addMethod("nifES",function(n,t){"use strict";return!!this.optional(t)||(n=n.toUpperCase(),!!n.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")&&(/^[0-9]{8}[A-Z]{1}$/.test(n)?"TRWAGMYFPDXBNJZSQVHLCKE".charAt(n.substring(8,0)%23)===n.charAt(8):!!/^[KLM]{1}/.test(n)&&n[8]==="TRWAGMYFPDXBNJZSQVHLCKE".charAt(n.substring(8,1)%23)))},"Please specify a valid NIF number."),n.validator.addMethod("nipPL",function(n){"use strict";var i,u;if(n=n.replace(/[^0-9]/g,""),10!==n.length)return!1;for(var f=[6,5,7,2,3,4,5,6,7],r=0,t=0;t<9;t++)r+=f[t]*n[t];return i=r%11,u=10===i?0:i,u===parseInt(n[9],10)},"Please specify a valid NIP number."),n.validator.addMethod("nisBR",function(n){var r,f,i,t,u,e=0;if(n=n.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==n.length)return!1;for(f=parseInt(n.substring(10,11),10),r=parseInt(n.substring(0,10),10),t=2;t<12;t++)u=t,10===t&&(u=2),11===t&&(u=3),e+=r%10*u,r=parseInt(r/10,10);return i=e%11,i=i>1?11-i:0,f===i},"Please specify a valid NIS/PIS number"),n.validator.addMethod("notEqualTo",function(t,i,r){return this.optional(i)||!n.validator.methods.equalTo.call(this,t,i,r)},"Please enter a different value, values must not be the same."),n.validator.addMethod("nowhitespace",function(n,t){return this.optional(t)||/^\S+$/i.test(n)},"No white space please"),n.validator.addMethod("pattern",function(n,t,i){return!!this.optional(t)||("string"==typeof i&&(i=new RegExp("^(?:"+i+")$")),i.test(n))},"Invalid format."),n.validator.addMethod("phoneNL",function(n,t){return this.optional(t)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(n)},"Please specify a valid phone number."),n.validator.addMethod("phonePL",function(n,t){n=n.replace(/\s+/g,"");return this.optional(t)||/^(?:(?:(?:\+|00)?48)|(?:\(\+?48\)))?(?:1[2-8]|2[2-69]|3[2-49]|4[1-68]|5[0-9]|6[0-35-9]|[7-8][1-9]|9[145])\d{7}$/.test(n)},"Please specify a valid phone number"),n.validator.addMethod("phonesUK",function(n,t){return n=n.replace(/\(|\)|\s+|-/g,""),this.optional(t)||n.length>9&&n.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/)},"Please specify a valid uk phone number"),n.validator.addMethod("phoneUK",function(n,t){return n=n.replace(/\(|\)|\s+|-/g,""),this.optional(t)||n.length>9&&n.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/)},"Please specify a valid phone number"),n.validator.addMethod("phoneUS",function(n,t){return n=n.replace(/\s+/g,""),this.optional(t)||n.length>9&&n.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]\d{2}-?\d{4}$/)},"Please specify a valid phone number"),n.validator.addMethod("postalcodeBR",function(n,t){return this.optional(t)||/^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test(n)},"Informe um CEP válido."),n.validator.addMethod("postalCodeCA",function(n,t){return this.optional(t)||/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test(n)},"Please specify a valid postal code"),n.validator.addMethod("postalcodeIT",function(n,t){return this.optional(t)||/^\d{5}$/.test(n)},"Please specify a valid postal code"),n.validator.addMethod("postalcodeNL",function(n,t){return this.optional(t)||/^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(n)},"Please specify a valid postal code"),n.validator.addMethod("postcodeUK",function(n,t){return this.optional(t)||/^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(n)},"Please specify a valid UK postcode"),n.validator.addMethod("require_from_group",function(t,i,r){var u=n(r[1],i.form),f=u.eq(0),e=f.data("valid_req_grp")?f.data("valid_req_grp"):n.extend({},this),o=u.filter(function(){return e.elementValue(this)}).length>=r[0];return f.data("valid_req_grp",e),n(i).data("being_validated")||(u.data("being_validated",!0),u.each(function(){e.element(this)}),u.data("being_validated",!1)),o},n.validator.format("Please fill at least {0} of these fields.")),n.validator.addMethod("skip_or_fill_minimum",function(t,i,r){var u=n(r[1],i.form),f=u.eq(0),e=f.data("valid_skip")?f.data("valid_skip"):n.extend({},this),o=u.filter(function(){return e.elementValue(this)}).length,s=0===o||o>=r[0];return f.data("valid_skip",e),n(i).data("being_validated")||(u.data("being_validated",!0),u.each(function(){e.element(this)}),u.data("being_validated",!1)),s},n.validator.format("Please either skip these fields or fill at least {0} of them.")),n.validator.addMethod("stateUS",function(n,t,i){var r,u="undefined"==typeof i,o=!u&&"undefined"!=typeof i.caseSensitive&&i.caseSensitive,f=!u&&"undefined"!=typeof i.includeTerritories&&i.includeTerritories,e=!u&&"undefined"!=typeof i.includeMilitary&&i.includeMilitary;return r=f||e?f&&e?"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":f?"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$":"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$",r=o?new RegExp(r):new RegExp(r,"i"),this.optional(t)||r.test(n)},"Please specify a valid state"),n.validator.addMethod("strippedminlength",function(t,i,r){return n(t).text().length>=r},n.validator.format("Please enter at least {0} characters")),n.validator.addMethod("time",function(n,t){return this.optional(t)||/^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test(n)},"Please enter a valid time, between 00:00 and 23:59"),n.validator.addMethod("time12h",function(n,t){return this.optional(t)||/^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(n)},"Please enter a valid time in 12-hour am/pm format"),n.validator.addMethod("url2",function(n,t){return this.optional(t)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(n)},n.validator.messages.url),n.validator.addMethod("vinUS",function(n){if(17!==n.length)return!1;for(var r,t,e,u,f,o=["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"],h=[1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9],c=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],s=0,i=0;i<17;i++){if(e=c[i],t=n.slice(i,i+1),8===i&&(f=t),isNaN(t)){for(r=0;r?@\[\\\]^`{|}~])/g,"\\$1")}function e(n){return n.substr(0,n.lastIndexOf(".")+1)}function o(n,t){return 0===n.indexOf("*.")&&(n=n.replace("*.",t)),n}function c(t,i){var r=n(this).find("[data-valmsg-for='"+f(i[0].name)+"']"),u=r.attr("data-valmsg-replace"),e=u?n.parseJSON(u)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error");t.data("unobtrusiveContainer",r);e?(r.empty(),t.removeClass("input-validation-error").appendTo(r)):t.hide()}function l(t,i){var u=n(this).find("[data-valmsg-summary=true]"),r=u.find("ul");r&&r.length&&i.errorList.length&&(r.empty(),u.addClass("validation-summary-errors").removeClass("validation-summary-valid"),n.each(i.errorList,function(){n("
  • ").html(this.message).appendTo(r)}))}function a(t){var i=t.data("unobtrusiveContainer"),r,u;i&&(r=i.attr("data-valmsg-replace"),u=r?n.parseJSON(r):null,i.addClass("field-validation-valid").removeClass("field-validation-error"),t.removeData("unobtrusiveContainer"),u&&i.empty())}function v(){var t=n(this),i="__jquery_unobtrusive_validation_form_reset";if(!t.data(i)){t.data(i,!0);try{t.data("validator").resetForm()}finally{t.removeData(i)}t.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors");t.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function s(t){var i=n(t),f=i.data(u),s=n.proxy(v,t),e=r.unobtrusive.options||{},o=function(i,r){var u=e[i];u&&n.isFunction(u)&&u.apply(t,r)};return f||(f={options:{errorClass:e.errorClass||"input-validation-error",errorElement:e.errorElement||"span",errorPlacement:function(){c.apply(t,arguments);o("errorPlacement",arguments)},invalidHandler:function(){l.apply(t,arguments);o("invalidHandler",arguments)},messages:{},rules:{},success:function(){a.apply(t,arguments);o("success",arguments)}},attachValidation:function(){i.off("reset."+u,s).on("reset."+u,s).validate(this.options)},validate:function(){return i.validate(),i.valid()}},i.data(u,f)),f}var t,r=n.validator,u="unobtrusiveValidation";return r.unobtrusive={adapters:[],parseElement:function(t,i){var r,u,o,f=n(t),e=f.parents("form")[0];e&&(r=s(e),r.options.rules[t.name]=u={},r.options.messages[t.name]=o={},n.each(this.adapters,function(){var i="data-val-"+this.name,r=f.attr(i),s={};void 0!==r&&(i+="-",n.each(this.params,function(){s[this]=f.attr(i+this)}),this.adapt({element:t,form:e,message:r,params:s,rules:u,messages:o}))}),n.extend(u,{__dummy__:!0}),i||r.attachValidation())},parse:function(t){var i=n(t),u=i.parents().addBack().filter("form").add(i.find("form")).has("[data-val=true]");i.find("[data-val=true]").each(function(){r.unobtrusive.parseElement(this,!0)});u.each(function(){var n=s(this);n&&n.attachValidation()})}},t=r.unobtrusive.adapters,t.add=function(n,t,i){return i||(i=t,t=[]),this.push({name:n,params:t,adapt:i}),this},t.addBool=function(n,t){return this.add(n,function(r){i(r,t||n,!0)})},t.addMinMax=function(n,t,r,u,f,e){return this.add(n,[f||"min",e||"max"],function(n){var f=n.params.min,e=n.params.max;f&&e?i(n,u,[f,e]):f?i(n,t,f):e&&i(n,r,e)})},t.addSingleVal=function(n,t,r){return this.add(n,[t||"val"],function(u){i(u,r||n,u.params[t])})},r.addMethod("__dummy__",function(){return!0}),r.addMethod("regex",function(n,t,i){var r;return!!this.optional(t)||(r=new RegExp(i).exec(n),r&&0===r.index&&r[0].length===n.length)}),r.addMethod("nonalphamin",function(n,t,i){var r;return i&&(r=n.match(/\W/g),r=r&&r.length>=i),r}),r.methods.extension?(t.addSingleVal("accept","mimtype"),t.addSingleVal("extension","extension")):t.addSingleVal("extension","extension","accept"),t.addSingleVal("regex","pattern"),t.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),t.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),t.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),t.add("equalto",["other"],function(t){var r=e(t.element.name),u=t.params.other,s=o(u,r),h=n(t.form).find(":input").filter("[name='"+f(s)+"']")[0];i(t,"equalTo",h)}),t.add("required",function(n){"INPUT"===n.element.tagName.toUpperCase()&&"CHECKBOX"===n.element.type.toUpperCase()||i(n,"required",!0)}),t.add("remote",["url","type","additionalfields"],function(t){var r={url:t.params.url,type:t.params.type||"GET",data:{}},u=e(t.element.name);n.each(h(t.params.additionalfields||t.element.name),function(i,e){var s=o(e,u);r.data[s]=function(){var i=n(t.form).find(":input").filter("[name='"+f(s)+"']");return i.is(":checkbox")?i.filter(":checked").val()||i.filter(":hidden").val()||"":i.is(":radio")?i.filter(":checked").val()||"":i.val()}});i(t,"remote",r)}),t.add("password",["min","nonalphamin","regex"],function(n){n.params.min&&i(n,"minlength",n.params.min);n.params.nonalphamin&&i(n,"nonalphamin",n.params.nonalphamin);n.params.regex&&i(n,"regex",n.params.regex)}),t.add("fileextensions",["extensions"],function(n){i(n,"extension",n.params.extensions)}),n(function(){r.unobtrusive.parse(document)}),r.unobtrusive});!function(n){function i(n,t){for(var i=window,r=(n||"").split(".");i&&r.length;)i=i[r.shift()];return"function"==typeof i?i:(t.push(n),Function.constructor.apply(null,t))}function u(n){return"GET"===n||"POST"===n}function e(n,t){u(t)||n.setRequestHeader("X-HTTP-Method-Override",t)}function o(t,i,r){var u;r.indexOf("application/x-javascript")===-1&&(u=(t.getAttribute("data-ajax-mode")||"").toUpperCase(),n(t.getAttribute("data-ajax-update")).each(function(t,r){switch(u){case"BEFORE":n(r).prepend(i);break;case"AFTER":n(r).append(i);break;case"REPLACE-WITH":n(r).replaceWith(i);break;default:n(r).html(i)}}))}function f(t,r){var c,l,f,a,s,h;(c=t.getAttribute("data-ajax-confirm"),!c||window.confirm(c))&&(l=n(t.getAttribute("data-ajax-loading")),a=parseInt(t.getAttribute("data-ajax-loading-duration"),10)||0,n.extend(r,{type:t.getAttribute("data-ajax-method")||void 0,url:t.getAttribute("data-ajax-url")||void 0,cache:"true"===(t.getAttribute("data-ajax-cache")||"").toLowerCase(),beforeSend:function(n){var r;return e(n,f),r=i(t.getAttribute("data-ajax-begin"),["xhr"]).apply(t,arguments),r!==!1&&l.show(a),r},complete:function(){l.hide(a);i(t.getAttribute("data-ajax-complete"),["xhr","status"]).apply(t,arguments)},success:function(n,r,u){o(t,n,u.getResponseHeader("Content-Type")||"text/html");i(t.getAttribute("data-ajax-success"),["data","status","xhr"]).apply(t,arguments)},error:function(){i(t.getAttribute("data-ajax-failure"),["xhr","status","error"]).apply(t,arguments)}}),r.data.push({name:"X-Requested-With",value:"XMLHttpRequest"}),f=r.type.toUpperCase(),u(f)||(r.type="POST",r.data.push({name:"X-HTTP-Method-Override",value:f})),s=n(t),s.is("form")&&"multipart/form-data"==s.attr("enctype")&&(h=new FormData,n.each(r.data,function(n,t){h.append(t.name,t.value)}),n("input[type=file]",s).each(function(){var t=this;n.each(t.files,function(n,i){h.append(t.name,i)})}),n.extend(r,{processData:!1,contentType:!1,data:h})),n.ajax(r))}function s(t){var i=n(t).data(h);return!i||!i.validate||i.validate()}var t="unobtrusiveAjaxClick",r="unobtrusiveAjaxClickTarget",h="unobtrusiveValidation";n(document).on("click","a[data-ajax=true]",function(n){n.preventDefault();f(this,{url:this.href,type:"GET",data:[]})});n(document).on("click","form[data-ajax=true] input[type=image]",function(i){var r=i.target.name,u=n(i.target),f=n(u.parents("form")[0]),e=u.offset();f.data(t,[{name:r+".x",value:Math.round(i.pageX-e.left)},{name:r+".y",value:Math.round(i.pageY-e.top)}]);setTimeout(function(){f.removeData(t)},0)});n(document).on("click","form[data-ajax=true] :submit",function(i){var f=i.currentTarget.name,e=n(i.target),u=n(e.parents("form")[0]);u.data(t,f?[{name:f,value:i.currentTarget.value}]:[]);u.data(r,e);setTimeout(function(){u.removeData(t);u.removeData(r)},0)});n(document).on("submit","form[data-ajax=true]",function(i){var e=n(this).data(t)||[],u=n(this).data(r),o=u&&(u.hasClass("cancel")||void 0!==u.attr("formnovalidate"));i.preventDefault();(o||s(this))&&f(this,{url:this.action,type:this.method||"GET",data:e.concat(n(this).serializeArray())})})}(jQuery); \ No newline at end of file diff --git a/AspNetCoreElasticsearchAuditTrail/wwwroot/js/vendor.min.js b/AspNetCoreElasticsearchAuditTrail/wwwroot/js/vendor.min.js new file mode 100644 index 0000000..a6e2cc4 --- /dev/null +++ b/AspNetCoreElasticsearchAuditTrail/wwwroot/js/vendor.min.js @@ -0,0 +1,8 @@ +/*! jQuery v3.5.0 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(n,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=n.document?t(n,!0):function(n){if(!n.document)throw new Error("jQuery requires a window with a document");return t(n)}:t(n)}("undefined"!=typeof window?window:this,function(n,t){"use strict";function br(n,t,i){var r,e,u=(i=i||f).createElement("script");if(u.text=n,t)for(r in oe)(e=t[r]||t.getAttribute&&t.getAttribute(r))&&u.setAttribute(r,e);i.head.appendChild(u).parentNode.removeChild(u)}function ut(n){return null==n?n+"":"object"==typeof n||"function"==typeof n?ri[pr.call(n)]||"object":typeof n}function pi(n){var t=!!n&&"length"in n&&n.length,i=ut(n);return!u(n)&&!rt(n)&&("array"===i||0===t||"number"==typeof t&&0t.cacheLength&&delete i[n.shift()],i[r+" "]=u}}function l(n){return n[e]=!0,n}function a(n){var t=i.createElement("fieldset");try{return!!n(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t);t=null}}function ii(n,i){for(var r=n.split("|"),u=r.length;u--;)t.attrHandle[r[u]]=i}function ki(n,t){var i=t&&n,r=i&&1===n.nodeType&&1===t.nodeType&&n.sourceIndex-t.sourceIndex;if(r)return r;if(i)while(i=i.nextSibling)if(i===t)return-1;return n?1:-1}function yr(n){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===n}}function pr(n){return function(t){var i=t.nodeName.toLowerCase();return("input"===i||"button"===i)&&t.type===n}}function di(n){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===n:t.disabled===n:t.isDisabled===n||t.isDisabled!==!n&&vr(t)===n:t.disabled===n:"label"in t&&t.disabled===n}}function it(n){return l(function(t){return t=+t,l(function(i,r){for(var u,f=n([],i.length,t),e=f.length;e--;)i[u=f[e]]&&(i[u]=!(r[u]=i[u]))})})}function ri(n){return n&&"undefined"!=typeof n.getElementsByTagName&&n}function gi(){}function pt(n){for(var t=0,r=n.length,i="";t+~]|"+r+")"+r+"*"),er=new RegExp(r+"|>"),or=new RegExp(ni),sr=new RegExp("^"+tt+"$"),vt={ID:new RegExp("^#("+tt+")"),CLASS:new RegExp("^\\.("+tt+")"),TAG:new RegExp("^("+tt+"|[*])"),ATTR:new RegExp("^"+vi),PSEUDO:new RegExp("^"+ni),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+r+"*(even|odd|(([+-]|)(\\d*)n|)"+r+"*(?:([+-]|)"+r+"*(\\d+)|))"+r+"*\\)|)","i"),bool:new RegExp("^(?:"+gt+")$","i"),needsContext:new RegExp("^"+r+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+r+"*((?:-\\d)?\\d*)"+r+"*\\)|)(?=[^-]|$)","i")},hr=/HTML$/i,cr=/^(?:input|select|textarea|button)$/i,lr=/^h\d$/i,ot=/^[^{]+\{\s*\[native \w/,ar=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ti=/[+~]/,y=new RegExp("\\\\[\\da-fA-F]{1,6}"+r+"?|\\\\([^\\r\\n\\f])","g"),p=function(n,t){var i="0x"+n.slice(1)-65536;return t||(i<0?String.fromCharCode(i+65536):String.fromCharCode(i>>10|55296,1023&i|56320))},pi=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,wi=function(n,t){return t?"\0"===n?"�":n.slice(0,-1)+"\\"+n.charCodeAt(n.length-1).toString(16)+" ":"\\"+n},bi=function(){b()},vr=wt(function(n){return!0===n.disabled&&"fieldset"===n.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{k.apply(g=ai.call(c.childNodes),c.childNodes);g[c.childNodes.length].nodeType}catch(rt){k={apply:g.length?function(n,t){rr.apply(n,ai.call(t))}:function(n,t){for(var i=n.length,r=0;n[i++]=t[r++];);n.length=i-1}}}for(rt in f=u.support={},oi=u.isXML=function(n){var i=n.namespaceURI,t=(n.ownerDocument||n).documentElement;return!hr.test(i||t&&t.nodeName||"HTML")},b=u.setDocument=function(n){var v,u,l=n?n.ownerDocument||n:c;return l!=i&&9===l.nodeType&&l.documentElement&&(s=(i=l).documentElement,h=!oi(i),c!=i&&(u=i.defaultView)&&u.top!==u&&(u.addEventListener?u.addEventListener("unload",bi,!1):u.attachEvent&&u.attachEvent("onunload",bi)),f.scope=a(function(n){return s.appendChild(n).appendChild(i.createElement("div")),"undefined"!=typeof n.querySelectorAll&&!n.querySelectorAll(":scope fieldset div").length}),f.attributes=a(function(n){return n.className="i",!n.getAttribute("className")}),f.getElementsByTagName=a(function(n){return n.appendChild(i.createComment("")),!n.getElementsByTagName("*").length}),f.getElementsByClassName=ot.test(i.getElementsByClassName),f.getById=a(function(n){return s.appendChild(n).id=e,!i.getElementsByName||!i.getElementsByName(e).length}),f.getById?(t.filter.ID=function(n){var t=n.replace(y,p);return function(n){return n.getAttribute("id")===t}},t.find.ID=function(n,t){if("undefined"!=typeof t.getElementById&&h){var i=t.getElementById(n);return i?[i]:[]}}):(t.filter.ID=function(n){var t=n.replace(y,p);return function(n){var i="undefined"!=typeof n.getAttributeNode&&n.getAttributeNode("id");return i&&i.value===t}},t.find.ID=function(n,t){if("undefined"!=typeof t.getElementById&&h){var r,u,f,i=t.getElementById(n);if(i){if((r=i.getAttributeNode("id"))&&r.value===n)return[i];for(f=t.getElementsByName(n),u=0;i=f[u++];)if((r=i.getAttributeNode("id"))&&r.value===n)return[i]}return[]}}),t.find.TAG=f.getElementsByTagName?function(n,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(n):f.qsa?t.querySelectorAll(n):void 0}:function(n,t){var i,r=[],f=0,u=t.getElementsByTagName(n);if("*"===n){while(i=u[f++])1===i.nodeType&&r.push(i);return r}return u},t.find.CLASS=f.getElementsByClassName&&function(n,t){if("undefined"!=typeof t.getElementsByClassName&&h)return t.getElementsByClassName(n)},d=[],o=[],(f.qsa=ot.test(i.querySelectorAll))&&(a(function(n){var t;s.appendChild(n).innerHTML="<\/a>