From 17325a182716892cd90512a2b4aa54bef5c090ac Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 26 Sep 2018 22:03:39 -0400 Subject: [PATCH 001/372] Update SS.Text docs --- README.md | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2f6f1e896..b7c81f19c 100644 --- a/README.md +++ b/README.md @@ -360,11 +360,16 @@ JsonSerializer also supports serialization of anonymous types in much the same w ## Global Default JSON Configuration -The JSON/JSV and CSV serialization can be customized globally by configuring the `JsConfig` or type-specific `JsConfig` static classes with your preferred defaults, e.g: +The JSON/JSV and CSV serialization can be customized globally by configuring the `JsConfig` or type-specific `JsConfig` static classes with your preferred defaults. Global static configuration can be configured once on **Startup** using `JsConfig.Init()`, e.g: ```csharp -JsConfig.EmitLowercaseUnderscoreNames = true; -JsConfig.ExcludeDefaultValues = true; +JsConfig.Init(new Config { + DateHandler = DateHandler.ISO8601, + AlwaysUseUtc = true, + EmitLowercaseUnderscoreNames = false, + EmitCamelCaseNames = false, + ExcludeDefaultValues = true, +}); ``` The following is a list of `bool` options you can use to configure many popular preferences: @@ -427,12 +432,29 @@ The following is a list of `bool` options you can use to configure many popular ### Custom Config Scopes -If you need to override the Global JSON Configuration defaults for adhoc JSON serialization you can use a Custom Config Scope, e.g: +If you need to use different serialization settings from the global static defaults you can use `JsConfig.With()` to create a scoped configuration +using property initializers: ```csharp -using (JsConfig.With(emitCamelCaseNames:true, excludeDefaultValues:true)) +using (JsConfig.With(new Config { + EmitLowercaseUnderscoreNames = true, + EmitCamelCaseNames = false, + PropertyConvention = PropertyConvention.Lenient)) { - var json = dto.ToJson(); + return text.FromJson(); +} +``` + +Or if preferred you use `JsConfig.BeginScope()` to populate scoped configuration properties individually: + +```csharp +using (var scope = JsConfig.BeginScope()) +{ + scope.EmitLowercaseUnderscoreNames = true; + scope.EmitCamelCaseNames = false; + scope.PropertyConvention = PropertyConvention.Lenient; + + return text.FromJson(); } ``` From f24e7a1ec91192228359894796ff85ebefaebdf2 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 4 Oct 2018 06:50:46 -0400 Subject: [PATCH 002/372] Fix FromObjectDictionary --- src/ServiceStack.Text/PlatformExtensions.cs | 4 ++-- .../AutoMappingObjectDictionaryTests.cs | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index b6a20a69c..67f419b7a 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -665,9 +665,9 @@ public static object FromObjectDictionary(this IReadOnlyDictionary); + var alreadyDict = typeof(IReadOnlyDictionary).IsAssignableFrom(type); if (alreadyDict) - return true; + return values; var to = type.CreateInstance(); diff --git a/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs index 615311d80..447ad0efd 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs @@ -397,6 +397,13 @@ public void Can_use_PopulateInstance_to_populate_enum() Assert.That(config.CefSettings.LogSeverity, Is.EqualTo(CefLogSeverity.Verbose)); } + [Test] + public void Can_convert_Dictionary_FromObjectDictionary() + { + var dict = new Dictionary(); + var to = dict.FromObjectDictionary>(); + Assert.That(to == dict); + } } From 5c5511e54c95fa9f8636a9c4205328079ff13e3c Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 9 Oct 2018 11:11:19 +0930 Subject: [PATCH 003/372] Add ToStringDictionary --- src/ServiceStack.Text/PlatformExtensions.cs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index 67f419b7a..dc96380de 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -791,5 +791,26 @@ public static Dictionary MergeIntoObjectDictionary(this object o } return to; } + + public static Dictionary ToStringDictionary(this IReadOnlyDictionary from) => ToStringDictionary(from, null); + + public static Dictionary ToStringDictionary(this IReadOnlyDictionary from, IEqualityComparer comparer) + { + var to = comparer != null + ? new Dictionary(comparer) + : new Dictionary(); + + if (from != null) + { + foreach (var entry in from) + { + to[entry.Key] = entry.Value is string s + ? s + : entry.Value.ConvertTo(); + } + } + + return to; + } } } \ No newline at end of file From 647ccf253f2364200b75536e189e95ca1f8be3af Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 9 Oct 2018 12:00:05 +0930 Subject: [PATCH 004/372] bubble unrelated project Exceptions --- src/ServiceStack.Text/LicenseUtils.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ServiceStack.Text/LicenseUtils.cs b/src/ServiceStack.Text/LicenseUtils.cs index 18334311e..3703dc4fb 100644 --- a/src/ServiceStack.Text/LicenseUtils.cs +++ b/src/ServiceStack.Text/LicenseUtils.cs @@ -221,6 +221,10 @@ public static void RegisterLicense(string licenseKeyText) } catch (Exception ex) { + //bubble unrelated project Exceptions + if (ex is FileNotFoundException || ex is FileLoadException || ex is BadImageFormatException) + throw; + if (ex is LicenseException) throw; From ce8d3a61e4eab9a8cfc91f3f46f5641ce68d0ad7 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 12 Oct 2018 12:37:17 +0930 Subject: [PATCH 005/372] micro op: only trim/allocate if need to --- src/ServiceStack.Text/PathUtils.cs | 36 ++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/ServiceStack.Text/PathUtils.cs b/src/ServiceStack.Text/PathUtils.cs index 708180bac..e4775d059 100644 --- a/src/ServiceStack.Text/PathUtils.cs +++ b/src/ServiceStack.Text/PathUtils.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using ServiceStack.Text; @@ -106,13 +107,40 @@ public static string AssertDir(this string dirPath) return dirPath; } + private static readonly char[] Slashes = { '/', '\\' }; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] //only trim/allocate if need to + private static string TrimEndIf(this string path, char[] chars) + { + if (string.IsNullOrEmpty(path) || chars == null || chars.Length == 0) + return path; + + var lastChar = path[path.Length - 1]; + foreach (var c in chars) + { + if (c == lastChar) + return path.TrimEnd(chars); + } + return path; + } + + public static string CombineWith(this string path, string withPath) + { + if (path == null) + path = ""; + if (string.IsNullOrEmpty(withPath)) + return path; + var startPath = path.TrimEndIf(Slashes); + return startPath + (withPath[0] == '/' ? withPath : "/" + withPath); + } + public static string CombineWith(this string path, params string[] thesePaths) { if (path == null) path = ""; if (thesePaths.Length == 1 && thesePaths[0] == null) return path; - var startPath = path.Length > 1 ? path.TrimEnd('/', '\\') : path; + var startPath = path.TrimEndIf(Slashes); var sb = StringBuilderThreadStatic.Allocate(); sb.Append(startPath); @@ -125,7 +153,7 @@ public static string CombineWith(this string path, params object[] thesePaths) if (thesePaths.Length == 1 && thesePaths[0] == null) return path; var sb = StringBuilderThreadStatic.Allocate(); - sb.Append(path.TrimEnd('/', '\\')); + sb.Append(path.TrimEndIf(Slashes)); AppendPaths(sb, ToStrings(thesePaths)); return StringBuilderThreadStatic.ReturnAndFree(sb); } @@ -155,10 +183,10 @@ public static string ResolvePaths(this string path) var resolvedPath = string.Join("/", combinedPaths); if (path[0] == '/' && prefix.Length == 0) - resolvedPath = '/' + resolvedPath; + resolvedPath = "/" + resolvedPath; return path[path.Length - 1] == '/' && resolvedPath.Length > 0 - ? prefix + resolvedPath + '/' + ? prefix + resolvedPath + "/" : prefix + resolvedPath; } From 384eeebdd55ba0a3a2ae2badb431b766b2f839d3 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 12 Oct 2018 13:30:35 +0930 Subject: [PATCH 006/372] Add Html with UTf8 suffix --- src/ServiceStack.Text/HttpUtils.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 23367c3ea..39834025c 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1072,8 +1072,10 @@ namespace ServiceStack public static class MimeTypes { public static Dictionary ExtensionMimeTypes = new Dictionary(); + public const string Utf8Suffix = "; charset=utf-8"; public const string Html = "text/html"; + public const string HtmlUtf8 = Html + Utf8Suffix; public const string Xml = "application/xml"; public const string XmlText = "text/xml"; public const string Json = "application/json"; From 6d128bdf92cb344078e8035168eec4c350727430 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 13 Oct 2018 00:17:52 +0930 Subject: [PATCH 007/372] Add Config.UnsafeInit() API to bypass Init checks --- src/ServiceStack.Text/JsConfigScope.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/ServiceStack.Text/JsConfigScope.cs b/src/ServiceStack.Text/JsConfigScope.cs index 5231954cc..ceb91dbb2 100644 --- a/src/ServiceStack.Text/JsConfigScope.cs +++ b/src/ServiceStack.Text/JsConfigScope.cs @@ -66,6 +66,16 @@ public static void Init(Config config) InitStackTrace = Environment.StackTrace; } + /// + /// Bypass Init checks. Only call on Startup. + /// + /// + public static void UnsafeInit(Config config) + { + if (config != null) + instance = config; + } + internal static void Reset() { HasInit = false; From 0d56c9d96dc25586ac1568fc1888e2362814467d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 15 Oct 2018 23:48:29 +0930 Subject: [PATCH 008/372] Handle escaped values in AutoMapping --- src/ServiceStack.Text/AutoMappingUtils.cs | 2 +- src/ServiceStack.Text/StringExtensions.cs | 2 +- .../AutoMappingTests.cs | 21 +++++++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 6f5d19c33..2c5963ca6 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -802,7 +802,7 @@ public static GetMemberDelegate CreateTypeConverter(Type fromType, Type toType) return fromValue => TypeSerializer.DeserializeFromString((string)fromValue, toType); if (toType == typeof(string)) - return TypeSerializer.SerializeToString; + return o => TypeSerializer.SerializeToString(o).StripQuotes(); var underlyingToType = Nullable.GetUnderlyingType(toType) ?? toType; var underlyingFromType = Nullable.GetUnderlyingType(fromType) ?? fromType; diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 4cff119ef..43d030c01 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -677,7 +677,7 @@ public static string Quoted(this string text) public static string StripQuotes(this string text) { - return String.IsNullOrEmpty(text) || text.Length < 2 + return string.IsNullOrEmpty(text) || text.Length < 2 ? text : text[0] == '"' && text[text.Length - 1] == '"' ? text.Substring(1, text.Length - 2) diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 45901159c..73c9eca65 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -758,5 +758,26 @@ public void Can_create_DTO_with_Stream() Assert.That(requestObj, Is.Not.Null); } + + public class ModelWithUri + { + public Uri Uri { get; set; } + } + public class ModelWithUriString + { + public string Uri { get; set; } + } + + [Test] + public void Does_map_Uri() + { + var dto = new ModelWithUri { Uri = new Uri("http://a.com") }; + + var to = new ModelWithUri().PopulateWithNonDefaultValues(dto); + Assert.That(to.Uri, Is.EqualTo(dto.Uri)); + + var toString = new ModelWithUriString().PopulateWithNonDefaultValues(dto); + Assert.That(toString.Uri, Is.EqualTo(dto.Uri.AbsoluteUri)); + } } } From 66487a9be1235e561050873c4f881f1e5fdc06b0 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 23 Oct 2018 01:14:57 +0930 Subject: [PATCH 009/372] Add GetStreamFromUrl APIs + friends --- src/ServiceStack.Text/HttpUtils.cs | 117 +++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 39834025c..0dde06ce3 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -708,6 +708,123 @@ public static async Task SendBytesToUrlAsync(this string url, string met return stream.ReadFully(); } } + + public static Stream GetStreamFromUrl(this string url, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return url.SendStreamToUrl(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task GetStreamFromUrlAsync(this string url, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return url.SendStreamToUrlAsync(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Stream PostStreamToUrl(this string url, Stream requestBody = null, string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStreamToUrl(url, method: "POST", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostStreamToUrlAsync(this string url, Stream requestBody = null, string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStreamToUrlAsync(url, method: "POST", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Stream PutStreamToUrl(this string url, Stream requestBody = null, string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStreamToUrl(url, method: "PUT", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutStreamToUrlAsync(this string url, Stream requestBody = null, string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStreamToUrlAsync(url, method: "PUT", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Stream SendStreamToUrl(this string url, string method = null, + Stream requestBody = null, string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + if (method != null) + webReq.Method = method; + + if (contentType != null) + webReq.ContentType = contentType; + + webReq.Accept = accept; + PclExport.Instance.AddCompression(webReq); + + requestFilter?.Invoke(webReq); + + if (ResultsFilter != null) + { + return new MemoryStream(ResultsFilter.GetBytes(webReq, requestBody.ReadFully())); + } + + if (requestBody != null) + { + using (var req = PclExport.Instance.GetRequestStream(webReq)) + { + req.CopyTo(requestBody); + } + } + + using (var webRes = PclExport.Instance.GetResponse(webReq)) + { + responseFilter?.Invoke((HttpWebResponse)webRes); + + var stream = webRes.GetResponseStream(); + return stream; + } + } + + public static async Task SendStreamToUrlAsync(this string url, string method = null, + Stream requestBody = null, string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + if (method != null) + webReq.Method = method; + if (contentType != null) + webReq.ContentType = contentType; + + webReq.Accept = accept; + PclExport.Instance.AddCompression(webReq); + + requestFilter?.Invoke(webReq); + + if (ResultsFilter != null) + { + return new MemoryStream(ResultsFilter.GetBytes(webReq, requestBody.ReadFully())); + } + + if (requestBody != null) + { + using (var req = PclExport.Instance.GetRequestStream(webReq)) + { + await req.CopyToAsync(requestBody); + } + } + + var webRes = await webReq.GetResponseAsync(); + responseFilter?.Invoke((HttpWebResponse)webRes); + + var stream = webRes.GetResponseStream(); + return stream; + } public static bool IsAny300(this Exception ex) { From e1d9ec983cb0a796f425b3af568f937d9ffe69e1 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 23 Oct 2018 02:49:15 +0930 Subject: [PATCH 010/372] don't close ResponseStream in GetStream APIs --- src/ServiceStack.Text/HttpUtils.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 0dde06ce3..a4aedf3b1 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -753,6 +753,9 @@ public static Task PutStreamToUrlAsync(this string url, Stream requestBo accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } + /// + /// Returns HttpWebResponse Stream which must be disposed + /// public static Stream SendStreamToUrl(this string url, string method = null, Stream requestBody = null, string contentType = null, string accept = "*/*", Action requestFilter = null, Action responseFilter = null) @@ -782,15 +785,16 @@ public static Stream SendStreamToUrl(this string url, string method = null, } } - using (var webRes = PclExport.Instance.GetResponse(webReq)) - { - responseFilter?.Invoke((HttpWebResponse)webRes); + var webRes = PclExport.Instance.GetResponse(webReq); + responseFilter?.Invoke((HttpWebResponse)webRes); - var stream = webRes.GetResponseStream(); - return stream; - } + var stream = webRes.GetResponseStream(); + return stream; } + /// + /// Returns HttpWebResponse Stream which must be disposed + /// public static async Task SendStreamToUrlAsync(this string url, string method = null, Stream requestBody = null, string contentType = null, string accept = "*/*", Action requestFilter = null, Action responseFilter = null) From 411587ad1927858d3b796306df0f6c285dce0b16 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 27 Oct 2018 05:44:23 +0930 Subject: [PATCH 011/372] fix typos --- src/ServiceStack.Text/Common/JsWriter.cs | 14 ++++---------- src/ServiceStack.Text/JsConfig.cs | 2 +- src/ServiceStack.Text/TypeConfig.cs | 6 ++++-- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/ServiceStack.Text/Common/JsWriter.cs b/src/ServiceStack.Text/Common/JsWriter.cs index 7e905ce63..984c25d4f 100644 --- a/src/ServiceStack.Text/Common/JsWriter.cs +++ b/src/ServiceStack.Text/Common/JsWriter.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.IO; using System.Runtime.CompilerServices; -using System.Runtime.Serialization; using ServiceStack.Text.Json; using ServiceStack.Text.Jsv; @@ -155,7 +154,7 @@ public static void WriteEnumFlags(TextWriter writer, object enumFlagValue) } } - public static bool ShouldAllowRuntmieType(Type type) + public static bool ShouldAllowRuntimeType(Type type) { if (!JsState.IsRuntimeType) return true; @@ -169,8 +168,7 @@ public static bool ShouldAllowRuntmieType(Type type) var oAttrs = type.AllAttributes(); foreach (var oAttr in oAttrs) { - var attr = oAttr as Attribute; - if (attr == null) continue; + if (!(oAttr is Attribute attr)) continue; if (allowAttributesNamed.Contains(attr.GetType().Name)) return true; } @@ -192,7 +190,7 @@ public static bool ShouldAllowRuntmieType(Type type) public static void AssertAllowedRuntimeType(Type type) { - if (!ShouldAllowRuntmieType(type)) + if (!ShouldAllowRuntimeType(type)) throw new NotSupportedException($"{type.Name} is not an allowed Runtime Type. Whitelist Type with [RuntimeSerializable] or IRuntimeSerializable."); } } @@ -284,10 +282,6 @@ public WriteObjectDelegate GetValueTypeToStringMethod(Type type) { if (underlyingType.IsEnum) { - if (underlyingType.HasAttribute()) - return Serializer.WriteEnumMember; - if (underlyingType.HasAttribute()) - return Serializer.WriteEnumFlags; return Serializer.WriteEnum; } } @@ -439,7 +433,7 @@ private WriteObjectDelegate GetCoreWriteFn() return Serializer.WriteBuiltIn; } - public Dictionary SpecialTypes; + public readonly Dictionary SpecialTypes; public WriteObjectDelegate GetSpecialWriteFn(Type type) { diff --git a/src/ServiceStack.Text/JsConfig.cs b/src/ServiceStack.Text/JsConfig.cs index dd01d1e9f..0095d580f 100644 --- a/src/ServiceStack.Text/JsConfig.cs +++ b/src/ServiceStack.Text/JsConfig.cs @@ -877,7 +877,7 @@ public static Func OnDeserializedFn set { onDeserializedFn = value; RefreshRead(); } } - public static bool HasDeserialingFn => OnDeserializingFn != null; + public static bool HasDeserializingFn => OnDeserializingFn != null; private static Func onDeserializingFn; public static Func OnDeserializingFn diff --git a/src/ServiceStack.Text/TypeConfig.cs b/src/ServiceStack.Text/TypeConfig.cs index 8545d7f32..db60f30ee 100644 --- a/src/ServiceStack.Text/TypeConfig.cs +++ b/src/ServiceStack.Text/TypeConfig.cs @@ -1,6 +1,8 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Runtime.Serialization; namespace ServiceStack.Text { @@ -23,7 +25,7 @@ internal TypeConfig(Type type) JsConfig.AddUniqueType(Type); } } - + public static class TypeConfig { internal static TypeConfig config; @@ -87,7 +89,7 @@ static TypeConfig Create() Fields = config.Type.GetSerializableFields().ToArray(); - if (!JsConfig.HasDeserialingFn) + if (!JsConfig.HasDeserializingFn) OnDeserializing = ReflectionExtensions.GetOnDeserializing(); else config.OnDeserializing = (instance, memberName, value) => JsConfig.OnDeserializingFn((T)instance, memberName, value); From ee8c70d871f5d613e8ffb5316d4c3e7f8401ecf0 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 27 Oct 2018 05:49:22 +0930 Subject: [PATCH 012/372] Use cached Enum type info --- src/ServiceStack.Text/CachedTypeInfo.cs | 85 +++++++++++++++++++ .../Common/ITypeSerializer.cs | 4 - .../Json/JsonTypeSerializer.cs | 26 ++---- .../Json/JsonWriter.Generic.cs | 2 - .../Jsv/JsvTypeSerializer.cs | 32 ++----- tests/ServiceStack.Text.Tests/EnumTests.cs | 29 ++++++- 6 files changed, 125 insertions(+), 53 deletions(-) create mode 100644 src/ServiceStack.Text/CachedTypeInfo.cs diff --git a/src/ServiceStack.Text/CachedTypeInfo.cs b/src/ServiceStack.Text/CachedTypeInfo.cs new file mode 100644 index 000000000..ae05eda25 --- /dev/null +++ b/src/ServiceStack.Text/CachedTypeInfo.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Threading; + +namespace ServiceStack.Text +{ + public class CachedTypeInfo + { + static Dictionary CacheMap = new Dictionary(); + + public static CachedTypeInfo Get(Type type) + { + if (CacheMap.TryGetValue(type, out CachedTypeInfo value)) + return value; + + var instance = new CachedTypeInfo(type); + + Dictionary snapshot, newCache; + do + { + snapshot = CacheMap; + newCache = new Dictionary(CacheMap) + { + [type] = instance + }; + } while (!ReferenceEquals( + Interlocked.CompareExchange(ref CacheMap, newCache, snapshot), snapshot)); + + return instance; + } + + public CachedTypeInfo(Type type) + { + EnumInfo = EnumInfo.GetEnumInfo(type); + } + + internal readonly EnumInfo EnumInfo; + } + + public class EnumInfo + { + internal EnumInfo(Type enumType) + { + var enumValues = Enum.GetValues(enumType); + foreach (var enumValue in enumValues) + { + var mi = enumType.GetMember(enumValue.ToString()); + var enumMemberAttr = mi[0].FirstAttribute(); + if (enumMemberAttr?.Value != null) + { + if (enumMemberValues == null) + enumMemberValues = new Dictionary(); + enumMemberValues[enumValue] = enumMemberAttr.Value; + } + } + isEnumFlag = enumType.IsEnumFlags(); + } + + private readonly bool isEnumFlag; + private readonly Dictionary enumMemberValues; + + public static EnumInfo GetEnumInfo(Type type) + { + if (type.IsEnum) + return new EnumInfo(type); + + var nullableType = Nullable.GetUnderlyingType(type); + if (nullableType?.IsEnum == true) + return new EnumInfo(nullableType); + + return null; + } + + public object GetSerializedValue(object enumValue) + { + if (enumMemberValues != null && enumMemberValues.TryGetValue(enumValue, out var memberValue)) + return memberValue; + if (isEnumFlag || JsConfig.TreatEnumAsInteger) + return enumValue; + return enumValue.ToString(); + } + } + +} \ No newline at end of file diff --git a/src/ServiceStack.Text/Common/ITypeSerializer.cs b/src/ServiceStack.Text/Common/ITypeSerializer.cs index 3d2ada278..4545e0b62 100644 --- a/src/ServiceStack.Text/Common/ITypeSerializer.cs +++ b/src/ServiceStack.Text/Common/ITypeSerializer.cs @@ -49,10 +49,6 @@ public interface ITypeSerializer void WriteDouble(TextWriter writer, object doubleValue); void WriteDecimal(TextWriter writer, object decimalValue); void WriteEnum(TextWriter writer, object enumValue); - void WriteEnumFlags(TextWriter writer, object enumFlagValue); - void WriteEnumMember(TextWriter writer, object enumFlagValue); - - //object EncodeMapKey(object value); ParseStringDelegate GetParseFn(); ParseStringSpanDelegate GetParseStringSpanFn(); diff --git a/src/ServiceStack.Text/Json/JsonTypeSerializer.cs b/src/ServiceStack.Text/Json/JsonTypeSerializer.cs index dd4e22200..770884aa4 100644 --- a/src/ServiceStack.Text/Json/JsonTypeSerializer.cs +++ b/src/ServiceStack.Text/Json/JsonTypeSerializer.cs @@ -280,27 +280,13 @@ public void WriteDecimal(TextWriter writer, object decimalValue) public void WriteEnum(TextWriter writer, object enumValue) { - if (enumValue == null) return; - if (GetTypeInfo(enumValue.GetType()).IsNumeric) - JsWriter.WriteEnumFlags(writer, enumValue); + if (enumValue == null) + return; + var serializedValue = CachedTypeInfo.Get(enumValue.GetType()).EnumInfo.GetSerializedValue(enumValue); + if (serializedValue is string strEnum) + WriteRawString(writer, strEnum); else - WriteRawString(writer, enumValue.ToString()); - } - - public void WriteEnumFlags(TextWriter writer, object enumFlagValue) - { - JsWriter.WriteEnumFlags(writer, enumFlagValue); - } - - public void WriteEnumMember(TextWriter writer, object enumValue) - { - if (enumValue == null) return; - - var enumType = enumValue.GetType(); - var mi = enumType.GetMember(enumValue.ToString()); - var enumMemberAttr = mi[0].FirstAttribute(); - var useValue = enumMemberAttr?.Value ?? enumValue; - WriteRawString(writer, useValue.ToString()); + JsWriter.WriteEnumFlags(writer, enumValue); } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/src/ServiceStack.Text/Json/JsonWriter.Generic.cs b/src/ServiceStack.Text/Json/JsonWriter.Generic.cs index 980d49c4b..3ca27da83 100644 --- a/src/ServiceStack.Text/Json/JsonWriter.Generic.cs +++ b/src/ServiceStack.Text/Json/JsonWriter.Generic.cs @@ -142,7 +142,6 @@ public static void InitAot() public class TypeInfo { internal bool EncodeMapKey; - internal bool IsNumeric; } /// @@ -189,7 +188,6 @@ static JsonWriter() TypeInfo = new TypeInfo { EncodeMapKey = typeof(T) == typeof(bool) || isNumeric, - IsNumeric = isNumeric }; CacheFn = typeof(T) == typeof(object) diff --git a/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs b/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs index c7f94770f..bf8ac24db 100644 --- a/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs +++ b/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs @@ -5,7 +5,6 @@ using System.Globalization; using System.IO; using System.Runtime.CompilerServices; -using System.Runtime.Serialization; using ServiceStack.Text.Common; using ServiceStack.Text.Json; @@ -240,32 +239,13 @@ public void WriteDecimal(TextWriter writer, object decimalValue) public void WriteEnum(TextWriter writer, object enumValue) { - if (enumValue == null) return; - if (JsConfig.TreatEnumAsInteger) - JsWriter.WriteEnumFlags(writer, enumValue); + if (enumValue == null) + return; + var serializedValue = CachedTypeInfo.Get(enumValue.GetType()).EnumInfo.GetSerializedValue(enumValue); + if (serializedValue is string strEnum) + writer.Write(strEnum); else - writer.Write(enumValue.ToString()); - } - - public void WriteEnumFlags(TextWriter writer, object enumFlagValue) - { - JsWriter.WriteEnumFlags(writer, enumFlagValue); - } - - public void WriteEnumMember(TextWriter writer, object enumValue) - { - if (enumValue == null) return; - - var enumType = enumValue.GetType(); - var mi = enumType.GetMember(enumValue.ToString()); - var enumMemberAttr = mi[0].FirstAttribute(); - var useValue = enumMemberAttr?.Value ?? enumValue; - writer.Write(useValue.ToString()); - } - - public object EncodeMapKey(object value) - { - return value; + JsWriter.WriteEnumFlags(writer, enumValue); } public ParseStringDelegate GetParseFn() => JsvReader.Instance.GetParseFn(); diff --git a/tests/ServiceStack.Text.Tests/EnumTests.cs b/tests/ServiceStack.Text.Tests/EnumTests.cs index 36f2ecc85..eea25b68b 100644 --- a/tests/ServiceStack.Text.Tests/EnumTests.cs +++ b/tests/ServiceStack.Text.Tests/EnumTests.cs @@ -36,7 +36,7 @@ public class ClassWithEnums public EnumWithFlags? NullableFlagsEnum { get; set; } public EnumWithoutFlags? NullableNoFlagsEnum { get; set; } } - + [Test] public void Can_correctly_serialize_enums() { @@ -263,6 +263,33 @@ public void Does_serialize_EnumMember_enum() Assert.That(((Day?)Day.Sunday).ToJsv(), Is.EqualTo("SUN")); Assert.That(((Day?)Day.Sunday).ToCsv(), Is.EqualTo("SUN")); } + + public class GetDayOfWeekAsInt + { + public DayOfWeek DayOfWeek { get; set; } + } + + [Test] + public void Can_override_TreatEnumAsInteger() + { + JsConfig.Init(new Config + { + TreatEnumAsInteger = false, + }); + + using (JsConfig.With(new Config + { + TreatEnumAsInteger = true + })) + { + Assert.That(new GetDayOfWeekAsInt { DayOfWeek = DayOfWeek.Tuesday }.ToJson(), Is.EqualTo("{\"DayOfWeek\":2}")); + } + + Assert.That(new GetDayOfWeekAsInt { DayOfWeek = DayOfWeek.Tuesday }.ToJson(), Is.EqualTo("{\"DayOfWeek\":\"Tuesday\"}")); + + JsConfig.Reset(); + } + } } From 057aeacb1fe4b6e83bd2d91f6ca4563c1a74e215 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 29 Oct 2018 10:40:57 -0400 Subject: [PATCH 013/372] inline StringExtensions --- src/ServiceStack.Text/StringExtensions.cs | 82 +++++------------------ 1 file changed, 15 insertions(+), 67 deletions(-) diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 43d030c01..047a261b7 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -999,87 +999,35 @@ public static bool IsSystemType(this Type type) public static bool IsTuple(this Type type) => type.Name.StartsWith("Tuple`"); - public static bool IsInt(this string text) - { - if (string.IsNullOrEmpty(text)) return false; - int ret; - return int.TryParse(text, out ret); - } + public static bool IsInt(this string text) => !string.IsNullOrEmpty(text) && int.TryParse(text, out _); - public static int ToInt(this string text) - { - return text == null ? default(int) : Int32.Parse(text); - } + public static int ToInt(this string text) => text == null ? default(int) : int.Parse(text); - public static int ToInt(this string text, int defaultValue) - { - int ret; - return int.TryParse(text, out ret) ? ret : defaultValue; - } + public static int ToInt(this string text, int defaultValue) => int.TryParse(text, out var ret) ? ret : defaultValue; - public static long ToInt64(this string text) - { - return long.Parse(text); - } + public static long ToInt64(this string text) => long.Parse(text); - public static long ToInt64(this string text, long defaultValue) - { - long ret; - return long.TryParse(text, out ret) ? ret : defaultValue; - } + public static long ToInt64(this string text, long defaultValue) => long.TryParse(text, out var ret) ? ret : defaultValue; - public static float ToFloat(this string text) - { - return text == null ? default(float) : float.Parse(text); - } + public static float ToFloat(this string text) => text == null ? default(float) : float.Parse(text); - public static float ToFloatInvariant(this string text) - { - return text == null ? default(float) : float.Parse(text, CultureInfo.InvariantCulture); - } + public static float ToFloatInvariant(this string text) => text == null ? default(float) : float.Parse(text, CultureInfo.InvariantCulture); - public static float ToFloat(this string text, float defaultValue) - { - float ret; - return float.TryParse(text, out ret) ? ret : defaultValue; - } + public static float ToFloat(this string text, float defaultValue) => float.TryParse(text, out var ret) ? ret : defaultValue; - public static double ToDouble(this string text) - { - return text == null ? default(double) : double.Parse(text); - } + public static double ToDouble(this string text) => text == null ? default(double) : double.Parse(text); - public static double ToDoubleInvariant(this string text) - { - return text == null ? default(double) : double.Parse(text, CultureInfo.InvariantCulture); - } + public static double ToDoubleInvariant(this string text) => text == null ? default(double) : double.Parse(text, CultureInfo.InvariantCulture); - public static double ToDouble(this string text, double defaultValue) - { - double ret; - return double.TryParse(text, out ret) ? ret : defaultValue; - } + public static double ToDouble(this string text, double defaultValue) => double.TryParse(text, out var ret) ? ret : defaultValue; - public static decimal ToDecimal(this string text) - { - return text == null ? default(decimal) : decimal.Parse(text); - } + public static decimal ToDecimal(this string text) => text == null ? default(decimal) : decimal.Parse(text); - public static decimal ToDecimalInvariant(this string text) - { - return text == null ? default(decimal) : decimal.Parse(text, CultureInfo.InvariantCulture); - } + public static decimal ToDecimalInvariant(this string text) => text == null ? default(decimal) : decimal.Parse(text, CultureInfo.InvariantCulture); - public static decimal ToDecimal(this string text, decimal defaultValue) - { - decimal ret; - return decimal.TryParse(text, out ret) ? ret : defaultValue; - } + public static decimal ToDecimal(this string text, decimal defaultValue) => decimal.TryParse(text, out var ret) ? ret : defaultValue; - public static bool Matches(this string value, string pattern) - { - return value.Glob(pattern); - } + public static bool Matches(this string value, string pattern) => value.Glob(pattern); public static bool Glob(this string value, string pattern) { From 554402c72d802379136dd0621bc15017ce38a0d4 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 29 Oct 2018 10:42:23 -0400 Subject: [PATCH 014/372] Also use CachedTypeInfo for Enum deserialization as well --- src/ServiceStack.Text/CachedTypeInfo.cs | 55 +++++++++++++++------- src/ServiceStack.Text/Common/ParseUtils.cs | 18 +------ tests/ServiceStack.Text.Tests/EnumTests.cs | 3 ++ 3 files changed, 43 insertions(+), 33 deletions(-) diff --git a/src/ServiceStack.Text/CachedTypeInfo.cs b/src/ServiceStack.Text/CachedTypeInfo.cs index ae05eda25..f879a0317 100644 --- a/src/ServiceStack.Text/CachedTypeInfo.cs +++ b/src/ServiceStack.Text/CachedTypeInfo.cs @@ -11,7 +11,7 @@ public class CachedTypeInfo public static CachedTypeInfo Get(Type type) { - if (CacheMap.TryGetValue(type, out CachedTypeInfo value)) + if (CacheMap.TryGetValue(type, out var value)) return value; var instance = new CachedTypeInfo(type); @@ -40,37 +40,50 @@ public CachedTypeInfo(Type type) public class EnumInfo { - internal EnumInfo(Type enumType) + public static EnumInfo GetEnumInfo(Type type) + { + if (type.IsEnum) + return new EnumInfo(type); + + var nullableType = Nullable.GetUnderlyingType(type); + if (nullableType?.IsEnum == true) + return new EnumInfo(nullableType); + + return null; + } + + private readonly Type enumType; + private EnumInfo(Type enumType) { + this.enumType = enumType; var enumValues = Enum.GetValues(enumType); + enumMemberReverseLookup = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var enumValue in enumValues) { - var mi = enumType.GetMember(enumValue.ToString()); + var strEnum = enumValue.ToString(); + var mi = enumType.GetMember(strEnum); var enumMemberAttr = mi[0].FirstAttribute(); if (enumMemberAttr?.Value != null) { if (enumMemberValues == null) - enumMemberValues = new Dictionary(); + { + enumMemberValues = new Dictionary(); + } enumMemberValues[enumValue] = enumMemberAttr.Value; + enumMemberReverseLookup[enumMemberAttr.Value] = enumValue; + } + else + { + enumMemberReverseLookup[strEnum] = enumValue; } } isEnumFlag = enumType.IsEnumFlags(); } private readonly bool isEnumFlag; - private readonly Dictionary enumMemberValues; - - public static EnumInfo GetEnumInfo(Type type) - { - if (type.IsEnum) - return new EnumInfo(type); - - var nullableType = Nullable.GetUnderlyingType(type); - if (nullableType?.IsEnum == true) - return new EnumInfo(nullableType); - - return null; - } + private readonly Dictionary enumMemberValues; + private readonly Dictionary enumMemberReverseLookup; public object GetSerializedValue(object enumValue) { @@ -80,6 +93,14 @@ public object GetSerializedValue(object enumValue) return enumValue; return enumValue.ToString(); } + + public object Parse(string serializedValue) + { + if (enumMemberReverseLookup.TryGetValue(serializedValue, out var enumValue)) + return enumValue; + + return Enum.Parse(enumType, serializedValue, ignoreCase: true); + } } } \ No newline at end of file diff --git a/src/ServiceStack.Text/Common/ParseUtils.cs b/src/ServiceStack.Text/Common/ParseUtils.cs index 5670c371e..672d87afe 100644 --- a/src/ServiceStack.Text/Common/ParseUtils.cs +++ b/src/ServiceStack.Text/Common/ParseUtils.cs @@ -68,22 +68,8 @@ public static object TryParseEnum(Type enumType, string str) str = str.Replace("_", ""); } - if (enumType.HasAttribute()) - { - var enumNames = Enum.GetNames(enumType); - var enumValues = Enum.GetValues(enumType); - var i = 0; - foreach (var enumValue in enumValues) - { - var enumName = enumNames[i++]; - var mi = enumType.GetMember(enumName)[0]; - var useValue = mi.FirstAttribute()?.Value ?? enumValue; - if (string.Equals(str, useValue.ToString(), StringComparison.OrdinalIgnoreCase)) - return enumValue; - } - } - - return Enum.Parse(enumType, str, ignoreCase: true); + var enumInfo = CachedTypeInfo.Get(enumType).EnumInfo; + return enumInfo.Parse(str); } } diff --git a/tests/ServiceStack.Text.Tests/EnumTests.cs b/tests/ServiceStack.Text.Tests/EnumTests.cs index eea25b68b..f88cb117e 100644 --- a/tests/ServiceStack.Text.Tests/EnumTests.cs +++ b/tests/ServiceStack.Text.Tests/EnumTests.cs @@ -283,13 +283,16 @@ public void Can_override_TreatEnumAsInteger() })) { Assert.That(new GetDayOfWeekAsInt { DayOfWeek = DayOfWeek.Tuesday }.ToJson(), Is.EqualTo("{\"DayOfWeek\":2}")); + Assert.That("{\"DayOfWeek\":2}".FromJson().DayOfWeek, Is.EqualTo(DayOfWeek.Tuesday)); } Assert.That(new GetDayOfWeekAsInt { DayOfWeek = DayOfWeek.Tuesday }.ToJson(), Is.EqualTo("{\"DayOfWeek\":\"Tuesday\"}")); + Assert.That("{\"DayOfWeek\":\"Tuesday\"}".FromJson().DayOfWeek, Is.EqualTo(DayOfWeek.Tuesday)); JsConfig.Reset(); } + } } From 7b24032dfcc0200fac9f43f6ba99b10ffd5e405a Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 29 Oct 2018 10:55:19 -0400 Subject: [PATCH 015/372] Add int EnumMember deserialization test --- src/ServiceStack.Text/CachedTypeInfo.cs | 2 +- tests/ServiceStack.Text.Tests/EnumTests.cs | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/CachedTypeInfo.cs b/src/ServiceStack.Text/CachedTypeInfo.cs index f879a0317..74d71e47e 100644 --- a/src/ServiceStack.Text/CachedTypeInfo.cs +++ b/src/ServiceStack.Text/CachedTypeInfo.cs @@ -99,7 +99,7 @@ public object Parse(string serializedValue) if (enumMemberReverseLookup.TryGetValue(serializedValue, out var enumValue)) return enumValue; - return Enum.Parse(enumType, serializedValue, ignoreCase: true); + return Enum.Parse(enumType, serializedValue, ignoreCase: true); //Also parses quoted int values, e.g. "1" } } diff --git a/tests/ServiceStack.Text.Tests/EnumTests.cs b/tests/ServiceStack.Text.Tests/EnumTests.cs index f88cb117e..19a9350cf 100644 --- a/tests/ServiceStack.Text.Tests/EnumTests.cs +++ b/tests/ServiceStack.Text.Tests/EnumTests.cs @@ -264,6 +264,13 @@ public void Does_serialize_EnumMember_enum() Assert.That(((Day?)Day.Sunday).ToCsv(), Is.EqualTo("SUN")); } + [Test] + public void Can_deserialize_EnumMember_with_int_value() + { + var fromDto = "{\"Day\":1}".FromJson(); + Assert.That(fromDto.Day, Is.EqualTo(Day.Tuesday)); + } + public class GetDayOfWeekAsInt { public DayOfWeek DayOfWeek { get; set; } From 1a6d461a72e2149a2c2f72484d7f274327702d08 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 29 Oct 2018 23:09:56 -0400 Subject: [PATCH 016/372] Fix issue of enums with multiple same values --- src/ServiceStack.Text/CachedTypeInfo.cs | 13 +++++++------ tests/ServiceStack.Text.Tests/EnumTests.cs | 11 +++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/ServiceStack.Text/CachedTypeInfo.cs b/src/ServiceStack.Text/CachedTypeInfo.cs index 74d71e47e..770d12fdb 100644 --- a/src/ServiceStack.Text/CachedTypeInfo.cs +++ b/src/ServiceStack.Text/CachedTypeInfo.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Reflection; using System.Runtime.Serialization; using System.Threading; @@ -56,14 +57,14 @@ public static EnumInfo GetEnumInfo(Type type) private EnumInfo(Type enumType) { this.enumType = enumType; - var enumValues = Enum.GetValues(enumType); enumMemberReverseLookup = new Dictionary(StringComparer.OrdinalIgnoreCase); - - foreach (var enumValue in enumValues) + + var enumMembers = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); + foreach (var fi in enumMembers) { - var strEnum = enumValue.ToString(); - var mi = enumType.GetMember(strEnum); - var enumMemberAttr = mi[0].FirstAttribute(); + var enumValue = fi.GetValue(null); + var strEnum = fi.Name; + var enumMemberAttr = fi.FirstAttribute(); if (enumMemberAttr?.Value != null) { if (enumMemberValues == null) diff --git a/tests/ServiceStack.Text.Tests/EnumTests.cs b/tests/ServiceStack.Text.Tests/EnumTests.cs index 19a9350cf..e14d282cb 100644 --- a/tests/ServiceStack.Text.Tests/EnumTests.cs +++ b/tests/ServiceStack.Text.Tests/EnumTests.cs @@ -299,6 +299,17 @@ public void Can_override_TreatEnumAsInteger() JsConfig.Reset(); } + public class FeatureDto + { + public LicenseFeature Feature { get; set; } + } + + [Test] + public void Can_deserialize_Flag_Enum_with_multiple_same_values() + { + var key = "{\"Feature\":\"Premium\"}".FromJson(); + Assert.That(key.Feature, Is.EqualTo(LicenseFeature.Premium)); + } } } From b0884b8d4eef3f20af482c69646f460e2678a43b Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 4 Nov 2018 22:03:32 -0500 Subject: [PATCH 017/372] Add HasAttributeCached --- src/ServiceStack.Text/PlatformExtensions.cs | 35 +++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index dc96380de..a0d475bf6 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -131,6 +131,36 @@ public static MethodInfo GetInstanceMethod(this Type type, string methodName) => [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool HasAttribute(this MethodInfo mi) => mi.AllAttributes().Any(x => x.GetType() == typeof(T)); + private static Dictionary hasAttributeCache = new Dictionary(); + public static bool HasAttributeCached(this MemberInfo memberInfo) + { + if (hasAttributeCache.TryGetValue(memberInfo, out var hasAttr)) + return hasAttr; + + hasAttr = memberInfo is Type t + ? t.AllAttributes().Any(x => x.GetType() == typeof(T)) + : memberInfo is PropertyInfo pi + ? pi.AllAttributes().Any(x => x.GetType() == typeof(T)) + : memberInfo is FieldInfo fi + ? fi.AllAttributes().Any(x => x.GetType() == typeof(T)) + : memberInfo is MethodInfo mi + ? mi.AllAttributes().Any(x => x.GetType() == typeof(T)) + : throw new NotSupportedException(memberInfo.GetType().Name); + + Dictionary snapshot, newCache; + do + { + snapshot = hasAttributeCache; + newCache = new Dictionary(hasAttributeCache) { + [memberInfo] = hasAttr + }; + + } while (!ReferenceEquals( + Interlocked.CompareExchange(ref hasAttributeCache, newCache, snapshot), snapshot)); + + return hasAttr; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool HasAttributeNamed(this Type type, string name) { @@ -556,8 +586,9 @@ public static Type GetCachedGenericType(this Type type, params Type[] argTypes) do { snapshot = GenericTypeCache; - newCache = new Dictionary(GenericTypeCache); - newCache[key] = genericType; + newCache = new Dictionary(GenericTypeCache) { + [key] = genericType + }; } while (!ReferenceEquals( Interlocked.CompareExchange(ref GenericTypeCache, newCache, snapshot), snapshot)); From 1b1849ae9d18d249ae53be34c02cf6e999528a28 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 30 Nov 2018 23:45:48 +0800 Subject: [PATCH 018/372] remove deprecated APIs --- src/ServiceStack.Text/DynamicNumber.cs | 4 +- src/ServiceStack.Text/LicenseUtils.cs | 2 +- .../PclExport.NetStandard.cs | 81 ++++++------------- 3 files changed, 29 insertions(+), 58 deletions(-) diff --git a/src/ServiceStack.Text/DynamicNumber.cs b/src/ServiceStack.Text/DynamicNumber.cs index 4778f6333..3d9b5ea02 100644 --- a/src/ServiceStack.Text/DynamicNumber.cs +++ b/src/ServiceStack.Text/DynamicNumber.cs @@ -580,8 +580,8 @@ public static IDynamicNumber AssertNumbers(string name, object lhs, object rhs) if (number == null) { throw new ArgumentException($"Invalid numbers passed to {name}: " + - $"({lhs?.GetType().Name ?? "null"} '{lhs?.ToString().SubstringWithElipsis(0, 100)}', " + - $"{rhs?.GetType().Name ?? "null"} '{rhs?.ToString().SubstringWithElipsis(0, 100)}')"); + $"({lhs?.GetType().Name ?? "null"} '{lhs?.ToString().SubstringWithEllipsis(0, 100)}', " + + $"{rhs?.GetType().Name ?? "null"} '{rhs?.ToString().SubstringWithEllipsis(0, 100)}')"); } return number; diff --git a/src/ServiceStack.Text/LicenseUtils.cs b/src/ServiceStack.Text/LicenseUtils.cs index 3703dc4fb..517de8014 100644 --- a/src/ServiceStack.Text/LicenseUtils.cs +++ b/src/ServiceStack.Text/LicenseUtils.cs @@ -498,7 +498,7 @@ public static LicenseKey VerifyLicenseKeyText(string licenseKeyText) if (!licenseKeyText.VerifyLicenseKeyText(out key)) throw new ArgumentException("licenseKeyText"); } - catch (Exception e) + catch (Exception) { if (!VerifyLicenseKeyTextFallback(licenseKeyText, out key)) throw; diff --git a/src/ServiceStack.Text/PclExport.NetStandard.cs b/src/ServiceStack.Text/PclExport.NetStandard.cs index 80351a2d3..c75e1b34c 100644 --- a/src/ServiceStack.Text/PclExport.NetStandard.cs +++ b/src/ServiceStack.Text/PclExport.NetStandard.cs @@ -49,35 +49,6 @@ public class NetStandardPclExport : PclExport "--MM--zzzzzz", }; - [Obsolete("Temp API to be removed in future. Submit Issue if ever needed")] - public static void InitHttpRequestDelegates() - { - SetUserAgentDelegate = (Action)typeof(HttpWebRequest) - .GetProperty("UserAgent") - ?.GetSetMethod(nonPublic:true)?.CreateDelegate(typeof(Action)); - - SetAllowAutoRedirectDelegate = (Action)typeof(HttpWebRequest) - .GetProperty("AllowAutoRedirect") - ?.GetSetMethod(nonPublic:true)?.CreateDelegate(typeof(Action)); - - SetKeepAliveDelegate = (Action)typeof(HttpWebRequest) - .GetProperty("KeepAlive") - ?.GetSetMethod(nonPublic:true)?.CreateDelegate(typeof(Action)); - - SetContentLengthDelegate = (Action)typeof(HttpWebRequest) - .GetProperty("ContentLength") - ?.GetSetMethod(nonPublic:true)?.CreateDelegate(typeof(Action)); - } - - [Obsolete("Temp API to be removed in future. Submit Issue if ever needed")] - public static Action SetUserAgentDelegate { get; set; } - [Obsolete("Temp API to be removed in future. Submit Issue if ever needed")] - public static Action SetAllowAutoRedirectDelegate { get; set; } - [Obsolete("Temp API to be removed in future. Submit Issue if ever needed")] - public static Action SetKeepAliveDelegate { get; set; } - [Obsolete("Temp API to be removed in future. Submit Issue if ever needed")] - public static Action SetContentLengthDelegate { get; set; } - public NetStandardPclExport() { this.PlatformName = Platforms.NetStandard; @@ -284,50 +255,50 @@ private static StringCollection ParseStringCollection(ReadOnlySpan< } public override void SetUserAgent(HttpWebRequest httpReq, string value) { - if (SetUserAgentDelegate != null) + try { - SetUserAgentDelegate(httpReq, value); - } - else + httpReq.UserAgent = value; + } + catch (Exception e) // API may have been removed by Xamarin's Linker { - try - { - httpReq.UserAgent = value; - } - catch (Exception e) // API may have been removed by Xamarin's Linker - { - Tracer.Instance.WriteError(e); - } + Tracer.Instance.WriteError(e); } } public override void SetContentLength(HttpWebRequest httpReq, long value) { - if (SetContentLengthDelegate != null) + try { - SetContentLengthDelegate(httpReq, value); - } - else + httpReq.ContentLength = value; + } + catch (Exception e) // API may have been removed by Xamarin's Linker { - try - { - httpReq.ContentLength = value; - } - catch (Exception e) // API may have been removed by Xamarin's Linker - { - Tracer.Instance.WriteError(e); - } + Tracer.Instance.WriteError(e); } } public override void SetAllowAutoRedirect(HttpWebRequest httpReq, bool value) { - SetAllowAutoRedirectDelegate?.Invoke(httpReq, value); + try + { + httpReq.AllowAutoRedirect = value; + } + catch (Exception e) // API may have been removed by Xamarin's Linker + { + Tracer.Instance.WriteError(e); + } } public override void SetKeepAlive(HttpWebRequest httpReq, bool value) { - SetKeepAliveDelegate?.Invoke(httpReq, value); + try + { + httpReq.KeepAlive = value; + } + catch (Exception e) // API may have been removed by Xamarin's Linker + { + Tracer.Instance.WriteError(e); + } } public override void InitHttpWebRequest(HttpWebRequest httpReq, From 3f1a5eae7410da925cb9fb2f7abeaa00f5f075d3 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 30 Nov 2018 23:46:32 +0800 Subject: [PATCH 019/372] nuspec --- NuGet/ServiceStack.Text/servicestack.text.nuspec | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NuGet/ServiceStack.Text/servicestack.text.nuspec b/NuGet/ServiceStack.Text/servicestack.text.nuspec index 925546365..04af3c29b 100644 --- a/NuGet/ServiceStack.Text/servicestack.text.nuspec +++ b/NuGet/ServiceStack.Text/servicestack.text.nuspec @@ -8,8 +8,9 @@ ServiceStack .NET's fastest JSON, JSV and CSV Text Serializers - .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. - Contains ServiceStack's high-performance text-processing powers, for more info see: https://servicestack.net/text + .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. + Contains ServiceStack's high-performance text-processing powers, for more info see: + https://github.com/ServiceStack/ServiceStack.Text https://github.com/ServiceStack/ServiceStack.Text https://servicestack.net/terms From e5b83eed799dfa92e78b8006f3a272ef8dc76fb3 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 12 Dec 2018 20:24:34 +0800 Subject: [PATCH 020/372] Refector to use common Directory.Build.props + SourceLink + Embedded .pdbs --- NuGet/NuGetPack.cmd | 2 - NuGet/NuGetPush.cmd | 9 - build/build.bat | 5 +- build/build.proj | 215 ++++++++---------- src/Directory.Build.props | 47 ++++ .../ServiceStack.Memory.csproj | 1 - src/ServiceStack.Text.sln | 2 + .../Properties/AssemblyInfo.cs | 34 +-- .../ServiceStack.Text.Core.csproj | 29 +++ .../ServiceStack.Text.csproj | 42 +--- 10 files changed, 184 insertions(+), 202 deletions(-) delete mode 100644 NuGet/NuGetPack.cmd delete mode 100644 NuGet/NuGetPush.cmd create mode 100644 src/Directory.Build.props create mode 100644 src/ServiceStack.Text/ServiceStack.Text.Core.csproj diff --git a/NuGet/NuGetPack.cmd b/NuGet/NuGetPack.cmd deleted file mode 100644 index a6284979e..000000000 --- a/NuGet/NuGetPack.cmd +++ /dev/null @@ -1,2 +0,0 @@ -SET NUGET=..\src\.nuget\nuget -%NUGET% pack ServiceStack.Text\servicestack.text.nuspec -symbols diff --git a/NuGet/NuGetPush.cmd b/NuGet/NuGetPush.cmd deleted file mode 100644 index 47a20b1c8..000000000 --- a/NuGet/NuGetPush.cmd +++ /dev/null @@ -1,9 +0,0 @@ -SET NUGET=..\src\.nuget\nuget -%NUGET% push ServiceStack.Text.4.0.15.nupkg -%NUGET% push ServiceStack.Text.4.0.15.symbols.nupkg - -%NUGET% push ServiceStack.Text.Pcl.4.0.15.nupkg -%NUGET% push ServiceStack.Text.Pcl.4.0.15.symbols.nupkg - -%NUGET% push ServiceStack.Text.Signed.4.0.15.nupkg -%NUGET% push ServiceStack.Text.Signed.4.0.15.symbols.nupkg diff --git a/build/build.bat b/build/build.bat index 509895586..209743e96 100644 --- a/build/build.bat +++ b/build/build.bat @@ -1,6 +1,3 @@ SET MSBUILD="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe" -%MSBUILD% build.proj /target:Default;NuGetPack /property:Configuration=Release;MinorVersion=1;PatchVersion=0 - -REM msbuild /p:Configuration=Release ..\src\ServiceStack.Text.sln - +%MSBUILD% build.proj /property:Configuration=Release;MinorVersion=1;PatchVersion=1 diff --git a/build/build.proj b/build/build.proj index 72e9308ea..2e2f3c9cd 100644 --- a/build/build.proj +++ b/build/build.proj @@ -1,125 +1,96 @@ - - - - 5 - 0 - $(BUILD_NUMBER) - - - - $(MSBuildProjectDirectory)/.. - $(BuildSolutionDir)/src - Release - $(BuildSolutionDir)/src/.nuget/nuget.exe - $(BuildSolutionDir)/NuGet/ - $(MajorVersion).$(MinorVersion).$(PatchVersion).0 - $(MajorVersion).$(MinorVersion).$(PatchVersion) - $(MajorVersion).$(MinorVersion)$(PatchVersion) - - - - - - - - - BeforeBuildSolutions; - BuildSolutions - - - - - - - - - - - - - - - - - - - - - - - - AssemblyFileVersion\(\"\d+\.\d+\.\d+\.\d+\"\) - AssemblyFileVersion("$(Version)") - - - - ServiceStackVersion = \d+\.\d+m; - ServiceStackVersion = $(EnvVersion)m; - - - - new DateTime.* - new DateTime($([System.DateTime]::Now.ToString(`yyyy,MM,dd`))); - - - - - version="5\.[^"]*" - version="$(PackageVersion)" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns='http://schemas.microsoft.com/developer/msbuild/2003' ToolsVersion="4.0"> + + + + 5 + 0 + $(BUILD_NUMBER) + + + + $(MSBuildProjectDirectory)/.. + $(BuildSolutionDir)/src + Release + $(BuildSolutionDir)/src/.nuget/nuget.exe + $(BuildSolutionDir)/NuGet/ + $(MajorVersion).$(MinorVersion).$(PatchVersion).0 + $(MajorVersion).$(MinorVersion).$(PatchVersion) + $(MajorVersion).$(MinorVersion)$(PatchVersion) + + + + + BeforeBuildSolutions; + BuildSolutions + + + + + + + + + + + + + + + + + + + + + + + + + ServiceStackVersion = \d+\.\d+m; + ServiceStackVersion = $(EnvVersion)m; + + + + new DateTime.* + new DateTime($([System.DateTime]::Now.ToString(`yyyy,MM,dd`))); + + + + + <Version>[^<]* + <Version>$(PackageVersion) + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 000000000..0c630516f --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,47 @@ + + + + 5.0.0 + ServiceStack + ServiceStack, Inc. + © 2008-2018 ServiceStack, Inc + true + https://github.com/ServiceStack/ServiceStack.Text + https://servicestack.net/terms + https://servicestack.net/img/logo-64.png + https://docs.servicestack.net/release-notes-history + git + https://github.com/ServiceStack/ServiceStack.Text.git + embedded + latest + true + true + false + + + + true + true + + + + $(DefineConstants);NET45 + True + False + ../servicestack.snk + true + + + + $(DefineConstants);NETSTANDARD2_0 + + + + + + + + DEBUG + + + diff --git a/src/ServiceStack.Memory/ServiceStack.Memory.csproj b/src/ServiceStack.Memory/ServiceStack.Memory.csproj index 55d4f83de..a53bbc20f 100644 --- a/src/ServiceStack.Memory/ServiceStack.Memory.csproj +++ b/src/ServiceStack.Memory/ServiceStack.Memory.csproj @@ -1,7 +1,6 @@  netcoreapp2.1 - 7.2 $(DefineConstants);NETCORE2_1 diff --git a/src/ServiceStack.Text.sln b/src/ServiceStack.Text.sln index 51d3e1b06..7b1339201 100644 --- a/src/ServiceStack.Text.sln +++ b/src/ServiceStack.Text.sln @@ -13,6 +13,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{F7FB50ED ..\NuGet\ServiceStack.Text.Core\servicestack.text.core.nuspec = ..\NuGet\ServiceStack.Text.Core\servicestack.text.core.nuspec ..\NuGet\ServiceStack.Text\servicestack.text.nuspec = ..\NuGet\ServiceStack.Text\servicestack.text.nuspec ..\NuGet\ServiceStack.Memory\servicestack.memory.nuspec = ..\NuGet\ServiceStack.Memory\servicestack.memory.nuspec + Directory.Build.props = Directory.Build.props + ServiceStack.Text\ServiceStack.Text.Core.csproj = ServiceStack.Text\ServiceStack.Text.Core.csproj EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServiceStack.Text", "ServiceStack.Text\ServiceStack.Text.csproj", "{579B3FDB-CDAD-44E1-8417-885C38E49A0E}" diff --git a/src/ServiceStack.Text/Properties/AssemblyInfo.cs b/src/ServiceStack.Text/Properties/AssemblyInfo.cs index 85d1ea7ef..2136c0240 100644 --- a/src/ServiceStack.Text/Properties/AssemblyInfo.cs +++ b/src/ServiceStack.Text/Properties/AssemblyInfo.cs @@ -1,37 +1,5 @@ -using System.Reflection; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ServiceStack.Text")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("ServiceStack")] -[assembly: AssemblyProduct("ServiceStack.Text")] -[assembly: AssemblyCopyright("Copyright (c) ServiceStack 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -#if !PCL [assembly: Guid("a352d4d3-df2a-4c78-b646-67181a6333a6")] -#endif - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("5.0.0.0")] -[assembly: AssemblyFileVersion("5.0.0.0")] +[assembly: System.Reflection.AssemblyVersion("5.0.0.0")] diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj new file mode 100644 index 000000000..be4ec1f9a --- /dev/null +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -0,0 +1,29 @@ + + + ServiceStack.Text.Core + ServiceStack.Text + ServiceStack.Text .NET Standard 2.0 + netstandard2.0;netcoreapp2.1 + + .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. + Contains ServiceStack's high-performance text-processing powers, for more info see: + https://github.com/ServiceStack/ServiceStack.Text + + JSON;Text;Serializer;CSV;JSV;HTTP;Auto Mapping;Dump;Reflection;JS;Utils;Fast + + + $(DefineConstants);NETSTANDARD2_0;NETCORE2_1 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index 47705dacc..8c0c709c5 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -1,32 +1,18 @@  - net45;netstandard2.0;netcoreapp2.1 - ServiceStack.Text ServiceStack.Text - false - false - false - false - false - false - false - false - false - 7.2 - - - true - true - - - portable + ServiceStack.Text + .NET's fastest JSON Serializer by ServiceStack + net45;netstandard2.0;netcoreapp2.1 + + .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. + Contains ServiceStack's high-performance text-processing powers, for more info see: + https://github.com/ServiceStack/ServiceStack.Text + + JSON;Text;Serializer;CSV;JSV;HTTP;Auto Mapping;Dump;Reflection;JS;Utils;Fast - - $(DefineConstants);NET45 - True - False - ../servicestack.snk - true + + $(DefineConstants);NETSTANDARD2_0;NETCORE2_1 @@ -35,17 +21,11 @@ - - $(DefineConstants);NETSTANDARD2_0 - - - $(DefineConstants);NETSTANDARD2_0;NETCORE2_1 - From 783b721f21ca195f8c1238a9d11c8d340a086c30 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 13 Dec 2018 04:37:25 +0800 Subject: [PATCH 021/372] DRY ClearNuGetRestoreCaches in build.proj --- build/build.proj | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/build/build.proj b/build/build.proj index 2e2f3c9cd..1a9cb08de 100644 --- a/build/build.proj +++ b/build/build.proj @@ -37,14 +37,18 @@ - - + + + + + + @@ -81,7 +85,7 @@ Properties="Configuration=$(Configuration)" /> - + Date: Fri, 14 Dec 2018 23:56:25 +0800 Subject: [PATCH 022/372] Trim JSV props --- src/ServiceStack.Text/Common/DeserializeTypeRefJsv.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Common/DeserializeTypeRefJsv.cs b/src/ServiceStack.Text/Common/DeserializeTypeRefJsv.cs index b0a39ad3d..aef14a9e5 100644 --- a/src/ServiceStack.Text/Common/DeserializeTypeRefJsv.cs +++ b/src/ServiceStack.Text/Common/DeserializeTypeRefJsv.cs @@ -37,7 +37,7 @@ internal static object StringToType(ReadOnlySpan strType, var strTypeLength = strType.Length; while (index < strTypeLength) { - var propertyName = Serializer.EatMapKey(strType, ref index); + var propertyName = Serializer.EatMapKey(strType, ref index).Trim(); //Serializer.EatMapKeySeperator(strType, ref index); index++; From 9828e0f04a85392a1779ee3e9293447c33f156fa Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 15 Dec 2018 02:05:32 +0800 Subject: [PATCH 023/372] Add CI NuGet.Config --- src/NuGet.Config | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/NuGet.Config diff --git a/src/NuGet.Config b/src/NuGet.Config new file mode 100644 index 000000000..42daf5f44 --- /dev/null +++ b/src/NuGet.Config @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file From 9abe46e462a751f93b505d5f527e04865ccf94d1 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 15 Dec 2018 02:53:20 +0800 Subject: [PATCH 024/372] Update Version to v5.4.1 to use CI NuGet packages --- src/NuGet.Config => NuGet.Config | 0 build/build.bat | 2 +- build/build.proj | 2 +- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 13 +++++++++++++ 5 files changed, 16 insertions(+), 3 deletions(-) rename src/NuGet.Config => NuGet.Config (100%) create mode 100644 tests/Directory.Build.props diff --git a/src/NuGet.Config b/NuGet.Config similarity index 100% rename from src/NuGet.Config rename to NuGet.Config diff --git a/build/build.bat b/build/build.bat index 209743e96..bc3006a32 100644 --- a/build/build.bat +++ b/build/build.bat @@ -1,3 +1,3 @@ SET MSBUILD="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe" -%MSBUILD% build.proj /property:Configuration=Release;MinorVersion=1;PatchVersion=1 +%MSBUILD% build.proj /property:Configuration=Release;MinorVersion=4;PatchVersion=1 diff --git a/build/build.proj b/build/build.proj index 1a9cb08de..14534e65f 100644 --- a/build/build.proj +++ b/build/build.proj @@ -63,7 +63,7 @@ - + <Version>[^<]* <Version>$(PackageVersion) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 0c630516f..8f18b7ca6 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.0.0 + 5.4.1 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props new file mode 100644 index 000000000..ce1a79289 --- /dev/null +++ b/tests/Directory.Build.props @@ -0,0 +1,13 @@ + + + + 5.4.1 + latest + false + + + + DEBUG + + + From 12c4b15071d945e30ade6a132fe60a892d8f4c14 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 15 Dec 2018 03:02:01 +0800 Subject: [PATCH 025/372] remove unused /lib /NuGet/*.nuspec's --- .../servicestack.memory.nuspec | 34 - .../servicestack.text.core.nuspec | 38 - .../servicestack.text.nuspec | 43 - lib/copy.bat | 19 - lib/net45/Northwind.Common.dll | Bin 1438720 -> 0 bytes lib/net45/ServiceStack.Client.dll | Bin 200704 -> 0 bytes lib/net45/ServiceStack.Common.dll | Bin 477184 -> 0 bytes lib/net45/ServiceStack.Interfaces.dll | Bin 139776 -> 0 bytes lib/net45/ServiceStack.Text.dll | Bin 442368 -> 0 bytes lib/net45/ServiceStack.dll | Bin 1633792 -> 0 bytes lib/netstandard2.0/Northwind.Common.deps.json | 774 ------ lib/netstandard2.0/Northwind.Common.dll | Bin 1438720 -> 0 bytes .../ServiceStack.Client.deps.json | 1324 ----------- lib/netstandard2.0/ServiceStack.Client.dll | Bin 192000 -> 0 bytes .../ServiceStack.Common.deps.json | 1446 ------------ lib/netstandard2.0/ServiceStack.Common.dll | Bin 476672 -> 0 bytes .../ServiceStack.Interfaces.deps.json | 192 -- .../ServiceStack.Interfaces.dll | Bin 139264 -> 0 bytes lib/netstandard2.0/ServiceStack.Text.dll | Bin 429056 -> 0 bytes lib/netstandard2.0/ServiceStack.deps.json | 2072 ----------------- lib/netstandard2.0/ServiceStack.dll | Bin 1583104 -> 0 bytes 21 files changed, 5942 deletions(-) delete mode 100644 NuGet/ServiceStack.Memory/servicestack.memory.nuspec delete mode 100644 NuGet/ServiceStack.Text.Core/servicestack.text.core.nuspec delete mode 100644 NuGet/ServiceStack.Text/servicestack.text.nuspec delete mode 100644 lib/copy.bat delete mode 100644 lib/net45/Northwind.Common.dll delete mode 100644 lib/net45/ServiceStack.Client.dll delete mode 100644 lib/net45/ServiceStack.Common.dll delete mode 100644 lib/net45/ServiceStack.Interfaces.dll delete mode 100644 lib/net45/ServiceStack.Text.dll delete mode 100644 lib/net45/ServiceStack.dll delete mode 100644 lib/netstandard2.0/Northwind.Common.deps.json delete mode 100644 lib/netstandard2.0/Northwind.Common.dll delete mode 100644 lib/netstandard2.0/ServiceStack.Client.deps.json delete mode 100644 lib/netstandard2.0/ServiceStack.Client.dll delete mode 100644 lib/netstandard2.0/ServiceStack.Common.deps.json delete mode 100644 lib/netstandard2.0/ServiceStack.Common.dll delete mode 100644 lib/netstandard2.0/ServiceStack.Interfaces.deps.json delete mode 100644 lib/netstandard2.0/ServiceStack.Interfaces.dll delete mode 100644 lib/netstandard2.0/ServiceStack.Text.dll delete mode 100644 lib/netstandard2.0/ServiceStack.deps.json delete mode 100644 lib/netstandard2.0/ServiceStack.dll diff --git a/NuGet/ServiceStack.Memory/servicestack.memory.nuspec b/NuGet/ServiceStack.Memory/servicestack.memory.nuspec deleted file mode 100644 index ef3fae7c0..000000000 --- a/NuGet/ServiceStack.Memory/servicestack.memory.nuspec +++ /dev/null @@ -1,34 +0,0 @@ - - - - ServiceStack.Memory - ServiceStack.Memory - 5.0.0 - ServiceStack - ServiceStack - ServiceStack .NET Core Platform bindings for native System.Memory Span APIs - - Install in .NET Core 2.1 App and call `NetCoreMemory.Configure()` on Startup - to have ServiceStack.Text delegate to use .NET Core App's native System.Memory Span APIs. - - https://github.com/ServiceStack/ServiceStack.Text - https://servicestack.net/terms - true - https://servicestack.net/img/logo-32.png - Span Memory JSON Text Serializer CSV JSV Fast - en-US - ServiceStack and contributors - - - - - - - - - - - - - - diff --git a/NuGet/ServiceStack.Text.Core/servicestack.text.core.nuspec b/NuGet/ServiceStack.Text.Core/servicestack.text.core.nuspec deleted file mode 100644 index be92726de..000000000 --- a/NuGet/ServiceStack.Text.Core/servicestack.text.core.nuspec +++ /dev/null @@ -1,38 +0,0 @@ - - - - ServiceStack.Text.Core - ServiceStack.Text .NET Standard 2.0 - 5.0.0 - ServiceStack - ServiceStack - .NET Standard 2.0 version of ServiceStack.Text - - .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. - Contains ServiceStack's high-performance text-processing powers, for more info see: https://servicestack.net/text - - https://github.com/ServiceStack/ServiceStack.Text - https://servicestack.net/terms - true - https://servicestack.net/img/logo-32.png - JSON Text Serializer CSV JSV Dump PrettyPrint Fast - en-US - ServiceStack and contributors - - - - - - - - - - - - - - - - - - diff --git a/NuGet/ServiceStack.Text/servicestack.text.nuspec b/NuGet/ServiceStack.Text/servicestack.text.nuspec deleted file mode 100644 index 04af3c29b..000000000 --- a/NuGet/ServiceStack.Text/servicestack.text.nuspec +++ /dev/null @@ -1,43 +0,0 @@ - - - - ServiceStack.Text - .NET's fastest JSON Serializer by ServiceStack - 5.0.0 - ServiceStack - ServiceStack - .NET's fastest JSON, JSV and CSV Text Serializers - - .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. - Contains ServiceStack's high-performance text-processing powers, for more info see: - https://github.com/ServiceStack/ServiceStack.Text - - https://github.com/ServiceStack/ServiceStack.Text - https://servicestack.net/terms - true - https://servicestack.net/img/logo-32.png - JSON Text Serializer CSV JSV Dump PrettyPrint Fast - en-US - ServiceStack and contributors - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/copy.bat b/lib/copy.bat deleted file mode 100644 index 96ed200c6..000000000 --- a/lib/copy.bat +++ /dev/null @@ -1,19 +0,0 @@ -REM SET BUILD=Debug -SET BUILD=Release - -COPY ..\src\ServiceStack.Memory\NetCoreMemory.cs ..\src\ServiceStack.Text\ - -COPY ..\..\ServiceStack\src\ServiceStack.Interfaces\bin\%BUILD%\net45\ServiceStack.Interfaces.* net45 -COPY ..\..\ServiceStack\src\ServiceStack.Interfaces\bin\%BUILD%\netstandard2.0\ServiceStack.Interfaces.* netstandard2.0 - -COPY ..\..\ServiceStack\src\ServiceStack.Client\bin\%BUILD%\net45\ServiceStack.Client.* net45 -COPY ..\..\ServiceStack\src\ServiceStack.Client\bin\%BUILD%\netstandard2.0\ServiceStack.Client.* netstandard2.0 - -COPY ..\..\ServiceStack\src\ServiceStack.Common\bin\%BUILD%\net45\ServiceStack.Common.* net45 -COPY ..\..\ServiceStack\src\ServiceStack.Common\bin\%BUILD%\netstandard2.0\ServiceStack.Common.* netstandard2.0 - -COPY ..\..\ServiceStack\src\ServiceStack\bin\%BUILD%\net45\ServiceStack.dll net45 -COPY ..\..\ServiceStack\src\ServiceStack\bin\%BUILD%\net45\ServiceStack.xml net45 -COPY ..\..\ServiceStack\src\ServiceStack\bin\%BUILD%\netstandard2.0\ServiceStack.dll netstandard2.0 -COPY ..\..\ServiceStack\src\ServiceStack\bin\%BUILD%\netstandard2.0\ServiceStack.xml netstandard2.0 - diff --git a/lib/net45/Northwind.Common.dll b/lib/net45/Northwind.Common.dll deleted file mode 100644 index 648d02d00c37fd5bd3b7c23dbe6147408163cc4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1438720 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

28F8x2 z!F(CI!d71+gK>R=%w)?yo0PnEA~tMro!ov;WYsBr39^6cK*N%0A+e#t)K?A6aw5oP zDD`iH{R&#Be&qZ~XJTwXck<3xq0i(JZ*384D@U!m%$gU; zXUP$2>Lu^2|6WlW&bb};{<>g7u5v1NVC)65UgVgJMW~(v>g*WIeNY!dl;aZL0LX+# z)o0w1&~UQh^z(k`Qx{W=X&5mf1Ly>#K%oNAb(sR$l1on%4ECGSvTzdDojywhrW(?Y z^M?Kd0@A&OGgN@IjDi`?e*h*rU7K43AJcFG?aEQZDQvXq)6IGcXqT9Car7Ws8a5bC zLj1>amz@YnOn3{+Sp@`zy8=hkL$Ibgk{c7SsMmfU(u6^T*SO)jL4%kIxXKNz5_& zZ7~`GsI!>_ra4~f{-*T=X*ugSDlv9BIW@wgVpR8%>Se~{chIhAljfYw5@@#m&Y2~l zHm5m9myeal&bbo>#s+x}yQVvj1F9uoxD7JLr36Jz?lkTRXtM=^bN)qaq|~XZ35-rS z9d95oq!8zCK>RbBXvbPFb4>m8U0_39={PDu|%g5=$zrdo|GJ9nRv0-!Q z!~lZKC97lmNwIC;c66d1pqdh$Wd}&rBphc+eGgDOCC*LZQ@}sIeII_eAe9ZuvXD70Sd4igIg z6)n@{uFcenKihUN^!oL~d^nsvg8MFhM_3vcmAHi@a#2in04j?_^&E*@p&^U#G37cQ@Z?IY==1SY#xAVE@P*o1VzhOw{Ir+5onK*oarDoDy*E^k3c&m zx|=o)cnRIHtH4?RzW~-melKPIvOJW|C;=0`P40c+^4|f{gNVb^+kIl}S(mfp{1x=s zQg)|wz9u%BMyDqPh9ep$0sKeGvVP^ooSYGB^0A)$q@a4cBPaUF6Y-Z}Tld*sU?3>$ z8JzJWD3lz|njIKMO55Oic_Rj>!t~fcazY%QM z@jCMkOmpm=!63*aE+?PA0)1ik;{1^-g2Ex6^S2}j(mj3E`DO}1_5^kJ^g{ftG%cLX z>0Z)Q5x|6ZJ;I%S3KYET=wk2<=v8Pk6Yqq?{{qyOE_zI6b{NE(sR%b^2KyTH>QRjR zX}R18B{u`i>N1YHtkXGr=%)bsr;a<*hx8DI2;(_+jgnfcSO{h&Wog+wVLI?8( ztVJQx*-jH^+{mf-2;I{66$!G5%gLO-MfM5wEMmiCIcGowh4|*YUit^Is)tVD z^=vc5z{JC+T}T0gMFp8z{iA5xQbYx&`3+j<7?Pmi9_>IHJ)GG5Cah`pUYgFb#Dwz> z=bL8)1=n|Wu>@(0yo1a?Nt5&j$6059w7eMZq&i}CkvNz?L!a5eI0Htg20jP#KcyZx z@eYt?TymQAR!NWJQGnREsV0qw{zaf+-{YtQ#;WsPe;_u@xUNyrc>R3($ASODScKS+S z`Jzr&hnbWvw9KX;J(DyQ{ZL@-VX;#;5*zY@x|T6M3<{&2qoa+$;Hb{w#c z24I@;=d5(#CrID=^)@Bl&=ii%oLL~qY?r+0CsvOMonxdCFsk{_=^`Ug z7!HMUiWQ9#1h(DR-#0NEjNDpX?2$B}K74)E=5Dz(weDayx6W3@5~FVvaX z08A*Tw1hR7aln|>;EXe&!3~@|F&_G&Jg3@>zYu5-*EM+>Y!8%%TFvnlg2ML7S!7#7 zlP+j)<4=%16LTD4f+!3NQoo*Inh%V1DXhh;Xp>Wj46;ghW750sL6{s89jz~KW#rFYBwvTvPJqE#oNosJ6NX}9`uuh_FnZPz z-cd4fa}GdJl5#B01u(pg>i950#@9lrW&C{}6q+(B+^?jtVN#t%Muj$wIY4z=cz z-C0G1M&|}j)*&#=xZ~A3!>}E6=ar`wz?#y{`T94ZA-Bv(Uw#r4R*UnB$u2M&-q6wE zGpl^1fI?z-UV#B7Bw^=W8er@+NNJz^dy>RPXM|4Ub`_-|SUcqlFd>xbGB+j8s!|7> z^$SSLY&zGT#M&3$C!`A)Vof5>|9R77y|Wvdv8Ae$pr}r9#&36MGiyU$El$>odz8jV z%9P~90Ta$Dz1by5OD*Rda!*kd-eu6nn}rQb%Rk@M4jZj(%^*hUUgcgo-w_2y51lnY znNKznyc1n7;xo_$v|9QxLx3u=nx?W!!sJ;uNLv>q1o!+)MTOxKq3*&YJp)s-D zK$yVpWE7fg9^SjNtgpMaYq{pxb{H+9bR@r&7$p;I6q=eJ{nuaH4VL}|ufD>EFHV>= z??$xq9!*-wUe;e7ROza0+_h5ao>?1KuT-)ZPaV5qQug!9#%`$pQJ!sFCXce;#UF=W zUVhqNyM1J(GGW4mzKtsZenm87D^3$~qL7~KEU-_{mS36GQR!-|5=>=gZ8(f=IBD#L z$=RexT{bWNxLfqGw|2$gvat(9L-ruZb3%Hum%&~+(-`Z9vHN!&yJ2GXwn$xeYW(p% z(Z{~p*Za%H9u*DQpFt+C60#g*707iv7=t5VaFz^2{}v2h9U1Jc%^FiSxDZ2mF33$n zda~QWwhZM+7+ZJ(diR+~UG|muY0qLO>8pKXLfP2BhjKJ~w*X!lw?F$$Z16A9$G+N|!^#F%iiT|b6+*5Nt|!}! z&$kJQymBiTTYJpd4b|aU>kp zb)5k(iPdE%#Kz8vKK9kl8B#VjPBdi4f@}ggUz{&4j)lRi#A7F#>B+8$EMzxF zANy;6sg@1i0H1#zWZ`Z?)_@!blF8bL#&aADKC^i2hTbghL-ys!LKaV6Z|&zx$_8H) z4cX!yVM|C)wifJ(LLy`1VQk&@=-szt?LUe?{wDg^U)yU?+1Qz)A$u6)!dWo(8rWNf zjg0lc*zSkI*q|#T&zKkaVYYSjw6}K2)@5UBL_>BH$iqTZTxI(r|WFfOd`IB+w-aR53vO|v&l7UB+7FJ8V1CwSE{IHhb)bJ~LX`XCm!p(f8JFh&<(M0?w`xHQ7Bvda}pB zw&a3|Fm}r62q{04Unm8v|BgS}VI0+6p14djWcPqPA*3gJ8te-~qBSrH#_pF+Pc&Yh z4f#-HJI+JBwet@t8+#PPR#_%whLE0YG1!(hFd4?45Wkt4#a^EE$HwMGANy;+h;sNd zq9L1#9DXRsi6Ezew8X9{F!=BpNIdai+1NGjigIUrYmY@v@}y|Uc9k||Yu+K`g?)sa zijOU8V5-htuPwMXMqSF{9`@Fb*s(mE1Dm@lj2*WQOTbij#@J<%?Y`QhQSZ(W4cP-A z&w#uH@-j$E?`klJkTTh{KZ`AxqNT64|EzNF1|CwT!QgpEVkwv^@5ZQ0X5IDIzCNXF z@M6)B-2?Kpke=*UU|YO%I*g%qo^0BmeK9r`XNTU}Q5|Jt1FN04fw5~3Kvw<7So`a)T4a?0Up8;dD)??lMCeCaoe8m~Pzjj(wq%0H-*~K7v zR=wbGVOz55Oc<*lgjgB3Ju~4eu2=eN({?Bi<6_Z}Z35XWq$j%zY|EU@g0a>`lO zLVB|Mz_#?Pu089sv1<5LD>Tr~$hTL<=bVWX5YyJ^f6b#Yf(jQuX!HV(|#92mQ2KSYpt*=BpiJ+o!Pv}xsG zd{8uG9jk?`134e$Vvv@UGZzNoBol3&byRFHPI{qW?>xA)5`WYlZY=XM=4C$UDH; z!}G>&m}1MUe~69Q-u+@&c_^P04cX}VLSEh$#ukDdRyXTyA&fmO+vKUX%=&(8%=T=0 zv}1e$yX_U&n4SW{E$T(!T845F3}UM@c?$;PRM%I#C>qLvZ*>;K;6sv_db4=IvR}kK zjH`ye+GTQ|(A@F=QNY>MlcOH4!N-;!?g)cOsJ)pfwYI%F3eIt??yv1VtZZ;#33UmK zq3W7w%dDMaV+Tba`)Zd)+p2+AT|2=b3ZcF%9zvq9JdVB9kxfej56#P94ZFBWS?qb)6|uEAo%hvNMt(W4UEFdQyJ~lIEuNR`Q?aqQ zYkjqQcPqQd4Wc1?9c02DLTW-}oePap>dr8RXgSdqSzn2b#YwNP_URF2V*`(tD_{`i zYhPvxt?$GJhU_(v38!NeXA5nu zyH>(jei9qILH6UgXTOa;_SH5y*LaXz`QP8r(_@8}cV*?9XyTRBQhhWZPpUe7VV{u3OYqzd1 z8#`AtWDkM70P;G>n;uKue~14+rX;IJz(sC{o(%cU}by7 z#^U_bS6$kiw8!MvvvIP7vZWx`;!tBXxR$Q%32RTtg~$}+2R3fS`MkgOnJB$IBO0>Z zrV3~{S3i=8gJIqqGY5&CNPZ&fxnu(-7!jA1L#m&I<7eI+&)ceJneNaQ2~+X}3P zF_a{|w!(_NBD2Q+FuB~bftMuv!{BL>_9kZW%w&(py|Y7kaC8}WHgf2fKwboS1*CgV zAuUDo0nHx9zL)(hHW+7x{@Ul4|KECeAPgd;Om3;NVuNw8?ybeU;(wl@~pCXic%^knyfZ8`Hg9LCOmJ8zKUb(LKa zTeFMcD~FY5?IKZ;Jp%F)$g3c4fVAX;w`uo!ZN(LjTo!k)zjj3AlLPDC5imARj>9Hq zar?8Ip)@LiOFSj$+TYD&~_6Bx8wid>o zUXGr{ZO^_P8;cj8TuM(X&)W;4AzQJtkTZnzWaok1BqZAG90g;z_Lyj^tslq6;wkK_ z{cLsF*ubwnj)uYf4AE>9|0_25yC_ok*8UWoMGbtTdJGJ{BGW22sm9{aYogd37ZPGI zI{cj?;B4+(Ax8-5$<6@VQl=aWYirh^;)|yz+rFK#zS?ckyC+ABhU|Kf2SA<#c^>4v zd1eCN4ug4Yj-zk3S8Om&wf)tdo6&1vf%!OC!aF>22maw`;Estc#WUAeTN{nzz~13G z9>!2POHhuDy(=~rmn^b#jB1pDRnF^R?6|kVSnTH6WwEh%4Et(ZMV0dzq9MBEs@%hYt?rXy?3v@>DD92K z8MeQ6Zggq&qG-q_A1`Eyke+Nc*u#ZHq4^XT%N@nkbS6^Tp?pX5p2WZ$FsvlVxGL6n^mIp2iBwF6qyI{R?Ez@*Ij$_-7gMyAU^y}`=sW`+L}a9T zlMZ{UJVF16px<=#@KF*LD+_sm+0}rh!FU)7)%LPLxxFg=)_BbW7}UyGpGNQQ3Q8W$ zW3yMJ9n4Ry+!bJVi#^n=9bt71WAmsGt9Or1m+UcERFxP;GZNJ6p@@h1 zBTAJnR99D1>Ad>e9spA^_%^z_)_DxZsza=8m@Br9nUMzb8{qZ^7*wv1~^Ywo(b%SqI+nL#3TdgpXCeuJ5Z$q*;j^|UFXMKci# z0rr?!|1GW|nq{zMiHy{bG?31ayLtd-$kvjeUe5CY^n_oJsf+E=V* z(-OH8HOr?P!mulmd&?i-XeD=r@QS05IqyEzY}Zt~W

9OUH$cvh&-AY`?7@2Lb6yk)vT5B<^=%c33--pW1UU zke-nxEsdHxt-hbj#44BY;zkuIwdW0ag09Ev(`}ZOz^tKJ8Dx>ZdI$jFOvq?QL4A<{ zSviT-KFg$A&Ci)|D8T0JgnBFu#-)qZk)(}(EN`ZtkjLoHC8*cGBU-bwVMa^RFUMw;UlELzTC&rpD!Oz>MTe&!n{AYb3R*L4m{rtQ~0Sqg5I0;5l4GuFpuFG$37{*UJ<1A_Pq`B_;+cCdS4{K%Tsl0R|ZsX%-xsdzxmjP@PNM z;wQsS0obKO(GU1>`UWl;kK?k!k=C5tC{NHinQhRkA()F`I|M~D5T^nV9j{3&e zz%XAMy88cD48|jStmaWQ`cK!MX{u5N{Urr_gDop>-Qg?%Vz+IRYX?-ELdpu4FjQSu zPFJV@Zrif~2oHLwSv_`#1lC=|3pFYY=;uK{2Vj^)YIMQ+aOqg*4Aqfg8q9AJ>0E$; zSt8f)Sc<`TWRKNL{nB9m%yJ$8VbZm@hKDmGuuKi0&!jsaVAc%ho~0*o=~#Tm z>T#O2@-xFP0GM5VRT_-d2-%WN6Vm?f`U?RFdD)_w74({1ItGl?!I^a1`N_+R3ShD= zo5jf14CXS*i{#Pp1G^Ytb|G_VFlLfaeKj#%GQWk)mjLVm*)|lqrpI1fG8UhqI+F&~ zXXFXG*K7%Ca;tGJBx&}sZ z<~#jrX|T&^=($jypcf(demKCoEiKVV0@A*&1Q-;e*cJPqF&JxpvHFG;N9Yj_mVl|28H~kT>1|k-L$nrz(<-e6GVx;yWpM&2zkZS-2N0H2LGFbOhX&7he z9H~vo(DL&YT?;T+22mL>R&HapRp)dc@HY&u1EBS&FhA)2Tsj`r!)$%K8_eIGay`&& z!*Ol7V*wBAV%Aad{2J~CfMNAQ#w+!;FONf@Ln5O;6WO zJ*qcpA&B3M#7zLhF*S1134?9MV6LRRj7|#hJEi7kfK|!rg;;a{)y_D;Z5FDD9YwbSu!l?)%LyF}cnAZs4iT#1Bu<*J0&!gg z3nh@_KoBk3zImHzyGgJL95cWf3(g?ySe;11aw~a)z8t}02#h!Q4aADP!M6htF3e^Z z@EStUT%D16`1o{n`nxdi03ZZrlf&%#eg@>8AGN=(!7EFp$fEy-Wp-)Hre!`5DM}0}Pvrn>7n4{Rur?vvw4!Ii#WZZ7RM8V0Pz@ zV{`n*V4u+dE1SvaST8?c>Ae86u1gkB?kK>TZK%fFl;%i3CH+2tS^rRJFt=n=NqqS$ zC;tE-yos@9d7+u#9pxxeH<%4F@r{GELEf5 zS&NSX48u*6!{B-bgR!a}tJ8@6{fC>!00`euM)M=}1`N0}k&$}3Z@S(5eM64}5Q~gs z7w`Z=(5Db79%t%r{)>#C03hULteN-p6@=g@WU?2KT-<*0@=1VU*lBSs0B0m%W(idr zO-=X>J5K@3PV+FMYX^)qhgfY&%;GoA^K?5H3nzUKS0n31p}LT|fgjj20JGg}0n(dB0}z63DH$rjBFuDhO2gK1wPL-hom#py36Uj`s1jYC)Q zA593F0p*+rvUL0>jb8yE43A71Kvtk*)r+KwpW*Q;!0ZUlOs;2g=~xMi)V|ZxZRaT9pi?Q=a=~_HFfN%KZAylRAJ`iJ!;u-Xv6r8I0F$or zs>h|P(eKENHvxvuozW~S^eGJHR^!vek$#=~Er3B&ZqfWWeFcNL)wmIPg#0w+w*h7s zGM5Hp!4j*kwB_7?`N=x~glZnSR>nPCI+oG0mY?LLpKAUtz`!Jpjt!%qXE4@hWAz9P zrhZKF9>DB=ROUGs%vJ9mqPa%DjRWrk4D*bk=9bYPa>*DhR+o=Wv%lXw;|Hc>vbZwi zD*it(80$l!x`H~k|6yJq0uU2qEoA^%kB!tCf#ZCoIzJxBr%|e*zGT&@+zap`8(c0mX)+jXHjd&_6MylhrR# z88GhLv3iz#CVofEeF`wF7HV;o{+Qd16|hiUOibdpTIe%?;Vh8QRr;L~fK`-OZB0Vi z|KN(x0f@~yjV|C2E*%3#>KvNe_uH)V1;8LDWhRdKKu=*b?h>JThztQgLHQ-nu)d{5 zJ6iwR48~@0tnQ$O^IzZc6#(s$lhS~!r$nlOh5zv=I90cOwRbW9Bg z%x$;6B)k00(|-YQtr_U$Tw(e+E*5SXL8|A|=9GV$*Kh~Yp^ z+2Y~gA_lyT$VmN6oasLtd~X0nLdRtQnOS9h5|z+TLjPdEW?}5%7IMcPR{bJ1jM~qC z>B)}(gk%Xd_b&Y;)t{pziQYi#CHy7JPXNSPm#7RNtL~9{kfw_L*Sh=+KrGd3aZQhR z%ao9$i{DbcUjT+_t0vdZ>WgI=0T$JH6D=cya)BTvv%$L31F)&Wz^}?Xk0v5K}2r14doH~d<6GOP_LguwCDh{Dxkqqh&1|7tewe%Y8vqT=OAkU2;YMkUT-qQ*G#gQiPVhFX})7*^$mt}PPM(=`_~Qs0q?_FI+P)ij)RkBsIHtcNg|(+9HM+gBs{ z^|o$6!fZ&BYZFXiB-UDDb=Gm|2J@c{=?*~az+pDm4xr1EKOde3^mE|!02r2$Hfw&I zUYkqzF6m^E+JYL*e;H{{0OHh+X3b2ew`D-C&QPr+KWuM1zf(JU0nE;aJ79Y;7}u<9 zW*e2Zmi^|#djrg#rQ{eN&WLjiVTbD7)zc;Oo1?1-7{qd}4+{nKE62MI&~!`4dC@L1MAUJ5K!a6VY=tFl+)p+tfYnUKh|T<_9jVU(B~q)? znARXq&~p(SjKCb7e>!4CPQAVW)T_dE&+o5?a8Sz6nl`tSoF)jWfJ{g}pSu;MZ!=+@18F494visprYU_V;To13-MiLB7+)2o4~t457NKOImLEf5Bl{ z0Ah+vzLCew()*mWex(Ny8L7*uI{l}}MgS1=siC9i=m~_NS!<3}4?0TBZ$5P-z@SXZ zm({s+4j3y%k-BN6banbElcNA;m)A4z>D9SpE|_={Qns((Qs2=4Lnm)^DoQ)UfXgT! zO-qCMb@DL)yK*9iZbuYv$tB}qKxP?9R{DKnYB_+tG#*{R0o$WA*nYIE-ftdfEWqF? zk2DJ?hu<|TM6!N|mSyyzlY^A#NTU)<8!0eZFVd zIGPYN>zT3Ij67WatCQdqHhaigTzkVA3RpRc)RTX4{$@G=(G8@Ra}((qTtr3;)#3fp z+~U^{W&jOd-mnZ9OBivM(@`#dUfz`f_SgidLfnV-MqDzk+E^V+b?LW3dM3cYDUA*< z=sbflcBpEIHT^kd767r^Fm}bUGZwH`8><&*rrXVbrf)U??P*5bI{F|kA&azF4JVu5 zZ|-3gfZ6SF%y;@U24i(BQVWKqOXugNToqt;R*@@9U&UaoLdR-A-!zz?gJCs*ow+qc zN@+0GAtH4>4F#9V6LjZoBp8aotk9c`SdlYtbpYmMs-n@gH@Kl3r6pANE}JghC`@)7 zh~P{K>h+a~7ER@^0WeH<#I6b83vAn1!iSR4Jj7^c0D7MAV|6?&Gx76ktPQa5MF9&nbGiPQp6(3mk=ld?pFoUxJsH6^ z2o6MWID#ThSqFetd1l*J|H6P>&r6TC@|jQaSNbW>a{z{k+SoNb95B}ZLN$ymEdPnx zbpePqEpnO>t0vr7j=+}vjU>PPCfU~mm^FHs_jH!(uBh!^qp`=&=vg0N7{lc&EnKpa zV4=#;*yA^ZZvZeHiqou_4cuXX)rU|`BChNuPw+bwXF~u&!<1gmyr4&NUGg{{W|wK7 zUiZ^4Hv$yS-wBrtN$o_F(EjJ|Yz#m<#qL-gGq`A6nX#%R*N~r2V-tX38mYzMI=vBt zvBn~s>8Z#0Pa|y#K&U8kJ^}NkBc2&BR{PQ{s=tb|8365`G6!&HE+H!sp?ZzJ597C| zY;%CYK903x3>;7z>_}Qf;Ab9hQ2=Y!%;owd2D^mFNY$;F9_jqR<^s$f^H3U$t5Lv6 zc=;dmuq6PYT1KwXaR(L05zV1`hCB^^s^wMy!cF4A-Iz=UF(vIN~Gaz@t zSl#*;RHE$whBNyzt{uR9uNf><7f|W^kL}wYfbfJeI0;O{Nn0e}!; za{Mm0-_%loks3fk+E0Y-2rzpv0<(jj!(iMqBGt8bTB`UvFn0nVJl&zge=Z=Kl%e{Z zB#WP?duM=Q_z4|$(A#tA7)(xMJ2_oC|KVpB0Ah)K#x)1_Wk4R><@03OG@$)T832b@{#!X$JazZaCIABXtP*!2I>~y$XQx^`w%3tiDHT5;<@D0rxfyXCyT9 zg8qR^$m36_cAA)GO@9f!pa2+aE`#oJ0cl69cgE_3{(lW{9{^&Tmu#=(Ds5yy9^K>Y zrtRF~zsGA|pka@HrVJYEg0jb}OS*Xed;Avy&>p|V?5>A#@fa{xpOFILKOwUp0PRE? zH<6ygfULaB7sbd@@S8~6-;{1Hsllm;hA_Kcd!za3 zM28!s?J$U!M&e?HYA~&+_S;8u1i;{MXm$+`XW(H=Ay(JknQkyYhr^Ko!-*4_GGH$6 z&%HMd=6B-6Q2?_C5AnO}2f4vqup?>xp5MVkM+3|*x#w2VuQC`beqpw)ojd$o+{XY3 z#}qW_B|=gckfq~)Ou?}L#79SB%@RU?!9`=mAygmHnYjKZKO6@@yP2jmAgh_Nin^z{ z#BVdr@c_f7wTxyy(0_92-Y0P!s*zpNV1AwL1b|t4z_F!zUr0(9b4jF@nw|#pw+BuH zAeKor>(YQcs>W&)5+#1iq)r0ZTLZwEjy>g!Y^?CfdO8|tK9wivbue(xlb~KNM6_sn z^<;qAFA|gnW3G&{-P${x|IEuNK*LJsjOM1%gSg?`qPkt_Xrw98P-aIdOboyvae198fJSkE|@crGFYUZAZ^Qkw&!#JLR)Th zEx6UWbgVT*>I9lP^VgQo0HEE+!yQ>~$$)zh8LOSh-R8HC=S+ZMLbp-#`nu3;|`3bSJ0k-}mFiUALR-T1fs4D$GUU3cp z?I-QHd+D3FbSy+ewex^72K%*`V##I@rQ)%MN&lWfjV0OtM_bmM=myE&0 zuSYI!zbW1G0R|_E>_cHDd6U7o&xdMla^U;>G%f%jES;zfAnRlD(UBw4?dEUkTnIqS zA!l4G@oO$2b7rWf9GeF8n?t?`VD{5!Ja}pcjH@$JSnkn22Knn@7X$F@sp#bV{<_0O zq&$Q~hH9@NX~4_n34Y(bz65|6gPL7SaTp;u`gH7k&d6_x;-vt?<`-F$!rbYAv04_X z{mFCbzxm}d0AfdOq`8IkR4yGiXQW0BO;@Mij@-)uW@mdGFlRJp5f*3nYv&Zdsh%qe z^(gB~xgMR7m6dlngoNfL{Oj>b0AlA}v+Jsy!}Z8YpbQ5art8sf=iXHSv(~C(o;qM$ zkD)q%wh8)Kt5*XIqiX1IxZaUV#yVi6G#QY7qv|!LWTL4@Wx%)^Lv>h}bT#^E>em7c zBWlJqPY>Xdac2wFK6IXi--vo0z~+rZH8Rg>7F15Z3l)EJcOQ9zegHwK$*b!DhT&WE zW(Um~Qdt#?)VAcQ^c%l#0Ggcv;hNH?aXq^1_z~${ev=?K0?fL!OM~4+gI$!}uw91u z`?GHX8d#)J^ULdNxM(i(?@GQkKNh(eU|1^~X=ZQzAcL_w8>z=h`1`Guy#-)c;~bU& zV-AVcNu+f7t#Q5;V90;7>+|u1c>vH{d*gF9TW+?~A(j`*O zv_{>JS?&TDruie+P;BJVF<7W>C(iVn=D!gZ<8%`ep7`$wu zc1%*PH^;(~BS~mIqQ95zK>*rC$IN)TjZ4SkEK)m9T=LTr9s(HLqjGo$jnMiC24n3q zQm@e3^z$ThdH3kU0K?MG*tHIw5ta4kSnWbnn*K{WA1PF2iwpQTmyXR4Ie6l%G*|lB z-j4zddRMcJg*(>0OT%s#3lZ&h7SHDX>^|&!tP|UzLv=Kr`Xu0Cu^A z206EMkC8Xlf5PPn0K%%uXl@0KF&rAwq1PDq3KZKQqwgyP)dT8if|AU9sDejAmpPk+VvMF8SZ z0a-52s<|_?vK}3)g=DGvA1d$?02}6lV_0hFo4AB5(;}6lD(xpv(CZ)=yNU$nq_#sr z7Ofb18Gx9U2wgyDEPtHvW3~QT=_>VCF<${-53_=sxn93Z2%4)jRR5w9`h79{Re(X3 zHEL!F{R4xsS{A9j>eHq3mu0U35VB0Z_|6Q&eZWy(Le-bn2l~mf*9)Z!UBl5CV%ZJ~ z)zqnft#oe`02|8yvfz%@30?jg;F|!1w>fs$!5w0`{X%s;?WgneHopZh`(;k9Fx}-+ zQXsf=a&i@Q_DJ^5l>aj4+W<>u=U5+dz_?_QY9+PS&r$Raz{anLPR{S{4tfk0tA9*O zx0~OJuXh24UB@kDz+4d)QJ?eQb^M-bH<^ZSaqUKDlyw2`pylHJ)9~*D&>kek6{fSy zC~Tp`s)-h@`YG)n01P6m#kCzrGuUh*L)DLbH~u2*LjYPE$Qk4|BLqF4Nbz!0H}F^7 zKLQ}O*|cZ}@F+siZu=caGpzoLxIYFU78+z6FfivR|tHgauN z=6T0XiPc3kG2*Y(ehom3c}>py>t-sBqe(>S2l74mk9pq!F!7yo*V4J`@)Msh1w@Hm?X!{PnE@%2-ogrRFbZp47BRYz*Y zE@{oyzl1*n5Yq@vWdPZo6sl_a)R5ma!Y=@WqA4C0t}*S5cC4C(j)%oh)5K00Gx&ts zu^)FWRhM#1FwI^24L-jC%zjv}G#IPYp?aD2Ci=}Z{SGke(quP=K8#DoPL@!;N{em$ zb?AQs&@MVC4R{XWN2&|it^Vr{{s160QV6Fot80dEEWS|vN=tnFHdFiwG%Q|a7{0Xy_%i`7vynEQQer2=5^PQ{LSqaWvzxgD;OMmj(5 zR3*T$)uw5Qz+$zCO6IrKrUSsB$7WnB^<6F*SEGEk_Ah9A9RaqfjJPeDD@y;sVC;sA z)ERUb>kb&R??&(nf{zeDtTF3ans?nWUP*b>M7b&?YHK?3&8BD zm&^)!IR;}rI#RR9y7E75rUrnRl9A75vJ2P&WHmZeJM5osH@_*FT7Y5Wo_r>X?YC7+ zl`dAN(J~mnjeB(f!*rx*CQAhNJgrRen~v-XFlZ*R!{B;LE*V#2tZt+oQhtg_H-On= z1s(fsekrg}9YtH|{MOub2N*sCpK&cy2aF|2tj;5$?Drk`9sq-aE+#k&#>2Q|3?|b( z#dufFyKAk^1#fGkOb{b_R7PkrqLFf2?F$1Iob3@#n(m$9m+Eie8HQ+fjsT|l%T zmQMOAM&!1P)Mg|o{rW&X(311pxWhSMtbxgQAo`~p&+kaJK82!%+A$XI;gYdo5UZ=m zGvrsY27p0GW?V35_;$JEC0fGmCnQ6FT`!Z9&6*#lpXHMAz#6L0XbA8>Bq3_AO72$r zeFkLXAXaN0k#0A?s*C{!SCpLH#(lsUO@AP4IV6F+8UC)Q3;^M1i(MPB%N3-Uu-X@@ z%c#@&IocWlW>=*!-)RS|nXn^u3%P&&7N#@-3}2QJ$2RvjXXs`o4b^-abNs(7(+og+ z1}jS_&Bbv{tXQ2)TCAT<)dDblo={|0X*9O6;_NQ%D}4MuPM8Ih-ImKNu9u}|a>^B{ z7nVtP0Drlx00=`zKGDOSzyWlMrnVrbiJzg<7hq4wV&||77R?x@3L| z^FV+>G&hwgnLF@Q*QUYzMe`s4V$Q$G^(O4hRmnPZq)s6d+;7f52e5f^E?8IwjH@zM zv%92A=XXThQUJ4hEcYtS!-ZOLqV>3Xemf+PEeS=D)CR7y!>60WGC8Ae$wT zs-}$wm&+6M_XxU~lMO6!~}oX{*`+<4z~bS+`2FrQc@DkpROGm$9;meg$cz#?pF#EK%<%xUXFx6qV61MS(bfML z$O!yX+XBnWmP_{hV)yrGznlhMMn$-7Gv2` z3?m0Fk$1!Y6rITcw0*BMAP?uU8c5S+etmBWz%Uac%O^^f&IP-bwx0RVge(t0Y%a}c z7R7p5uFe&RjMU&by&KGbbLmt7VmOaoK-Rq+A4H^%+aoPI{YLX?0E6k;?79%SIF9c~ zd;sJy^)p>p02q7#Q5i5cEajkoa)tSM0agSUre5MQVC>2f_a#kE_)op81VBs*hK}6O zbBHq>FGQ%;Awd60!RY|Rm$I750J_zAH@U+6zwR^xfbdW?y1q+C&vdJ_>+)&N^!HG$ z3_v()Tgm{k+zzt~+I>cTUfP*Jf`t&4L1M8Isvl^5fuDsi3t-rd-{f>Fy)APJS8J#q zriSy|jXxV;m>3UTFh{FpF!6@bS`EKtkgEU;dknBngOnfbsI@F!LbWeV8u)E8SQTin zw2IO8;)-O`BvkWgF4y1GS`CQy3kFW{j$yzbXl#nqPqf6%{|g4I0}!WP%7hlz=LHPN zC6x1s$VcmU>g5^$vyQjYV6HFhpX3YkbG)qyFwA;3IRa7NQo3Yck<-*~)^n{wyM<-I zxMZ=qkbGhO?Y1@mu@AExATvs=mZH-6?ZaFLU~t~Z6caPa<6M;tCTFpppO(vh&YL*^ zOU}|Mjm9h)t5KwZ`OUzr3p9JoEH{mQn~Uax4FQHTeB>K5 z%$g;^Vl|E29DZl`Y-GU1WY4&M*^o=dBVVM>rBzaXhRDVM!wS!qB?Nne9MFC%JU0Ot zW+{rmcpP;MSg}~wPPdugEXAe(1B1vn8Mw`ca5cJpt{csI`Z3660E0azpJZS#M{DL0 zJy!GS@Na*6ZgT+MyDWqyzrUWurE}T;8&cDskSFK{_<}zl1W(Z#h<467F2yYXmbhk1 zqp=1XWyiK_uzr@@TtLAJ58ZOD$>n0CP%THh_WYQCOMuyvdbuy@Eg6hm4xzeja+)9g zeGFRx5Y}9a>x^|&X18?zULg(WZ_RBDKzuVtbW2BdbyPie1IU~KNiM&S=4=BrjNow@ zFzytQ8b}j^ek1s{0JEPjEL}2|EungRTDmU%J&M}_&>olNcw_fqZs9&IUzR0-;&)uu z_5g!^(&D;)9WdA4d3a{Jbbji|4gh;id^IxH!=v?4Try^oP#r{@fj^Qb=)st(US9&) zIfQ7D+j&QT**(>z!MM}O_ep81tl#|VP5{ICjB%NgF_XmVQ1aFIozJ*4!0gT;?!Wpx zu0~cGflkwVU7CwmiV>`TqPk?Pz#z>0Th?!+*MS z9sm!PVM*4)Ggmr*EIT8$45^gI%M)~`6D636U_As|A}AW>b_F2RlgI^RrPVR*LiNXC z=|1PDo@jufgEzV!*hjhT*p3XdQPr=5w*d?X5Q~+{RrxxDu{j<(pHA~XICnPy z+5@DyXX&pPkO$gG-8L&-I{(!+^8twY+(um*keMY^KQEUC^qUvl9bj0sQ4Wj^*I3<5 z3t0VDZR`Osc)nx^=W$azimW^Cyh$sU{9Ipq0uA3dYAgfB^%$vrR!rBU-#3o-0vL`u z%eYhgjNjO|Ai%6GTpElm)mT-LOTph3J_vvq-C7(r&|7fn9Kh`8b}`~V zv>gmIoFX7QuedH9G#37mI)df~{7(@$1b}d4G?f8lP7zNf&9nG9G7bfpJ*Jf3-&HAD z2Mg7A#3}x(jt>LiV-wJLr2$z7i?jQ-H{OhsM4cNTgO*-Pf_gn4bkV}7!-0gMEp)xE z^O;Rton!^lmi@+nBLD_VUq)?yb6pZGR_E-T?%)2V{*gem-%&0N$ZR4z0%_FoJ7D=J zfWh);)~xPpN1^0_K#tO&@zl@qI2vGfuj7(|{Wd&Zm4162j{#WX>*AWyM=+bPG>Oz) znnU$-cO45f$jVSJ30SB$p$+!_vhp|pS{F@eK<)&xU~fvgF8y3I#}^u|Su-E#bGRzm zK91Ej#FBmucLKodp?;;o_8`3|QV)EQE}7q1D<=Z%)HN^&FdOI_xMZweM(J;!Tqr-+ zix7M-BXhm(wzNbe31~UzNkF=BCKU40NbIVKvwOA6$9v`Hx^k8Tn9tCweli3G`nzcZz8>Swx+2eXb94MRM`vbVQoh_xCEC3P9*xVHrSH&gDBw zv=Grx?>Y@&7)@jCxLX}1kE=6Q>yf_fKboEnKzl4)X+XEfT}Iv8-vxCB0KqUa&Xq=V zdV<=RoL>GMb0!dBd}lQGWbNp(+<>uKsV3de{fzIk0ET0Znq08gnLXY5JdI2OzhjQh z1{l^?%7#voQTi(ebF1<_5|@7KE6)KKmSo6Q)skRrXvyc%rEo+lrFC|R;0bT?FA5SX8ycRs){>d0p;=y7hFvGNe9FFr_fqu;1=0l@4z zex<><8f8xgF^Ioc?ZN_Jlk38+xF&7jJ1*c*&7k$@{(u(&(0(k3dz3B-C|kqH{P3G- zzZhUx<`tGH-JjI5k@}3r9=}yymjLW%IgKadRF>|;RmoB;QjfNYLv zk*RYj!0ZWMY^Rk5i&bx$MfE@7>oNdhflE}Tbj+ENx|{5QXP}hynk~UJ1alEAL{Oxt zTn<1xIlyvWFU8gAw%rLd8{t1Wa0LKyCPSzlz)7V5L-h?gM*YrYxDsH{8ya0Or*tgB zVs#*KroY~B6#%hjuGs~2O2-pRvAQyo7Gr*E=B@@9{G+iu8?Yu<<(5Rs#Lk2?n4f?2 znnG2U1LKm(r+`SK^{>in0f=LOGG$7~9X(d3(-*$|jsdz3V3@hhxRU|%sqQpaWvK3= ze&;uHdp*G5stL=0@mS|>81nPh++f;G^z^1OVC;1h!+=(>`Arkw2rzq`4C_|hw|RzUDVQ za0|e&lDVl27`wn?HHa3Q_%CF>6@d0|7nbw-8ZI3(NvsYag~-nhbsNC!UdPg4E|Z)_ za}oZQ&g}rSAB0;HKsk4ax`6+lojU-CX@X{VdWE^e@dd|fb*fIkX@WZehN+#{1-p;i zj+rG=^9jsvYUeJ1owy406Silx1ID9(d^La;ot!IA(7z%WyeeEa<0aIm%N9y<+1w2< z+vixuJ5pG)iz8NdkWlvPbN2uY9>iwX{$-KxIHu%l^Jk|!xW5PSUI4;M6^p-g@!WpU zfr{s6rrrm%2ZljdmIiZ$=1Tf6(lmp|E#i~EeIQm)q4+9KLB41y;iW1eKj-#S0K?kirX?y}q;@4wy5G{`rvZl5hb`_j+(@oU_7lY_ zw^X_+{pSgu0U&00nwJPLQX7*C#cz`5S%BF?j#$#`8C*KIi}UBU{0}*Lu27w^I~7;P zZhVepihp%J55VO3E$Ur*BQ7C##ZWz)OShlDC-DUU+Px+$^<6->O7Ge+4d|y{z6h|F zL=P0vQW}jFiCA@`;qE;A9DiCEoxVPB@Ydz+C4VSO-zPhH4G+p!gke^rmSw zS=Ar8V5ia3wcBc^E}do(zg7Kj0nEDCoRT?U+_j^qy&nDCYi}2Tn#z=lhd4PUiu^); zVDA77$2`a<5Lq5`x6wID4qd>jxXrk9u{w+NN`JNaJpe*uC<45X z0l9?o?FyO(^dI8h2cT8Hm=*N%49Iputn`{`uJlvBJ^+|r)pWShXbdg~B2az$t*!YG zXpmej?zAR9-I;umSSR;iyfKkG)t)> zIda78bg}&B2L1^^Yde+(y{OmucY;p<2=7qj)}>QI_LoNLjUavOkH2^5(*j`V zPBl8_BlkL)xmqh-rT&1Q0nkps^GK#0KpqQ1bzlE9px*@i=KzCI&{C#!JTycqGbat^ zXB2z^Fno`&#pzbsu^zeYLbcnpivn> zx7|)A=eGaZpo;(q85U{Quk=qWR@ku-t8ZzkrJoG@8ep(KLKn<2=ol+3{2j=#Duea`^9}ORzH(ZW05>T&ss-ycbKrykWst!Y8&cLvYT0E3{6+&RXT7>qq`u{xaQIQ<3XF91YmTQa~% z^;$JuI={~LE5PjD9p-TDl#abNp&CHjDE)`;-vEg3O2lQVb4&7d$LdAWi2T1R@jC#u zD9*8KnXbp}#}0r{9ZWskPjCJ=z_9KyDg(xx8D?j<_i(>OkADEk&K2{JqMc%~yEIa- z(iDjQT=Aa(+;k3lI5&-U%qv%<1godnatC>Wz7v7%)(BgrAP#BOexoaRy?DM5boNR0JbVvn(BfWRG`nishJ!JP^d{lTFjb@>{pl31C=M8I>uP z+h8A(5$w09vI<~!jUzu!J9a5|u~?0zF6KX*Qw=~Y(T?0nQ^$B?Q5C6YNU!r-qTLx_ z$?RC^;xUUvY7{Bt{wpfG01=&9e1`l?y?}dwTfPeirj1j-zFh+}Y!c0s0ppP^QpeDq zegA!;wE)EG;-=DoDVa5i+RblWaUEcw{6v~H4t*R~qFb)d>9j*X<)o_di*EzD&A!ev1}* z01W1RMzg?h?NR3bP}R|FfS-Ba6JYpAQd1c)E?KO$u1%NB?;}aQ0A>%CFI_UORr%}( zEtK;+SiU#FtY4WqTwlce?^ff%e{s!DJpi#mRK9e}jspjf{o0{Aj;hjce`p_o*~zfd zVC?J))%8@Bev@Gh0JBTUcyM;DL!-QWA20$S zw#Uh_>rMw}W?@|=R!@GJ2K3(^7XuK>X_}W1Fw-{;=(n0C129b0wz#vGw{hvX{X+E* zayt1>)iwgq9hIw^4{hz@cyO(`W za%N<0y1o3T*82kxt34WBK&N!-;-}aHE zfq~^6&80CM|7WBo(i$NDWg0OH{T*sq|8wKW3kTGXESGF=o2zFwmyIb~tfwHGI9-vg#%Al9o$h4I z=!4{b6zO}At-)r)IiG3BM*XJE)aAyW^VE9jvuY$~n9kay8zoO1={a)A#`bx8HaMuw zx(&IS^-ajtVsmwOOWLAew9o2tljO>oTusia$y~=$ayQeYXCl)U_EF8wTV-qXj>y%b z_du?!&6RbZRjbdC+l?808*=rrxf-%9*%qpfY@L46=KB-*2HJe``#?JdW#;0 zi_H`@H1eam=_$C|tY^wa^-1^dY=8HO-Sv*h9O*-l`7FD&C~T9DYk*IjC->0TNUr8s z--FE0r^R}<*{$kqPyH@(H|byGk{x8;R^X{^v%Pe9i)3oi;IthuJrc-8Ze**V&wJBj=j7rgHA{`siP5uD-WQF3ZqyHs_SOLC?hPE{%Fu zT$483&Sk)Cs834rU1F{lbW%~iNI#1EHKG0r*J16&sCR28*4=NDEVa_}aP4Lvxr*=) zH+e>Ho#Z=4u4-i3GRSs!i`}TNOLD)A+_zbKC8^3~iyq#je?#^enp z_N^O42-S05rI$t?$vX#EWvi}BkxsC6AVaTE zZzNYW+g51Ov^|UP2k8Tn>=&73_!FpR{uW!^B;hI!x5n~O}51MSDeiPT>_Fa2sYuq{*s(&*XBi-k2fj=Xy zd1M=l>R^~2DcQ1pTJ&sOH(T8Pjlxt80}j_4C3*9>*4cN!Pl!*K)+gb1L#(gkM`j1O zS(nkzCRsm}tNJZ%`)0crjjh>b^$*A&#=80*xz^h^sL4)rUv-2Ygbb2#rd-tqB&??v zwb@9$J+epgEh}6{+vf_$vZjz7rEfF&8ujCHZMNA47Rk8L`ZJTQNq4$e&{s~&3{)^x z*BBj3rfl4#havN4X&p}X!nv=ooSu|qUk}&FzC&A4XC12-;C`l2Ux8~fruGqrair%s z{bVYmdXU(AK+$u@>(7wAu|<*J&~6`S3)s2wKjpG@{x_xXop|BA9>3XmFNif)x$^6V+d z%;Q3lnz6jzOmb!G8udxY{cjp`8nSD+wLDedA^Ait{0-U1r8U0nD(;(1)7kq?=C$RL z?P)3_likXd$1CVvao>^0ql#E&MSY3n6UE_aWN#lgnuHmgF20if0eNIN2p^E^0NW0k zBC#=D50m@Np`M9s-EFq+#mqHB?`kq+G&DQ)DlwM`Ic|ZK^%2OOj9O}AYOii??wR^F zC{VX?TYVN`YXAeX|@b#)trpTTZW#kyF4fls}mQHTvatm?R|?lYZbi#vWsca zhHEm!jVogRRrLYpv5~$X*RHmrlvAI%MaE`X!P+b@N>2T)1i1k)QsneLW2AI{NRo$1 zkWP;EY$Wf@$+=I>^H#FYI|@0jK=34jZxL8;Z1;yH3U92=O02#<*9ySt3E(8$Z9{M& zvK)ulH3%L?@FaqZCrj|E#On1A5~hD2>#mQ;&8Y|mw@R=HVha!)hu{$e)Q8~4lL#svlVAvf)e&rhAddj&Rq6#2 zzk0YT&Az#Jr@#a!CZvn5QIw^>&{AvszQnD-rn*mel^L2xXB(-B;a z;4um4y<7B0NN;#j0#jehAhwDG^?EL%rkyls`kmNo$K&>m2p*Ct5B&^ci;z(VPf4`% zQWEq+Y`6sc;~G5+Hx?o=Z+$9a*lb;|pFk8Ft@TS1b5LvbH@Ka9T7qb_1S=voPa3*j z?|>*apX=Qv=KQcupNQM9AXtPT_lyK9N>H!YN7VdqD?=}oFkQ#lu6p#dlI0)-=OK6% z!7mcj>)PieYJMCdwyXqP)^2(>ZY)4xYWM`iZa_YLKcYBCOFxa+CkQH@chI}*tR(3v z2ux*dfLNOZ_4*J*$7~|OaiAHwhrSHApG5Epg5EDkFdM;%=s|N3GkpOa+4*r#y#;O` zg224?1&BQ?LA`z*QPaL(fM(QQy3>ntdjbN}L>nM>`w{!0rk51Wx25&f-wUnSQD}1B&gRH6{7kY(EP(b z`aax#8G(82?+_dG3Vt|RLcPvr5==pCO(YV7H0UjH<0u4`!z8!}vB!~5zmDi<2r6Ec zpiu(;ai~Y*#!Lj;A~+1e1rpTjyAXYEdkG!|%|DFvySV)m0@Fm{YZBWUK^uYv2u$BU z1hESc+#>q%`c>|G^T?Taq;8UXIwwJx8-nM~GSAiHkvzR9d0iyW zElS=U$>=ovkOPr?Y*FqDk$i1Y@&ibIrYQL%B!448OfUEcl55^^la-|Cp%U<$j7ReH zqU4Q{yj@Z9?npkcDEZ|7Ir)4fUtN^@UL-$Jl>8QwKb3%sQ~9nWcawnMy9vp;qU4E4 zUb!fFQzY+Dl)M{~_m?0;HFzSD&n-&67Rh%OB|nAa*NT!qMe_GW$-#S)Tqgk+ryr7s zOTdMnhUC?Xk~c;24n@iPBl+l}(>6FNbJWheM;}i%wPJxW$6o@xYfn?(p zbcA$DtkLZ_1wD>a(AhWz{Vbi5(GU%s0;#|$5D4j%Mhzj$DG-gE0;$L;5Qv-tS;#36 zgPZ~hm`-WZU{g*3hjI#7f>Xc^oB~Ejr!;HyP)x%PC;+t6m$(vL9gHxbO=sC zU*HsU15QB?NT;-D3=9*b3?qoxnYi8jc32CmGg?A>Txn>sL zm5}C|S$KCsnrmj^Jqc;9nT7Wzq`77m-j|T(npyadgf!R8!uu1_Tr&$FNJw)Hg5Jw? z3S@mjAZsUj29@D4LxZ5AwIRFoIr-J3Xf;*QnK{{1TT|7LTtj7Q|ck(jnIVAt5&HoAVS91RAk$*jtA9wOHPckH5A&K%npCNw-&VK{) zZ(#D{PQDiTJJ|eRAb&^Be@B&+{w#&gdzDZHvhNCU(NY%LH;dFe%#4-NB&xyUp^aIwXieizZLnn zH2HBSFB=ty&VL*7Z*B79PF|Ky4as-6`F}$G8qR+^@^5SM<4#^yT@T6k zME?E7{oZk~@K=XmiZGYFXwRTcc92xHR_6Q4lky`Z9thDNgq)CXh%5-1YBWSEh%q2! z$7z*))@AZ6DTF+0UAZAYAA(G>9K!r!Du}fbVi*XS05^A*2C;lXEDK^f7 zZKG9?1cn$1LY$U{7!5)kiiVf~VwHp#2SSW0b7wgaV!5T?`3HGtsYrR};c`RX`6s!c zE0|vhpH$@=5<(iaDjy|8R}d`;Q469eA*5}p^0Iu{JU}{16)N5kJwfzKh~MN2mNj>T z->dSnQO^+FL8yfI1=*zMm^*!NXJA6~1~DKZVi1E9A_S33h=0o!tZN=1a-j-*R;U5U zm=1xob|CL4b+EbIk~)}y2dtm`W+sRY6Jj=qjZ+W6@6qmZ8m#<&Z~OZ-k!x=9leIx? zl@N14Y?Bb{f!Hn~wg$0#LTm{__R^Y{-T=f739%7~of2XT5IP~`(@0hMc?q!zh+Pt5 zTM&DKXy;WKfdZ*;dFRvRhLm|{WZEbBMIOY$gxD3t{t2-F#E}Wn2I9bkm=EIMgxC+n zu?cYih~pFDFc7CE#J(VoPKZ4~9GVb^fH*lJ4gzsvLhJ?Na1gdMwhfPw^7Jv~xn6Eb zd5%H0Gn3z(1mgUJI1j|t32_{VvlHSJ5EmxIIUue~h!a4Zn-HggxHuus0C8zToCV@? z5b1YYMcz$1k<|6Qa!cOrT4cLB`OT#uZcd2HLEM@USA)1SA+7{*I|%b=@Lj7sH#EO)Ml{qO_O)z+P8;1HsRGW7n zBJZKha|X+Aq`XQlL2HM6KXdJvA7HMX@&j>g=k+%EU0?IN>2gDUH`L_okRNWY9rMeW zYp47ObM4kKKgvcr<;U1aRer3EROiRrNay@S8|jjtY$G-K6yB zHqtpi*G9VJx3ZC%{5CdHo8JzR_Iehvggznfd$in;_ua*0?2w;lt{wB*Ts!4=Ggrai z-9|d)_q35JjDj`!y)9Lp-^WHe=NH;Ym;C-VQjMr!j1+elshP#fu*KOB*yB2h1* z69og!dtEGdsWbkg1TY`6)$=V@*g}HXjUuCYH^4FNF;9ZA^c?90KQGPGOr_|$Jk}ki$ z#pLUdzin|g(;tyoA2Qy-=mxld^FhPd)elDI?4B}xpvGy&-w9O>Fa|3j?MpC zlK+i#zREyUh+wGXYujELt)}WZ(PJueA`ojZTGj+r&-HQ>WR&I{G6Zshj3JyLf}0Zr zfD=TVa)QW8PAGa0k%pW@ip&X3ZbGw@u)oOcj)T`tq-9Xqwxg6ew+hr-*n!XEF6=-P zkpz+IHo-(B;l)CNiAcgrg#;6kgqI5mCL#$kWY}kzh$OsPNH7sekU_!bFcC?3y^vrc zk|2YF&0!*v@Ma;wL?l7R5}U(BB;oBsf{94NJB0)jk%V^(2__;5?-deEL=xUFB$x=s z!usIE${-kK_-wdToACKEsJ&KmfRg@nfOz|QV0zWexvYbjop@b{=#dD{L~x@7^|^lX z)BFhY`%r(ltE7L2!2I@4#HzLUEPfFNZW|{JrR7uEX>z2H#dK4Yp)I+@`xNQ*&F|8KnUxuX5309&vJ!4h!o}NYx0aM zDmEMUsQJ|-`BjHJ!ki2v zHREnDsZ&fU!koy)nsH~D)Tt&Fp-nx+q^@965t`JYx-z$tNkV9oHml6dFi8k)(khj? znI;LLO&V93n{AR1npzw>urjx*NkV9odROLFH%SOh(vXS<; zRMMy&!`dM^(P*Val{tht=?67ky9`C9?v)*Old7rAttHQGf8MuJ|1yA>;SWquQ>DcE z2{yERFswtvkXjpsxm>eF`)#m7avM?iHW;F|S4F}O&Tqj9|LaY#!2fy^jbA5wsu~oy z%y}$YS-26~-P3Q1W=`G|QTJD9@8mY3?rk)DavM?iHkcr}ji`GY43XSM)V&SnNNywQ z-Ug#2w-I%3gK3i6h`P7IK*?=H3%7fB91`?|Lwmsog>lV9B;mtCf{94NM}-6vk%W&6 z2__=E2%g+ZuA*}+mNj6vIVql;S(%$7FVG>6aO858x%CW%&~(b711fVHm?VTF8!B@f z$<@deL~_eWdlovuf7}P8UsUEck;k_8fpz8mMGTlefLCm1a=fDOqRUZuP2s|vD3EDJ zOWr!StW8cTda+R|eX3RN2!6vco$(gi%VUhfB^IpJT1-T$`IAC|iAchyg#;6kgwF~I zCSu!RTPcUwAkq%=rQ=uDREg-Xt(M+jH)PGq++0Bu&ys|>UF9`~j<3vZWs(r)*AcNY zbWmk(8}>GBLhdGeCMl;`up%bAG0?H7dv z6M>yDSKf7LdDpf(bn$!chV(zG?v_jOdjhX6SXuCde|iRCO|L+Y z!EE7tdFv%rDWyo3!ST%HVsWi<8it?a`hRvu>!N6l!RL8fsv@hT>-yB;~$IVfP52%Z$MLw_PbUCmPY; z^alA01rECp|1P|X4PN}W;azI*GJhN1<-lv_DUo);NYk#z%8l0loa6I{n*#k89(3e? z>p@53L3XH-{@p7OVH=DxWj+mM&h0LpJAcN13+*iXpe60*`E$(g+V+r_`5U{}o&xuG zb}x(f_jNCe_xE)#gO@)KZD}|T{3aR<)&+>{+(Oc8sw~58i9A)Is5bxE5R>29K4^&< zZd>!ajM0Ny8~!$leqpQZ4*#2^`Gu{~-^OYew#I)On_ZYUdTW)@0Y#?O2di}mf-#22 zc9mxRZ^-dBut#ef^tINu1I$DJu4c<0WU==$vM^MiO5wy$6q$|Oq3G52FZVA|QSy5m z2^L0Pxnhr8`9px7UtpeVOI~2ur(J~$38ZkD9DiNmqLN2mC6ByH9{t6V7rM_gZpo2A zB{w<#OC^uJN*;TaJYLe0=Z$r;SYN0QRuc9T{axhuj=~u={|%YFGgz!DK4y>@GOZ2& z2fLSy0{;iQmW)TX)c>ct)rEQEm9V4LVpmMcCjdF0Gg22Wu|)+JfQd+gSi#mcVz zDc^;>fSAJe1x!Q|zAYq}h$P5JWOJB^3{UWptu0rXEP^j6Coh-w1x>2V9R|=mLhG9l zKlBkM3876AKlD*1386_UI8+wbqF{elz%~&{_`Z-}B9ib!A;ClzzuS2GZc7!v+i?aJ zq4iVAyPaT?5H5bVlS~pqQ`-{7r-hYkC+y&;% z5ZX7Bsf&wD5<;6K&2ouJLTHnOWiB&G2u)H^vkY&$TJG&Hi&gMS$!eXJ4!PcvI#{mt z$+b^%ZAh+Ra*dK}oLn=>wK2IiCD-QU+Jft1AXD~ESZ5M+ld^ZHG@iyh+=rD5;9{() ztP0mR&c>=UO#zC2E1jwETjSq@ORsVP+@(QLe`e4aZ>rX*=cN=ft0wixumI7k23) z6%_nhF%pZ4)s;R9RZ$jz6tN? zF}Y8-;Nf1#^H>Mmom)Ry;){BHlj#*~+8g0~6Am#cr%G5A)b&K3f18x`P0Awy&<6{; z7$}|a4zKsRTi$kHcci@7@T7zl=I$50k#eyK7n!nzl}K5s55la;zk4*fPeV}OeTS$j zxJsUkdJ!=ve`s@A`xxvSAKMTcszUV$>cZ3OV`-!608~{3s$SX!)HUW_BvJ{~U4|ME ztY@g>3^hnr6XD)&h8h_xFw`T4ni`y8sQ!kU9o%535Uc5sZLy7U2cX>f_5-e~}JRdBPRYCC|s zCb-*Bdz+ls1rHf&9rG?X1Wy@i6+_(|yi$QOJY0$2-5R`W?!9QJ2c?7H-XN3nxuCDC zxa$%8+uVCT7;dPq4D~@U$56WQR(Z-lgDniTCp>K}>M`pyqAHh|X9ptTL z^b)GJ;*J#6wc@T6)xF}L%AUdTwM$EECxjd{dM2Y?Jbi`E9NS=?~RRm$1s@zoKTA#LqGLE!Gt#=L#n0FP)LIp$fk` z+N3v|@MH7j(uj|moQE0o!gEj-`y6}MBK{{&zS+Eqea!go8N zq$9hoDPafmZoiuv=+X_Pt25=@+dSVJcdmpJ>MoV=q1tODe82YAP7T49-R>36yu9`S39qetLc;mA zFG%=!-5U~~RQG{|3+g_XFz)&<37hMFm2jQ9N?G|lp{_>4hiZFC_4T3CGCjldo!!U4*+y zxFFb1!s?16CETOp6bT=#IA6lwDz1{Sx$;&C$5q}h;hf5+B%ELQs)QB62NG@)d{tEy z+#CHY;jsF#oe=+bDqdM_)7MZk3dIhfKa(@) z*j)*=hM`UfdNmJ{VQrt}URCq3>W;yqhWclhjXSJX(J6S=P=|KjvO|Svqpu}Y*kgP} zRq$Ry4d@}-RPb3sjhB1X!M6#uvfQfVoMB z^mj??4os*`<(WN#BNJ)|d1jB`q=foV>ZNCJRziI%_0luAIH3*~yk5c833aOA^$KoD zsIk%X>fXUU2{kR6Ez~0kbxLM@MSbv0LY-RcN6Nah7E-JG@*X) zJ-(tL_$Hxh>U)Tx^1Gq_S#e!vZgm*ECkr)#;E~|E%mEcqu*^V9?bL0xia1yYrb=*V z6o^$JnyH~Izr?}T_MYLFIM^kjj+U}#g54A994UJy*e{{pma;bnhb7ckQufB+_=IZi zIla0mI6a}3>N#7eiw%YM+^)Jgh{Oj{c+Zw#yM)4fW`p+(W#2O!d}b)T=XkmIt-UAj z*+cs4uL-reyr&8(#U}y&oG0(8g4%?-Pk6U)&^w`?72fR|G$quga<5-7AffVduU{}M zp}>RvgV6~E9_$}XPAKr;fM9w;fd>Z!t0xqAur*jOp}>Q!!R84C9vm2Kmr&rrfx)f` z1s)s}?3Ga9!9l@+3H7X$FBcq{P_Ik*a=}Rn^<&fcilu_H66%kp9plghD$E4_-|ulws-M-Go9JmJU8O6wr68UM5%>=61rn%Lb<>6y9Y-@U5Zj zyNn2aHI#jq5kVzPbZK|Ux)DKbLg8IT2E7vs?=muIN+|Hes9-=sfhR@eI-HDZ!_PvUNQr_{QEdbv-5cC84Hv9AB|~P$5gW&<<;K z>=7&<)FjjnG9FD0dL`6e(neE*#)SGr#(-%-|AhKM#(-(T(1gm%y%mB{3AMl6TOpW~ zP%Fs26@!%$YHhiT7BDm4hP^>Q8C+m4g!#>QiZ>nZcO}^@Ft0%;2Jg+EUtmR&Z59 zX=(Ra!OaPE>i@&un}F9@RqNw>e@WY<4Q)E7Nr46h$px`31qxD3Xc;19Y|A9l9NM%E zv`I};pn#fKL2{i(u85k50~HWaRJfuh0!mO+1QZo8VGtt7Ac7#%f4%G7EBiY`(n9ff z@Bevj^PIKUwAWty-Rs-m{!UI#WgU)kHwI~|tiw_6mLQ!iF_*gAgLIL^TtVmsbV4blZtXD7I-AbmpW>;(7bAT64B-neCM?;ssD@%fs zT{v#JTNI=v)4D`DJV+m}xNzJGcTAAFE4oBFDM){mekZz>L3&L3o#@sD>6zk7{7G(O zkc!8AY}`ri0+q18e0to;?l}2Ki0v<@xb7ffe>v5CWdDfgsqV8X0ndZP_C?wR&vJLF z`+AU`m%4tJ`&N*O1($cZ9|Y-4!R$2mlOUZdw$t3LK>{xCcE1S{aCx`;Ly)R>xp3U+ zZZJsu?9wIDUxW0E*`FV`()~S1_sssHNH3|xnrLtzkYAbFew}e2R*7@SxKGojbI7>M zg7j&b-x=Fx^B)EVXOOgF%OGTyhwo#pnHU&+|~*1HRWgz+}G@2JG_Hn<29f)7WZ(F9*}*o#XY4G>hrpB8{Kle zITh}I?{QxZ5^`yEFRR2{THRRrC5GI!wLV+jM3r#=D|fAKW{|M&wz*w{gnhTo?HQz- zWWR2AbAxoJ?APt?V3m-|e~;VbE>nr?aJG9qNXX?Jci19~&RouM$Eox=x697GCP=BzjP~A zV!iyztyPIFuU1yN+eDoXF6(l?#{lFCZf211 zeDsjpHAr|qddTe=B%I41c5{P-bNR#WV3m;P1touR-&Tp&-y=>xARo@OgtPEp-IYPYS@^H+x**{!{Fu8jNH_~W z=57fRYVdJ)dyr6rkGtOm2{rgPcYlyjgMV|61PL|xgnKebsKF=P^FcxlKI!BDCI2oe zK@C3XN`r(Ne9BD@5^C@%R~aOng`al21qo;2r`=vb!ddw5Zr>o`Ec|zOaFDPL&$uN) z!a6+Tj#CNi@PU$lxb}A<7p}vz?&ct&UY>JHmTI0_FVDH7Rbst7=T^|B_41rMJxExG zf4Vh6!aDrZ;hSeLTg>5kcTSKnhv!{~O33Bnk{8^7O3dY7Ztl_O$7i({U6)GSlV5b7 zQi-{|=q{yAb9vES9wg-QlDjfU$mJz>U64={FS{FqgqnES-4Z0!#4GOhAfYB+alZ=^ zYT{LQe~?fUuewKqgqm>v$snO7oPRz@s0sNM(=kK>HQ{|}kWdqepByCAMB*!hgqkSw zy9Eg~QRMdu67Vec`vwVk7W;#Pgqj%RmjnqlF~%PqBs?FD^(%se=cBQ{K_#ri$4bWe zj$?^D-eW28zX=j*qSV(OuXE6vDE0L!aUDwi@wDkWl=@SHglDJm{)`~u*=f8#D@eG9 zPw@DPE>sBa;S>A?LBg|Bng3vr@a$CPKN=)FJMH8@8zekC?c~1{Bs@D!^j{AWo}DK8 zYl4Jlr%C@>}n1qshi)BN-x;n``r-#JKlcAD<@2oj#1X83)A zglDH2exXWOzt5D+^tUd<2)vFee8qA~Sif2RiWNG#uHP(wtx8AmO>H(%%^*JXcluKLrWTRaO3>AmO=cwtqZGc&?i5pA8b8t9JG;2MNzrJNvOG zYGx&Pe%QrN3=*CncJVWVgy*VV{jNd6bJebX&miHsYL1^9Bs^Em@dpM8&sEjFE=YK; zs`l>;5}vDe^Ctue&sDqm(^LYUmzKQA&pn9<;(B)rdH$lRT_V#tB#u@GH->DL3w6{Nj zHmQ(ux3_;+knoiCR=+Apc*=UKU(bFr-q%a^@x3Z>ytn!CcVPtX>~sBzDsg9@>sPA8 z@#gxqwCQ+r{l*~SDQliTH%NHOn&&^relp%wCG-6~DsjAh{hp`A@fP@Il{nr4e~wDL z0v7o9)23Iz0)KIk@RYTm|3r}Rl(nC~jQwQ1@09HCA61Ft9pD$fJC3)|H>DeIlRNY&$#J?1zYpNa=srY#I`|_+OOAhlBf^_w)=S7+tq#so! zrHA{(j$CLkUm|ti%9c=R9CfU>5+b6kd{`>6R9>xGiSfOwB8>P zq&LrABGR!z`hMjxrSJ472I=ROCy8`=kanudlpf_9gY=fFGez1EqC3bJPZtK2`wc;QOVx6b&JNN&m8XwC#lJ5| z4^^%e=|e#pQ~93pr}~cvX?o>(BK=p8cCY;4_;>m4AT6r=s7P0-#M(X0m*M}}q;34nuZ>^n%TJVC)3tC^S{TR zA@=}E@0i^;ewE*N3Z?3qw~k-!Zw=BRGk-n4(Z3X=`7?hvevO}dDm`l|?i;_>Zw%6u ziigIp^F1nYFKF`LREfWpZSvO#&s}zYYG_Jc zPWZ4tIY@U`>^I?K{+=LRUvc<^OZ~=o)3a`N(}XMhK#)qOZ=UcSKj(DX?w|3&2|w^h z2I;)%AD(c7-x#FjJAZ1z4}Eu#mhOD%gdh7`Rbtk?{?{uJg){2)539tTz1RPZHr?5K z{c}OOzoKVCpMNDtk5znKq;U-zrR3)mubS{vKPgCeO}tj5iXh=^dXt|MB%Doe@-;!i z+4N>VFGx6>-s}$w63(W#_(Ow)v*|7Vs375N`ZK>QNI0AR%%2t{oK1i3R|g4a)1Uhd z)=$o7xB5*%!rAmz|GpsMY})TH3KGty{r=-Y!rAmTe@T#VHoeVv2MK4>U-&D6gtO@{ z{Ix;C+4PtGh9Kc=`b+=QAmMC!yT2_+IGf(??+nuSD}ONISN=~y`gvuaNDl>R&a7Wf z__cpLNPEq?OQdImbV9{_6Mo}g4$|ore-Wu9!+P0i%2N~W@K>yYggekbC;ZlTG(zGX z=uZEeAmI*lm%n{2Y!{W_)ODA?J4iTn-R18O5>8!r`@aMUr>?vGlR?6%>v#U2LBgr) zciydIOq{xY?@NM&Q`hhPG?kFqD--VVA5@8%{lVWABxLqSzkicP(RD(aQT(NW6y}lzzcU0^qQdf}Vu2y!R z|74JsR_!CwWhybx`~9RdV`hK$dr&IDcz^c$1PSB)*&h(3x~l!k2K+mMw6yAAk&aY} zF$ewkY17$0;C~rB5%U3mSCA0%0e@eR>Z+EMJ?I|}($cD9M0!dk#(c;(oP|6;SMr6K zr<6VHuM5(9XPz$7^Fca!<|>ie*VA)F4-)sDhy86?(g3BB^D90go{t9U!irCd^mLGLANz}cAxOB7 z{lyobkC>d_BfeFoi%M>HQ_3Fo=LP9cZl*|Eg0$FADI4-14$|>{rbwR&(x=7tSASWM zdc^iue}zgM;W0n%f;flAeK{qqy2pJ*kWh7x`|2QJ#s21Nf`k?Oo1Y&fRNWK)pdg{@ zp72Xl;&@N`%W2apc*wox8l`bk7avv#s)^`QzS@%hiJ{6>u{v&12`AdUz zmj9$kmj~$@vHjCu8KfVI?VtX-AU!Cy=lzXAdQxo9`&(5aE-(0l-WS*5Uw*MlyvO~^ zADd-6S*0!ViHJ+e{^c8jbfNoF*^7Q%kS6=DmA&LQ2C36uRraz!H%NE*@0PvdJAyPO z`R}q<{l!6gOVU^7l1~I_adK;!PyQ=NE0bTBB}sRX-krB zr-Hsk{v5&RqpG3){|)_d1xA0{w3tu+xZC5C-)nRYM`YxD&wt;D`D5+4W_0wnC;n@l zZ~llQMR=`xW;;@^d@HIqao>`+i;LU`X5jB?_M41aS}A{EleiAm|9KMh9YV*rNwe|S zG|4VbKEK#GUH)dr-8j+7XA(cRv;29H`?5rs;JzWWEX283E~v!K(>NyzEp{K(I6o8r zvF<(@Yn;1YXo*HH)yU&D@&t`srjd7YuS(yE?yEB5B)3#*zT9oC#Gjh=%UDxfh1Ngk z!km$bcl+<~EMAn^$zNb-9AHx9Fr#8uGzDmUQZgUwR_QFRlRcrtH48qa?)x&w@j9ak zI-@e3(M~#}i8>?iF4CA26dB}M?5-C&#(h;0K1IeI=T^wPO5C+F-%|II@Z;Td-EEi; zA{04z7Q460ii~j&OJ7^N8zfKfo>cs66paUU#0|n1sov{c5(mBQX4_NkJMJ@jedbr` zj*qxKF}EkH*P6+{BW5~>H!A-2#~I18<8(FdwlXEygm)b&F?$9e*3M(ax#%Wn0|w4 zk$eugNX`mHat|*SzF7ETInj)9E95mrUNc0qNM87)UQ^_?hy2CHB6*FK*MGV?9OqDZ)>Y&p%HUpQ*x4b%)4bO)Qd^{H3(~<@I#orwc#b9WI$J(rjnQ=WS;S zKU4HG<>Lhv(zinTR>dLtQRKFJM@e4u33beB>7JxY6& z-XOHx^(o)4^bVze5bEUtui6Xdr`UzvKc@bXD}KTrQU1oR^Lgv2$o zKP7bQ)JsHPI{7OSXX-BB5FYQl&C{{w`Ek3n%V$O4^OA%A=iRtnp77TSeNHGm>pkf4 zO6BdsS#uNQuqHVLBMOC8zH318pC(lP#@r+SY5vLLxyfwR%vS!*%D*Jz&Q0E|n!QzX zt!TXbP8I&(f0!&#{Q}h-to*^sFHwGp@=KLps{C^0mn(mo@~0`kTKUz=uUCGaKYMmj zQH@_Td3@35Wvod>?V?BK)2GiVxe&o2P=P- z@_Q?Po$~9Izft++%HOQ~Y0Cdn`PItbCHz=Cw;Sz z@h|!PrcWGGmVnNY|97HfQgxvFN>%P7SNlgN?jzUd=Y&?d?+JaA`|-qD^{ERKp7rvH z_mW8&)nw$aGj^J^O8$mnhS0^LZ&GWgT07OcMXg)Z+NIVWwf3m>aie15-V(j2u`2MV7zsn46# zr$&8h)mj%Qd={(EV)dz4p9ZyN0)@{i^;xApP3qI3*3LlTvqgQjs85&rbgQ)|Q21P~ zK9{S{R`uysYhR%7xk-I)QlEbH8BptBpzwK6eI8VwA@y;I;u9!*<|tnsC^T|u5e>ACHtqrQr1PbdavEDwZNv$2K?+g^yEn>ZQQkPo0Ro@dRte1=R zuamZ_wO93hfx>!|SYMdbuhs$84+aYBgJK;cA12e;1qyvp(K0u+ytGKyUG>$0!dj#H zTGiAA3jJc~wMTiqS{qcK2^7{Q)pw|-Gf?QaNUz%RF12>6z9&#vFBj|a(ATTJK{c5`pQH@Wps;RHYnS%zR((&PuwJg#%eC)T_32e>U!d^mSN(u$1_OouLGAURMi^2b zH%8|eD13^>==D2Buir5`U$s^T3ZFNrPmNk@RbLkS{Pe!eoF|e*u>ngQ2 zskKwBood~pe3$BblsUSK%w8N z`d-!a1qyw?>IYOa7%22Zs>dHp%2g96^ra<=vudgXg}z4hwW_HL6#9DAH>f5PDD+LL z?@&!=pwM@zzFRdtfkMAk^}VX;3l#c()eoprkHJL!6Z&H1SYB~djzDxDps_6+7`mL((RZU-@(D$o;KsAGbLO-N>e37=` zA1L&t<28TPR0j%ujp}PvQx_=o^{UUPCNmzICe?JRrc*Uts_9Wpk7~B6rcX6}s_9qF zfNBN5mIGR$a5tXt&k05s=7VJ+PW(dMY8I#B3qME~vbTGiAA3Vprk zZzyk2O(sz2JCyGX6q+va{Aqc&YI*{Ne(O%>yI+*|s-`bc==;V0ALRq884MKqp`Dhw zm*vX}H1j~AFP(^al}^M;l}^-IsI@v!_|%Agr^&UdsS6bP2IVt>Ler#in#6y`FpGl8O4llph4rZZ6JyF~x( z@^01i1Pc9D)%U8VFHqJa|u$GqV>Xff?M@%j)2V!&7 zS{*2SYD6!Urkc7yp|6*Z`j!Y?=1!d4p!!Upur^6dc@EO}O&YmFt(}3wr%Uu7DeqQI zPoU6mRei5&`T~W%U-VxpA5hI;pwJJA{u}bKeVtvP(3eius#8sMpwQP$Ms77?-BMnw z`no`2t=C=+s>uWjeUs?FUEZOZ&Oo8>Qhm2-dIE*MSNXm`q3NHz%&nO`pqjxzp&!zG zh9;ly+9nT)&#ppI=WdG5C{TEoPSL8Hf-AIi3iif1YOM|wJ~ir7tD3q%p>I$=6DTxI z>e->1&Oo8>Qhk?KNXtNsk#=b zsSXtS8r9dTrY=zE>!)I-^%xea*BjZucp*s;LVU`g+wjs3sFA^i8VoP)%o`(08f6TQxm_Lf@-= zU!c$oC_fk|G(*#X?a(w-@l9N}CQOOQ)aj8m7!qYjvRTshO^G zQB7T-(ATTJK{c5`p>I-shiWU*X`zg6^G%D0OC;wgQq?^Auh z>ibncsQN+G`x!cm8R%O&W0|{b${f{H2MT@746J_5j5hbpDYdGv3l!FR(VtgdFMYo| zr9t(XKw)jtzD?SY+N*rO_?%fjp!{Hlj`G!kLQ|`JU7*l3D4z)wnhxbV1BIqX`JS2J`;_lfen9!bKw)(innR$_ z%u&8NP-tqEuL~5KPUSl*z;{&~C204krbjhfRnw=MKGpQAWfJ2OAyDW` zXCdYs)l>%xeU0jCRZ|xz^!2LGs3tQDnkLnBs-{ylU8?C(O^<4}s-{mheX8kK&46kK z14XnU)w@dMSz3wxXO8mKfx@R&`MN-%$ta(x1mCHAr}90@_bA_|e4p|I$`1yLUam@! z2^5++%2x*pO|9~EfkM-ud?rw6I+X7W6q+98d#b?qDc`63pz?#t``J4BZ1~JkzB*87 zYL%}G6q*L*Gl4?Wp?qhc&~z)`6DTxWXJf554*>v)TyRUHT9zT$CQj}GOB6PUY)AxR85y^dQ{V+nm*v*s<$IMMQ0l4?bB@wlr433uly)oaRXU*5?WX=pYn3)A z?NHjSv{&hXQuikHS6ZudK&gAP>Xp_iZBW{wv|DK}^}EBfLut3tUZn#{-5wf8X|2)* zr5#GUmG&wfQ0m^I{z_|=HYn{-+O4!#>3~wVr}`_cRXU*5)u>)+t3~uY;$ zsoPH@D6Li6ptM72x6)pv1Jv&i|8AwdN(Yp79H4roy-Ej^b}UrA(q5$lN;?izz0zK# z14`XN(9cmipwzuxHA-vA9}G>c(gvj+O1qWzDjiVj7HMClwMrY5b|~#u+N*RxsXIjd zmDVb4P}-riTWPP-0j2I8nu*c|r5#GUmG&wfQ0i(mveH_m4N5zdb}Q{wI-u0mslU=% zr433uly)oaRXU*59jg9H2Mz=84p)uRTBQw2JCt@S?NvIU)E%MzN^6xiDD6<%t+ZF^ zfKqp)`YWwf+Mu*UX}8i|r2|S`z4|MyRobAmLut3tUZn#{-8-X82R+cSoyxlaq|6+ zC2n8&>`0w_R^})-LB3b5OulD+C;6PoMEM5$N%C2g$?}b|Q{;Q1rpk9WO_Tq1V7mK& ze6HnV@>!P4B+A$2vnyB0XI8%Ds@%8bGb-Pa&!&7&K7Dh&d^6_F^4XN%$Y)aq<#+E7 z%VXidA!hTl#ZJX&C9AkZ#wvECxU)VHP33_OI3e(#Z=K>UJ2_@W>g5BI1N0< z>QT?LXF&7T$?$x<7<{|x@6^%Tl#V`P(PZ>Wbaab@xiAi`9C1e?|6S+EILkH9_ZDH4 z7Zj5ZDm_W*RS9OgX7(JRS8M)7ir5R9;n|AJ)f(+TRl}ICs^?z13Rf%rjP^QqBH|o5 zZFiwxtpI&e`I0d;!V|F)^}j$V{parj&wFRTb=c>dMMNI-*uW$InTkK-oUHs`bY9eO zj=$IWGSC03kaV@DYw!OmL8)l&RQ(=S5-@eUQ)F}==-Wp7rN){wL*VU zxl!m|RhxxATKNH?^_3qMT37iQq5qooMWNrV`nu3-XI&%oS5?;wy`-v7==-W}6T0W@ zJB9wD@?N2PRXr^9(aI-;)>r;hXkDdjq+y?VvI76N%RLh(3f=Lm^%s@$U$3~g&DvS$ z85O$=9r?Q3N32g)ED(Bk#eqWKS9Qp+=6zL5Qv6ZEUp;e$(2vhNRcQOnl|oOcTrIS< z@=T%cs@e#?>TIER&%8kB6Ei;`^!kd6g%XE9JB+o$gMLlv=l6*&w&_wQYRl@Hg zG?9DV&ce?Tn#etGSK)UPn#g^xTKG2$P2}G9CgJxGn#lcccj5OGn#euyEyDkY&_uqC zxJLN7LglZ4}eT6?nXyV=> zUf$ITP2|pgfbfS3P2^K$2MWJLXyOi&-d;YZ`gY-ukltRt;BArc_0rqRXI9@K{87@| z%lE$434gTo#@Ayl7XDc2jqhhYO!(uax0lbd9wGcm(%ZX}g(mW4Hb)76s?bEfmGo%g zPZOHRXHbt7{tTgsTP3}{TP-wkjdJer^10S!!mpL{hy2mD(8M)KR4<=#JxTbpB&wJH zdFd44H%L@3pL>0m@GWvi@ouBg#J$I@6uwnxA}1F4e|O}2B{RZrlF__7TWI3Wkn;)gyZFC~+;u_|Ipuvp`0oo%+z%uR`M*$vCh~tjeOdVb7Mi#pN*3PTC^V7( z$>?(7dxa+QdE>7M|5Krf{GUeO5dK!7iR+gvyt_?kBHwy>rSQKIn#ea7@g(mWC zk=F=+kI+QE0rFbm|0pz(Z*}~x@b?N$V3Ge((!h3&<@QF~_kNnSt zFBY1}H@Ni+KUS#hQT`Xgmk5>q_9&sUN69x}${rq>$af(p}7 zDtnZFQTSS+vPa1`{mC9BRQ4kI_CDE*gvwqd-^eF>kr3I7e39@=h031e#|VFdQ2GBB z{W#&53r*yXQ!4z4LS-+KZ>^KPNT}>Zekb8i6)Jm?mk-mr(}X7O-SUlb^8a`UP25WP z7C7%3gvuV}rwf0EP}!sWOyO4xl|4$nolW*Ap|VHGx2nk=B~`Q)M;Xf!;_9gi)EZLWY%D&_e5dLDJvj6x4 zh5wjP*?;`oh5v+5*?;8Qq-6gQD*KOrhwz^fD*KPG6aI5T6L*PUEc|~7mA%LxCj6yB zWiRshU&1aEDtnQ924D6fp|ThGqlE7kDtnGUTIkpPv7-5g(8OIKpVRkltI))K(=QYL zN}-9n%C8XqYN7J?w*DmHuMwKa{~>mY@ZS@fxbORS3I7A3iTrP3?-u??LKF96zf$<0 z2uJi_paV%&!vu=Ry z9`ol5|G3b^{ms8u_$P!W?n(cC;hz$kxTk%m@P8MYxM%zp;r}5tanJe-g?~<{>|Opt z!apxGk^c#;OZXRsChjHwVc}mEnz&c|M}>b?sQk%o@^Rt4(8MLlCxtH(D(?j(pB8?M zQ2b|zpA~+b&_w=^!ApcM6`Hv5$>)WiAT)7h$rps*Noe9GCSMeOlF-DJCtntRvQXJK zk{;pb3YC2$xm@`9LS^4bz9#$vp|Woz-w=L(p|WozTZLaJRQ8SJO5qO@D*HxqweSZE zm3?g@h!k;Kq_LJlm;ZGJS`$_V1;ZGGR z`$^I-{AofHcSiCH;a3Sw-0I|Z;Twe}ZcXxQ;nxaH+`8lr;hTgeZhdm6@Ee3Ct~t3| z_!gmwYfXMHe4Eh3wI_cNev?qyE0RA6JvX^e=;q|lLeEPEg`S^0DD;BlVWIC$9ufM! zWJu`ylgEU9Ao-g_*djD>A55MU{z9R$GbB$7f3Z+Gu_Vt3|DQtT#F9KK{6~b!E|L6G z_)iFxT_Slw_)iIyT_Sl=_|FJU+WYtnY-QHC8vPr3A6rEVqSkzv$rRY;dJw@Lx`bp8RigqimDL$ZhQSs@; z9mU@(zPJ|=%3UYycQ8}pD{X80?9`BU=nZ|5=f@|Whhe&3S6&c|P& z$A5c_IcyfB?0AzWL$|j)N4!;@Aoh`Gg}2Ew0{)c>%4jEq_9sP`Cga^R@(eV_kC(f8 ziM)PX^o;v)(HQ?Vw{Ou_cWBYo?)ai>T|?3LTuadn?tMi+avv?~bC(s};;t;}cmG{< zyX!By!`)N#h&!+N5z$NdgAX}y<;n#IuADd59lW$9vwBIUJ#)wz!>VA-H;U$vRV!C6 zX=>ZJKC^l8`b=Bffh$FM*n2i**0&)7JVNYw`LRW1)_kL@KQhx+zq(JZfQQdv9-OiRrn=MtJ<4dnlr7NMM#f2KWkLlI1(+!+uZlf z8*ksNc>89>qm40WG2Y@W$cwi? zK8st{uW!^PZ`WJWpiU=(5A%3Xh{cN zzImfLTY5pYD%5!pal!DvB@RQK(70AAGz>H>w3-%!==6h!@hyNTgjlv|VNH(z-cxSRBPwk%i;(#@5!R z_UM_G<&qt?)vab=*|t`-G`BZ3Z))TMWhqvtt;aN;bHt{m)$U-M*1SW`TDkJj%&N2G z|A0Qcsd2rS6uq_r2J16_q&@`<)@R?5`iy8;kl!O*Gx-J^1(lj_tzVt5i`ANMvuLcw ze7hB3z9kf1z9E)dzRiX!l;&_%73elxH2Jnv#pD~))sb&q(cIL2oNNh=`KIGq+S)Vg z7q_e~V8hakW;eX^qaGZZu4!+ zTk^+HnDW(&*JWCd&TPy#DB}5Qh4k3w5v;Z!<@dAQDBmK-sQT4y`Fgvw3z+IR$c0@% zAIiU}kj(%rXtc3LbvmY{y-;A5rXH9Iq{O8yU@$3-gEMfr@FWc4v z7P;xSHntTopv#EHu)P)Nc6e)J)7o|I`OA9zri`2^+BYB9*os=pchLLDrse{c!!zgR zyDx4L-`36f1|&YBQFr-c*N9!7R@w^mUMwk&5VN4grj^$RC$Hg~pPqB0w8?IY@+=|u zz~)tr?uf>AIi;?{-B3?=@#d#}Qz8OmjwzL%K(kdFhi|S~hieUHRj(GiU#ewTSQqZ1 z$V;y}$@J`&vl?A|&U8y!Hp#=MJ3-c=X+tAUH%DfgSBpmaKsvm&Wkb*)XN6uzAqQRh z-m9i81x}%MXLeFM5*nRwlT!vLs9^J_VA|9G!(Ji2$|1b+@J-#bHJ7x!k%#bMU%Q2? zJz0kc8^!D)NMTgFnpVLtKu!6zTt=#XOmXgsb8(j@pRX?T-L>{ zHb&=&`#oo;9CX9y0M$oHYe2n@;DW{{zSdBrJSH$+;5UZ$xJ+wXT&8elP){t|u$lT4+jjl&KN`-K3u3zl+Lh2hX&$iE=Z|Ylv?zu82ZJnjcArM zp0R1|+Q!yHTU*X)!#ga?+M%{I>)P8}o6gt-e_6by^^L9iNGvX^qv?c9^V-HJG9+T< z>Qci*6Q5+4Ha4$qUl+B@Gp#b)!&~LrIH#rctZ0xr$Q<3c;f%)CsFTWWZ^>2Gt#8V- zMV}KI*EF^^%GQ+9aZVW=W=?2apE*~#lpSN?3Tu_CHb&CX^3`>l+FRyRx>>NsI?L{PVrKoOMt8PS9rVym^2>C-OA+Gi zbE3S-CF#rKsaxJcDBZfoa|5?*(;02DfMP_*;S;77MU*z$$y2?!67mc4mNU*&1@?J6 zeQM7v1@``7>ypM*O&c=n-Ll5kv*j5{YH8J3`^cL-jqBq(HSz|_h7B#v`{+UzHihmZ zbOd(m8_%V6gGRvY(#K#;GfUB$IwYsx8?v|h>ed%XakVHBx?bKF3c$NVTUypPW|~#c zLs1wE$86PNKS)_pVynI*qfWy|Z0#MTMmu`vF0^3Mlv&?&p4RBFv2jg!uS$ca&eR$< zEfXRnnbzV?!(7u^=9$)@w;d`srws^D(9mx0#H77f$ESz9f^brX&5g&jxHXw`g)-mp z7!V*fsns42954F%<~1$DZ|T{w5eLy>W$JytCG9P8so0qT($SmNw>MGEol+0MR0MFe zk43f?LE(i|*-?bU5f$-jV zK|@_@Yi2V;*|Rkz!y&Grj-DkVIo&OE8OZ6Lp)(IpUTQNwY*I^`n&0D~ix8=s=Bhf~ zO2T89nz9tSx0to1eO)618F1QRSV%+2WWu|qjyLF5x6dkh*HEZ7A;l$4nYGPwwrpC} zrU~&WPWuP8UUr+NRZZ>s_Fr4})+R2Et!pxJQyIP@d3wYqr?<Q^d*vdG(Ek~PX5G72GPm4@V9~>Rt6c5_C!Wxlw*`g22NDtI(89_imi2>84MlnkczuJfS-Nb}5z)-^}NPcvBy-hQWKRc>ZGRjb-@G9cG=~q zt!5b}O6X!E(iSDyLLrB4+!8o`c(T>pjkg{q+f#+f89pj25@Aze8^4B6&Tg4pKJ>C@%kapo-nqK>3_nrhu}e=t z$I7p9)?{Rl=9=L-Svh;a);Pn$YP_Eh7fBw!!()D#bD5j8JY(s~3_lGX)wtQ&z8J66 z!{yi~zh;OESzy!UUJ9FIa?%4(hi7)xW8qA;WiVN@l|ERmoX2^MldIDQ$N0$4ape@r zLBZI<A{c<8$wPCoAUjiGt+tNVHK zt9$uWo*O(g&+FuFCSY)-}%x~58b}1J3urCXngjYD}C78a?Q;hBgY@~LS)2X ztbHZ+!jwn!&E@LEYrf=Xdc;|vAJ$!%r8m2^`^gB#qn)2KUY%f{wjYpV=N#cd+|#~= z_=Vd4(BYW5^4z@m+4E1YrNuWLWbo-W?PGfL$+el?^rN+`u56Ed9X0v-bU#?_1%31; z7iIP;>>GQg{nLCL#kAJOzUk39+GsT0pMLq8bpO$t_S*iwY5&-3o>VrjFI;hW zMN4|DbPnc`j%RkWjnvoT7wVg~!Jd9u{B5<_aVf=I(h<|PZABg3Zc(v^?WbsBcf!s$ z($9Wk#VdEl7^iSvHb(R?KelO_pRM`kTcXB%vRg>mn%o{{jrz!qW{X}Ua~yqvAcYt1 zA+PVp=73t~Xp9{7`FGEevoZ^3XLHP!%qNZp&U~}2*;1i6X&rcbW%qn-5@O7kNW9PI z;tH(!Vx_WTu~X!Fre$P?y(Hos=WIEn-PX_OKD4H3ZoGV3T0OPX2#Ynl1q|fcY{qjf= zN75VO7-3|e(Z**l)EV|!B4w25u?DlxUFd}u?{l^;`SpxS2gdZb7}ncb%N{c0rY)mo zKa!1+MzU^?KAk~2TAJUUIPgIq?zncR+TNaNKcH+#TLq(CpsRpuffbyeVOo>sEw}V2 zua&oWXi*JzABJohz1Eo9@6S;%D(`8zJz>Z5mD!0K>J(2Bh8_{LzMKhnZ2A*FehYe^RhXhg7CZ?N3(JAHD6jI=#P}E!D0A1s8b>_x(W53`pI#a8$YX*0fM-iYv1jID z3t#qN_Lvv@qb1td1?a`Aj#nSNfDKWH2N8x3e}D?EX4EsQ7BXx^m6D-th1H8#u+qa2 ziZNMBoF{tl&JH`#VHKvwOUGbbqnI1-Z|EKKNRLJytH=>BBJYQ}HJpv*$Wku)+-0z4 zm^-nwiZF?}A*T7n8Ip@~#1FZ1^%w`yc^xy3?ZDJ$<216w`n8C*Qph+z6V4Ts2xdpM zxu7RcCS1c@gotHf?MOJon>~;j@Wal_E7NemXsEx4DtOK!;uf)oH)mj@8tQCuXe$Z}zm_*(l^nz!$5uz21fk+T2)a8MEcR)#{fBMWk$2)}|wyj;&c@d|nOQ`|Nx| z4A8^;fD>`Sy?_|oUJDC%K+GPV9E&~Tb&dY)$sB7xDqRyuYE+v(d`NtdPxWHLeISLrk>L@~ps98fMSBMK0vy{=qvt@uS`D^_ZFM z0GtKy6yz}<+ZQk@;&Qj(OwB91B{Im=ey~!u&b+5Fd%nYAPcy6$?0weHTEiNBS*eB? z_G;|EX*`K_HsX*>V=ekb-r^!}ocnBF;A+DcbKsqn^#&bB24+Nre!vVlLmP9Cn9&Qf z!>&MFfo((=HjJ`8KfDgi8<-+~{NX-|NOq3S-FX=S9^`D!76~n05hF%7dmPI+>j9Zw zpuDfKqHJc!7xRV|RZQ%7HB$p5h(7iJTA-sZP)1E=*Coc~2;4UipGc=G(Q+8M1s?W% zk@mt&czWY|IB8oxpRR$l6>En39IxSslVL_Qsn6#lw$a~4LS6AGm;DSuVo!?E?Uh|^ z#0;4dRjVzlS71(jt@6=>v4C>ynVxMnPh?qftU8MUKSr^8Q@Ur&C9OsN+{x?&$iAq3 zqQlxF)}~7%OPmT(^Fqs+$14Fy+7p{$2_*1hHM3&L!<#?I-TXNZoTTF_z#pDGHGo2c zpLCs%gas=$jc|-?BLidHXKlT>2E4<7^3DYg*A}as)dh)t?cQVcN2CldU}?Oy#MdNi z&5vtjyDIw=2OyDN8}!5rJ+R`~neEyo~4SK$0@Pv9yNZ{P|{5W%pCxJHhvM4Cnx zSVP9TFcL<^2;6VcgZY4C2FTsw!JE(D#2T~V%;9C{GPYK?aqhX8(2}pEhIcFQs7}@x z)|Xa87^8BHfhmzD&5zEWoR#%wWXzA%m0gX{1E0dk#{IxBhCg^)OWWZLKl(90#AMvK z(uOpz8%k+}<6Vh!A<~As%`d;@nx^%p;mo7Oc4EXdK3cb*W7hPy*;{L9p*0M)4`ExK z^uCgg3ZCeimKsW^cwDd8Er2b?>u{y z9TtdiUjRC+U|;DfyaE$>XMLi7X9+=C5qwh>+PiT5;Ukb5pN)FX48S_)Z5*V$|h1IkuekT@f> z##wz^-`FA#V9IJm{bB9w>V_Y5L=ky`Cl;7Ham6kH%(Hu0M!aWpPbQ8$839+~hcR>S zaIgS7>gmhu(&!-bv`n5=L0jb0zUT!RwaGP)h!88HYo}@An5INIzgJpA>@W^vS|vln z_|V`7c_JH z=7PTPjr}m5p$UAz+Yiu0eF90=Eus@w%$KXd*7`!v3^{l5R;l(`Q;c9b_ybd$gN<%2 zGBzJ#&zPuUaz-H+df8rp){wOpeKD)tSd3}W=))&1)5TuA`iThRM2ZRn!Wfx&QL?9D zpeSV~Z%r+E(5;=;9A{DR`p7FhgJf$|oZt#4|6?Xrw%uv6t<0Xk-1x72vvX z7vl92M+XPY($#FJTHT^WhVVr0++Q&(q6~lNO=9%ySwfda)p$dfs1~kZ_!2`#CgpBm zahMkJSV*usNehAL)i{m937#u*yvmU{x{Mn7V0ebB-`{|D=fofI!pWMJObho=hW zMx=oiaF3W8^1uz14a$2H&t>q8FCu~{T#M}bP0xfm12tSNkXTQ|4lBZwC1ql3d~74a zh{S!D>ynL$p_+>T5oYZgZ#%LtSVTr>VjrLXSDx4`lE}*eKdUKb(0X zOVn9ku02LhSF>3$Pean~WUOb5L2P#nVOuF?hNy-u;u3YD#MyIhv4&}5B@=B>s}-P) zAL2=xUIC8E7??BXZL`Ptg?^Y9b3>olGvZ4wM#}cH`yIUuQM5oAE$&=I*v83?J-SR3 zbFnnpkVOo{Cjz!-S^YuFYt6Dp%WKc(%-OSk;+4pFtYGqp#6CvZv(PMfjYSLZUs1No zqXvJ?jH|`QBv0gV?;*P2c*^4G0Z0%H*thS8D-kiw?qzygHy}$La4;13oXh(Z_uG6N zm^-6q^FV_45+H6oV-r{OihWqUoH@^x?48aWakA^t@FtQ#mQPW9XTbXMxfb_$&J$Lv zSd92u&}HSt`m-_eTZ?OGvwnHSM2z{w0VLuaFpv0x1uv^gjs!>4k>r=9b2gNT$am zZ(f*9tgW~v7?F{2^5naQ?8#>`^6nrUYzxtBPkKZhaU^Q2VrVcn&dQhzc#LQHFiT{L z8KtqJt`PDZCDw2@Zpg{T%eIUpp+1pqoG*6=UMaYO@RK_p*By0&-q=6DalUc?#cZ>q z8(M5lN{@~e;+kY@p+kI*i0T23tXg8readPY@Ao4@oHwpeN}LtnuZnhXmAO980MBw zx&@}ln9p{s+Bh;0fy6aM%lkMpOXI}~A|lzp$6$Zh3*!~FmKWmk2_7~|MiC7^%!t|G zJznk=MA-H*tQRyk0{Q@3){8~tdKm_2?JqCDBPYW%VsBc@INieAdUDNxA^Re4tS0kE zWZ(iXB9Ch1dZQ0(ld&)d&V}!B@LEM2u3Vg@&32@g^9HWyo!t*R65lh3bLRfe-w6Td z^jyg!Q)12;aRf#{c9;R?XtTH2=nX#BaMYL%c2qW^(A(;qzBYS9oUxH5apbtRPe5zf zqh(%c3@ihT$M;S+a-n^BB!sEw{+{ha{8+Vy0@j}Oi}fw^V`Fpv)(`8)s}t04jK?hSX>8SWc5yDfwg67YZXyo42z20oFhk%?dO0Ry@?Rf z<&_b0;L{H3x9}Xf`si!5ffoA@(dEv|I-&>H53|J&k%_T$2}NFaoI6s^JAM z%maE>3%uyhd1H)-s`+m}rsipgnrtofK#Jp{1#(25dF0QMv7m>)^<@3p{?02AXxNVw3blyZg&c9opFhUO3qFOS^Q^+ChIK?FKi+H8#C^;1X0|{nzPLjG zEuLm614roS$-N^+ffm4$qV$A)g?ndMqA zN8Yb;EfEJhQL;{RYZv1q({vSMx8)D=;~5@VnI88MKD`=VtY6N7bVsmdUyDHO3`^5m zbz2)(z&Osz?8wwGw%KL3c;Ye*Ylqh*u890KNo#B*Lo%Y7)^Mef2l}!<@w0K$F_8(c zA7){*GQ?kh%Sc9vXF9rBFhZK=K4PoORY7m~aF;+2s}VyowsF>&5fR4BN501y9ySI? zf<(?*vl}LHOk&6C#BQIq7|$mS>$~G^tkBmRE22&=9nrGRZnH5o2^d>#nZIFbGFn5E z$fl);EVZ0bZcK}{pY9649On?b+FmaTh5Heav@Ktgwr-ne{}{z)v+WjG+D;L@({)a* z)hWh^ugImf$QQi|trMS3;hnCCZO?Gq9wWswRA2{hYnts($$Uo|jWP1kiO3meb4Qzx zuX)85xe-mHu_YG~Ms~P&75d4Z)kyOgS#Rj@o`aDsBKYi|>@`f=$&+%=W%lULUXj9! zxYD}qvl-6|m_5-2!iBIf9d?jhbhFV!4tz0Z=776gZe+7(Bk|fK#)y$37g1tFSnx{U zu^@;$dl zGcsbdr0K}<3VEd?=dW3QEZ$iPqm+$Vl!%1k5%uJtM;5V$bNT!%&=Y4~^hGYfn9=fm z|6LmF8pxZwhmB(OZ&#n~#%7N#k+-XY2-qxgF)Acu<~D!YM?#qIgV_lAILDm8!4Ip< zisc?*>zzHH38P#PLo<^nBwuMkOU`%r#!|uyJ)kA;H6t1s{E>FPt4JXZ!YFR4aZDoJM>k z9@#KswEQVNzRkhvmv=er6hNJ?!acWFOI*_4rm>bb!_Zn<@!SXwFRp~uru8Tv&H&hPr#b-6v4c(`q`doDb59)VHAOc zF|}M6Aw5^16stHNvxqKcj?WO{XSC|&y(+!y5;g9sX@nxr-GQr!cXe3J_Wln1FoT$P zdOqp8vWR9knf;@bjuo}+mEAY4h3Tn@zQi=WYKUmwX+#U5hT3Ia@h;DMd%9O4KIV*T z9~t0x5JV!{z`@4r1DJ9T<~|%x56G3XN@os@&4MvwC1#I7$tpX$52D1_=9%6N%t}x6 zwrVcalhN4+l;{*fmKLj5{xt{D9ogHkPR|cIVpzC>?VMmO_X_l~D>NMqyv;aQpO$Tg zn6LR;8#U|^5sx0}Shmxov4fqli8iR&V?20aCL^8EfFxer5e(NtpMErCtz~}57t!&F zRp5r4fMfR0{(1_xI=0;bqh|X-%0<9rYpuHSdu~e;BScT=fE+TR-896O8Kx=h^yYjq zZ~m>3A(P)0dUC^VVLyhu$!HA=e2&Fr=&+~euP-AYBU~@=1LgH@v(4^hTDE2*2H84D zjKoSKpB)=MjKMnO9nGSqDJ_&aNCH!773U5!0yJsA#D-tF<<=wIk_iA89qLH(Ew8ajRw$0Qs7`=UM-lNB2 zPDX7Gm}T}{^HI!374aMgjvC+PmgI4t&+`?xdH=JQXx!Zw0|#$vF*jG zHvBNI7I-$8RXv02&P z!g(3Bx!Gtt+7hXV8AoT8gOamRAlbfadGgsRRs?qlR#TjFHmXtLZkygSd8bd~ZQjg+ z&tcq8tuB!#y|7+Zy%v@C-Z)2_%}7{g&pCQ;KS!L*-|l`ujIkqj%pom90~tS9b@Z^> zX75r(NB#Y7H%- zNN>dFr?ptSjAMAG(S;84w5lRr+onV`8|B}3|ICee^S*}t7yB}M@);!Ei@YIW zmRy-wFnYetdKGG;H#t(Sj@fL@P0nqBAh9;gd9A{azI;Zu8S|<&nu}SsT&QlN2WEu7 zYvX#_Ut)4}#JAPK?tt|rPUyus*-VIxNoGT9wP&_M7>=Z~zJ|g`ezd1YBmU`nMqkST zE$bWe;4Tb=@uU^8AvZdHxXyEXq-AEzy0y`HO0$048|+%(uEr~r{&uxOGF(T-;f=Kr zQHyE$=eDrNm14dzQ+RVVfD89ZaNEL_DDrfbMl_qp*obaB19L_FGCoko-iyzC+ZD## z;2Gx^b&T*vQNwCS;>8%?vZZw1+=Y2!GW4?1dhHVPwrhn_JPQM3y!g$mcAsFD5!)S^ z`|Ix;akA@X^jPqZXvW^CY?HVPlUn^62Cp4k^gvElzj1t2EO!ZuKKk!7nV)4j@;nQ9 zKo@5?a^Hwe+9!8p8^I#-%D29-8lLnpe;@%qjjbX4`jBNW=1PQP-ngql;vUTF24@In zW7$Uk(K(yL=w72)5rHq}K-Ad7vN4@y8RK#MY^3RhzTnUjchnJ);fcxW%i7n9HL@^t zEknE~%<8phd}d>w`IIxHo;VndbA0`r;g=sFd&GQuz9#0L&v6`}ZL`MS$oI$7n(e*w zp^rUP*fqn9uyVXM_+2qX*XD^9*_lkq)+TpOhC!}=`(*Uqu?U66iJ8;N5z=E3Rl~t* zmzWsV*^+5cw z0tvnogKGv?ZmeRW7!d?#2m-4#pDiP@p=-IpgS$KLX~-#^uld>95J%Jgdr-yrafHYj zGT9o-p|IBK0anf|KEt6Wzkvl7Ab}sNwOk}4;_%9rs9`2RifA!DZNxpDYs@!tX8-rK z#DSR^%E%V_m^JLN4zlx0OXTx4jKuE*Kvnau10?u^rvlp}fF#kk%FV_W5;e@4e`jt8 zAzu7VoXvz4Y}Z%1o~_@u+Vq^ZE0sMq=4~0;6Dr5W9t|sBv5vV*8_E%DJS`CIh(5+bCKiWdLmKTTowNDbJWby5 zmJyi?(XufNyF&PHdt62Yjq@O9ak1kP7rXyqw}@w9-2G7JcvsOXH5+fP2G75UJrbfZ zgOT#4$F}`O>OY#^qFM{zG;e()?q<*Tq9$8UJgGBmbJr8G%>(1v`-(si*y36T%0!y) zf}wu7KcfdCSai!cyS1#Wr8Qg1?(s%R>AXfCZ**&JK56fWpn1^>N-nO0?cC|7Jl3l1 z4Mg2^h-hP_YuI$KvpTp6BUifR_C~Zey0vda%DgkZ;LE;w&-Rq) zhdNKAYdz6YAIFHjcAT?o5s^58&CJ>z9b@#oX*C~?35gnJXSkq^{^{##v>Xu=JuQm) z=E@O)Y|i}uC)zk$8=V@HVoN>o{?vKrj6IQjX$_IQS!)#b=BiII&!e|+-6Rty%C5G5Tc%`*b~ z=j$#0j<>lvY;VNEIhi&a1&f)jC8qh~TMV|OhQHY?BCzC%jVI)&=UAY*eTcqAj6MGS zTy7?oTfRQ#66aypU+$b(BUV${vx6`FBifMR1r46!EDIYG*%ZnM-Zlz7=#`F8sGr4s z<69feW@K|s=MNiy(svrW3z?@yGEcP7W$P`HwdP@7hAL#9a&0vbDP3`v73}t7cC$fm zI`jFTXl<4l+h&R!BZlcL%_BckTFlN_+FYSEgbXvrw_4@5{_$N);=;b!Q48&@HX>Tf zG|lH{`u|FU8SuAPc&CK5fXvb_!T|d|%(-6ojUjCB^W0*2tNd^=;3vL~P8l8W zbC^;bW9fy#=1Q;ZAABTbe|Mk^g%3e32}d$UT_AeX;R8}Q+#v=i--LtxFzq{ETI!)g znc-5#2F3ph2>p1lPER;D_xOuh8wdIEBLUoA_je05661|b>%?omlI z-CF$G(s;D{)Z07%$4Wn#m}C9dNnP+=^%qow`m{K zn@_II?4~c&7P>&N`uI2lws5@oOJZ!9*gmxU zjV#V+2s3YH3rf_9F#2)b=|xl#pU5J&^bhwYepLiM*p2HPlsH-o4YfoQ$dH2vEW`pR za|YaZfFtriZm270S!J-K^C-jvDVrTR^o9l!ez`*|xgQf{V9fe5JN;orZ^pr_!I?yk z8eoMP(bwuUj*PsCDk})JX)+?Df3QabA7F(&4V1M?G+CACfm)yrJY%3`p2QV)aEQh$ zn!l_i%3NPQ&@-cSCfU5zDMpAmV2)fX#3x#)QXpYF39A-1;t+8H7o))%*NPlt0=4-X z6FJdhE$*wl9)YSMYqbmC_`_dS^G?Q(0kB4i5|N7D{(>Lo(ko;#vo=D-*=g*74G++~O`;sawt*ji$;Eqqxsyzb*Xtdck% zL_&N+8Gb~7^$Q+0ytp&5KQtKMEQSvJF*jQ!^RUW>6;~A6bk!48qr?*^;)i>u{rLu~ z*E~mVfu~hI#{}NUnpXo?je7wRMn0%qLwt064Hw%PcxS}=6AR)5D?GWk!-6ra(s*Yj z7Vsi^q`X>bLxn`Nn6n`pkxxhE)nU0{_26%45kufglt7WW)u8!}-g0H^>u0PlP$zPn z4JVd#hsd$EiLs4pdk4{t_}O|y zJR_=xRz9kR6t8vj8@a`(_`#|GJxW|JlW>jUhjT?GAxrEK+ym42T8(6nXmgKuxc`s3 zx6P6yH?D1aNE8`ysWkz0P zu6K9r9?#dtpaIiBR^Ed6N7xbp)q{)vc_9~1rRkY39>_Rcky?ZCPrrPg(2c)Vh&u`J=h-8tz?u0IT~~+EnF+ce)h_uA10&xT?1es<`1BmkqAlCmE$kTqJ?+usLmc+b z7@qs+sePZ9sbUOgWiUOM=eqlv*YWhi6c$@2z{AQ6zG8dc!C3CfZLB}#hD>g`H?phB z;D|W<1|pkfysJQ&4|&PYYD;Kp*I9FS4?fCwbHiXVdie86B!iP&wcd@gYG&XV!ePXY z!5iw2{HZ3y@J4ZvtwAL+j)(?_^lu9asK3PXx0Q(&A_hGb8Ty^1e3t zG_`}bY1!jDTh-UPAa~CidSCO=ICQh_Ziz8{I71ZoIw6bOlNfsD=qe=PfF+QTjr4rJ zF5CFdDlxRiyW)y2c6__g(nnb`ccM#wmF8T@Zc`QDowdOlaq2wvS=Xg?o-0XcI}Pj< z4AxIiGZAb=)_lZDR7B+DFZ0w`_**NcBEo7u?3Fe|A#9cT{Ujgl1@VD^yAXP3KK0F( zk@<#eUedFTzpxhW$!11Zy?3Kw$}=V{@a!~*Eq1LAWhM(jqdqN3NEbmPD=$Pf8VWK>rRWI zza@x~IBARM#LM%)QwtW1xQB_TiY`*o!cumw*`6b_)RsQCOT>7$09Qf8>wMbj_q2WQ zW6gE&P#joAoFFPY8Hq0b?pihFU|6D24#vIJ>_9RyBo^(n#y4W-wH5k|T_xh( z#l<=1Ke~n?J@)R5dV86T&;TiMu|9~pdzx;omWj5VDGymoeen(0x^AAa7i^7byMv{Z zx6HeHViN?yknt0;VHVl?P94NlX;@r>34Ui7}{}<{9BAVa#6n`<}MJa9>W&Iu;QLn z6MD|I76d#KXkr1MT3U7=_0)E)+0ZYF*t^}u)~YUi5>XMVa)`HFrly8W{6hko%%SDJ zv}?v8hT>*CtoHqZp4gyE&+mA9n=<0^5M^}Hpi+!M;zvaLgaK@7&qP<9cJL!)&$)9) zj4WjF%4`>7@bEO_-Di?$F&1%ofmEi52-(2^Mlv_X%iNyUqDU^{=Ly$_xGSM<%3n0` z9s`LQZ!xiVDJ98!FA+8Ob*o^t8ni}3_G0k)^9J3J9jY=~9LiA7VazIU0b?=}Wsw$P z`74U-KRq!+o0ZoyVAZAGss$S02wEYQ4QH4oPiE0>E$=6277mWr z9@^r86=t(0&hZVMEBl6!y`igKyQEx;4YT_PUNvNi0}3S+AV(lHkN$T*&YP^^}1j^QnlQEkux z8SZh;9U>Yr0~>6Th3n+8%$C)zfyE>-mwz z@-y^osRs1CC#xQSEJ%V3S&MWsd(9y;vRWjac)!yz0wXj;nAObT(;XlKIYWk? z3RzYDM&@o{>Esvn;iGE^W3#pNoM~QPSTg1`XFDeQyppLzww_$}w-)L%Pc&I4E@+cQ zY#y#w&)6+GXv#nSPsRNfhXpy_FFV97)V4i&xzu5fB1+i-o&fe%|f)9L&J9{^sc8v zYv`OSn33B3-AvzMCv})BU0z9LIO?+9Mu-RIlv9ry3c3+7e z(7P~3}S_Vl@Y41{BLl!(hP;2e98HxxqerHgNF{>OAhgIv0))}m&gb(&Xo%7uUFGfU9T)7*$JPBJyp#7DLINceM z(TC>%+u28M3}YyHz>?l_8kv_Xu$pD|1ZizEO58zZ=Fh(16%K00_3nfjA}8NirY1QV zP1PN{VoXNmr3Y*f7x}n1`k}_U4t@LhqQ`eo&--U6i=}9A*P`!WW<^Bg88T`Sn{lzG z*xV~e@X}pzWqP#OU{=5KOl(g-t)I3Mb1FZ4f?d2KYQNQrDR_tutC{6)Rz%9Umi|yy zON6+y2H)8D4AswCZQ?}kyRC7n=N&yzp!MS} zxz2oU*8th78TZsRNnI9ex7(<`+Dkbjvzsn*mlO8 zwG|G&L4l%K8o8^8hL~UkvyArC4nZ^6vjqHD1)A*#y2#ECJ{fzz=Hm#@F$L||LLA^p zMMjPe5z2G#*mXbSH5$IpVf{o{AF%l;3S^>EOVoJ7hBNlf$T*g-8e(X+d?O|U(J^*r zK!VY*GlLUHbkY(%bojV`%sO8LjPSOc&C=-2fV-cf(FS=T5pi?IYv-_N)#Gk`Se2Mp z{E52vVXX)J?@de8SaG!-MyvtF-r><_=dsfB5n1o3KE2_usEapub0DjbykqFjxFS?p z$C^H8HuZU4n5*11PbBi!?A*KN(6rhyTlCCM8jks?edg~h(=*@scP$tjqxh8-Z8NbB zM)>U?T}G}33sKhQxy$tRE`N&x*-*zW9w%YUNdA^5trm?T)^TD{k&9-irV}hz$NjiM#R0huA}|T}I-aGkeBk zO)H9`d*5mWFW@ORu*iyG>-ecY822I~>heRM{ICR;%Hx7-kg`H8`t62zPz~UdyUaIZ zYQ0Z&a&?DYC6DKmon<7t?S}ES8~82XdS?#2`{;wXt9Zoub&RWo;32Puu9%h|5#;UO z%Er*ulIWTX7>lH*)BPiNdOp+O8?){jap{Fz_}eYm(&Mk!p&rINi|vujBNDCX*9^pz zyWA0H^CW6kaBr<65GE${hKYNh?5QP&c8{LF8Wlt99WPdU+>LxO$(XRV>XW~3!i&7> z(Qde+Jp@A#^1>ON~}Gj#*0~s(J*c;R)%bmkLx|rp0IqD zfk^z-j&IdzgM|H|dd56#-F58A$+hw~CfLGVIqcZ1uDMwUJdgcd9E^vsShC8M;zS;L z7kBm-Z+IG}WQFG1_V>)xby~|RwQXxz-}6#y*L&Yss|Z9u|MX4&^m_K?rpz@D^9^a* zKFpwlq_^GHXyLSMoSaNK%;~Z!atHTtJy(H}IAYmdXGg}|6PqFRif&Q+j1tvhhktRI z?78Q;aS!O{pB|U(nZx?Sk`wC)8|GtnB4@7TOt${LKYUy_tM){dxTqA|kie|jE+hYsPH>34t|LyQS&)55c}Ia!L@siB`ekpe z>%h{=P^}2-EZ|H26^qQ{ta~cMGPZ(;bIiCG#AHQN#(Yf9F40p3^lV*_!Lrx<(*C@~ z$MSvdJz0?ttYtQ|$%^>IU*>v$w(Ks*)UZvz^K^O_ktD`oEwHcu{&m?<1lPFjsbTbv zy}XTC8+@CvUWohG*=v+m zoT@t>Pb-xXC$)e`vcTAHGS~sTyS;M^%i?9S-K^Kg_|LLYJ_(n!%C8JLauAa}4_;IqwU*dOc_RQR`b`g)@KnkwBZVJ%;#ICDnaVla~JYis|`&#>pPh!e{Xfb;+ZQ^iu3X#!{>`! zWiM-3!9MXJXWneM@NmZ$op6^=`c1Qzb@Eik5v#F?4HW`Qjzm#?_gsBv<18aCv_HB) zlyfPAt;ZkfKhG`CFfda_W_gdJxjIe9ul;7?~dVJ47T1{cVV30 zEm_&Gf5;M`M>D$H0^00MHqw-lBPeIf-hY&|+h_1J_*Pd8}Y$%w&_hRfpfz`v)j!(6TMKnD_ z?1_6E!bIk`I95!%KC8XVCu_)fZuxH3uV=Nbp&j1uY6UUK-jlQO=d^Y0w{M&y5!MbX z;W5&- z&!Qz>uUNMyMXsH+&4@g~(O)HNjeUF#4e@tPvReHwGkP%SGi>p1#_XM$`CO}i$LEgO z#-hhv?p|lI11=#MM(3D#sM17kY-78qr7erGfgVVJu{+${erFI>@4gR>sj}If2+?bc z2f0fge)M(Kdm6FUlLs#HS2P$|g+u3z^6YQk9E;)9Q5LiCdLkp%@{e=OSd`p(nQ+w# zMeWFBH9Q+Wx#0^477Mt7@EDATE>837Wn3XF)~{OcB-rmGZ_n=$!>$OQ+xBGay;cWT z5vkbWvC$$EGuazom2p2Y6jiyKomj62tda?sEoRYWJg+CJC)#PWgJ0!r>%=u4#X2x% zkDl;ZoKHP>xOL~wWG&u`RGx`P{FHzS{FN#6(Ra-d75A-VK1<7xIAsm29lEOzC!&+i zf@g=^PT5!ba!8xT?J6R*N-|NKT9K9MSw%MfnLT3c;>~{C8}ClUKJJU~ zzUOGos$AuPC+PWH6&dg0HU1*^S!eYTYw>ih-Ko`*8MV^W=u<8qr(XI0>{iZd)o&8M zMGWJQ(Y(*XJY{Dqd*P3JDN^7OFGC}lPZD`9mLbZ{oZ2U<;jOGutrl3D1?~JR?y|P; zT|bI0>pX=gx^mew8gJ#0=!&^0AQ5%HWq`$Y;q09l$UJttVa0PV0M=iJRY3{7r>Du};0i@FTf(HZ+M^2}pxx zyag}zlK7Q{4skNeIx#utm7GY4b4WTGmLcj2eRS7%?@6?L{B~nxcXZReBcL4I?kkWG zKX&D=-{3;%Zt1geEJaUF#0+QHd9%keS;tHxV-^W__M4qo57~O5dg3`O(ercmPDwa; zavS-6%!oMdXnmGDJZ0^5o$rUDE6c*>M=@?44D^{6hkfsIACc|+n^CBUI(!I6u(@KX zZuhnI$dnZ!Y(I=els&g6E{?zl{+@FmW7|`G*2P%F$6qT7`G0Kh<5`&+f5FPyz^eEt zp5SkF0tezCLRyh09%WaY!ur~pU6|G`=d*XB3YPe}o^Rih)%!SKXW?e?`hA79#vj6B zBHKdgE4ELa-a%NejUmiF%iG$}^%)xi;r5DHsHM>u&8}9RZTmA^*Yn$)=!h{ja`Q0x z^UGYrR9v-zt^Ue({pR*#7`Lit8aP*Z;;sCo`Z*KML?jkO#m7yv2}b z8*dTkNK}<{KXFucNtcz0C~{apZ*VzCw2{62oC>aF0(k2R6}tsy5~-`nSTmK9p| zj<$LbZ;`@Y&K?NM)f1WU`+D1IdEMwM2(tqGh-BCjz1;o`g-$FhV!bVQSnLe^mS_0- z%<9wpR#RsgiRkRYS#g!UqA}*3W2JF8q(Lk#`;BJhiZ1gXU*HIuAkgo{`&IZU($`aowdvKsYe8$ z%fF4_oxyL(#E(?mc@qzjcdg8YuW*%n+~r?*!zF4+btE1>TYHDP=#ICbYK3S9zcCnm zkPn|Lg4a=KUR&3O8SlE&ql^{w!Mt~# zu)%sX&=X-i%3bE&&2SyM%ykXh^_+9ORjoMfg?HF8_j>VLx*zZ6B#W&TV#~k#VKq6F zIShk2ejjCzoYjk##$V!4*E%5@?`p7|d`8&QA;Mv8>r*Zir~+aXs^M5W+~_5BO>^R> z&H8z8-2INOe=`=vG8v}UiW8-Alez&`B5nU}9c0f7#6VWQv4htNaE{Oe#n;Q)C0_0m z78!ej?g)!o$c5Sa_A8oXg$3I%KXau|{#Msz;a`TtjXCSD%iXmFkHqj_Y+yiX!B;Z$m(tXMHib?39MR^!8+brdqp$kYES7^CU#Hvunb#yT%Knu z4>YZl&OkZrFkm@3C=}niqeuc%o{5Pf*sN4X>;e zp6RN9e+}VugE4V{-FXqm#=Y%;)wpXbO^&<;H#Q=4nW-)(PKZO}GEpE~cb4&$pXBWJ|bF}MV#MQG&U(CaOJHQ-lwO&vonUncy zaWaU9yZzoNz?8Fq6i>YeEV_E^<@TQ_L^!s~`73YX?1`)WBqzhCcj6j`@7uU1y2U!~ z7PB)lLx#jWPAqbtKB9)iHv%gNbLjK2%EWSPVH;$Sfvcwqi`W1WE?JEIB+9#=F_#T{ zX^mjbDgX$E;w%4730}{!ePW2GrzF`GZ*seSBQ0mM-|UqiRTK6IP0qWx!8B|rAAgm) zGuU!0y3}~$17WQ2Y}>D1qKF)pJA&DGkHjZ{PFuvzd^* zv-ZT*c=c~|_OJKr47l(SzeZY;pYRG+FGJ*V3_bTKG~6>$=;Yvk=i)?leb0Sft`Rfx zJTWgXs@_(2(evpww!-bFYs__a{EfG?A%1Pm>5Ac^6&0`y5A1}hJQPb9$p=03>45<~ z+1flBupA95=V_hQS{RnkJs4?J;)y-HF*;8Levw%p?pT3XxDIKn!C5)($cEy{Uv!ce zb676YB(}-d`UGRFOti_(s=zwlr)0S!5u6P)SpmwT$=&s$RD2(`Vrd+#qK6NVZVvy9 z;jiy@;2aY4o)8z!=Q{{?*&n9it3+;@b-9bGsMs&o+Txv#Yvqi24l}f3RZ?3~U~Lh^ zV3W6!L6VSS;mCi~}e>tl4ox2ny0ycsQR@x=_@(yYJmmZ|`w!N~jS zLzQ9JJ|Q}EiS$JH3EdOnG7V|=VR3^1*(h<3LXr$c3OOI@q?oOKw0~m48tXA}>1+QM z;XTUQ)z0)XXt$P{?JY=5?5q7Y_V_jW($KsA|}h+YVsA;_oFMy zAsf;%VhEb4{+Bg9q70F8XWx;7C?D5}iP)7Rb5&(=Z=DrjcCf+PRciM0^DEz2@=WoK zPV8YuRZIKuRcY@BAtI8i56px7c#DRphHX5(qHD~^V%)jY#!IwH8;dD2BNaz5T^2Fd zw;@+D@AvLjxFb~Qp-a!*0(ZTCj_u-i#q8J2FjVSV-GG z(Gn5f;!?cz`-bd$!t7agMRD9+uL#03Y;1{;Sj#{8UX&OKOS^G0}5p&VA4aI9_uz7Tyo_hGkHbx7G>J{_WRLUj%qFmlJ6+_tR|X z)H>TP&<-ndJTc6M+UJ_$7~khr3nJ-W7gKE!hwOZ6SF2@btIX${Rl?{#zq3Qu$S2)@ ze4G8-FMt14=byj)zDuhZ~oN%Z@>JMj&AN`?n9rPpg0WCQl|@2Fo2i*8TaLAJ+cyTdN!yhYo7(>$ri4RA1 zoZav8*gmaP2HHcMpAE+e|Ga3qg7@@%IIsdQz5=mJlr|8DmFxg~LBlZxf{_gMkC|A) zA1iz05WW28j$SsFfidn}6@wba;r~dJGjm?rwCIYGe$l~CAIAA3V=r+4XNn9Tzc{jL z`mL*tjf_2o@e)KtRBKqIXFli>QGbMNm3G~2G^_*Ufu?_$pyvaN*uoTR%h#T(!<=2k z&so%2FOI%afWA?=YWRvC-ek(~G>UeUC|O&+Vi3y8MVMDOF&@6;#%ft=RWt^F7F#^q zHRI7wy0m1<9h+E04@8_1A?~dK39~G>BxtBpo ztRrh*>|BpbO|cbY5hOQbFjHets+@a>f&!I*ahNtM){Sc252KQ|L=ry4=SO|}SZ6#O zM8iBnz1iC7*vocVko9!3vV4ssRM4Ex*3s+CcveFb{c@paM%Wv&>S9+!^#P_QZ{r%) zs0d-h^T-`ghF!6ezuG3aX)DwH+qaxvH-3KJ;SJT4k_O6nx6TalOR$`9zbdMN77>)HgP!8Ls(gzt5QH z-x-WV9K{FR8C!*~RQF*u=oQa;qhF#$xTsI%4R%i9A-1)$Yi6 z>zgl8wu@-79{bqqxymy;jvDbWi#6@QIaA-fmu<|P#2$QP4Wm7su6X%9nZ4>4h3zkz zw;4nrNK3)X0Z)AW#tj@h{{t+CC^q}QjMBM?4M21v3(M73`2VY?{s zN@mTJwa9VzY@;LEFd3Ux0PWfjAzJ?t2rRHdWLH14y)_7z*=E^}Hg@vx7~`pVdNZPWFMCAuP{ru#E1LpeXrJ>7je#M5&qz+M(`B7@h&BB(H4Cu{rS#IN zmA_yo!e<3erxv@SeC}Yg_m*t5i*2%ui$*5O<>Z`N$wG#)eeNL|b|SBav!|6+;wv6R zyNK+uTIoD1yXO`TGL2OqUBgt|T=l%dx%2+4r!-4M5JIBGOdM$@#IATU%Vmviufo&% z3pZHJEWezyrk1{_F}rBd=OY94jh<3l{GMyJ`dPa9dRV`*@j6QHx3!`{OvI~CM#;~d zLJovH^W|zzNU>9O5Ce6@a#m+|c*M4JXFW^qMx*rKBVb-n^LeE`Kj}8__-5Lr;R}ks`}Iv11pF1;_3>7ljkMP;84vYyaiG!o z#2byRJ5e1rlWGGy;WMomg0|9-ab{LnztP9NG#C9fCo{(*S$LO=8!IPkf0NVW5Qf3$ zWc3 zKpH-@@m9N`d$w41r&tR@NXjqlTz_ijA6?e4f|h5#5ngjSM_QGU@iBhd>WMYrx)_l# zC#ut;*R}o?`{rw1U9`guZ=&!ths|X>TfEC(|2jUDwdad-)aHKuFiXv41v9kmh*`RVJjKh5(bcl!vmYj`)M{DSntx1Np31f49WPw!n$=KU z54+gOqfftCE(+(_s|&1;>_N@I2h+0 z0X^$05AK|ik$ZcfH^=s|pFev>c1nv&&txMTLY2{ZHO2-PtvI{Rxa_kdULwz%2lK0% z=$Vgp^{ynjwy;xdO7x^HtSl?DFSAx*&uCfCsW}dk&kALsT@+h$m+b!=a4!iU zySuky5i70{pc!`;5iy)`ID-$e9MWN2&aC0O${C58J!5SL8{Ki$<~3SlB`ZGFj&wM~ z&eS$TYnF@7{KT5R-(o@8T_&#bqUEwJGRMlyrW22~`P2@QtsvX3ES$)mzL_stEL_n= zLhQ=*vHQv2p^x<;Wv{z)SY5B`s3dfiHgc}IOa$c@He#&Y2=yYe;nPekDwpy;;{uo1 zs}6Q1zBSw9&U*MI z#~RH}sEmWtWv=M*cVb<<_qKSon-Ox=4xn z#9a+{D_vyxE+$*!?Jk?tVm?fU(l`ip*Zz~<$7jetVrqEf&tGJkftx< zp@ZhIQp#OjW=_pkGd~@@`iqNqcL4u+4J~4p!J^GC_(hGrF&jPo&@*#0#&deC_RJ_T zYwnHJl>zg`Do5z?Vbo4I!`+@5S!_l8*;tL_VTdoTAsMPC(p#lH=IDhe7V?yzESIm* zx+;|W_vfw0_w3jUH9Uy4Z>0K>d&K9MJ#9aUFKdfWFdaal?8dv`L3mS2% zT_nX?+e+RYMRt~^gB?a?sE(1H=eqgYtvDqynDwXJ?3A6}hzmVhb!wY2I!4T#=iWDB zio{?q6EX`Rh?#$E1a%E~ww;r}mjk7N@NVcy=(YRQQ99v}0hj)pjXc==mgiR!_ zXq`Gq(ed9r(Gw5vauL03*b{ZUseyL;frfsJFkgD(ju$Rw#BlgK$9?N2+sf4mWog$U zy|P>he(P;zy&@L{aE-zA`X-%^vT!xo8ntWuH|X_=#W%l2?yh+UJwN)!mM9NbCB;Fk zLs))HN<6KJu?HjWxW0!2Xu_S-d54O+DXS1S)EOL z$!V`P_}_TCW7yS-XflF>j$Uy?vN@`?72Cg4OrQGT{}zG2(e)jMwINt5wp!Ku^{!1~ zJ##LnEQ7FCSlc=r4^ zwMayFmiShMEzup8vXm89++DdSi;ZZj3B+CeL#OORgO&B4d&b4wbkl5QR-gPBk9B9! zX_fP4%;jS4v69UFw^_;k%VkJ=?oW*CyEFU?6g>NHVyz5lz}+wfOVOpBl!%-|R>t;- zy2!Ja#@Sx`WEx`hy6_@`SNxQ!HH48inuc-t_Q1TAY;m`HV-!6ua+bG_L#I*ys@{Li zs^ta{Iv(ZV!X2-j`EZ>F;{GzcUDA2u)NU%(IIC1N?DEm)9jE~ zk5#QdrS+XVNAz7|belUZsbv&H9dywO1AkQ$w-^#4O7DzS+TCXwER18FjrI@uWTGRV zW495xzI%w2saDV=1NWbPx!>F7w8Jbsm^J&Z@;*&b)b^yOuhWt?)6*6V5R-5s;%acR zYmFd6-yh^_TK!%F>%=YI*0R#QV?Jz@F&4WsP9@9UjL9K{-3NS{tGbNNRgJb%{pp+< z=bX{B^UiFZ**Kf$YZi|DHD07ZV0B@=aP)rxKZJQB>+d4ud7{Z!{6y5<#1em3as~}i zB8xueMa*6Feaa;fV@EKh3|$psjnK0{e9pN^v(GG_o~@_0bEm{rN?O-ia+Gt!I6Q07 z0aaKFPQHU7buBn!FC@`oHfD+@+E~z|GV5qr*$zoFIirug$if&c`k{1YF4E3$cTIL} zuln;ogsvL1cC}Lkwa&&n(F)PE$m1>O@ZUa@+3-*XW1|`&%B*g|Lwu)3RQ+L~Z1gnPs^uXKj))J?%ZOnTEZMr@t9xPrJ!X?-umP`^wi77qE!8 z{$hO2uHXN*I^;HU?@>vVwI?AgD#Wxr>>KkdYRXTYp^}}~wMfp-My=6eBjT%{E;)dm z+$fGT8_PU&mbI%+4#!*HAntfE##^X0e$qSV)b|ZyJfJ6oeUgXyS~48c>y^3fM#Cyh zwUFL4o7eLqLGCYE>Jp#Gieu}}7ELVhaVN-~{;pMU7wvm_onJ=dyae?mbbjOy{iQ3ohZKVchXjS>EYFnF@=*k5WD%7RXGh! zB;~l-Qy*Qdq?guJl8v;8E4+vhZK8q6_mxOm@3}#fHRADvlX)|Le=|NY+^PSJ%lg2h zm}$irs>Wrpc+XtSp**gmRy1pyy)(aOghcGL!dgB&kRQMeMAA8H7ew?wN$iMdSQq&@9v><*m#4N^$#XU@wVaT_QPBCS_z`!f5} zU@ar|-PnpDe*5kw_RaBByr1rq$MKduqAJ8-*5K=k*;hu}qs2u`j)u?prmuG7+=KiL zg|N>~*>=+8nlWq_!fq1nxO-rQcUnEkVrGll=#cbe8^Tz3XNz}jy!G9f?|fhkvh2(I zb+ho?Gm@h5yCf0CV`i*yv}ohY_xdn%#yRH2K`SBENQ7Kr)ZwKk^T&QGXhpfTjuubR zhv+PxYta{j+7pp@%fD6$({uj&`|hT`@J*Cv(%tB|GXuKI$z0e4SE7~XX(>52iBUG3 zd zX#VmU-{1)ruB7!XpC0)yx4yrskG$Q`57v<7haMMpMA>|>>B?d$0%qDlRvAIq7Rxlk z2W$0h$6MdbzJhRjcD1yT^F<+E*4RZzY|A^j7_#T$VZNP#;cCw4py9l`Q54ws5(Ry6 z*RwdgKISqa0{x?#J~LUA5$>uwJF9s=TRed(sQ9kd>~LJKxsO`3iIkQd^>dHayhX5+ zcV=2XWXW1CTCq1{d8Os%)K(@cTGAiU7!MY*mA2fjT7T|ix%=}uXjf+JMUVUQDrDAVp(KH#~oZ@ zHnU}pu5w#<2B|sf*9v5gYU6WS_9oGT`bdqznDld>TNK56TFa-|-myR$&c5&Zj+1Qq zcbv~XnAZDVxZ<&_&fMt}x93v?&9r;jsfi~m9Aj*fsaal+-lgCggcC%c*tI%?pc@Z${{E8~bss}zN z_gUwKccM@uzs;sMZ`&U|y232<$J%zqjEd^H1zRzNKV$C@+B)%K?CfUlJ?FJ3!bIoi z%(4v2OFWXga&vi!J>n*|MlRy6IQ@v0xF*j_?fgulC&uP%4r&tJ=SYBV7+WXq*g3vS z%XRIkhi82wB}%YHVxI`jf;%5(Ui;y~jGnZor7;QiBJ%`L%~`>fO+CoG``mQS8FU%9 z%SB)7iCO;lUR;%BjLIQRV!mHbvbzouBr`t8*l%3!ApzcHVwR26(4PC`UdY}mqVrh~ zn=5kKP4?Pq_uLcvek&ki@*s=q|MD!~drNJAx5LCWt$dxqLbLaN)>mnWnNP@aT8wVl zhOrqSKY1%Rv212&VMF%H$Ytz*ITr?x-CEPG(d03V(dIIybg*sw+=)XQJ2^Fyf5VdaMRl!qLb$cn6IO_BEBv<2 zo-o6GIBQ?ccx_b8TwCUhv4~^u@+;4;wynIkW2H0PPo2iJWY$$=)CEr&^Uu$suq8`B zSXq`KB?|5f&*-oXecE<_nxuSIUC*l7j-7fAeRMh*za85!5jhc~hJ@qUOLucgUbPmZ z@rro}A`7wlj@_#`6e`oz_qm3r5mkg!)6-A1LuV22^vUzR#YfC77VMB)?*_})-V+jc z9kEH%vxiO+`bj4{B}z{Qvzn}o%z65vOlFMA@I>*%BvfnBFI!|;%a;-`nnc7s1wI8u zJDJW1MVZ@wfgcR{cB@bMC{9Eo&Z3XS=I3>>(&O`*S6S13?b1d_xO?}NO4Zyw@3gG% zGKagw=ue!!Iisv~t>ODx5M1u~;8Zgb0bnL2)+OJ^;3 z>Zj~|E~hbT_!TvHWDJ{4zm_=9*tMPyb6EZ-F7jFSfsKFvBu-X2ODm2@x!4U+c1Eda z(sxg++2tX+M5zS5;(u+`PX0dgG-%c0&gVpJPrG|15}VeZ*6#hdFr3X}c~J-9j2s&> zV8sXvwPDm=gs81+ch3S6rC19~vK31apwIj@gT}Sj*{_bO2zrOT{!7+8`^G?IAnm_O z38&9}fKZm&6K$0(tw>@uJi>%ll$jk9#h-DS^|GLLtI;=VaSdrQkTJ#coD(_pxoVi* zRkjhcdiL+1dV$GZJ`ot9ODyp`jn7&#g{9$|CG9O!GY?1b0@-lGhFG3$40nc1wCXDB zuU5G4Gc?f;<1$g^=rLgRt@DO%MJvL z#y!U`Ydh^lqHNfshYqXVC8MP8xU***crH)<5jmR6sz{hQ`;C|D)=YM4S!?l$2mjaN zG1w^j*K2sXMscp= z?&3$$JBRM|x=OC2Y2vkChlyxesxw*jcWb}eGY2CGP1YhOSAEhp;#nY%Ip@ARz*043 ztaoG3j(c^r>AYUOhchGJhn9yiUTwM?(|H}Ab5FBozzj$)OETiUhEIENwe>wC8JPbv z!8bCHJAI3Vh>66|P2cy+P!;>Vb7EI3_@XC&WqfQwZUnZ*S9Hm0-^rimPhI-GAyOs8 zd087-R(_<#gZ9LMySbTpSYcb7%RF3KA6B!2#8I}`tM=onj|TrmGP%qDE_?qT??eP| z#W;aV&G&=T{rwC$TzSqh=%`al29R(fT_M>xW@DRz1-RPqfmO z7ghv)Q+IqOf-E%#IrV7B)W2q!wDz1mWoQ4cv+q^JVC{RSf3E$!&zVrm{IM#!tIj97 z^u4UoXpfU)xO&|C7_XRWTSSqAXIFjy&7&;VE`GDJ{V?`W&9x+s&C zp8n>pUH9M_Wi*~ z>Ki5fv!-SREd78MAD>qASOI7KU64Lf@8BxBTHg5#VOd*L zPi;E2L^}&lD?Xb&*A&qyvrlID#2c8vQ+LBNo)<=9Vzms})`AI0`VnV5n2&gXYXAK# z5su@lF4}FK7>l?66%xObhz)0A8NK$C+*>m>raaBgkM)f7b#32Yn4u1fvF{sl)9TR< z(fa>44AXt?vz9(YdOo0jKoBYW&UnOrNXCz-tcf5irMqV$uE z*bh&LnD-GrWGd&}Eq8EU(hLRml{K!#5*Kl0Nj@`DCTj7P+9d|=1Mwm8R5cfW@ud~A z#J6kD`&CxHXsDIs^R^S6&p3)-A_EoYy2CQx?Bsp%QUSW~E9Ugf3>27WCuy;+1XRFc z7U)fjH#>I>gz=|lyu}A`Thrx$%th|Ikn?71l&tz*v{>`?iwyYS2cJH}j1P{H(|DvV znWAA$fSIz9mi6Qa@5u{XJsoDmU5sw-SC~VGPaH=UZ+&}VUcc5E zcck5Iy^&;-%;o%hq@6kMWbN7gI@ZPpa>gl3<(k=olu?2r`ts78$egw03bJ5)#v%6Z zqIK9`wzEO}_~D5r2Kp8&tz%Q>#$V%M1-%f)l2t)YcoK>|>)4b7Ln)ML>u>gsX-G}u z^Bz9K5%z#;D9d%ch%i}Tkr5x(f)N__=;estEOqs>91c!9Y|Kr!SfBe=eN5=N^iU4h~Uy}EP@3BWqGhmgk>69OAQ9%Fl zYYb|o32q z|M&mVypR9zV*l#z+|9ftV@&^SPo3oH+~=B4{?tAliewfoi>|xpj1uox-A4cKwVWDX zvEaQ0nKJ-modW^*Lb*}%`r0BM{#>zha7W@q?cT@UWJA0n#+(|b-rd7*9h1MA`S9V) z^XT!_!`9R2!|i+htz0jk;Y@YHuL$>et*TX#?mmZFGp~|nXl3?VWXARJy3@wj`{Kxp z7$09UI*U{pkhR*pt2t`H%8$Ip6JJQ&o%kzbd<>Fl6&ZV>LEk-j@^T_GEq&ha%=f`o zkv-Y{ahYF0Weg1RsTY=_dVfNN`)BR@sLaKkAVlb*%RT=vkf?u6~$_`BVh!>fLjTP8gG>j8Osax&GlTGo~ z&N=@v%BSYf>iaGx##RKdeaF;yHQ}rHs`nJTnNuO?fh25_0o1JX$tSj;rS}x{-3;cUdbL->a*5{v1^2&)%7_eKPJc=hbk=d(xssy?BSrT^^3?!hJ4} zzqR#^q#Zx4F%!CX6dHr^&&TcmfU&#G|F{{H>o^k3J4Em47G z7$bAs8v{=}crBvxr7HY6n$(S-zZYRdr1G?uSgXF)w<}Xx`TMuND-7Xt|EXnMplZZE z_rTL{`u?I&1r}$YX5LTatIgY$SDjP;D}9+Nw(_>qNZiD4oe1~eAJ3}?el=#NMU^KP z@9n*-PnW3s&6ub`hJ3=nXWhohpIUhwoAEispY%VL#asEwh?6+>ngfz$^RMU;0o8yH z=(O9R``M{_&DtkkxHn~|EF))730RwtH9W5^ECgNj2OpJe_dO}wW^(Y{QiAT zdF-Xnc@JBWB`TR!G(?PqYV5n5D}65>20aIphpa94_3Cf+ReSP}d&CGw{UyE3V09H( zPL<2=+se`Yl0{2R1rPaL)?y)Rts-E|Z#?jwRqTS}YyR$0cCK@;qhVgPc-8q#5@JN? z`w-|7hxdO~1qKy=1@n2vo)ZDAM6#1Adwl|d6xds-Wv2hsz-j<{V&0I@+Qy&t!g-d~ z`)nB!z?qn0Z7r-bpKxQu^8>{^-d2&M9wD`$er_NX7sJY zeiymEAFIi}aaO*16-n(^)>-X(ju5>y0?esxzvt!oZZCPp`jiq$M%Ga8Fx5SfvrovL zJ0k1B*m~pI*XI>`#pi189frt#B76m1GT=<&+wb~fO6KJKd!mbN_R{K0hVqdbO6+pj z6KT!x$;Dh~?0NMLkDiHS>W8)L-TlI^pZm;x{La^1&oNfXlB{}?TL)j!?TJ_Ws_`{R zJ4a;*VUQGAnHNjsE!gsL4~E*6b@vQIqBfM-JM7*sJv*~CcdaVbtNcmAo>e74XYcjD z6~*^hV_C%10X4?dV&4FWlyfWkVoSzmUGF0d$~B$VV8eGmJf?MRL;wBrOdHuQuB#PC zKCwBEcVmIEr>zm??33vF^D#{3yy`3L0B)O!J9nm_co*${~41 z7HK=iDw*|rRtIgn>zzlQYH$%WVJC8Snylb264yEF40FqBh)njqJ$za9Svdw%3*6D} zd#ZBMjQAbKtAp{kEVA}upkyQee ziTW8srOWj`-po@^Z87G~*y=w7Sm*h>S}>c*d}g~xFi4J&<9*L&`?vM*Abuj;w;M76 zH7h|+II9=C&bm&Rqq9CNqo30gWA4;i+H2N$LGqb5d7>7U%<}ibmWZllc#6Z+Gy6T) zK+xJNu4UJ1#@3ZHLs3ye{~RN|kI%KQ{Z(LMEdtwDZ6vRFBcU=|1>*-c?kD1E|7rBK z72@T)m^BGxiJ)hNxm0ICRHXCi6VLh(X77=Eoq3f!qop*I^KSd@X?9xj*}^F!e(&_e z`pTQD^^ZoL?~gP(S)uFygnC@2KI7dga_)ICxdZR(!z+TXl6K}qU&$;jITWPKO{C-2VcVDZt^ACT)_3jrIUr}>(l|AKq%D%4co-fnW z%4dC_XJjeD@nqJXdiRWEs&3S{R~vYvS*f0slI{X0fb>~Z-=}M!v$sI?HLX1Vay32d!Fj$w_cLp-iC0N zM7YtrmMA%!oljy0_-ykja@}_r&(4th>fFhj@9FE!6z6rsip81nd+A;4Yhy4mZm|5y#e0!YY`<549yZAIq9^MXN&t>%(4fcxFW_{1%=a2E@*|YsBgU?8eS`_X) zQRD?yhPGMzdBldXmA_&vuk zc~_V3`k#%p2RFnPreGT^T1(zTUY<86X4D09Z+vB{Y{brc)HgGn@nRg<{M^>AziiD+m2E3zv+9=;vYpD+vf##%@~Ovi&r+6`}eeRmlfAMiQ#U?3YiprGV__@YS3m~m?9M)&$_vlnHbJ5 zI@kU3+=qymIcg6tO%@B&YhjN zTJ&6GZ$#aHiR(Oj3i7g{yY<*eJHuG*dP1=|+Rf9`y7+=tPqlLeUic8DyHE76SajKM zvSpq-W0}mnJ@4Qkmxd+CkS{h`#R&AU)H%t6=gU}#3e;JNL_En0Ys89$p1;^4zRq7y zQoVtzvmp&%uoGgnCpPc;>YnI|@jLz!WwywMY|V)kVkTqbZLAgXJS~S;gth99fGYS* z%eO)~ES~+Z3qf`$V1-y|+c~Q)9LBmFndLGU*Kl4-2JWf|+;Mh1>3XN-@)F@a-?VA` z+&yU_>N1WQ z=8*l`IB;b#mPGhua~RgXB0p={w?z{a##bf1^}-73g=i8fnnf<2+CCXfgkrns^&vAv zi3qGZcXnalz3uFa>T4Ew5p``^y^NC?dLYIQd9flpv_*equySO?0tP3x_x?TpWhQ!e z{^B#lSu0lPTAQtH<0bE+Vx=ebjnO_kfmhEi8G|g^_t?;jzeNGoo_}o+h3m8`f^q^x zjgn~DPcmVhk+_1`7&8)CG@MfgCe5NjRm5`GuJ0<=cl8uux8<*UB!ca=Bcdk$D}>JoQ8ACu!3ntaW1Q{yd_{HIT3nWliy1%66hS;@tPW=i%P|-%;cqLLgB5DIrrp!C z_fC?ig=vVQ6ROQ&t2j?f>&q_lE}m;!4oGE*t9{xLH~ILiWdWSDk2&?jIP+umc9&LtBthE?Bn)|>_+9r$?JT@ z-z4tQ(7_XpY@^&0-if^spD+MLrDG zJ(>M+?AKY(Je4d~-m#T0WF%XOrW}mzYH=fQ7vst5m1*Nz^E4{o4#;mY(F+q17hOG( zgR`u4l@%H-;*sNcD*{_qab6hFzkV1Yb8i=Gy^mVicg^5B0!=@lY>e#&@$?+~$jkT6 z;fY${4u+I1NNtacb?;>`Ky=6c5Hb!=6lnVVAqzh4uCfqL&M!$={@zT`_vu`u*KFc1 zw#_$YP?KTWkNNy4PIF=p%}S5>lbALq_8L zk)N;6EkDqpT(w~JKXgOhJsoJPOxi>beQf+B0cmD3{9oFVXX7TNb- zz1_r3d@Q>9y)i5sqx^n<*A--SUVanyX(EF|b26jzZq(yO@r@&R=(LL!{>D;K2XWDK zh83X9ZVdY~(rf=c_MQ=ItkJR3o}8t+;Y;S9Gw-cly?-_`C*N%8ds?i0vibZ?(rWDa zm*>}-7RI#NAWnBuwC7KxLDu}L!)lNC@!@e)rY^lKM*G~ zczm@w``^iRyY*7x7xglAx<$g?B5NPENK9Q&q#1{?>^`e+ibPixw0 zhP=a`*!e8${Oh;MpvJJZhXvj%%Fl=!tsQ44ll$B25Kf||=g+=z!ztgiSSa4>2ZYW)#y-)zAU z@7%-FF~37v8yv@9YgE}iGuGJBVa0oVnIR`4KA$4)x8G*9WFA@ltTi%_B>pNX?@C3( z*}T5zx(hP8O2A525RtWnJ1AN!iX^EB=|67bDLmb8^x`vJ;Kac z6ZDoQaeiz!?@#S^W9Jecc)$zsCx$>2^o{>4mg zTWhTcK9kr9#xl4XA%l^g{2~r=U{~ZR`M5*A8-Olre4@E~R2x3*7^}^OxwHOyhIf+H z+a0US-Z?C1$&(qlbJeiMy+iOLc{>6E?rSaH+(Q}5y$>w>PZ#W-LbctU&S1#(5;e8;{zj?Xu!H@&u}Iihp_Jy%RY5Je2aO;}kDT5oLI$T^}D`QhjJ+E^sb6Dc{p&tn-q_sE}0Shd93 zF8K=Do_Sg_mPyt`?CyQW^JMMR<26I8u4{-|27@Pzw^oCK^}vd083S%=;N*`<+^@IXxq8AT#$>$K3%W7Wi#c8aO zt$6Z`9>QeoQ%}yZ#^)YB?iLw~0K4ffr6XV6WuoU_NuJpn%_>Ig%v8R#3(bAK#jnp{ zPl8sT`eI9DVi>|yGh!5B^U$JEh|K!e*oa(Iy?Zu%zk)+p!Xu0$0-kZRAkxox%hT!F zTMaDJuw!hFX)2MwY2EF8JYKBrs2=it9p#@EepxqR9Vm!tRg~;b28+AV3=ewZI`*=A zdeVzA7U^l{=_y7WdU@SxV)hwPe)ra@;QHpQ9UtTPZgw$bjaF1oY_Age3zMo2*a2B_ z#+zu<8zN>tbdAc>%>MdR1L>`K7rAoKtS*G>S&g^aD)A0o@)JjK;C;c~Z$TIDMWwY9 zQzdt_LmJ+ZT^y5%SOgm}Kq^GnKFRRrTZGjy&WdnYnvYB*OEYzLSsSOkZLf!=v)A!`Ejp*n zzTTMw_j5!wT7G9WHY?}kFL&1R{(FtW$UeJ^tXii}`cKGC)^8Ca1B#q4VnAY!NXZUq zAF+6jwS6KU_vO^X<~crdtD;b$8rYJ!!DoP3ibqu=&^7M}V$y@q=- zT0Zcd=UQ*WWKUdHjLy19#UU}OVqWuZME3GcjFZ#4Z>NO*U2j@G^BEHX7tc4^kYr?r zQ~=QwU8IcJGkyU$_jVq%`thA?vK*Rc8?vX2oH#QgD%RS;x3O?fHp$mwJG1#XdhHEK zwXe@OtmRkDp^83Cr2@N_9@()AtHtfmvO7=zbBx=0Sa{-B|BCHKaJT21HHtF?Yq9AW zblxbc8e;wx^yKhs-0$RR`nK1|Hf$M%od|=X?1s_C)vpuGP!(XWHSe^e<U(*Y{}1RaDO zLgcac>gD4RF;suSav0x{-5A9D_6nc+u-5Oe*krev8KRD^wd~{AKAtsWc6C0s0&n*# z?05>o*yj2Fq3OBISzCPy%UL?xviD36y?bwn+XF>w0sBs+pe|@l29pQ72Et^| zEEu5k)#%PhpZo96>wRWEJ9FTrzIgY)(rJBWOk^Q{+6LG4QZw1`>n1dB|cQF=K`acr0 zj1?gf3AbW+hq9+!CemjeIQNOqa1C_Hkk8irD0)~pFKwTavwua_8Q*+ExBmwH zFR&$3@jPn)afmj(_-h}_+PTO2J!3NAv;4kiwP=w=90hC8Pgn!TOg&}KX_P9&zS0C?3Pbew__w}q5@9j7f zhT!H20!@BRuKJ3%EcV-kPcE$37E$x39oBbnSiq zD`To{ZxKW^?BN4=E1|W9P~-0W-HH4yv3w=ouj+u>_w4kmKFm4u{2ptI5=Mdv%;Cec z&RMzYlLCpq#QR^6_WeFAtsArXwNrHJ|9*Y5`x-XovuHYKqG$QYg0HoEWosrA3D4>$aX@lX_3v$B5pec*dC05dLH-wmq9@Kh{Cn%cn}oX$f# z>zKEXVVutYJ8d{yxnDDZRo9F^&&?;8Z#DAx?1QD~`i>^z@7_-TH`U$GGyh2A6b_UhH4} zo%@;9WQ^&b?WvPIo%>w#$)DOtZ`+|^|0zn~V*yvL#^ zjjOM`@o3e@6&tW1mR1o1lJ`H+q5bY3XyAdU!N!O^hu2q2qeiC_d}0}b*LHhk9(Wp3 zi=R9g(W;3Zw9Ou$JmmJOQ0Bh6pp9g;CIsEF>s@bp(uWmDjJJbZ<-?b+lF62t70~@4 zPRHrdQZ4Wk#`f-->QHluLwz*6UM1&?YFhdYolw}gNUqkv!fKzU82M`B^8#F2Wt;AG zACdBcqBfd-;5^ZZ6us6fH*)Upz7)W~X`MZ@Zx8ZtwTlkVRa$>`3bXfZmhgqvJ!U50|DUn(4P#j0~| zw`4mQMF5FJer#+cS#@qpL&T^X`(tn%9KzbI@|k68)}G$mmm!s2D4~s3^|!Xn&G^3R zir6`_&uS};WB1{8Hzrw+Qvq&7Xzpc1RXm?2#csPF4e%*S#Z6nrSg^ik_e9v8KG$9Q z(>-G|%k$1EY{3%vIu^4I{+@QvmG-F&*PpkPW0Te3HO#Q(h4uQL5k}xPDR13YU)Two zsl!wZY=+8H+qtl|xNe#BRI-AcRaA}<*_rkFM%P!96WJ%U)MkhMbENw4O_ae!opN?` z%7$G!wIa`Zx=3E%zeFHQT6whve~Stn(brnYy`o#D#({Qk5PI|f5SRYm9d zcyp%s39X&5HAW*Ve_G!)T+M9kHAX$m_PO%fe??}jWv-`A7Fiv~W{KIWw75kPOPmXI z$aCLXUQsUB_Mt4~Kf7)$U<|)P7^$d;WO}u%w~FHPjE}xrRefqgUdU40VrzW-!4fSo zaDI3^_tIvz%F#3DoP$@6ecQ>}sY4D`0^UZ6(Rpz@^BcxVwWtODP-q<&JrD&`cC;$& zpWu*k;i301QBqEy9nN3g&UZsRi!Oe83V8P16*P#4)%+AH`eE=hEqLswJ|kuQYAqhK zxOpVzN~T&NFEqlu9G}`OG8eY=%@`|vkjgpuL}ZNN@ACH4xS~6jL|2ru*!veYjDi)R zYhLJDm3O*}`0I9@2U$PYRUjp1M(8XOX1baafzJH6gZ%XZ{q5M!sGL_{EV%Oy95Ucw z<1McO->f7u+HJ*srDtEC>kJjoSt3jF%QJp&A3>B9c&TLPG!&&pOTUnAg`TK3|K;Z^H(admd+Sqs`>cE&R-H?e`uFzQ=~{1pLq1xxbK9#sMzcCdKW#=bgRwJLGV zNt9T(o%R1-?|SNA(R`MGP1ZuSZ*|3A1nSKWI1vT&>X60jbw%AA(P}@eo7lh#Sac@b z3GP)h=KBtjr%>Z84PC1VF;i>CTld5}8Mc4odA;*|V=a*`f+6s}X9nYZ*s{X9fNe9V zMzO|q+3l@Kbgwv;{k^Sbiy6^l1y++OBM_#=KQrv0NQ)U3hfgD9ASrj_0<9m{?5+hP zFP~O9X2iY>;m%z8Yft>zjXlSwcUs0S(X;lw?$&nl?})w|o158-uunVgpvpRQc(#Br zQgJ>l8e?~@c@J4z@dU59yq!p&T+Tksg12BSf4^d}j795;_)wx(v|wv?i{-lGTlbo| z?29pBB6>v3+8E*Y2yBZf?A`kWme62DNQ)O%#S5KbQ*Z5Zat$-p#V2Zox*P*U@qD*(z9S)aeq14AS)LuC>rA!5A-A5O;(z2x3bVy<-t8 z@fX`@I$O3OtCZL$Vds2OE~nqq%jYK>Rs}RT;k4deQ*6q?Q3jEF6~X!tvb5^JC-{qv z5cC9qDsna9AGXjFZEG+6&=E;ir^#w-1zu!u+Q!b^_`S2otQKL<>iLY@s`tJ3h`yhh zHGGRiGSO*dWgLRxBerB?{$$J?>u7t%fIC{U6*)aWvfBLsajPWSq0BD0Vt&|_SZZrO)EaFYNKu%FmOx=y>wk11x|!QV;<5Ym*G`)@3XA z{e>p>u4NVIQcqj~rr==CXwoNZHNhRMWqX#~AFzXOVtPduO=`z$PMj2_+^OJjm}>N@ zd(ZN_WAG6pvOO!#D{|U2N3eL-FmrN5bE6pLlNn5VHzps>w+M4bVnxV~7{hKX;@Jp1 zEv@CZkI=0pukaE_ZTSsmbKrniFfP;YqWG#OHoh~&Tp5sVF*ROme*UecGrBz&$4-6- zpDj6%7mUPrS+NGxh$Ehge0%CDZK*5UMV*N4i7j^#g{Nme#?D%@QiooAE?3`S8vT4b z2ErxsCfBd+kbP&BEO<6sGdZtZNa>p?5?3gfz4!ssP@}3cVwJT(i8Z-d{8~}EvmU!( z2y%P6f*ih?Cr0cui}oLXMRUB!zIbc%Yb3s-aUu%N-&y1HHT$sTQM_t;Amq8o0a%biv77Ib}EAZ~coyW96N{~4`eYc=GA zOjd2aTO>YDwYd>Hmzk3rIdFk1@zaM(+6Egnkjb3TV>M{dVqGTXLGB`FJ$A-ceBhZ# ze4;t0Ct{#?VobHRZk##av;A9+?|#mzH9yvd&B;dQTQBZKZ*2f)(c|tu?yUeBAFO}` zx*`v@*sDcPY~4XnWTieu*;rZ67+l?R_Eo&O_hCPl-QT7c5?W)V#7g|xM{GK^vR9;L zp_Ck}Z=%fEcePce{QZ4HG~=qZ#|k4NU>|$kyJ`uZ!kI{XOXzHftr+`l4UEg8$Q##| zS>xZ|zVmdoj9)qB{+mV7#3MP>?qPxaVH5h)0qcg<*BS{ML5#EP3P#oq5yXa=hUSoU zXRRznR&`*N^R}?*%=YYGv;DoJ@iv6A7}FZl665*y;+nnhkQXvBV8u0Zkd=#`ZrJ4a zGb)B7cfz{Cj`&6lp6m!0YiQAQHKQs89{GfAycJ_A(CXJUx--+?-#_sbp;LnW`&h`?r6bB_6H01eUkg3BV)-JJD@6lqKv&$f|RkBm?LrD7-JpOj0e4V+b_Ll zh0b^1nSLME_NA$T-`13vBEGfTg8eQ zKEuxn9eYKWU)EU_w#HXnV2jtk=NsCYt9_XFjB~o=Bs1ud7hDww*^G=gOPJvauj0B_ ztk~5Fz@~agh=Df)*(pC3#+|G5kD4gVl#eFkq4#tx`4N+v%y5^dI^%Z{pX z@)qwzW|e~**LeOOqp$A+$!iA4Pu$5#>|rE~!;&(Yh)2D$ zhxUdmn(l(NISgg6h`HNh+q^T}<@3hxdtjBV_gYUgqCBi$b;#M%7>jwA@J*H+LsVA! z+<8VA+jx4#UK#jj4}?Wk=7K$Vx+Co9*@L&B3<`37c!W!>8OmXJ@qBiNNWI!uguW+X zef$!Ea46T)1|?9xKwdmt-C6PuhED-?0`{BsB8FL&_-V%Hx`SqgI>clWv-y+g6e(eX^tFBNLI(lf}vL zk8eKe)wjKRRqKwtxVk^+`;GvL^h7gEV|Lh9gZ*`l8gc$U7CN2v;h-h;(1pBBs)hgxW8P4u_o zx_)wc;%ueGUKPRjggxVYTORI2Nd@Mv#j}MajhU4)iZ0)ytAw&_f$Un)?mdDbL6tUn6RX^Y}STKWBj=H*LWN` zgKil;Y31vA?t9Ysr!TM^H$zyg(R8=Xp^WZ%Ouk%@!6hh2kLOlZcxb}n)eKfs zf$`f1+s1(f*h^*p-lYvQ7vbfGg=LV=_w1fpS}aC6DMLlr*yoM0Yj^?@0g~GFkSxB_ zqjKs2C!c3*PgBtJw*^;&vy}q|gPw@gVzv0>_|wU``o4~a8#(LkRl_`%O_-@E^IN6G zqCzScjVw!kvmmEMfG+de%c^yfIW%3rHTU&J0dJY(Y2{s~Rj!s=|bI0DQ0jHFFst~LpYg#?i3tbtU zU+p{RnzK5mRf})qA~TVrLKp%225v^v?>K6m=pyMCw0e2?sx{uSy0e!&!pGc|oM^aq ze!`{JNabMpU@N@GPIo~+^|f+FkzH|fANHQKIE;&GS%iB}L(6vv-y9f)IV@-QWi;&X z-#+pD^Y5IzVdj4xpL^*Mg}9Lc(pXfkO0*Kf*);1iab)d_i86&5u(bx#cbpyfyAiWl zL8g7Jqj|>M`*mw=TOrF?1A1f!kNxWfUeNZxG8}(>pWyDtJA29RIafdLM#kzXx?*<4 z*od-1)O=X&{t%%(bWTel>Kf2w-b&Qz3^{G6$(=Eogh2k))1PzNbIohT@S6jOdP3zc zdhDLx)5yTM+XaypUH|nSOlGYAMf15AABvaN;YQqWP41#$3~IRV-jfVvRv~4cK1h%g z7OcNyH|+G%Dq;@1zVGQKQ=wj9|3aV3g$=@GwH&@t0RU~EQ!)YU~$A+)m?&O&WVb|YfuITcMS?Jn=G2b+3Su^Y3?Ue=k<~^*$E4Df^WB1=XxjD!B zl=z9@gDhmUcMZ|sh+q5mO5FEp9!gEZ8LR-5uK9W+2xJ#h7OmgPO>VzOoRso@TR zbkT_m=-m-+ohMxktpjLMbB%<4f3<+WVjOSZS;czK-#o1)LJ;sGmodya?26GmI1VxS zWS(KGOf1F1HT20-tD>Cu+Tzh4UXTn&<#+&(&4?e!sKL4J?W_F6(wagPyvu?$cYhtg z>e#ELB717h^!2y(bmPYv!RCw}pY)KQdBVNW6U&fbg^1RIJpJj(=g`cjtch&*XMapIEMZb@|`L73WsqY{oI%l;<%RI2tK7g3^n2S5{ zGM{o6cA&+FJnd^O9OVkL?1t~Z>Wep$F64_UB*k1WE!upsLS0ZGBTjd@qh*eJ_w;;%`krL1(JG^R2JR8w zoY9-UlNyKf#9=(1^Ek}x`NGHVN;r{Z zmIZoWU$Qq0U-g*@7h2y+jFY>US?IgxV91GKQt}2%T0YujC%BveTUTd)?Xqh3nmcn4 zUGAP^EL(s4MInrAx%=;ILN{dH759F~?icn&Qxvc58P|2z84y5@t#GXmd(S+@CH4{5 z*b8dmDu1=Sez+^S#?pvb%xb&aTv4&USZO=kJlTA9X#*`kc;@8!`@)sMcXV5m*V^Cm z9b?#%7g$;i$c=dLCHm&0FERpY=3Id;(X&GIl!!TV?!{KQy4cr($9%nFtY(ZbS{cAf z_z03GX2f7*oTfXr+S^W$aigMQ?5{gXzTdJo9JLE(Vyk>P+M9Qgl*1>_w~n5lm@fX? zJFH!=u)9hbwbL?8FZktM*Qh{N1R3+Z}r*1DlZ=Fmdw z-KQv-;N$M$^!D6$kKiTivEHf1mfv(mk~k@Yj$+YSqDYrW%yYW}&Sr!x{K=+~h+t7{&-?qxU2P1ka163rPp|VY3x_Ev z`j&wfZ^JQ_43JqZ{P$;me+Em|kdyCXeV=$ACpew6ix{c78#`7z+pX9sFT>CzTJ>3@ z)o}Jnhs+#hFgfALc(|K+xaYIhS-F5r{@QEhP_0)@5L<0cn|K(ZJx$^qZ>_!5pJFYd z=k|3EjM;d-!#(g2G3YsDWhCd` zbPCYedZTews50Vex9KHY^h(@^W;+#E7RJc(!-gw%Ke4sn9gK#mNEe0P8-1r`McC;b zevqMjgd4=!M-XAXGiJ2>)!3c0M=g)HwMdL6d}@6U z)9U@64lT?bhqdLuW;?k^B;UK9_drCn;0cs-+(kDIiW%<>M17yf4mr~@2WGAmJ#cb% z(W2$GDCof?=eUzOc(e?;wQ7j zmRRK(UK`0@)`cIfc0?ClE~BIEgCxJsUUywo!9p#yLsz!RTRirj#XJ|Q{f6PF|Mf%c zAz}R!#-aNi-V*OM=I1>q`(faYBR4ltBLgu5)m2t95ncHqelgZH+Jkpo`r{sk%C$7# zTH0LN;3x&vtO2`hB0C-h(#=Z*gEW_XPX zwB-)EjzV>j*~3@t^Qjk;wIQ?F1uVK7vbVb0DUiw3lk8oix{pLR_J;Lc>v;^0)346Ce|<|=8$X_zuGoqM@FL`(NjXi z@+(AJznHLtbu?t=6;b^t>%9wf<1m#LHk^O8pcZ!?@c;D{#=ggWt$)>sVV!I9A!d5u zsRT5^6kdt6PYE^SDiuqK=z1c?N)VBmX%RjBG(!{|#)G1K$KKw-hHSl_i|1Zon-5mK zu>1b<`SE`KIs;x~S~!}Q$esGiMT3}JEB4|>weBIO0!}&7 zhS9cfSbF_jE5pfOapQS`*Xv65q^N4YbN9c+vCiAFu8u7SI(}tAuruSoCDwX5^a$ z_nvCD{{Dzf^SHLwax{x1K7elZc5}b4X9QqpwDd$l{GF#S-uBLsh;?T^7RX=Mb;enV z50G>X3@tBKGfS<9!Ts_?6s{3vzZX-xoe^zo1D1Ku;d@=rHs)n#I}pA|(c}cEVN~Bk z^=n=66t7`x1qch|^7p-0(F%k1L*DKrxIScUK>{4X*&1)A*bwEayD^AA_@EKO?4{Vr zh;YP~5?VMU?&2$3{cRFfpv|ws@AEuozS0YQ+7MYz!@|6>e6FgNBID`coFnmJmA1*! zo-(78--G3R2hLwaFv2})V=z^yeM{XN~{FdSHmUBWh#KOpZFW-CH z`@~o1x^6L>z1EFG9E|_e&Ldh~N8Se6i3I&)2iV>NMOlG?mCh_(P98$=T|i4N!)? zjalgqqKj0P7PHuipZ%Cy3)=Xg?ROEz#1%Kn?Q0$z&-CB*-eY#IfJ0b3xyd}TswaK1 zO`9lPAqw`Xc_I!D;3^lvOj}l97{~W$b^*D2xIQ*Ql~~Sx6{0qbX+TFciG7pO|Zm{^)-ud-1XKBt2Ht! zFzARDTAu$ZL%8NqO=BiTF&duEa5wUzE}!T2iqx|XT$|o{Xg8|W0{J^jJjMumJ^x(? za#}_!T*+5#eKT{N5>GxTlcjg9I&KCg@1)0HxPtZb8p`75E)YB8WM*}}!zj6Wm0w4G z2fE7cqbqjz*)aA!e7g1I9akU_s1ErhUH{r)kbsd zwPs`W^h2LIB(Aho;AA)!qdBJG!6&zO!~P!*Su;v>)v;kWVC33#i@e@kUsMc zOXSvM5#)Z=10Uz`0q5Hb(8V^WvnEdV{L_waZOEFpea$P0PYzC=@5EM;&zM|mK$bqW zS9{kH>yY?_Bwu=PM>+G=9A~e*k`>lkvk^hofJ%GenUSqlXsQDEPzgYHdm(E6Mv)ZX zC)#8C9b`3l3CCku4AYab-hmt*Aa2RUe3O~RWwo`1{XiWUfo61&d70^~$`zV17c z4fOkl!k!GTG=6)lEg5=R5ecytbC4Mp);1AlHK@8?gu}ykHb;Ip01w|Kl%CaAjMK)R z@77rxlh0UB+&X_S1Jr1>dR@^7Y-KJ;pb5g?t=j5l>)wJ6vXc$lJD)?$%VA>`uinLo z#)^%n7z$hXh)ONkXk+Mxt^5te@RGYS5}bQ)Lob~ZJG0?#4?cu0@tvnpEZPlnq+Y>Y z&^-~kqsDH?@hVQ3iOo*DE9D(`>jLYyqrQp3IOW7x-wF-ZV$8`!D?~%js!>fq*OMTg z(>iMe(S#JeE4t;6h6syjax$~JD<@JjJoh8y^kddmm1aJ-uE4g~sO>I>IWl8NVkK^G zm~Te>xswO+igY9W`EPR25$Dimcdg1wuABv1@YZ`VnK}29yXb|JD3T*G*O^b}P8*Ew z&p6^vmpoz0oqb~VdY9*SY(omm^ucFm#A?e-OlDrc_{N$Rw9Z`(`OAovvdyQQHAAM# z+V~19Lsc2MV(-daB5?hAkGE#79sJ7+I25j7GwawZlV;D|2=(gcbgsSX#9iu`v&`ia zBt9sU31Ugc_Fy0L?mK}8CLq;JJ_5b;(=+dmqU%vjPLA*a_&}A8Eb7H;@|*^GLv^S zB=OXY9f2_(t0U}+xpKEIpfP0W87VDzVcEYG(HnDOqS{6i7yNDB8LPq-;W9;ISg8MV zcW}5`XtYxlB6=$lQALaT;Xe5GKrW$1{^*F1XIOik1#mQbbiv0O;R#?CN&6$d+_j9w zMo6yb+E|O2HE3HS;MJAuB9}HJuqV5pWwRI(OZbePutg-?VmgkTjr>>F$3tMh;=?%oL!<M{qP`o%!or!3nE z(ZUWIREpk(LDk&dId_6}Xp#eMm#mPf`uFdoFnPYOYgo&!Eq8om@l)GgJn49%-C2=R zJG5A{e8E*KVreY#-8T-n5?*V~<$O=T4rB7aUf{|HyP*NjSQAfIHF7m^r|tO`aqePF zmh`VUq~*CKhyDcsnR}|QD;j}**64q4H)L@(V!5b`HFIQW%bh;B^4r7kss|>^ynIAM z9rJfL=o>?8Y~!u#z_fYwt>VOD?QE7aMT{ba^t8{+P;%s%HV!54?y&4cMj!9Av%WQH z5*3%Nm{SSLf%@7kPky-O<&!7gPakVyB*OI9%i5`L-(5v}{#YlkvB^j-8nJt?Ha1TD zm3Af^RrAnwFFLb~yO<>_D=lpE^fv$067%`dgZHwb^#q|wv}WW=em_88Z1L*3cI&D#o_l_>QvvUt2_%{ zEkEUBUc&(##YpY)Ze)#1-)|FQ%u3Gr>dEP^eaqfgEqmBI;;Zgoe$4&(mw*3N=dZu~ z<(FUn^OyhlFTN7|<1hdABZR;HnBekte9KwD^_O4ol|u?6(!bs=X#K}u{^i##_~Q>} z9xSc?(+_zv%eTRDM~`)X{NcwVN4Ut50ZLnn{gS*Ve2@JKAghSamtnRVO8)7G^y}-- zKXm@^BbGF=^G`qW`VpPJA8KmEG?U;o?Y zef$qE_OJP$`+7QZ6t53pW@Ii!mfl^L zB65GJf&F{nSVYkC3tg|Tv^-i?KI*9#)?kX?kVVVO-p0xQFSgg0zdK?+4vG6(&ecO! zRjMT0?hnUe=8G1HSlqG5D2%8c8_V0DM=NVTzw)~)o;}0>tvu@t*%NUp8kJWTpHawj zSr~>Pq=$3#+Mh%l;m&J}y!{mI8Oi@l-<*80>w(@$yS9Dp_#9WSy*{aYF}ki0A@(k; zh7q#sNUe6l7S2*pvXGstpX;bRm0m|z&A-*im&MPRUJ>4iRZrFR8XNk4LA_Q9v}7N7 z4m0uEi9b(&7}D+^qMR%A{Xc=+HOr?_FZe^Oo^N+@)u#mK-d%Xz3nWjk%=xqq^In%k zL>QfjtzR$3-u3))IO!_(Jp6CCltc5`gkaIq>&xpa3x7ZVHpZ=#-{k~XV z8LSV#YK9fa5km;uRxN7%B68|%MLzGX-tJPy=girE(tR&8`|~FP(e)XgAHP=n#^{p? zY(U&pD6ijtu1qEBs>GQAEB6^*cjwos*In0iG4coDdul;21a|#Wg`PY-*h;{P0Rjx#a580oes$~9~ZCp!c@lurH z?J%oXE252JcNX8Z=>IJ)Gx6;Odu42^2Oa?l;hFY{^(m|0IvMZx z{E*u(IQLvwWi?+G!>>xJq>8}~Dlso}1J$h*2Bs(cFsTbi-0Pxp#@~ z&VRqLU6Bp7T2`;W-mE(B530_GX*$<92BZ#A|i5Sb>%bpi7mZ$Ax_Qe-=asY z(gUp2VmvLsvC3N883qjzIqyEbyt`X6j-Q54#=B-d9P>2oEdxJZMO1wKlc`zgBm^W@~SwX`RL8RLsPUanX+ ztCV|t1rB1n9YOokRoqWH;Y!BDr)?tAkIyaqi=NprM|F&CA`-S^hSsbyzPA~J5piGd z8Xfk-Fr4*AwMVxdKiB!DcS^!_F)0Dha+6bzhbjo1mY(|9dcO1m|E!08m)8>vWoG;; zLo?$^j%KJj+pe=u?1!g71c?=^$z-CD4FRjpVh-Ue&Yl_YX?M>IojoPm&x@_+CRXED z{^pxp(7D%})9$-IEOqC^NSpeAHSDw+Ay%Gx16!Fi)S1B=&pOeSvtq5Bc+A3GVnuPt z9U{4NI^X$n%t=AhKWJ*Te2K6A*@|pWW3vuFN5+LUb!|@@pZaF$Z*cAod}0NA4ib#O z*2<8rGGpBD2EB`tZ46~Kzw*dka+Iwx8T_$f7I-lWaT1d!WU2$i5xQWgo$xQ(c~BBk zL{Z;3%$mMuS9?DFUQfYk|Jv7D_GP}iFE&`z7w_|6>w4R=bEh4Fa(THzRK*Ni;3R(d zFn;3DBdlX5)ijo3AexgmBA&PQTK@VxGp1|K=$#UL^NFu{=!7=zB&2`ZcU_|(!M97&FuYB2B!WJW0jT{o>@)`b7i@GmAx_e30?pCWv)9# zTJvmR6+2WSa1j5vP1MW|cPgR?vq#EV>y9}?j;|cnKKUBY6$!a?l`$eapWI-&om6hM zL+_3)W2-=UixZ4tj&~Qb7G382h$*A#8%K;`1PWsfGen2&umwl6#8N!Or<~p{{{75G_4L~)9FaQHTLl_dT~GTd<(Xw(U{0S| z&uAV(dQ}6g87*ddB2<24=YC?RO3LopXEnRxI@cBfSyy#^-lEMup~p@ljSZrI*4o8@ z4@SgbjAdnO9#^u{lW}FW<#X(_)t}`B*xtB z+1e-L*2aBV!b%vze|{3;&Tu|r;k*%{=Ue`&K^)|`UC<*s#M(zp@u{Y(T^ruSbG<;^ z-S#{DG~e|^T};uj*LYsH-<}Z|;z+BOb4&$<5*5@KQjXV5uh7Dq2 zrPvvTKEV{EMG`&iv!Xn#uy-WU!?tmujeXWFrxV|v+U_AU<^0s*n^>$#)5RzDjg5Oz ziWHjH7>ousEv~bdJ@EEi4FAwovNO26^zORx&&WfR96}gx$Z1^_OV6l%7Lpr1a!P__ zK3$8%o;%O%Cxr2jRVxbpA$%f=9dftM@*J6Wabwn;!r6Ur4Vhz)>}k=l?>>qog0h&1_EmG6;JYA&oX-wb|T%Kq#{KUzVf2IuyxO{ z#tJJ5J$#*V#~=}Z#hdk>8~2@PiijN@zU5t;B`nJuvvz%2#6Fuh8=VKJ;u;a2- z9=B&`i5|1& z24`12cFu@J*1iZX*AvluU%n$X*P+Y4BIQgQo5=9rGI*|KEOSU`^NB53bXGg8VT%l` z-g24U^Jy>pup`%Gr4hSA{G0{3bAQ~Uti=$|6(0J)_wY47#_lNZ>nB34V)u#y);Mxs zi0J(lZ&@RnM4<(6Kq|Wat`|#WD|fNMW9Xu<_7z>Ks}(^`i4v>a4KkEHW$S(tJy|%1 zKl2%0BD<3TGtjbzV4aZ?)^@r@S)7QPv0hHZK*O`>+IH8od1^lQJKH^%(E?TM;5C-O zCSnFldmtjR%Ei-M_Ad}Z8LQ0spI^l`V|LVe!J2r;KI2x#-Ah05!QBB%>H^4ul`(U- z-i2QL4dE&_9#ZZq(U~9KK?p46Z&|YfZSKtZ3_;3>=zPa|dbYtPPdBmp9My_%09Iy@ zU|!7K?cytTBTxf>ad-Q~*@M4(4{;Z_zs9;de$jr1mZzZzR!3N2e9f(Ow^s{@(-S6M zBIsSNc4vM}24_C_A_I{2d@g?W3>ov}BC;UBh>zT~B3a{@mCeTN8g|KX`y~&^)9BeL zc^(h2UpAmoT=JM5CA0e*nqImSxg5AM9b4&K+jt=#s=vk|H_sXXrtUzon!lRdi$e&g%Li*4`QA%s;$VQM;{5+*roeN1j3h=sC%Zr$BK3C zpfOqZk+NP^X?ypcVLL_bvFEt@%BUGK2xnzxiqxo=ThS{g`_2+;L|ZO0hqp42hwgy8 zZ&uy)A@7YfY_WnJH1s0oM(t@4lcEw~*CQJ~uRWj5%E1*ccza%Dm({_MyI|bpNlrxW6FIs0 z8C^KI4?asl7oFa!LV5eK3|OJIE%sz5(P?3Ex|6PsuS3~qA(&3nv5`BezyTNMaR+*Rkx!*>H2Tqz8 zO*4cx31@D+kKuh85mP?pAbCxK?P{+v z$y@K_A)e+_Kg5kj_Ns{l`_n(`mFOCuStC*R>-#j_o8E`cl|zykIR9QCEz7)%G%|DW z?i@Jy0UaVVL%iOzanD6oZjrr=m#NLgNNm9`S$xKBAK%s+HA2(9z=yR`yQ~RSBW?G| zTOPdnc$Qe-oD1vPt-vm5@*&m}EpbyWvT~PL$K&kJ zJaxq|_9@yXWTu#mq)!*D_QOApXh=S zAF@F132V()Ejy!*XZEf?-c}DlNF+l}=ET=Vpfkkn`(9}DczX(?-ij=dSS@6y95yd@ zp}C=pgiQYM_Ztd3%jru zvTObCY_N{(j!{-WwMMB1UVT=8A+l;+XvG%MH_kAvB0A@t$YJ`PR%Jn6M0|e-4#Ut? z->5*Dv+Dkc=~HgJ=RV1+Bg~6^d1wDb7B7y&_u1z6rJ|?4EQzal2sc_rVZJuJ)v#W( z=b(&j_$#i&jUQOrQ>ARIRi0Q;phEPEC^Z{|LqwEAtJ9_QJDGFx*h?%FK`8sZn3-_? zj>WqU`H3C5UoWw4*YmifqaqYYWIdioyci4`eU_>DxY z#n^a?xY27CuaeeuUWZ}W5|h>Ix1$Rx)rVs6WQm(Rd}6A2dIv+IVhyNuOv-_2!Nz?6HRH zw7r^J2J8+wb*INFeVqAW$1LdKwK4T*Ug%L%XxmvMdA;lTjo=iVw~oQkbR=3*E{Le3*Tj|I74?f>WM(;o_?9JhMgy;Xui|>WcaMP`Ved2 zi*Kgx6O0?4STj%VeUQHMW^Ux$-w0w)*`5)G%Vhc>DlSIh&7OiSYhKqSV^_}|g@KHT z*XP>L;u{{P&lp=9n`J9^yueW_G?MDUI7oJ$*K)mbcuX2Ty-TPWhkY-K%cr*eGjNJHo8UI^sRd zong-BPg?3;<1jm9_55Wb2EWVYl%L3orj<&aX{HzB-AVVg>TfpgZjrM8)T&& zXX58t?Z_hVkrnYabg8kSD`M`0xghcTbSxH4?&kA^uDFtoG4QM-U(RR% zHnufVqGOCFKjJjY^{{AONzRs4Jy05W|02rDZZlV)8EM1 z!!rELk+i_kH#cqR#giw`%9n`v;9)ZCU?Y3?w&$K)_IDBXMy&L3X0|@@xDURM#oIVZ zYeneJTF`>2`16+%E6lmdzSia9D^_J>JXj-3a`%@2-vWsbM8Msg(CEa11$)@L^EEer zfmX%}B5`#-T_19vk;MZ0NXrM@PY?5L?~aOl8=~y9yz32j_?hS4j?r6Xm>*(cC$#*u z(`3u#8b|Wce)IRt&oOq5_T=w*O8w;t9Z)fkER3B=u4pqqo%KAgeyhdu6Mw{o-0EFh z-wdi!u*8Z0mhzsJ?xhT)HZfZz)^mA-+|aKVlK2)YpFf^iX8oL%V^}at4BFO)mgPT~ zp1hwAY<$|kVTqChnOelvIUy?bk8GFW(8k!YK{n0m)2Jw8=g$2?KxtyP*cPzItK zPe9dwhaKL`Gb{Se<992D>a`ai!L%7zEGF3Z@+sI;fc<49{#?fl631kOL>#d|Ci4}( zLof*~(mwQ9$yip=!zZoiF7lAQw`61l%&<4C6>qU+jBnU!CBUnCX!0-K%$`|uw=U0n z_`SBv{5)?~xifR^vb(2LHl2QEuN|Mnm7v3A%NZ5P*=;60*-OQ~Jvg%(zMOh+ z1Ywbb!}Rv9Af{jo%0^6|EccYLXQhyVaXgNl5j^#W0Zh4T$N*yV-67@%__w56X#9`QK$=&@`$mVrEW6< zS@*-3^v%pymv+J+uUIvwSjwnsLFBveeD|{1Fcm+aR#Ylf3$qQe*5J)fd_EgSoG#h73-Y`(GkfIern;W9FxsF|H;j_T(T2W|IH$p`T=!yhA7DT ziMQ{f^K7t(c&i077~@l2Bta2$WxV!=v9Y}K@^kW?2BQ1C)^|Se^g5AEcD8C_mv5rr z#?FA2c!E8-puu^!=M&0EWNiq4j*fM3w9_hw%_*#z16i>4dj}}Tt$JVK@HvjnV%sxI zhKxR6v3LAE(R}X1RXE8SpD3UVs$>PyN%0NNV9zDCw7w%WeitJ-h%S*3>z-&z;H!1p zv&;PXCLzv9-ud{BT#NDu&X^w&_+(#ZcWd%dbf3|Dma>lAw;p_9t339cijU}qWz4O; zM|6%o@8d7ARDs!JuDC7!ayJ_%YtMf3KiiTs&t>@pw(!a4=R5o8T0NhUJTY8fUDmRf zcy%xF399>m$18u|@Ax%m?1*GfIT1z69(U>kEH;+=`vRF;Io@G#_4#S!Z-w}dT_VmJ zvwZd834X#Zc3$V)ks(aan&Gd5Ll~c64eR9Z?*7K}DHrFkK8{);yozYZ(&@IfFlW@`-t1BX;NgIU;ng7rB!Wc#0-9i0tH+{NXN&4hd#q(Ot#}jl ziLl5a!yoyQmDQI>kY*D*TxJ&1izL1GE!Mc?OFdBByO}tHFn)|ipRw2xeyvl+^X&DU z(}&-0ur3bd&RRx9l1F!^oS&^D&CaZeF|mOzXz~eNXRW%gR(+xsm& zu;yNzM5}L*K`yH8JNB75KlAx4J?F8G4^aUVF8B(b`05>BzpkbK`3gf(?v59bJ<&Z8 zBVMmldiKfGdYI-{E#B@Y*DS?$l}e=J6VEiy;dU2ai}C82b=OFpuQuq@v*ejUyV%5B zf2{K~T|K-T$qG12)j2=UE6xlSF?-5rlIPX0QvIHCk%L3-wa+=QGw05jYj}@7*>zev z`&vCE^x={ibLaB+7e*(0<1^n-Mc_L=@7~^_gRS;o9q)MhnY}#yVGqQJ*HcP`07c%E zJhAYH9mhWml%I@PQKnd3?KS(;)7jTo5^T7K-N_5@Ml>Y#zp<6^9bVaIUY%!6asz?% z&sJ+14qfcQ)t=|9^9c)Q&Gn4?DWa?YMq8!lsskQ54b&Ve z@A7AN!NRi=tBfJ5*LFUx@@K?PZToi#=jr`rF{7gKL~G}jhG!$J!YFot zo;8mgt%>l;PtPSQGDue;KciX}wf?S5&DRU@S|Zq+ zJ+<47yI*FItxBBhLmCaex=(T!P3tXq##&_Z7YTAt#yf;#-{}_=t+#%Yz=r398PJXs ztlr71_R8;NeYO35^twV$J*^12>zWYr&FS3vW@zhY7e3L)78${L*n_Ofi-ran+K$O5dpJVbxr=|K;Y4sHN4MOxdV; ztzVIzmOa0jo;tF$eQ#!1uBQbw&^DXUMdFNDCC56|g_9g_MP6-~E8=%QWp&S>G0!vW zKE638tNiG&hxjOx&a#;@(_Urqa~o^kX@RUcnF)6>vR>Zv!_FzQPu8cjvyEl)W!6Zn zvvH_eU<=wl=Zm`bUG$TSjCa3T_`Cxxe0DP7EYXT5{SXdUSv|||dwP4GUp!YvG-7_0 z_QY=X7D@B8e6&LBYRh9X=_%8Uc!O+zr?OrsfomZ%zhC!S#VHtmR0!7Mb8*pQ{0XhQ z$IrUV!l$hgAMQvO(KPD4f98loNP;o8;>j}ZHwgEDifcUvQ4qkp63+0jIBgY8?R5|E zMJ|57K?f_t)b}1dx!xFKR*`4>XWB9*0@jV8_~5g5E-`<$e$KV`R66YQ(Yhn0U?*1@ z(<>I(L$2cNK5(8zD9&LM36_UM(P4|LmVQ+Z3&l%M9V(cXM7N5T#aAEAJhj@Cm-$MM zxihZhwA0;Aob%S`V#A8{T${aR%9I!k((uib0IKp896~ec^?d7jF`bb-_d`|;8QGId zL@BF7Gmbx7doO)D)yC=b)s<)D^7tL@VWr(rUeujDW}j4k@)~kfBs1;V=D$M-<4@L359piODXotc&j^weS$|iO(|2E><0+7*V?Hzc zELP5=wLtW-$OooY6BuI;J^EH(V@E4%#eTNve|4$DUF+y?9e$9w^Pha3enjGwu##*) z^C67b?DKC-BRx>p!>o1c2p2S+YedclYhtes1>XT2W3UsR! zTJU@I)4Ep~IFjM@()Rm!_%E`^`9u*5uA9BEQ^LI`hF;NE#|q1Cf|DOIgU`m+eu=jH zt>U0ZfA0X-e6aMH*>`<#!E@e4IW04Jk53VY?a6bwBO=+Om7ga*dwXDhC+Eq6D2C>} z#kLwe_d|=^$N?VDrqvm_``}Z~{{0LQm$l{0@XYFSpO~z>^z`Y9PuN~L%jk?tn_4;L zNW}2eP)hbgUaXusadSPZ`w*r5B-RKq1~alsYwPKOI#_erZ$I#i1(5wMxE2d`Jf-wP z>C-tlwPi%BjJ=xkifiu__->ZIe#OC2Qjt?;pBX>KarX5OR_;F7#vFFeF%^hvD6*V+ znC%XnCt0rLdu@?V^1WUan26u+7_+aJ($~4g(%hbPNv!)~a#{wb_MYB8vfR3R_F3T= zHim4d>lu`hcxT7`1`X=$*djh-p?~t~KG&GlubGTZpO8K6pHbMy>M6}5a*-q>Fmdm^ z_k>G(t!s84x+l`te%OX!&m-5$U!P!Lt(Gxa2YjYK;ZqL8XH1Kf-gz?bI_Tr;-34w> zHna17t*hWf@7MF8bmOzfx-!a!I52wuX+~y?p%_;YSRKddta-YveXZ7nye|5)BxxVJvTCIz{0VXeHxvVE%q zoFzivHr%)KZr$p<8D(*C;>iVz#edEr+c=GD+jDBtQ2e}-*|OVO*MRLJ+U$DSzP60` zyw==P5~^ui!MRh9d%m#$Udce&BpuXk;)BX#lV`z*15ob}brv_?LB zoH=oe^+tKOe~n##>D=eeF*?SjR3y27wVEf0CykbisKx2)wbP(?dfUvT$-dJTOIBwk z$=yowtwiJZU!SaeHTP~F`MbID_-dZN0DSMFn)2*=zW)4!0e}AG-+$Hl>o0%#<(L2b z)}Qj`YbhG_Y5#EZ_vatjpY#8Go9BV)yttpbPyIjr zy8d7P+va`z4=?tw`Jell{bY>kpY5rWJe~Vo^U0rD$|gHh`K&!9^eMGH$YheG&_AR5 z@L*oHoW%k5sCz!V)nFav^}AP(8T9>6mQTqiE1wSi)4K2I!xVCc)z}bUt%Wsq!qh%5 zgI5W1vGu_=-{Gbl%Rbax*O(QogN45C#5}CZQBOh-{1eIgwNJ5rk_|=b3jaxt)pcj% z)9Q1M4F0xPUv{ngJ{iL9&eUi5cEMVq7EzL4xzk!Hd?K)8XZ~SZ`@Jl)j<($JB#JQJ z^Z7k{e=jYcEc=omvO`Ypi68fKrd^l}4X~4`{UiHu_x+y{Jg!>I*59Xh=J&}%dgcs1<13?3J~36dyE9v*T$FpaC<33V z;fCh-F0f^HMA>%-SAw}?kqzbV*?p(={mA6kdpjaHti<$0Rtr{J^^}CXZ)(b#S<6!% z?{WBDB%kC|0RFQ(o?x60M&d2z{%58=KS7x9@9g;R@k&HLgR>djSDeV697Ns|&OHdT zbLL#Zyw=h@Bis||9g?y7S{sHYh{9EIwift?;(zkUPl;e_EvEHP2kgP`#ra*#8La8rLdsWP81TilezOcI>Z0)>}F3_i!01^8RQ4;@9_$SdA6Vo&Ur( zAAg^g{Ljm=$i~897pjw-n%HrMcD+-2&M5DGM)9c+S3CJugz7>q2#Y(2axp{eyPDYY zTL?UX_vwA|`@K1`{`z{xMyYq-d{0S;zOE&oVT||2-@*3EUEXmy_hISxd-2>IBtdzZ ziZHgol8^O-2&mrd!Pm8F_I_^a-CGORNg4LK_ z(rep%ZL=b%r~Cb#|9deV7}u{#Sc6YF z{b`*uNtJbf@{+7JTzpCkw6b(_zUN4S7uc zLA%I)ZyRrGU-1&PFb%`kF)=Ya3+pL=7wd_PXo(`2@!nvi@QjNFyu{jSi7Tux*pQ2? z1}|*H;=cV^lV!Ht^$yPP`CYU>Cogks`!~9wa>onZo@w`1yjg)(pDYklojQ7_!&0DN&Z7zoW(RAi+twWxaCYpZRs~T4KTl<|B&%C#@Q|xV+a5DVu!98|Xi?OqoRqJa*JKkBfp18(E%~o!Kir5l4I|I+ah<4HB z;eETj$r!&>{_tSTNZ(J~P16=@vuJN)qBuDTTH-;>aHv_%bbVI!?ZNXcI%iE7wo0%0 z@_i3Et7Wnr#tt83dXY=uN7m<#pyhjoJ8<>zZZzI%Pb=7U1-N>#cl3y$K9cj3F6|Z7 zX2Mf`?W~)BD1~h2kuk_{2O}$hTGPcQm(MIbwi_^pned`c3|UbIeWMgdYXug}mOB<` zSx;SVMcF;K*n>Z;A1XfiSmB(}>Pt4iT6@KM_RtPL+EC(bfD!E7yr{8;bIVBFK$eWr z%wh=F$_?&*e1p)tcws@#x&vi$$BXFU9hPIcb<30PyK?N$%C(KRGS2VflW8@-SF}QN z9KKq5X0V{s-<*Oo2q6_t(Bd5>%w z*Y?%IIX|SrlJ=~>V}kWmbki2mF}D2zTTlUc`>>q7u=0hqtq8-e7#XI+T^(a*NAYA` zU`N^&@WTfcp3MCgJgcJ7n*r8Ne9r!f(!Gy;^3iYJ?^=#eghfq6<1kvDKP8OLHAq>v zv+sJV2{UBJj%BgEQI9C~(7O@me6fO-Bc$hyr=5yn)vy+`r)Yr{l}MydR^Cy(j<2KQ zz#_X}u4Qv=jrEL?^**1<{%nm3-id*8L)S`&RD_GhmPo~tv1_Nx8s)N)iY3E$K$Gb@8t!5^`s(d9D9LEG=pT9vHg= z^x)c_Yxp^FTSRJEHOQ3+=A-!1*RtN^ut-+JoY6;sxS9epvh?(#k`E`ubtXhjhpM)3Y#%%UZi&|an+8K1UJ zzPl^Phj96doqOW*5G9#dDg*&*hJD*q3j5R+pX|s zE%@=?#SX!CYlUmXnENYd)d*Wqk)O$F@fXV4C32%rt{#!ZzB|I;+((odpPsD%t``F{ z-8s?1_1ntO-TGKZRA;2fL5SbCc!Dxd%;q9P#d|XM$5YV1eew;FnXh?U^yG!V#UzT! zJQbT4b$K?FtEkLg5e8fMCvuGF?`kBb&XzZ=^XJ=!Yl+D3B-uK7wER7D;)Xrn7tEPC z{hIx_-*|cZD-b(1-a7kqmr+FKEMD?7)ab!A_lw;_V$O1#2&eD!C&bK~kss{CALQ}Z z5vbz7s6Yd|jhQ_wHsj4Mi)*Ij#)tU*z+%rDS@7m7vzNPEHYdEeJJ_`sx>ry4ky#lR zR=8xKScy7#awa{OqRZZ)10qE2+rAc%BNNx%hlIX{V?9wf1`v?N?%gm>dlBTrsP9=i zhOxc@h;mXGF1nt6aBnU&Sz({K&))#%y{MAN9_)Ztb=aOeEH8V$z@@MNJ7TzIh@HH| zUdG}UPHAkfc)r0jb?KoS!t{(;Y3s?|Cyxk)le$&k3 zuGYhFtx;K@;2#KrmhV~I(d7B>) zT8*;bcNX;B4Yb)I&sS*Bl54qPEtFvrV=zVoL|TXbyZ$h(CqBbauSA4w_*fZ43y+}7 zTX)Yy|JK0#{gbC57H-3pytJ)nYwPCCS4>4jeYp^_;6?7B+J`YxPlVQcwi+2SD~2e_ zFmUjs`YgsPxrVI_I?u@RJbUI~%WQHLC+m z6N8?1%EOIWPKq2fMCWuS237jy^ zh{j;|nti`s_x)*BPbY_sPu#RWe0>ME@`BEZ?y6_DZC{Z_o|JYt$M%?vUQaui5q@M7 z&emTf?d#RQ_Q^pxT4NXMJP9&(YvC+wsKEZsZ|rS9VFXD{V0VN~qG_yjhc=C*)#dSq%=qZ=8asbIyTMOU44{3W_cg46j6!5kZmk(Ki zF5EU>o<(G0PP0f4bYEF34xw>Ho;7~Az$QJbFV*K-eObq;mimfCd&?3GiI3{%;VDbnLBLT`F7-5nQA>} z2YjaOS+8C0%vwF-tNPk8@3KD;j-jEMj(Df3mDhV{!8|Icm{n)df438^Bv#k3-WaOG zqFiQS4x2^#HJZ>Jw$<8da@fXZDw5xfc@Ia6_XjxbH;gI-zO2vawVLR)c;&P2v0(?( zL)nC*S*nR61aE?r&=VDt z$_mOpp@>OlgDrCRLGS4E7N(_`>#y?St*kt0tqxYjyL`E05gbAWE{Z-aoRy!9e5;r( zkln7bs#7uhVGKH~3}Mmwinl}7cO}_T1n#%z1$1EsEj~fTe+P(`?<=jNLV#;5wjX0p zJl#nwiM_SLTW_c8wQHy@@oJEo@s4n8B)8ib>XsW(Z$<>D7iU zn3*A#@u`NjUpA0EamonKXPB5RzQi&6RgwGR^5B*gH;iH#h6)Fimd%4w0ag_vrrO-WS=*@ScUB6{ut!E#eiM%#+jEK9tPAelsh8a=u z?oOa(Ce{?P#kz62rgg8o)XWvrt?CVK5_kkg;uspDCc4-XPuN8~T=uxLl8+ME%&vO& zSZg$KCEq^(z!!wMWVmQE7IE}Xe62MhXREj2sE@_A8DcSF*(=J}A7=KrgA2Aoe>z$; zwn>Xk|D91V5hIZl!FWNYqK`!6@fX%`Qw&9Y$fNJd_D7_M0`~eg5yGM=()Eq!im&`F z6LK@YdgVq|KFz2NMqu1vW6bRNGk>)ra`+mC=Zu!}cyE2SfC@;sS4N3O-pv8a?n@}Z6{{F^qF>@gQqIDg#^UnC-(@2o84m?y#AQtQ-fa3rNNi*? zYu8>;6Oq>E15Mb`inBJ8o0*HQK0TH4H#UZ4+MqYAsW@Au99!;?=(0kLjRdsFjCicY zRS1xk!QAO@h1rBO7EjE|v6cuxjyTAa$eOD~78jCTTRnhbC$agVyvi~evEff_!P9+W zH8MO~lSL*JMV^>sbvvQ8Mz-x3BkVEOI^M&n_cX9>pVTrw5l&mg%JEaXh{XAdP&=a* zcKF^yy_D&vWs!lUW9sIyaPrm}pD9=rVR#M(Ua~G+lCn?e@If0b>RViGPUbL!^{p=Q zPzEz2BN|W$;W60wR)5j6{&rf)r#zN5u^Ff65(VGf(R{k}E|Fv8Rn&*hjL{LmJ4}fuP95V(3)xv@T5xxafNbcIJ9}6KFmv}HY{C$2(KRY@!#gut3q`pv{?4G+ zdg8$+ZU2h~avZrkZ-mnmX{?xyclo8)h(s6PM*GSObc@2Q zMcb_PV!Y%Oo7-1bYh9msG)L|tP%h{(J7mR4@Ac)MyHnK6xhG+YP1YGP^RA;6b!3au z)4jiD^xmtL@~_oy2wTy^6sukI(Fz|jlfkk+Jx1&u(V`0BE;Dz+U3UzkwlX>Cs$;hmdqPxiA;wnD>rgZH1K4e z`V}4LwkvpGhAjG^lUM9B@8wQB#p(ZE)%or1j_@psm2Y>TsyFUf&N@*O5lmqPck)A) z7V#iQW|ks}mdF`}Huck5+Os0ZaB&D#@xr=2vJi_}Jvi%3Yte9J++=+E6ccUh9|@JJ~A6_D-M{d{pFm&mKu=sICSs6lTaK>##7Q6I(0=YLtyOo@7K4^(8>)SCj?KgK; zWFm6kz@v}6Vk9@+C9J#CtwG`rr-==%7!BUVB;4l39(wJp>|lLdAT!@0VlWZ;gd@w> zD};U0_f~)xbbZbme~7K+B+CL&caO|k9rxhsQ*8V;)Qt6(k?&<g+@#G0L^YXW4UX0N5VuqDzV#~OT!+BP^18DY^x0Pb1cUGX?NUvD-dj`n* z=`W#X@N^I1@U`N`1)ujs8WO9nvNxOJen-=tNr&0c2I$H7B~UL0d!DvtQJp6}m(K&w4jlmP5h3!nk_jsm>!h+4npvCF0+2O6XlQ` z3ZkMGI@1`!$i!AeSQAR&C3mr)4RwknyR0&UqEEv!Cu@DL^;=!@Yl%iiu@_!t&e_M3 z2#OCYhpnS)jnKB*`%Wf5HYTc=y=dHtArdl3#QeOs&tQv&T0LcZGHwq-Nn7laxVwLy z%AxB%84dki{8#Uc(B(Z%l$=*{XdxA`Dub+Q1jg*5>wL4-5;o9+`AXdFY}?9yb<^@h zWizSIWa|y@uR|sTd2U)SodZ+PlKPCbO0?~cQtg6?JK=7~aWIh}6dTrr! zypgl`1QR~yOZ3erNq;F_`RS?p+Km%=~Fow931vJ=SzG0y6bF;o}sIJ|-?}p5HT`?Zcy;GQ#RriXiE6X=~ z?^^f3?97RnK-*6kI`+(qoxCy*)@&c>w+=pJT@8@(o9eO^TjyD+HQ6^j_$ErV^*z4d z&q7n?HL8t|Ax&09FsrXff0n?>cWA!K%>jQPOGc<2k4W~5GWzLA5hhrl2x=Ibu zUL5+I?d`>t!9FS2Wxu`iS9{im5JYcp4{7;Z1Cjf&Qs~jFxc8}dzE9luARTfX7WJ@16(B#apQ#C~Fe=c< zepn2bvQ?j~#Yr?kiXE1t;!-r~ajJ$@dT4^1l|M~!*Ge`+7abxVy7fZzj^5;Qylf{A zUvmqC#b1x--MK3HcUrw#Al3?oLd;Tj$zmBBZ^MgduKn2O zHwxzZZb9Fx9q4>8E>bgQrr9F5E%Q_Ank!cAP}1;Y%w@%GHfg(n_TH`CQ+2?vSo5L9 zPskQ6=iK$n4@_Wm&m+%hSiwEp=QQg**b@&c#j+Kf@Non_uHeqxu8rtvO+2rd z6F*mendKb`-LYj)h%@H;VPe||oBJ4{p1i-#BDt@S&7N=P^IH4=Si83*S+XQM&&3&m zEf5g(*w=TClGDI+I1A>V9~RWiBjTK_Cd9?f_EmN1(zVsh<79Qu&iZ#B*Y2J*n8U{^ zV9`?3@v6U5h25~>hc@Xug^uIf-&mO(n$6e~yH#wnJ;}E2>wWPJ%NR25djDnBjc#4{ zM*BQ%SovHPj!^#!4Lf7@jn>J%^IU&%_iqQM!;QD!XgHqgefQ7im^nC}>#bhvW{>5yR->O-?0b&9+nvIqEJloAtkFL0$7a3uLSS55 zMQwIAWX-cY66=?pR-#r00@_AqM zS?H;T+pXGce0UQ+)>(i0NMc;kvJt^*aVdklE98=#^+FjJNn7(3J4-4^> zmwJ7UC9SUaUbBo?-xJJxv2){z2DexsS^N9@bQ^bl{e7*StGZ)h_a`&8?~Bt$j6E~* zsqkCHg1yt~u+H}S{bjRu>-&v&Eu%zARF zmvw)mSX{@Hn0VM|W4H3_3iDQM=X;gj##Dx~GIYB`R!@~^rMDs+QtR|w4lvb7ZQ5R} z$1uSW1c=S zBsw$WZQLCHo3X+<%Imu>?_U8iHHIm&YN)lu_Hr3VjZ^iA>+Klz~ z8e7h@NX?y0XY({jzvD0V@p$90#BME|IS1MsG3QrW>)RFUPezZSpIE)|)(-cv^8OuA zq^$|9=X&^`EY#au11n$WzjDXId3{>kXm(bs$}~@V(&4cyCdbtnj-NghjA2<=hVnzh z{)Imcw_*&RhgSBnbG={RLz{)~B2#(CK@m)i-Fv@y?s{q(2RE-uKUc3EE1x^<`#M@? zce*;!ixUH5EsOVU?wHT3-YP)s#CrWKG}~Q9s#5q_b?CpF`8A_I&4%_Eu}c4KF%5;H zN?4T7J!@yF_S@oS-}kM1k3RjgbMtvk(=j}3RNA%KC*#^(`(PJ?e9$x=#Wi-bV~wl- zGCv!|^*r;>RiEv{y*ja6wQ|vmBi$OSZ%)OA+}LsZw0&)7Tz^-Xx4%0po9Fj)?5X1R z#LvFzt`GgC$N4ZGic((x7}M8232}Iy;=I?r=1XAtC3ZAqanynaerC} zQM#k9aF1D>j@i|_kG$~8_uyMucyT~6ZW*DSc-4^X03apV1vu$=auaSc!RpT@08 z+c7ZKPOX@Zuj!V0TT$%xyJw+Qi__e$(|TS$BkT0h&4Ao$q(m*cm^Lj+;+k zZ)VTiC##<`RRRAUq5qQe*PK>WQh^;bd8)}{dY6%>f?Fr?8RK#O<{fY8;f1vi{o?)_ZWVUPt)y7d1K*L zH?qq0`@1*EpVs~T4(!`X3*k{znP_?Qeho19tzZ;=lb#Od(|Tzy2}4u|kZzY;;9n^Z)+m z-hcYzZoIJwLV84PpJKrVjGx%wKId&? z^=m)x&ovw0n$Nk-Z~VJ^uU;Lz?tNSH?D>gmrdOmg?y+sB^<7(;rSH6qRr_yE>mBz{ z@Z4jj!+AE->WV|N@HOi3uzn@vUMT&~M*QcV3Py;_YX1FPd}2LR*J}RVd+zx4oRxNW z&HK)aS6+A)H{|VVm6KGguy*$v_(pKOd76(b#O*BbiQ9bQ&uee%^3#31`aeXp_2rzk zGBDfOY*&$_i|$zn6+EH&t_629w_+uN7O@ z>hC^$i&DE)yu=6osH{f_o#oeqCSCesFV12y1kK>RsvG-z8NjEVt@CZC3_Ov-wvog5 zYff8l?RJcTjTT9^>vxweh_Tkp`gX;Owe`(+FZLn4dt+H0lHFrZ?y|Kk$4?l&l=eg! ze{p#1ra~_xuDox4T=q=Dcvj7xf)7&|JrBY%>=3T^-Tl^z&>Ev6${tp!DYnyXYl@Sm zx;u$`a#K5&n-%^0*>{L$jm=_d1gpoOe)?5?$JSW(!nE~fPuF{yis`s&UId}+9YQQx zm)&8u_Ao!W`W*e*$LWoqZsXHzh+2WQ+M$Toe5ZqES^>FJx;)UwdHCAe-ey>n&8#{h zWvO-yb;Wh9eaB+hrr+|>ysOc2xV2_F5pv^f_|Xz3xDM~L|2%om@mu|FZA~$ax!5bN z`m_}eT;epnEx*Te`CzC0Q{B_wyt!w+7BBh8>hzd}wAW|$j@7qL%f_+Ssy;BdR)cxV zqxGxI`SE}FLq(>jR*M;@<9#ta6RtfL#~~h{>~6)~dq>aajntC6t|E(7DpIXhC*J7)ksj@IrA9H9 z-M;BJYsDOfa@lvQ-ilTmnrp?d|BU9zvdHK+7LVaE;`Fcg_5R6SE2`OXB+H&whi7V` zg?jB6!^KPixNcu|FmhJDZ+*Xta+b@*%tCC0*K=kJ<0u6AZq&((;UfI%-5UPeRVzMK zcJH$7?Yrvv*6mkr{mCGHumfYKFJ%4CAFJLW3{k%Pj|5e|Fyek$&9Ai-C5mT$o>7?n zo>B2x(H>thS1ZEAD^C~+Wie1J|-@8WO!tYVF+7U@mHTPH6MH8-~C-vWgvC8GH$J-rt-YA znaaL0`Bz4^ubLUtaiy|Sg;U03tn{S74{lDi_hiD(d2dE$KWw`%;n?G_(QU0Go}R>^-^tvGb{3Y-V8`$LRdT#j(5GJnzo* z_$mHHk6CP%t7n|wy?sCDwU6uf-&tvyCsA&1afoOm@4NXMd*)(u-cu+=wy3i+jia6K zJgu6@(DZj6n%9$wyvUuW+IBoS)jl5Y9Ra88Wq0~@FW;*0c|9cW)^;{JW#0-6cS?AK z`sRP#8c)l_>1n!}E>FLkfjkQ|Q$+QsSA96|YMa$^QgTR!@J;&qC3zo~$+;1MSn3 z|E=_kWeguH-tl9TVw>5yFZ!|GeT=A8Wq)>dy7Jlh&upmt_ObaqANGZ2|4%x5&S2-$ zCNFPadTQv@*(uLcXjdUvO>zDv-F55Zxyl=l?V(HFvmf3p%1Qe=D|_E<{l!=$JD1(t zeF|t~tgh~72bP^4|LhsM`)W-QZ)V2rbM&f$(Rcq4J@(Mm*f-L3R(4n8 z*89BoPF<8xIZ0;&w$DBFZ_VC7!h-GYSd8m>>PE;L_vTtWSrSiC^i@}R6ekNsR;w?i zEgRjT?_Ntx*`VIIU5zMXWhC2uYH3r#a@e_OcB`}@68kZ5Ex6y;otZfHAFD|} zbYtE7PPcFtM_7w7ZnUR{o@HCt&N0?=u84;~E>c>GqoHNOp0ta2SPTneP#cFJBSNAf#XUavm^`gV$p~Bl#T9%*e+Ux011lt|Ei`yO3 z=k?j5gVlsi)EIrPGUjUSR`JlTaTzzBBs99G*s^|HB&&0? zQADcKRu0{A9cH%E_0G=ew^s9c&T8u$k@5OP-_;%C^{gL~?(mM^&5XVE>6>bYvR?M+ zmRjSoPv>sy!WJ4;S4Dv|{35igNE?Zv?r&ztR($#nT~Rc${^ejCi5(+w=gIe2sl`io z96No`Z-=0=rS9g9VE z+>g=S!?}t(bYFkbdbhYe*~TOl;u?eVHv}O(hL2;J*T*P}v%JV<@RKcdYlyo~sW+C@ zav`4^_bf8D9G0o@H2P#8@10$|hBno&I*eCUWBlA5yIV~YZ{4=`c+(5%*xf7+MYKFG zqL@04Yb`qL&RU})e#V&1@o*MZiD!*?XCMn!Z=9WM<*&Koj;-4HhDrtA?+%rswc&n8 zRu8jP#P2_M&awe-W0>qJTkLn;8%tblU9Hn=c!z5-va|KYgmcl_n?>=DWg`^KQrD_h z^=|C8>-{+nzv`NACvIvToA|RLB+Y+)n`ON>U@<&n6Jgi=(u7QJC!x5+$VTlkymM%5 zjCFs<*!t&)eR3int=O8ZrJp?SI}CC`XS3+!jp2<>nb-GDisf0L+t%cmIs2HxG-GvH0*gUNO=YN=%$>EsQM6)|~aVyQhilce=#Zo@Z7! zo4G%2Mn05Y^wN(kT&cEz+?R~*-;?)WNa>!piVDZUZ?Xlf%bFp-vVGB#T zg$a`~*FHGtw>C!PwjKFD53(^I&1Y{lkcY;!mIpCxY#wLpX3bzZA94IVf8&v*d6{Z= za)yF#S%b-&+8FgeX7L<^rS_ij#kH?^>wSK(dcT01&puwU`s8%%HXqJ$u?#-#kC)vq zuIEk}I;FMxJbs=oT59#)8lM&T?P0x?W}mz3bn8Ui2~ugp;0Z(R#g|@NZLLVh$7lRy zy*Gpu;Cy-CSY+M9vAl`8o+`-S@ib0$X68K`Sy^O@d3ov1>eMz%5Rdomla1@u!u0mf z(_70lJjJfkc8@&P21!Iw_6a3ag7C^>+H6jI~a``LQ?Nn+=8WYVUiEST>7+VTgg# z?<&Qj9qyuAwLQ$@8JCML`&nb%QD_} zZLa8B^^Bl6S~K0~=k>U09&@#v%tls0*uw$5?Y&R)IH@JS-p@Xf==*DGOtsIK4OhB_ zyISiMiD7?(kO97SrMI4Si|;V@%&kW^^~!8M#wzZP#b(Cylx(#qcBQMX8!0#JWHT@G zBWu>qGxXNP__%%EkEL+8qbJCIVJx@vf2`gNbY1t|U(D*qa7b%I-a5!qMi%wrkS;zs zPQ8bqc2;R}++NHW8kWX8HJEGk`3V=5zoKHMk>#wBCzZ@*~^;T1$iVt4hs}9HC z8&BhYS)A@~MTpdZ%@&b2mgdr~^VXj6s=eN_zX(>VWZe@Y+^yRc*GA(3Pvgvq+3caM zwKZ5Cr*=?+Y;PSa!{%--ZreAjp|khxQT1)zWy1lT72Fyz9G}Lp{Kf~vykRE}=0Q~VL~{nQ{jL!0u=_KQ~HRH7r%$z>fnn$(484-Qa_7QdapIpFEy^5Pyn6^$E`JHdf zw3emAGpi8IU-$9N{?k9Zu*a)Dl^mN!X>{nG{GECmrQ6uep1O|R_y|LvY=+CKt{a0E z?nZZ(-nq`!KDVQhIBX{)#gO||U|3r6K-BR%u7NVitiUW}f3kYu^v5v_V(hjbBmAJ6uxa3>2#n6yJ=*j;U*bA_w7owwA$=G~>fk*7WDSzXloI+frWeRx3_bw(iDv#dC-}UF5sn#@dhZ zd{SgOmdjX=!+K*ROZBs72la+3_YQ&eF}pW5E7}ch@$|*)SSc!g z*urkBwqlWaAK%$XyA)mgPfqdE2xc%HUyZop7BZu)g)h!1w)x?xHRRT|Uf$XvAFZ*w zXll1=>}rk6t9Nj0e5=RTa#UaRaGq}4&o(6=%duH3*`RFvE|PJZc0G6R*%1D);9@-N zUSzc|pJRLMgo^KJpw+%&(Uu=-X3=bGMOJKmZ@)eI=8gkAI)ROD{`f5}Z?wivzxpv- ztG%raTjyVd#WWVO-Kuegv8ngiE!XNpxM1tv87r3A)Wgy-(u&4ePc2>X4_SU@;YX_?^)2i_Z#;8bz~XI z&p15Jd1rIXZY4g);_jGb>nxtCAqzoPyZ`EQ=gum1Hx)i3y!P4bFI>y~Ja}iyYk1<) zRTff2h;iH=>K)6fDMsjUeowV|=tB?wC2!2I&&OEb*xmVWk26*bTHRs8F}urI7DLa! zJLE>**VTh6!J+pYSyW;ivWu7+vd7D+gkKa+?R1L6^3{mvD*c#wUyCR|Zv~g@s}QPH z-dBNl%DUrq*XuVIQ`U^*=h$hrU2ksN6)WQ~OQIj&o9XV^&~>9)onYJ^zH!`rqdluS zv)SI0j&d;#eSFfftatL^&Q_kA*TQ})TFd8U`SRZ`tcs&6tFAbLGb`UQ9yjBXf2gM2 zH?xps1Nq|YH{`;^hIkgX5vS{B%3i+k7M5bw?@GV>my0Rq`GjbFXX89Bis=FJPM*`(bt;V+ zdL2qJJT;8F#__n7_4W;ay<*uIOG9(_%Y{e}Cyc|3UHj&fOvD zzU_(ukwSOXI_2I6zE503Eo078c32GuC1$nnbQ_aJk$%GgQEb<9w-@V;=X(sdqd3*z zsbV^599RB(tL=Qo;2gd2^A69n!zZ-)Y+qMVzWEtU~`K%5ipvz*(+VQ?@ z+BKf=eq7ed&moz5iu1B$zZx-~ow~QJ`N!=OPwdJ>wXdh5Z)1&Q72D+uU(0LUJ?n3n zS0N~*jN}dLwZ7_?W>+i5w#fF|cd8h2v-K9)Cnr=B3aZHSIB8E!?LDscVzeBR}w zoy#vBQNUUG+PeH+7K>rE`cwJE9j|-Rl*Mf1FO<|xql+XiDOrUmT5PKlp{kFW?q%^a z(yJ2L!*-tKDD?Yehi}o1oksblLL6@`Zer}o?6Y0W^po{ZX6*mfHT4wP{({zBi%eDJ-f8#EWi!v40i;Lw1 zn^R(3U7L?(g6{CkO6}!Ybo7;$@_QK`3MyOW9Dl#Qi=k_gFPd7%aA%ylG0^Pt-Hzhz z-nH>;wO+i7Lo{+14>V%tS?rTV7e`eRb4R`xB3y|Vr&nU4au+W)Up`aI!?#4 z`xwmnlkv_`S?Ck1Y95=5Bn35+Mt8?as!o5ak-tLwoZGu?r>@;8E`6qBRj6KEj8*s6 zm;JmuQPZuz`TF}q@r}vaWv7v<^b^JJ+wB>@Y*QrN(()&x<5Ir$V&7ANZrO}A%;pCV z{KW)xjs9coW+~mW7n`ih*m#Wb{)NuHcK)D&4&w0pTbWiW5WU(#uTJf%`0sgruDB}3 zF9p*ihM(=z@kWh^D+{6xCuKHv%H^X~Ri}T9*-(3m(C=7Ik5_@K4r6uN(5JrBZdj(< z?&?92#Pvn`Wa~fEE=u1;pWpafCFrjAtQsnG?A^Z5)pts7yr_)EdO7&dApLI7sh3|0 zOogdcTp`_CL?_*wZ56^_*ivS7BMZkX?Z)ORU`-$u@{_kkP9)9m+>9oveJ7zn7^W#}j zeA6v-@%sJg+s@Cs zj1^4^{hWo_`-C&!$e6`-=sS6FKdp$dD&2U98u|4HL;33TcU`-Cm8o&OAN#X8mTyJg zd*&KB7WLJN)w`m~!jwI$@B0+u{_MTit(T9zJHVHp;(Rk5kDh3F3L$+`aM9y9hMOz0 zJqy2AZ#M2T?|ct|h+&fBa=B3$-$=)$J#r+Pp4f7+Ko;6^=70(XM2b~aeQ(s zzl-|Nj9aWVzte7H*V%8y*UzF9fpcrs_Z)p%5XEA#XTA4Y`Ik{qKuEn~SVd}Q@u|7q z$$HZD9Gg{@x6`L8#PrapzFYac7wfTQnH|_~v zlrikAZtm`(NN1rKl9W7*BKB5Ol={Q&Je0XR8F{0KPyIGdArijE&uSaqo&}yypEBH3s5fC=Yw<d~OQ?rJ_BW!t*0ozC`&XWX(@ z1lXL<>}X@OYy5PjKkLnI*WF_zj;CAkrseIoHl%TQnK~P_# z)$h+81g#BWsA47#is0*~(J-&pQiGk@D%0g)il_3!8sE+K=}x~mcg6Ct^<=tihRG@I zz7|!TpR%28THQF*-$(Wtt3Acar}_DdFIjcQp#H4Z^ctV1%)C#v&Bq5zd7yS{XtcHX zJZ{;g9ZFh+*@*k~$6mM_a|%9r+3HsH)Das_Q*-^;p0%lV?5bHQXceKDY4DTR^_|SD z(_S95vLnatt8nu^v_+AhK5?YtHgcyw6_~Nk+NqueXN{`WgLdejFRd~${TeCrVfWW; zWBa8a;zNx|k*T;inu_;?Ec@BPZarr+cKzR>mtlFL6`Wm+;%u}mjN4U(Th|#0WB2=Q zBnpvYIBwZ2QpyZvOqYe&I;)K~LYupasqyxS(e)TTwuZsT{^B0j{`=6YY}1E0Gu+vk61JBIz45?ew-&jODdBoS1Nm4-eYowNs=0ytc-_4&_N4>I58k?D}Ndc@Ih6 zUDLvyi0qExyUU4{L)-qHQ9h4p{ks-Jy)w5f(6%)(u{scz6r9d$ca0zWYWv^{gGHo* z?QHEH_ZYzH(C2UGL`KrHis4$`PPaon?|!$$3nnSFYrMEp01X%&hRtIzE8cdik63bE zPfPi|*oWeNxf{_>y$toSoQP)PghGd-ccURVDQ|--aBVky3D}KJuQukt>e%sMl%=E!!vlLX+Wi&=x z<=J42Vy9fZ$$qQpwjCj*V;U}we8pv!J%gQ^#`!DvA$xu=KI(+I_F8;huRh+Uh&=A& z^q$qVFzmXq=RHh5-&;tDak#gx*2iQl%zt-nwYiyWhAq$IO+;~}4%Cm`GUn_Re{TVH z*o~3=Wsg-B>R*;ZM!mdG(Pa!0*~&Jhj%}>!H5(Q?u105I+cy(DJZ|#ZAWoZbbHH7y7Xd86$qH$}=5o!5?A+3Z}&Tqt9!a@75Ono!J+(X%H2-5Vs(n3 z3+P*w&108xu|WOhV;qgSPm~C{PVnqI&n)cEy z?dm_HR14Z)tNpmeIJ;(e4|}+ttU1q5t8p9a|5%0aG@hN~BkV#)6CFr)$i`Nzg9X~ z444qZxTW4uq}>>a-82TR6X18Moz7!x^tHzIv(B-dR&g1h#V&KT8wq7zsXd#E@FHo1 zLQ@vvT^ptxXQ{lsfZrQhPE;Bbv|Ii=fHrwPhXmGK{1Ifu!as0PqhGlTF1Ohz2AJwKzGri4b;96_zdYBAujZG5R;m)Mx;lZ^`cFL^_FuOSmvyQhR_F}F zYFykduEw!l>+~>=H%7P1LD6LW(B>sBW04vgp<^?r-?;6$kmqS3+{=B@^u@6|Ri0v1 z2=xpqEUPIo3*D2=#;*U#*{>OX&Ze5OD30RIAM{1t+B7CQtrSWg6 zr;b>p*z(to{CADLah|%%K-cseDynrK-&pPH%>~z(q|9M-Hh7@sR1j9^V*JUAxSu09 z_`2%3=CfU1L=oaN6b{i8cRb^?=;S#>@%ZHOv`m{Aal-5p1!g;q_$vo2??kLdg@JER zx%y=w`?4=y*G9^D@txM%~XJ=>IZvy@yXNLzrPn}Q4}W)(Q+7z zqiC{CMz=v&d6N z%*K3Z!sw}iYs};O@IDz{#U}>d$N~}*s(i2eVb`dxtVUQk>6?9x>iw|rv^5Paqlizo|5;RquCT84^wCQ z66=`FQnrifuYJM*zkkDQZy6tJ^f|jYO6}=7Zg4^oS(2$SDMR#$m+VYiQyiTe7W%R}rdE*pA8ip?4O>;GR1AY|0kD%USoV{OVJL_!z4Y zr#XrpyJes?Do7Ysp{KMmvK4H~oOb)F8PwQWuh(2W#Ez3Lt6ODnR-2WddgWEW>vE`e z<2AJVmWS4KHJY_?h9B9&X|{`dr`7)ESg_k!{}sEmpCw2_&|cgQ!!*&VJngyG9&9-0 zX>z+vi)>WzcGCY(e2l+*QFj(;Z2q@aK5*R% z*6<^nPt0t>gR$(ihaHief*TF3j2A0}@&V_(ml;nw{D>TX ztr;twuJA&VN4(8WwqpW^V;z3`S{V-UL)T3ESo7O&zW^aAMi}NlPshbFgBLnA76<$0 zmlj%K91o(7slCJIzcu5p{7pU675~}EuY9svdl@f+#f%^O@Lj%EKbFC<9Y@;T!xBST zmP6cRp>bDAg0%g$daJg>TFQmbDVkP07cv?b6a!s-O3GHPXaCyvu~M$ar`pP*{FIey zu?&P1O8v5T{@Um5qdnQ}O)sultUU~3w*7 zovjJ_ ztp3+O#y8eWVLx=T)wOl)`)_~vN#6hT$K7~i9lDN-SDfub@H5~~?8F2=KUuDjvsHQc z?|)+0nxF1j-XEM>lb!$iM|_{-pZkmQIrdK<{{Hnf`(OUBxIAoEN$rF8jqd)>f6R20 z*8kT(^CVY|{o9}ZuD^Bv=>5skvz?v#8{2*M*MHvEZcXv;`?U33(|9VI&1ZXa8{7SJ z?Z&&W{oK1T_kaD{zx;{o@Bh<(;_BY1L_H>8u-~Z=b z@B3>g|NaMi|MBOy9sm4g*T4U%sP@-l)xCCmeg5r_y?sOQZ;v?PeqNtgYd@o?{V#v! z)2g5L@$=7rtgMwf_bto+{%2I=sec#I7Xls2`ukUaeYgPHNdTe~&zspA0 zWAb1Axc2>z|MmTD_cIUgd3h*vodj6Iv%34lx2Qhvi+gd1|8ytH?GkyX?#YXG8me__ zu!_aw^=<2I|9TJ%jqzce1?Ruszx*#Xj-l^(HL}9{mUO&sMSpQ*lzdc%8uE! zDS!6={->P~3_CW)&_)mQv$eHbr7x4Q{ABIg=1=)fKxcB?r-u2V|0kZ>uE`5XR~|X%g0yV#@TyDuS%s_#cuiz_xOG9h-Z0NOYK=Dilx(kz2OqwSa4qiH!2R} z7f=0Ld*dli?|lYZo2s(AT8LwwHg+eo@oLl4kM{B`L+R_irk&M4mb*^BZ|1)1;rj1? zvMmFhgy+ZTb3|U~ea`_IY1JtS%42T)?S6RIYKF2JvGe*`F?JSiHdfMo`H++9PxZew z%M$y`#F*tjs~h3_iHq0E*KFM0Tm5G1*~8jKrt~UJRb*_^zcaA4cc1Q8t=iRdqw(Sl zV_(m+r&gcL4ei~r`n=xU?L2!{KG(Er8R`7m6{fRVtE|l8lkw*|c3Wpfme2m}Z{4k` zeM~)DZ|2R=l6M4EzmxM+yj{!7)1K#mdeyF0mbYQis&|^!do%WPuhrYp{b{k@cBXe6 zb*&DRd2azl<1K2I+7*|>`W`R#*)`L3E$wi~#a6!WSUSGfa$hgTvK0Hcr{iVjeXn2s1v*K;z|yO`JB5&DrSQs<+S0 znxk4f55w$!zO&%*yK8o;*D_FB4XKrSQWd7Ze-b+ZekXLzQZ|acsN6#s{>8BSkh_03 z`gM%TZ|7n*LjCPBPWv*D|7l}(S-Ww4^)ri`UrpQn#t+Hae=|L`yRX-pRYe-1?HI+X ztKMpRyEa}sYwh#oSU*f6EC)}7vGN{y&aN%Gt$eQ6?iv%%H_G#rk9dyNA{+aA-#L5i z$dR`E{QXbs=l`8!DbK>hREc&f zPel+8_gMbveyhJcZ$dDjwI zvyC}1GSiqd(^acG-s72PBX_zQ?VGn74TsU``?&hP6~6h)mQ(0$v@G38Nd2k3e91=^ zzn%b9$X?o_N8?6HD#B z)>->RRvT+y89%+I)ROZ4@ zu8Af3e%e**-yZ0sT=-S8-0wcC@|M+RXj2xZpgc8KZ0)k6Je|k*`mD=u-t@9Bi&Wwq zq>|>R{W7%QS1cdjUo&ik{U@fMvS7{E>-U^LNAdE>pcU*@XH*%#e^Xh!h;us|jq7&e zwSH@i>Y2^%VNmy7-x2r?`^nC7fWJ6>>ObGAN%K>FZMkg3leN3&gOO*h=c5_=+0*5X z@Zx!of9+koH)m{I7~j~mxYgAZ`d3vupGEH5>SeMWaCt)f%bz)j7n&~m8y9A0heuP=k=L(Td0)BbTZcA)&^=!yNWwy}n?pmtC%U%JU+H|JmGKWS#9+uQQZkWOO)KMkUAUgd&1)? z48@ZsWvt%k2WQ8`wfy}?T`UK+I-x@Y;q_{%|E?jv6CktKKR>a*_luA&(}(oQ=8gWf z)^l&|XCE_XM+E(ag;u(zoH!Kwn^}Bju~uul?sTww{;t)GUe_lRwK27mkj?3()yt^L zlHT!`syzX!PiNDwi;Z+&`_`~AOvlIJe2@KOy^D1F8Zo+&c=b*HG<9mCaVO&#z=nNl zMBML}%zPMgGTuJ{Ts>BKMI(1f%dMK&b#Z)Kw}zq9-t-@fkOv4Q&- zVk4jXEqG|0(!GU_;X6_0XX|vovvnEB#uL*j^>geWZ)5nm4`Vd@92aFdD&m+=T}6_n z_ADr#`eXZYq4w+yeR}zx`K>x$;^Vjp#Z*Z>?I`Q5$zy16Je}_ZY!<`Tc=IX3uNlAk zj}_Rkvi6&=-}ml4#5-Zu-gzAZMvF0w>AxHlE9CLK=U;5WrP_z%p04G_8{puNL&t&PBbz2CR8@jOv)o6Qv2 zWuqQGcZ$=$3cDOo9`$9te5q9OTaN07Hp}z5`%kFLSxnt0?v{nw*$D_KzTG zIOb)hwRcYDVfR(lq5K`{t^4UdKJY#!otUqks_dC$DsmgP#t0_*%>Pss&PW89`vkDc{aj+J&Z_Jzf^?mWS zYWsI@g!)%qTa{v~GtP7E@OJ{lK-<*U$*2!AU&~K3wdeU-KOGVg{^K=m z_bn?lk6l@@oBkWGRn*pIM@Ht+Th`AA|B)H&zITNFe*fbwW@0h!(-#%vw!erp7wYg^ zbHBhSt2NEZfK2x+XeZvEb?CVK#6}V0V$9^1Lb4x2I8+xyfcN%=R4p3Em`+b&>~6iB zG^@qye!oM8pF=5@>;K$}<#sN zLU=2W<+#LjYvrkYQI$QOZuUISz|cQY{iE%kd@8e@$BI^}Np1e7V$DuV=YjqqR{!y^ z>NUmiaV$GgD)cZ6`(fC~*L#+Z&plW3W^D}0ze=*TSf+XTnclmH%E_&lhxJv76xJ^K z3d4{+-`qF$`+Jd2G0W!aa4d&t z_s>Y6!p~~I`|XZt5qOraLXK~lfL4uB$HdT1S}$I05wy?V^YwXNKk@$5U&NnpAF<Qn4+EGN&%KHC?|o-$*!d#VVne;2{!RIIvC zfjv7nYD=toDmPm!I}a*Q`GL4hjI*Ed9nzm#;e4wso@1joMb&-tMkzCNxOaxjkyu0Q z+p`wSo#E4d*fGR@&&l~0CvL(MIUJovZ2IJsWqLi=~$6 z*lA}O>aMn7ibrhB`(L}$cwCFyJ>0#YWMlO$#`>so<8KwHY@C{l+(?*~0}<^Ez+Z1! zr33!H%fiMMS$)6ej?I{rJ2}R0O1%>xU-69L?>Q3AcvX|UmpaAS3Ae8(us9v$PbA;P^W9k9QmJcM z_kke9)jvLIdweesDodlSWRC(x(%v$VZQK`aBb^N_f9^dG z8y)X<<6PxbQJha2ERytJhA3^!8=GGkhUxA7-Lqz=s|-huX(?dFd19 z>P}}NoMj+(QXF z&F87L;oli)R&6_P!|=SDeU4lkQ`POp^yI&jfYYPlmjubCrnRT|?~C9G30EbZuH+7N|U*Y3OkBJD$eOclV*+-Ojfqy{+JF>z+27 zp_9F1s6xd`J)*(>{xU~D{v99&%14&4m+$fT^!1(po97QZc;P=z{e#0HJop_Anx&88! z2R6U@dXBu??HDU&8d2k}j;yYX@$Pp9AXjbn1P<@zVF-(jM_!(Y8~NSG8Ww(DdzP-X z)iT$(8XjuVq_CZ6_p*@Y+*j{UVa>|IAzJIJX9#{8kBPngv}QH?u!R$nXBM1-oe>zf zw+O2|edS{PJFVm8AG@nmV(F^&wz09#d#jxqXmK6OVoA~It#MCVaXTlQb0);Y9-Cp1 zW39Ws(LH-13`_U+)`DVu#r;*B*!HZFiDt^os?f5~e@)MB^LrMIt-Xn_|3vhC8;Mqt<)Nl&--_nwx+q-@8ACNm$xiq+BwBM zWJ7&3t*&lP|IRqAuNvjAb4D}YVf$$eX7zTse_Ffo_Sm-;UBQG$tWtlqm9u+Z-q?%}&-eG)xSc&~!jKPdmphxs{aR*rQtM3-Yx$Qa%;ElU{1tq+T5In~ zw|6b~t{Z6w-RIwUb5x_c7fH&B*-k2DdAFYGd!E&H7HVhJsBE77ryq#lcsBO^o%*XM ztgqU@HP+vEYn+zyrb_O8%HM)J6~pny`aO>CM#t=v-Dmr~$IQ*+3vZ3mS8AbXe@ltm z#`-NrRsJQRT=_MrI$P%?takH%9>4FuQJyA@Q;X`n(-(KoijV#M;uS&hST6%+y$6X| z#6=-9`TNBBiS7D-edW{cWqPNwUruFWr;}CdwsyQ!-CuC0-U_GH=nNKs&Ip7lcf zS5e;^#o<#8=l!kt>#09sb7C;={n@iTwArE(jQW*v?EbaZGtPHxi}M|`(XN*Vyp8?P zmW%vjvzfH75~%^Ifv0k_aw$f(&r_E4{#r~{KX-)CuZ@@sUEHdVcvo*~$2oib|fB&vd; zdwwuaIgmNY$9T5(ws~l;61{N@&rkR7R~voLP5Jq}`Iv$;1j|4OJHsjs%{8mlEY9Nq z6ReasnajiTJ0`n7aXs7L$G8>HK=ju9@!vTA&S=@9rWh}}_8*4Y`#J;j_C1#O=+=JT z->cp{tQvHms?xZl&jTo^=Nlx)w}A^1f0>;B@JW!&c1X?#Bc z@@@|9^n&fO@Z>qh<#9Q2fBO41vYWj<8{0_twV!jbX+}Mii7*ubm3M7j>S?r(-Z)74 zscp}UPC=IBkB6>1Yay85wTJ4j^zF{yJmWiLI}Krg7OG-u2Tb%`f4b;N;QgnS{zbg8 z|NS3KEYAGLa53#XJEyQVpO$1q9>k^QHqy5>YEr!8UW;{{owhvVHtHU-pFW%0X~JhG zF|fAC&Oob0IIbJP z{{EWfd}H2eubs+@w;179X?qsX*CG85?ICEzd1new&%0dvL zzLZgG{V>+M=i?K_f4)8Zv!JgY3`w4yPWpM)8;G5DS}J~#?$qF%_OoA$^8D3Hj1au> zynDm=)7?3B?aWM9Rv4c=?#UuNQ6UE8VnUJpNE`#OHH)!KJwD|~rA zepgM>&CYfAEXVY*Ek-e`0hhf-Wk5Ws|LOgrYTRe7-8bHSWA4j9CvETd&n&Fn^PzS~ zcP6Re?9_?{(aqB;j~qRb{M=^qyZO(VS#7*nx_TBppQ86H!+&Zo3N^;N<<+1pl*g{3 zXq^)_A3Fj1ixuKw-2J;awvwucV{B8)RMVO&RQXp)^EbT}bEC6(Ie=<0>~w79fBrts zcUKc)A||25i+C1?sM_T#YP|0(q<*=<48@6|)73hj!jIu6&)2@zcab(bJ5ZMIzV8p! zdlobk_SAE~w4jm$jLdTL;D??_t^G7N8vpyw+7Q$56P3YaNZk5=w%`+s?T&M zCh^mnzsY1_*_AbZe@1f%pXi_MLyoi9rJj2@1swT;(Y6C*nW;~sCoTP z`=^*a!P0|wwnLoXy%7zGyG%fkHa)F>M)X%^s6AUge2BLC6Q8|F3?Ihd$_jDo@EgxX zrSiyE`f2oLTD>P(?ICbqFHEou-|z1JmEnyK=I1rMedX%k{?rwWjlfkLTE(8<)ypSt z_n} z!ouD)Z*ktW7-ALsjo#^@|5#ss*Wc>^lQ{TBuE;iqX%U z^3r~-or-5%&HVn8-(Pe8o~4X3fn{g4xKhcfS}pa~9}*{Em^vL{8*9JE*$T0)wLPn0 zH#@dcR>=6lX8oRD`In>YWP_fZW$%E~ziQ_BHqIf>=e4H&MY**@`t@FB-~9f%SFU{h znh9aiiZPCN0>ZU-ggXJnDe7VUis`S7h;f|b0FOBFhO$b;YbtFet&|6A;e2Nxb&0AN zoAVskTjf0NhormDTDx!j?%9&*U$buZ&dGQdK^B@Tu4bHdzkI~sn=J;q|MfHaME-1F z1ZS&xrz%cVavH$i^Z-$cmW$3oJJLhQ>E9{$pzZ-$=@V=wa`_ELKdv@(Tx#|xU?Ke(aPxh&*t9Qg9YmFRy zhwwS}U5+-kI|bqsmoc4J8H&Rxyb<+yEUI%+Kc;b}fyz<1|it6C%4 z@6r90QHovMc(kvXzM<$G^bXd#*iI+itzlyoEW{9|jy=)Zhb=o*t|Dl6_xaY|$c<|~ zuj=<-=l!`dgzXPaEQb`b#=O<3J&i+K^m1ZGRW2`9yfHtK{uISKRz3W6%`RMdPG|XV zOcu&YdqQlN^BCI2R~4E@RVsY9LiS?6o-Di({e-*mS$(qlSK7s~?8BeWu|MrN0l4*7 zx-jl+QzCSGBI^CMt0;e3dmO|tU5D6NaB|y=KfeO(vA(MuQGFS37I0?t_!igDWYygB zzS+C~|5LyB`&Gfv`=+H@F>H;IbWi)3(A#N%wBF(SzV%$8{k*>8#u{yueJ7Q6?ySqihK{ZdEe>2fv1)%tr2ig$_G(WP z?rH~*-qUv8!XvKL4v14a#+?}!!rs>!J>G`;iDP5$`|tkN7Mf4?)%`Mpedjt~oq-~l z554pQ=}zpO`DKbOcdFxNHvamZ->3IHw;#V#KEB>cccG!2Tv(1ns7(t3o{Cet3SmXLHOx8NYTKul9KY zV4va_4?aVo`Z&}4i@hr?ilenzl7r4bJam^GRl7KT|9LX~Ufs-j#xjq2iLbI=Tg8Tg z4H?+qY*z*7u&X#~IosXkVP0qFjp^NUZjS4pT5_L{S&hvy*E?GufBOl+*nfM%L>4Xs zMLiA4&MD`o>i@PnJgjf-Mu#@Gam>G5=esj@>qFrrhUBU|z4SYWR?T=a!`!~1ccz|p zhwStI6W=#Zm+->b2@XZdd457rKfmRm*5@Y+%Yj&9Ko+Q{t2g!UEqq#h_K(NK-Uy#+ z%kz{u32_!$pTm54YTZ={iZ2ssG7Z96-!p7Jv-oV!$K9#_*VQLRvrV7ds~WY_$q3JQ z{M3IK_9>5QSvLFEF}xIQnczkHxo`WwyT8}Hd#fmo<~c?dNv*3qEUUGxb}m{=5Ak63 zTB;Eii=)-EU+X)x?=jqG=jTse^X)m={w${(YC8YVeDnUqP}^4)Ipd;ih4O0GU+SA~13ek&kONy}Bf+B5b& z=k{MfRCQFGvhq~my#>wY&!{PTdHp^Q<+=#&b6IGH@5aX2{9YC)VcK5ai&XuYZc>se z)*Rl((DzZyhuN>aMtt*i&&OJQhgr)z#MFOyL!#Elxw8--Rnp>@S8Cqrn&lJ z@ayVh_Vc7b!S~{G$7t14Y@xf_i~Fu&Zf!a2BS#c>+05pD<`cI*6pSGwc&~ld8-pZP z%{hyr==@V)dQ2x}gl=L{Zfh-$Y#a)nKd)I-%TC>2TTV&(`8tM!DBt9;o1I|UWfuOc)*7F#*4hNpAd z7{?byQ>xyTw(~m-t6CcgU#q60dQ&sC zg>7oi_M)>&q-CS8cMegPiGSoH8@tBro+@F&boSK6xS!AVtom3NM(e^yec2let$*sj zOvqHW<_(swF|?MYu{gW$yZ=h>J$5}dI@85DZPW`vUgMo6imEtz6A8OLuJK?!?Cn%9 zis=3MDWdnPdTi}YH;avy<5Pv_XyY`2d-X>KR*jZ{kgMEkPyOs&y&d;o5j{s{WqCMO z*OK+t;cL3z{Iie8R))IBi)0Zrt`1cv%ai%C*6OQA*Amkc@n`${Oc-@dzdVfd?SY_3 z(jT3di{@RIkE!RB==ZN2h&V6wzY~FjdHY1(?32A?bS>FK0 z9TP<)i$7s(Up9te_cyzZdakJM?^(U-SYfAHOpBmsw*<^=@q*1q1NDLS=dQfKcuP^?$zz$_$%7Kc1h7imxsL8rjk!i))z}?VJ_;vvzev1 z$=} zy}5q(R2H>8)jV@0+fVlMiq&b>Ju9*KWZy~fCZQgSyey=%>2DdN*}Q#?^VX z{<84=@<%uAidA{u32<*F^v>THkCS-c=~s#JCI{vDa=9p;NPo@zGY_gz*u?gnTU#c} z(4KKI^{nDf@AJ&Y50t6jS>S{AYhQKRUogJLa#39i+W08P@h%(iHJk3e*=V0TC|=kC3}$g(%R$i9;}6*>t{!zzKd zr*yGDHnoqWzVkatl)1VWun6l(M?{EIEcK1_w(s~-k*DWCdIwj<1^nh=<2l2X2@5cTdQWI z_UZ$?F+MeoiDx8V+ws&cS;$W6l#Q~tsvpw(#(9}t7Hjos{H{jJm)e8-cJ`?!J6(%t zRz6XNW=uXA{MufQy5mi~`&`+4Hp{?b&+F+h&EbJQ>W8phMKJxtOqm!TV_VmX)_?sh zUS7N69_x9R4SzAn2GxoZ&!_(Oi(nBITPQ*|29^s9)l&twyS<-CRiM9`gQ*?L`Tcqq zYm9d059#>&s($~TlnP^_>nXKf-{rup*yG^yW34?n>O8hyuFTht)zutlrTPp?|ntp-oFZco&g-rYL=-b)O}PS z5q1^raE9@FoWJ7n^6*sr_jTvi)^Y;;H7Hgv;WdIV^H9WXp$_ z^)|0B+Nz3^1cN7NnMnVvhTzz_ef;5&eq0vA7@3k4BQEdv%Z%B zzv=G8;kxVdyWX^rjgXb$Rgqe&DXokDJ%6DZMtAQ&Upf37c`NmI89V*weKnR=FiZV$ z040{_zqvaJ#elCj@_OwZ8=tdzo3gDc{?)R$&uZM92W+b=wISX;D}1^-SFMZ1`3JI1PK%J^}fi$vsFXYq}d61Vr)_vQGnWFvOe z7uCaA6x;rG9tY5tnc7Z73T!?8mJQi_qQ}7Zzrk3F{k+Ih_I)-^GL-`8&q7!Z8)c=6&tTE1R;=u3A*CnubV5%(SzJT`}HR)hGOX@c+c? z3~%2jk3aYM`FTDC(0|PHuI9*%HzA7e3ZrM4Ji$%BZ}dfRXJOhFn|RjFciD&F_T8%d z`U`Ryb`svawpKoN0$8jkkFcn8PCiZMGt}0SI_sL%@(WV^A_-diK*7;5&<%|AVA9|L$X7{~| z8t$DWZMH)8%R&9_GUfWr!0mnV_}R{mdQtTV=QA^(tHT+Bu9Sk+qU)R9JfSd5Cvo-s zwkGz)e+&=3nRj(sd@{3MJI3|x4qaICvV4uXw>P}Es$XjD;`@nB?r1Xw=4bMB3$AppM zWhYc-8);W{pizI7S+5<(MpjbYle=d`YiA{&?#0jy?c(k1TwI-MnaWQVruyz>udyk6 z)p0&leB$I&Z79o($&TyST)X zBCssRPQ(z;=0*K=j@IODEQQM6p%*zn@)?eh!@e=Q*j(M&`{*jeG#+x_;fIsm?~%5? zRcbsw<-<5c+uJ?l?Mhdl8R#52ed-TnP|U{h@Mcvu(wX;%VZT*cQ)SUZ_g)d#Q_W`D z^ZXvWm^I6zOm)3I&W_0G#ax*08+*8m1Mw7XY>ECjzycMldMyXB=+xpnPQqEVS&bi7 z=kLyeD#^MS+R+}G&>JuALq)Bvcq;3?BNVN7j-GSJ(W;gTM74Z~=NQb2%97QrvA7&; zSN)!>@jz4YF_ya14E0lP9Apj0EaJtrS$U#kbq23nkw+i#F8VtG&nE|t#n{e8y9%5o zihZA|##>t)-7%KOMxGkSv2338VQe>@6nA^E*?jRozZB)#c&&EK#>VWLhnQ`Imhx4b zAO7|hBs=1P^svlYyNfd2UFCuy{C(;j15jnJU0>DTvxjwSj%Uct{d^6{@GKv*xLr72 z@9sn8IbJXHII_x$+KsM?*LU*TF>iS>^R_WX$9eUtcfsjB9jBdmqi&g5F2a*vIJBIB z&Vd}5YmG{FC!orLpR?fPT=nTRc-FN>lw$9%K1HJU-BrY}svH<}^0p&p+d zax?R>HTJZwJ$)Mqq4y27_nxFqhMcxy`)P7$+445CbCYI<>oBi1q%mWMb29eR5SH24 z`tAR`o0n-i@;iAa;Ol;|Y~R~nbAGW*CwE^ZI(FF@m&Gx5j;-wP95>o`nh>FXx%WiO zdu*x;vj*c6_eOe>g+ku&X;*x{W4lONr#{*7JOihX*2_dE=qry;>-p?E#TQ{cza^e4 zYqOh0JQ?HJnQvrl?Y>obc&?~zwv*m^Yii-xm^I_4UbEpi!fYvSoNX*tnO_Tt|z_ag8)JoW4CEhc+L z=4*LyUl#1qOL1(sX1kwb#+P@!Q2Ta%ybs38PQlq(>rfZ#SZp>WSJ$g%@bA8eTjjL$ zygudQz8QEuHQHS^<}rP}pC{(k>Q<^>-m;(1&+}jF-gGz41OJU-xjSyhTysP7b>`T= zxf|O~BVEUQ_aYyIcv)Sy@4Q0QXk&e|Mg3V&Tf``qaoCJXmp+}8I|F0?^bgaMBPig` zH|87lCbwrAk5ATS1%vT=?*-WEnY2|Rqn;akXJgh|Tf5wMXAQ>stQfWDa-y%kVlnQg z|J0my>v7$+F`s7Y?>Vr{Q8$G*zju<>HYWq%^N>-e$ z@y?TnJ;{glc{l$Yk?Z_DnZoFJzxBgW{5b5M4ZV#);a66>*|zGL}uZLU2q=Sii3niyzh7S)Vn;$)N;UA`^IZ~sU*(p$@XmXxqU{vsz7O9zPiVp z_itxLwp)Ex^o(F2f3;FVHbNt|=dPdI(?@$-)&6~BYV)jOuCZGC7+w8&ukl~yWyiOj zY@P)py?qvWTwEUF_b|*Owqm2Xt&m3}&8ZT1r&*bb`*x~7-dvk+WLcaBmxC-1bsQBj zD?DW{7E{8Ie%`b3{$wdDdlS!s{msvpbdSROzu7TXNlK2vmc6 z0@T_W!ZGBt+rDvCJLaC8^S&IVc^dF;HS2t+dF@UE+3G6;u!Wl1am5<$WWgC|w$`sc z%Yr-XxWw@?k|N}DJ1{ohclP$*3@uaQ+$wq59ISWR_B+wDg8J2P?VW&PdZMU}Z>`p~ zqq~)H3gI}ur)_iIlVn{jQjN45cRpgHY?K?-zZe?vo2}kPey#p@PDJzG9ZOH%#@hZ; z7J}7_XD;|>vH1JAcl8d`8Y_5craW{vN0WG8CT1BjmZ?5#&IJoN+W$%o!?J?o)%{jz zcV7((Lo=S;UG>L)`8o^BOd~_D?u6y9e`sgxkJ-*dqwcNBE?uXp2N~6bqhaWudx~1y>%%e128z=4+P`BUoNtqv{xz8D2bbVvtW+cQP(VWn+x* z86BGRkNwb=|6jfLkLBI7&>s6Rh*{U=06*K+{TMAPtxg3p@46NB*ztVW?#oCh^yCEt zY6+%lXT4goefGpSzujX!mQ=$==-XX(WoVh{erF>OvQVzDo3+|9u#?lgJVNMf3`^Ml z%IDPH>KMxc7RI?X>ot$r)uXtN6}8dqM%K%EJD>Ng^u0CpXhCenm;%QLWbJ^kYt<{= zV=*s1G39}J%NaYEzjM`inN5AJG(JV{Jjjnz)q2lpjF;1W!}7c5E)K-7NXl-pZ0}fE z9%6{@%+#)>hgZAXk*zFSF&kEyZ+87_*_kKGFY0vMy^&dBJ;sZBdcWD7h*;{&p4G8D zR^=(&@>33WHp)2^``@E^5_lq{G<(K;cRIvL5&o6WRi3ICE^zIt3Sn}5uZL&7IEgJj zyT|XbZRRPJZH#a-XBajm$PA5Y?^{@bNWVeQzDyDE^V|H?J|!)E=o{$yiqx?C>g z;5k>j$Zo6_E{w5$^VZfkGw?(#535JO)KM}etfdn-08YCJLi}$3+-q$i}E#Z@=_+UEDPPS z-mGlMt))rz*~<@r2ewE`qY_NUS(5c(Et7_;%uHm-@88f zX?7foG8@ZE(OvJEgRQW)Jw942xi-$Gwb}I1+MD0b0EY8Q%~+qhR1BCpM=2FkQ*NWN zAFo~Yor>vy^E(yw$Go!;)>ypA7U9qL;+4Jd-LpFz&+jv*XWxqBEI;00YaOGpvRzu{ zHa5)ct!GVasR+lwDgxF#zv7~P+}%4+?Y#Gi-E6k5F*?rbGY?}wJ65PXp2&@arZ*t@ z$(!q{+@9s+Iks^+ZueI4lFG*5{63kyxyv3KytuZ*{J4yr>0K4VR`are*{QO-*r+{w zo)yOLX}f2EI+c~3uNcl}ns3x|AKNn0OjhN!O#dT)cN1giPibR)tnPl}$J_Wl&a!jA zmRouIwOhNaJ?CbtyYa4Z1zpPQgAwoCDnm1|FKM{$ShR-s*T zJKP1|t;B8_BDCQSn{@Qp9G*IB{bo zPHNkji~1v;a8f1idlFAyv<^+{+Pqp$W^7s;)jsIaCpf#-EqK@)z+1e;TB?zFDt7&w zGoI7vL5mpx*)*Hokd_L+Z~oHx7b|<4nHY=XIvSTTdGEZ!Sp_Bqw`dtf`=^~&q8@T; zpIkyuKK<^xa&Pj^jLQ=MKF06ecNS=%W_GAYXH+nrlMyvIqek?$9pBn`gHgXV)VV^N zc?xU%uma}Y36Al5Vrv#YteyLI<~Ig#37a^g!Oi^oi9bF^;*V1)@6l!~|5C(xb{}K0 zM!=ccuO303Y84~8z1^c03hI*zr15#=7s}U|xvI zcPqf|UdftP2XGcomV zt&diWRdi_H?(N(TH~i@N3Py{eUCVgDkRlziE$+nJJYGwIDyyip2Ocp2+7; z8r3xZNVoRu(DoRgg?5PE8$lMt>=S-7ML$}yAo^C6^ty}B+v?klX2rd7fc|1k?~X8w zp%B9MEF_Hc#7#|Bf?k&s_@2#?vi?I7PCwaqwY5OW`juW5^#>e?hwAnzK=eEbt66)- zU@vA$Zx5tk8T44;H|NM+Lf)8}Kl`%P?kO-M(tUnf#iJM9*)?V1`=PrlzEd`|~XT)JQD{;K8$6mgK zUNOQ^^l6O}FC+Yn+gB+@FH)TW`w?|&=c#gCP5modm(Gvu=e_TxydA+W=2f}5=v!B3 z0?+PqJ37T`Dh%sZ4|&#?5MTw(wR?l0>#e!D68={L(L~KvIybWHWY_ssf12RhKG}V! zYdUtw^qqj*P_yKQU9mDUG>#Q#-1lYuiz-&R%qv{H>zLhisU=@GHLd6e#eC@mC21DI za5RaQ>*kErX!t>!7~&l5qjAsLSDUM3v!Ldrpw=_(LiQTa5$}2rIk1EKo0NSqi|M-? z;o+)6>m5+-818%5n>#(w%p`KYA&E0l^nM1X&LOwY}F($ z`@_?0o`cCo zy=l4-IK9T|^sN=XbwS%c?{)k$%E{BlQzZBH!8|Cj@q%(jIqT?ZXSFYJrY_SFzgDi8 zp0Z;_Ztlf96lP^~dOWp`UB3~T6~AxIoF}Ti0eU1AYrAEADzic73G%j~T6aD&I?Q$$;4BiIL+2Gm*R^WiHOWyq3xe zF3y)T_se43L!BK@=Hx`4@rJctj;~rpQk1QEaxfP=tbIQ7-iT+uS8g9q-@a#s1*=k9 z;NiNr*4~%#qo|a+v&#-2;-1*0?Hmn<(QULwmf4oFqV>-mG>hz2gErkCU+}NW_Z`%1 zRO_znP(35mtUlu_%CYfnGd(ZE^muIgOHcm|rM7%BX9bV)VZ0jzJSlRB-_(3MlDGSS z5R}n27R+~_|_A~_AV+4WW3A<}e!y{j)j#QMb_4Fm#&dPk(rQh(BGY9?2t*5|R1OYzQ z$9VevGkxTa59GS{F>vP`*e(4g#%jm>=#%k>VE%1%qU{l@;uC&*_j+zlT#*PLrP@zd z*4c%|M~l4&QR`ggKc zIasA3xwHO>rrJk_Cx7c?;StyDqHA z0Zzd6&4@gJh56?#F#GBM_EAl|cM%J<&)h$^w;OT}IvLafUb8-NA58Hjy!Fdyoew@x z-D#h=tJv95V%E%D?VYjIe*T^3E?N1xqlNFASQcq8u;= zJcqIG3GkQbInPF3oL8H(TjfI0qI*b0a~%3;+i_-_UFMtL`5E7~#|}JQr*(F%HM_r9 z(-S%s^Z@bj{g5-DZ`vG>-2GPJsEw6HY<8jn@07?XwY`F-}L%z1rI8 zIXFEbDL78cd9P+yBL{ynX>UYA{xrJ79SvaX??A*)6?zit4Xi*2>Fvdi_4Qmoi%m^F zbIC>ZUe%WoY|-Ba?lQf*j#7rswce1Up2AzN`pGN`#DcV z_VO-ow(oZysjEEM39Nc+-n?)pH@>&@i$R{`X+CWFc#Xeim3Mx+3bhB$>Gqk+PEj&C z46UYwHfBvY(Xb_&#qo~kDgy(E$Y^P+2A{x z&t_1hXCa{t-%QnrEw0Xr5t1`KCR%@MV5ba_c{E~MS+h0hI#Wl!!#kgF*p!)X1c=$V zv9fvQj6f|jQbTI*OkUM8KFFP=R(gE;UB1*nj}P-bQvc+|-!4QSOzjlq8qGw+h;NMG zJXq6F$ey{hzxiB&ho_y{oM_LPbz%hVFiIhYs38&sj`rfFmWrP}_qk&yU(}TR@JZL^ z&V=(Q**g6>dD6kybGWC0m2WP58n9#Krp5ZEuY);xvbH%hp%1o5%}Mg9(o@|rB=K4d z^j~Do81#B*;iqKxG^W8(6!AY?xjIJ)B*Su0V9vlU|;>~U7z zOE)X8jY#v^%{F6H=67gj zgS6*cR#>~21t_yiU7qhm_*)KqZvkODidBzon$`yohWP>tLH|~ zgBfCOZp@QC2r5qopX8hn=<_C36-_KgkpCe!`$jTY7t=kbdhi#C(0P=$G6wbGFdM9g zhSt&8N)Pljuaw#~QzURCk?xQz6IQr=Bbwh~cZNC{a#-)6Ow?+?+l@K)@E`lzhvujE zddEF_a`8KEbWhaCxVu}jIXhe;vcC&%jI`lhKb((OyeCF`eZ{4W7+EM2hjShyQ5PE?i*+?SGQ6%xZS z)}^@@b>yNjcEKCnzcJH0OEtVvKIe9MvcdnejNat8F?8CS@D{4p@>q*m%|F*gP}ESP zB@yME7ZrA%8gIbU|y+!}&v8Zi-$A|QuF%-}6ohPwh&<1V3NA0Tj z{oZ{$6db4k4T$dAAC&AI#~$;ee4+ec%NGyc6V((R-L z4(8Iq3D3m~6sh8{6(isHL)`ZpIO_ZOhFsrq^x?EIeuZ57`Z0HB!|zN#sg+%+@mkmX z>m%$#wNhDeUVSrl#>$$Sw>$WW3wd?zQ4gY614J8!`Xm<`rb?15X4d*#ed;Szt2v2R zV_nAlmO(S1_uGbkLN79Ay{FvU863ys`cxGTkdwcvk|4rcJl z1y=o8jr&Q*6QWmX_O-_jT>JY1Gkgmg0Q^o63?mvi8`2-1j}2=dyZEUplQ>*%mhz+MnHK)wUif zG56UmhxuS!BB$wiCr(fLu9orz?`Z*w&-)WOaxndv%2u*__NnLI zDtc2!Q`)MC&IJ6v%T_hS(uauiZ)WZm!(#^9NphncZTyBi31_X^Y0RtkS?@e-G?lSy z^9}rytrskqwl{!ur zv)905)N>}m+ouI*#3whl;P6RAemV_&lhh*nX)7kjc24R>1O55!xL13g4rpBZ-Abfe zWr1~b#<7()wMZZCIN1dgcaYJ})~Y5r+!LvdK4(b0MG0$Mq0QXB1-{lgdsP56PqpKX zPXK>MnQt;!M~CCitG+`=x_x~%cIV!WU}BsZ`*^*%XMXD4y5bpI!^@0MV+bZMhV_m3 zhFglcOOH|7Ih6O$Aml~1cStD2LuW7}RdyK!YiM3&10;Pq7?ZO4jy^H+dm6os+2H2v z^m%+MHpURsOLw?W7UIe(5=zOZ-t@QvC-}G4u#WY*`qfO{@1RcZwx*UrmvF)q&Roe??D{2 zH(yU~?XpXrL*KV0sC^SYV-!!lCgO=?qt^VMBdNI5F{{wk7W61dBGK;lAPlGbByF_W zI7c+mr>#$9(MkU1V;{HnMG(y3JwMvnv@4Ijh1_D7b7hWtMvzBryKBVwvroeKB?{fe z!Wzdr*Ko^GMGYGAp1PIdzAsnl9G=dUnm7T(gU!3?PJC`X><1XkDcE>isPRje7}7d`|X48pTG0}A0L$e^MBKR`=I{z zznsNo_>lYU!w#~4`xvD|`?ud||NNl*^LPCPc@6mLJC^5z6q?bYu7CT`{qKuoc&{@w z|KmeCI(q*85#N>Gej`yfXZ+j6o{xj!@But)5O+1U_bx^Ej}LsJ@x`%RLHpP5_U45u zzORlOr9DRv>u8PXZ@tIn@DP93*0p({Q(fuY^Y)@OUU{Q4Hs7+*#!4D~mGNx2#qsWV zR)AH<1MsBxD1JQG*x?0ff7GI1&c7e4UlsrFL*JiYctk(OH$VONigW*Ba^?iQ^Xbgt z^BnLR_1Wjqzt1Fo&i*|nyBgn{Z>+?_oQNf;-dj4+#}+T@e125ri{r0}f0gzg#?QFG z(AUXo2F~V=_vrh@bo8PLpLRA+J@2g^PsG)q_w@YHTod`X&OoXxQn7UUiM1+zhCW|_ zv+PsAzqs^n+$YZG>eMklo%BC*HL-`mw~R#KS4(s8*f(C;>1P6d03utjF#H~@em(rF z+Hb*p%Y?W3?DL%h##iXq>(!U0S2%xbettdtH-_Ig_XPO91BTV~wY%S0v0K%rULnuk zI~lsy@vGtgqpIJy{3FE2$Y0ey*`WU4eb)AS!K0OTD8Cl|KMs9SM4z<@;^0A__zZo| z$2&Fs4$tc>{95?mb%JlFQJMZRice7g;ORYm?^ge7bU)wymGJ+(F5kmWuDjUZJzt;K zHE&jT7QRaRb?|=|o3G`7ocf22Uz2-<CqMQhyBXSHb_s_8xyN z;6zdTUp-krtM`-9UjzRihd%H4({Ix2Kfm(sskwIcAK7oNr|4I}|Eu-+3`cMu#C?mL zKX`rpjd$z3V)RF@e+B$^?B6yggCbA;hk3bZv@3mX;al+LjPwW6{e=eqk`}*p^q1+V z0shnh3v&PY_zyatBXh@bo*uPv=Q0~3_0Adiy!(SMsQRmFJ>1{u$i0a7SLAvYfjhh0 z`NhIF*gqTp6TLy|z1c`t^G3@zui}2p!E4>u?!Qk1n2M`^v7}1JmVcd74*U{ruy%)2 zz^=bXvC{jk|L4zNWASWvFr~_kqspVA{A(Y?&MEgVo`Hw@8t=7J|JNsOIP)%*ofBj6 z25XS@F9wNtnZPG@cc#$s^D!TbuaUUN$G00Ko%z=YiNk)wFZNa;zjzuUUH7pY-Rpl= z|K>nz{ncfxVhvpBFJR3$6f+SQKH7)O4N(jlKYR9d^hI3Uh*s2{g$a1reK_HEbAJgE zg`U*+==XcwU_m~>7ddLz6Ch=`EWjekwpScoGk0#DmTB{-C5VGG87ly>M=g#&!30? zBf|F--`K3$=0zwXoFkCgJ;1-9OvKLoCDgk}-eHdi(|>vjfS}cH{ezjP*Y%-*cX<)% zkcUf7PlV^gs`#_;f2a3&cI(^!^`m~6TSrD})V|A=1x72}ir={zeAx4I&BN3`nJClD zu6XYCU$>zST%J%cPZD&c(Wu z;c3JhbBd>~!nkV3Q}@P4kT5U!Ma}$-&lU03emB%3@ypX4bMb@#ar(|~maNuxi5fi6 zP3}Ac-lr?%0VDNaX0?l6t}0lKbrq`_ufkn<>)&X^86LBc2JE?qmQLyS{CWQ8`P;G1 z+}^?(?}^ub%Ph3S*LO+(WL@Na%QrUb$WuWD!#%&Wh-1izQx?HN`<(#ni76;03%{8Y zIkc3aG{P;iyJN}^y|W0#$nnYNmZ#EZ4Ka}oZGVpK=N$NT{otb*Rt;e8$@W=cFR&lL zji=D4C}IF__@$(U9S|{YFo8qtkjD@A(34lhkoCAj(RJus&*6Q$8w-9*4Q5k1ixGk}-)B(BV?N&F=T((#fN`=U|B$Zhrb zpILL4hkF*)V{Ody*N!E(IG86-RoIFaJMM}ZRO}YbM2eN7lLzemr&Z)av;PSo|H&kl ztFZ6QKsCmQx8^+?gQk_zT25?(g)-d5n;5JdcE!LvuttgqxU4();qtpDu_>jb5&HDS zhMq8bcF=)cwdqls^CAyB6P*v_u)>-#|FuRA@KS%Ryli?}SWR_&{Ui+fb`MYyJ)$=E z`BjA&AyIP%jZDAs2{|yvGfzM`i#ggrI7_}s!OgxhcmO@l-U)1 zX`6ypGmaNr*+d$@Sd)F@@gHUZeb?H}QW-<%*O5m8TYmHkP521HM9GC^5DjlRUBOkX z)@%`=TcqJAs<2o4lo6yLRxngbWep^km7Q<|0eLDEwIMS3%9%yYpB!KOKXAA2-{7V%jB zdM>8w=~Tl7pB~qF+~qrg@rNGV=0W~yzuc6Aq3a2Bc*v+HVe&I49INI4uc-;G)LD=* z8_eJ|C*}sdUarf6K9>tL>Vr9mj&1A6*p1sfpqFgE`@svpp(3e|Xk|tY%%}a2D9jap z<^gu`Umruk|4IdV_&P80vcNuYgp!%NY|Gxb|x(DT9^;HST?iN3qUXa+@0>_eDw zKH}|qaF%EGoQVe(@e&!&p&sKK=)nt?a~7CckL(iL#3&t&#_ajAuFM5q!Eaxn0^yX8 zc#Rbc>r-Ex2RMMFcM8z$a$-5eXU7Ph&GiqV`gk?-ND>0{H29OV-*#pA}}kDvjo}#ZO#$ z_NK~W9?;f5X7;$rJQ1i}G_?(Qp?YUf~t5>K`66!TDvL_r@)X*k!-_MxS|f@ZJQ}<8xweQb6?Bkp<|H&4YAAFRDwRBN6_UuW6$8*sd z34aN~YirLa(25QsP)nFh9qE6SD!06zcx$R$P=&h|JxlP59uYdjLRG*n9z0?Xm;NDT z?aD<2*jAFcK4?oMiQM-54ZZDawLR$L8@yp*m(b(lE_S8Go?4L0N@jj~$;#;95OHRBh__|Lp61GUne!W? z`n4l+_$sv-@f$1r#;q3k?BFd?D3Jt@;SfnDD>Z_^eHk6>E?cUGb(i#8sI&9cD<$xRBI8wS@X) zj+uRfnKfw^@@|jhOaIGO)r=LT$>PLg2R0Tl(IevnNx7Ak%3V*zob}Z9iL4y$qstF6 zt(1>~pT%VTh=vskwyZ_j9qPu;f{wXFnaJV8E}T@P6^+KS=5qlqpYp_uEw!0DWTBb! zeB2{Do)V~GEs!;Fb2{o*90+iDiu`Ek@xZ}XX&x^SpLXT=rSPduMiSz81NBGo|1bWAsR;6(-1Lc7#MII~$ zk8sBa&xAIrY5Y+FdfaCgJwa7Fn%FmAlVkO=gBJRcXwOMC6Cf?_>}zv;HtQmRp0E&c zZET#xRt)6{Z7>3Ttb|D4lP4?a!p4kccc^J%+}SdoYK*w9RUanUw=$^SP{uzw@W+hc z2X$V4JXfxunlGe02XYf*CyKgOpHkQQhtF>obOI{g+@L|9q4mwk zn&KSHp1Q38GKDpF;hHQ!HDB78bEO9F;e!T|A@=5Jjv_AYYBi}d=E+6Xymg4M*h`l` zpC&u{HBosAz%1X8fy+v*=Al}-@QSe#>*tRWO#Tdpw#-Ee zn%oz!z7qe&qV>>_6$KITH3*yA2d=`Jk5-#*s%}V zjUeYb>>0_G=zAvQFsGgaDDZW9jLUjAKRsFC@G>jnjl8vwR=YlYc>@**`e z?uN8`(3mmmo3mN>#-k1}jvt;ASyt|%u}q_xEB?^egOI1D%&>@7X(6b6(ZGteTx6`Y z&0S2SFgFIO$2^EF_kB9jrEXSuq}Pu4sBXR1B6d76{)t?1-o;!ErZwcz-`*gF2C4Da zk;kv$9(fU;+^8j8!^ezB_{^`OJ1XZ@IX%Z{a)q#lVtZQpGl(7l-WPu%Mc0jFSL0sU|-j>KW zb&rg-Wd9*1v9Ruo&MpEDT43}7*U;21n&d*4_`>ZB9{I6Qh0AGFW^0}jMGrUp_8rkj zo1E5M^<4D&AsTo!QCIKch~+D<=qrU}pQ6Jun$_fPxSyvY$;~r!>z}7U*y9P>2Pb1L zT5Co7)|1%MU5tVph$DA14!`f8quX3)=R_7?hz7*VHM*hu%UfEe601i2Btr4n2uXzl zc}BhC&OBM_#aQGSL|r3`u6E^xQmr!A19RwIkKFSv{zT;k8eQc&oz_28xXH?{VtwJ1 zFyjI(blDxqMO0|W<}bO^3S42IC3Natr-y0*LAsqfj8z|qj6GLk>^^plo6(hCz^y$! zQNGCKL6dZ4H=0Dl9-pzBwdjuNVMScNTku{%Oyafc-!~Jqa$zYA&dL|^%)!uSE&FCI ztyomU?sR0xtePvla?M@Kob6%EhHDV8{9}$Liji-L=xQ zgI;pUTAKS*iq?owE$9~q?s{w%tXcVtU%DDXHLt5XtipkGHsl>n==fa^_lz1da@gt8 z^5kyTNzWNKYOB=R7ICvXnCcmPReWzhRio^nN2+Q%w$JvdNjUl&(wsZwHZqF z5Hy1{8pG=V6K#w(?4@il4#Qr_SGF;i48m0A(k?a zm(00`Iew^ZJU8b?*q$_2&9u`x4;rE83*YOlD6OX7I-S#m2i8A3-~tlN@zMyVP=}`e__KzL z_Pb*TE_LFCmZh?TN8?qzL`4>Ou7QjQX>Z=kt^e^6`|_~EC8E~9cuu~oT6G&Oe!#_r zSD}psb=!BvU+rZr+xQzE$xYQ)<><%LvFjQdd(hS6TzcG&a8iq|jN8B0qAqg)-Stq> z-KUIbQR-R$MuRknilw?-RlVjZ{My5RF~T1(2XVaxD`W7?_?*BKBt#NR)PZ)Bl!`xS zs}Jjy+4HQ4X5O|c_F0RPbdeC3nTIp}cFE7mIKb7tb{MyA=~3lpH5qZ%3Fj18kAqro zGGh2`X>Y8Z8x(*$gxO>TJb4O zgkm_gt;X45rVYms8_7XZ{LB|J`{O#jO3$5Hz9BW-;2%z)fWP7?m;Q^Ll}5zkC3o3? zpE-Mjm$88s`##Z;Z(TmH1C{f^+*pgyQ^MYy74_+*{OGJN813kBCO2BMfsD4KxYj%A zXmSllCm<S1BjnZC#MdYk+@MBKwA}-$S!sQ#ix~dnkO$u~99e6B1c^NL`idy9K z69mzmZEYrp&+sK_-b9GGIvPcjl{sU#42f-eT(u|4M9RKW+?|K7ctPD-UCW(!onZ*U<%CE+xcT|Cr~Mbno(~8w80BT*v}QTAf-UqE13+ zGwL<^yO4t$EU9as2WVlgjB?-(j~%C+LJM=PsvA!`U+$|<9(I{sqfLV`t6LaL+4WX5Nwc0Acc%&+g@z}R~bSbJVV3l1-0srT6XiKab~8LzDtk-

    O9NEJ*A2OnMP_O}anq6r#s@M&$QLvj%=H<=5 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ⅅ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�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 diff --git a/lib/net45/ServiceStack.Client.dll b/lib/net45/ServiceStack.Client.dll deleted file mode 100644 index 4fb8315012ec9c0f93b792119227237644713b14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200704 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⋘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�%C5?rE7et+kkG)0IM|O;-w;_A4=$ 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 Hm1f`*o0msO diff --git a/lib/net45/ServiceStack.Common.dll b/lib/net45/ServiceStack.Common.dll deleted file mode 100644 index ef554e5b9e272e5f901a3dd1b41607550b761623..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 477184 zcmb513w#vS+5acAo7v570&F%UK!7A*VAxH#MeZUXA|fIpA~z8b(E{p7R%#Iwp_E!* zMT?YDuoQt(O0BgPDWz7aQc5Yc-fF2uq0~}eYOSTd)W5G4{=eUu-DLO2_VV)4oipEg z&Uv2moabET%soH`09m>yPEQ+@|V>ZLFt@Uaa{+!Idx8 zT>Gg7sp>l#y;~aR-c~(t?(MgGcUIpxzq)bB?bQozufBBR;aE9}$nU5|7%(sOXMtac`C`*ssJ{NTUGa2@a~A$Ufp84kqYDd@+|q@ zch3LJojCu&Md^C6uCP1%Up1`i-I!{e2WV_#-C5C*IA;AD3DUc9{;eJaX{!aBO<9+n zCwEC!Hj`XKzv3Tlv#mnwi!^+A&HxTjx^V!=j$N3;jxu_Cl74x3On_QzOi7;;6NK+{Dy zI;r9KY`Pd9wsY2jPa>(2_;BIrq_d2if70Y zV89!VWNoo`DGuS1W04T-a?uqdZ^A0yrl8d`>D$!J4x}!_HNX6T1+@&rSZXXFT8r+9 zCM!e6J;hF`?Kg_;Hwq#v67n7JmQfV)9pEHTuQNNo@LrU%Q5kCh`* z#-Yd_6~)sdp7VwuW2k5Uz8=={f}5Quv}r#%JxVo)@*&vcF~EF>9cG6v$h59br4zLi~Qbhj^-Nh za~d$!7{DtYx=PX%nw#-rJNMj=V^ola#O(TLBck+<)O4KRZ9i0RS0vmSNP9E!QQxy7 zVn@r1lNF)x#uBG4QWPlnuE&LBL3t!xF|9ZpdT2raw>fr{yR*O(9Ai47>}WbplEqGF zql+%)gwSds2jYK8bhFFca@PAAyS`nZw%+N{h&*W<5)17IIUt>X#Woos=|IN40qW|~ zxqG(cwi5{yj#19(!LUM~wJnTH9D8HFCX7ILMC|&IldiHE(CTAOBSPQ~cQ#5*&B4dr zeo5%-NtW~Inyed!^2-X({f|zsyK^N{yCSDDo zvmijyff{Ho$#lqKB+fc7vO}g&cI|Rrap9w6qO0v<9*ZP;rw{_pa`d%e;yU&^G-0OK zx$s6ZaXab#Su}|ZW!|Tm`y2Mls6l~=6ZbBViq)7^3u?=oF>VC6x^PdD!(B45uvM^e z4I_Ffq?c0)rYyr45kxNvG?@ed;@bx%0f4CVfk^-$Mtoorag5X7gg-HC#exxxEO(>$ zXfjBzBOI6E%<0#zw7_xiL2{higwOilw_NEKYTN>&9JiT*4RObuy7%I2T0}}I*HYwq zmX_s43kJHN6P)g@z?u75ejrjE2kVre1ut4QV38PCrgYnH}iI^jd@^N0Yrnres}< z9N}6d+jY4MkDtrJ!}nE*HFT`6FEbnsw7suDO~4%us}nP-&Zd5e(W};OD&?3KXez_O zZ|9&j4fbKy#XPjZ)Oo1mZKR2zy1tgbU_92dI8av;XgrFb3we*?qW4vNG!_YU?TO;<@$sJGpb#%b? zHnZ$<$1EG_N_cC5iK*q*A{{TbRTO22;MUdL$IL}0|30R-U55$7Pj|IbkKqEw41e9w zi8|^FaHD~73+>&;@wOrn4TOx=bbbDmTOSPPHda8LYBO!@ulp<0WtC&S$L3<^(Xv$u#s7g@?)jF)qQYgj0#wnKt~s&!@tQ%_?_MMzQv-GWg+izB#NCt z*!wnBJb{mN4gQc_19n`${Bo;$V5SZMYaGh&ny-8~-Y*|L!!Q3k=anA|EkUO%C@HFQ ziZVAYC@)J7=0!hV2IE)-J*g*A%6b0BIBz26ySSLo|E>2!t^O}C>!51d?xAZxg z?65;%{S~z4LKcq9xesqydP* z;O)kh`t0S}F)r84yz(lJ-Jy>~f1kzhrfUxpXPqD5GhH;Vw6nAJ1_FK;&GfCtbl*z5 zr?5O;c5$O##!Y# z+HN=P;~~(5nqo1;IS(_xbph&}dLAfZ*J16!ppPcoXPONo3g#vZiZ9?Z?b)|;Jj;0T zb+)r=`nCG=a`0M~z2B6bF1UMUtPOiV0WWb%1MUGNaQG<>-a&k%)x4go#@A6|^-1p^ z^tO4++Wa$QNTkz;nC86^*6daf=(f!)=r5?epW|x8d8n?9Q@+uy!EA=9(+*)y;c_c+ znJ?=e#!2cI+2lo>xW6PZ_n)wk_mL?3C9sIodHNU!2rD#J*II@D$E1(*aU8rHANF?4 z!36;m)+RYSE6okH?M~};CNtNWHrGR~*O|;*XWCp3w_ay5bDe2iZ!E$Rz^|aWzx8jh zUxxj6n>u0Dm9I`VFve2r8vM^@<`F}^mAv}A3gxRrKEv}F`>zdTdt$)(XZCRj{WSi+ zD1DrcWAe`P?3?o-UA3KK-}&Coy(q5Ey(oU3^B{p=?7wg_>wxj&pVgrnm+r>@^evCq z-LI<3HPd1@Y5)^=HxjYs<|db8BsdZI+x{ zYdbXdM96Ke?HJfv+o^GqNmm9vOe&GB?rZoAnzbmRisKOHT-Wp|4nL7(zufiRv6^Du z>zTy?m$dmJ7lo!`J%FxSFOxfa5xw2l2nS=}=>-g0}Z zjZLr-Zo+uu`)0D(=+7Sc%nM@Q`qKZ4ZQHYLD=qXZj0w}ZC^@kg$B39Dq zL9C4m+~0zyj^g8P#ENa!L3Kt?S=5wLoNVuFdJ{6oE|2<}j#(L9zc*6h^K~7{uPc;# zi^@3Qan51pB1}>4LY~~pk4Ai8t_!l? zSoJW;Jq{V{N}eqr4=vvBaF#lO4?N6p?}Tu~@qT|^DZGG+^4^`3R}BBz<$dh{HX(1P zmbZ~3QnApf8ZrCEz`_~9h3+3f79?)2y2+SdU40cErqS}MuFH+Zx7$l5KtH#~oZ9;0 z9`+JQ6u6(EqA%NZZEg1?O7Q-OkE)8^b{Xbhf-I>k?D{}i(y`rl$gf0h)U$wVa;rD( z<32X`E3s2V2{WN38t+5cr2HAp-(Q7KtUi=)EkB*aXj6dYY-tb2D01BY&KSTpXB*GP zu`lzcEio2ejcm18Ete%yr;s7)cz>e$ckxl2>>Bp|j6_MO$a|0UCVUie-_7y^zZ)MwE8>t(YuI&3LENip+uQ;u1Uy&Y!vmCM&9S*f| zmIP3v+IV4I7@Iqo%aa*@V=gbKjn)kad4EG0ZUrti{|{1TnSTa}v(De~nfj1yIj^`K zAd^#u@knu9->~sS^G6irU4ozef0_Mblbu)Gj+z}iE(NtEb&HF*^TyA!nUCcH~ z4^w-@!+aenIfh{5;Ovi6uGMCsHIn1hbuXhQ+x|ZFD=2a~bwG~xVobGg^MUw!6IUv* zWfN_V;&RAL&Y|=c5q9uf%7s|ODr31E=i4DaLNsQ#K0~RZQ(1N|T)WVejh-5b9P65| z=$2b(qatlPo&y%O>cIGJ4L~_A)~#3$R0hoe=y(yF1{U^SPLM#EcQL;>j=WZYY|Zc$_v z`ejJe)(3lFV65;ek-g0Aj89{47bNo9n-xP{DO{d5t134`npWph|9;LW$I_q43&n*9!Z}e(G$~Q({ zF3&V(ht)|0Ty1%)Ml3U(tzHiZwz9?phzRqPCEEBllFe9t;_(cE2w6j0UDuoz*DeZ;J4&T%(tj=d@O*~a%_V%9Lu*~06COSX%dE|R#x2-s#8F+AXN&eJ{N%fakp zMpxvY7UlR^;QvBvGx7{!9`9ag>eMG{cdF{^^@FN*mfaW%Sa&o=@!|D1L=21AsRCYFy!~QTVYB&Ct%*j@poAH zEZxQ)9m)z==+3#aG3@7gL!mNT_+9htgl&Qd;Z1AIP7O=fGmZ>+q2eND8IBKAJG=iW zf1QWO68Tamka_Z>XmP!&IgTI_78 zg>OW@;tKc+W#-u0cCqq??_WeYU|KY*}m*T`5!;j1GQIfo{$Qz49Jcy;k<;1?JU2r-Mr*&mc`a&9bSAZ7zPk(-LEYiAT z-|`m8hGT&qxSQtOkL8q&9pI7k{P7iN`PJ9K43&l$E*PMiso{ zI5TUNHIT!aCf3$+m!TVQUEkI!_aB%?oT|S4$2e6(`i^YA3Z>ZIM0^&9tC45T~DL-Mg?~Ae;<@7c4ZJC%D&!=WOiMUJY5iyzwArdEEC_E$dzARLyMYV3!7cTVlZ+ zV>sRP<8<>N%xHb*jZaGI#{2ccgo0r|nYf|(8kCJC$~RG!)MTW+Yw>~k%W(e$Hqs9R zaU8?;xd_iHBY`?>t(PKI9`L3hi{o92lO9gvYQ%DxHwY)GB_X`&V5go(Ix*Bv+vt8L z9h>Zn7)yQM!mSO)tpVSmMkk-P>2<#k!}I2!{|Flou)l{w(F>mDq0s$44{d_(bLLp+ z{@5HH_XTq-axpODdc^&qIY!+dnPZ%bLhz9L6LSo62N~yO?(fX8*!{UVmbkw#$2Q!= z#r3xC%jVe5ebpRe+#dih<<^5kAD9FHW)vTo z1OTQWAD9F{`wTD%fbtA52>{%S`B_W?05@JfFbM#RzdkStfKC};5&)GMU=jf67Je3! z0KlD)4@?4}YX+DEKvf2q1VD8Lm;?akJiiQ+0O*zhCINtv&6h9<08D#6FbM#xkbGbg z09Y#dz$5?=`aUoT05=0n0sv#JFJTe@7{7dA5&)P5d|(m)bs1n10QDJQ5&*b`@w1o& zK%WdS34p#CU=jf6#(ox)0O+3qCINt1#g{M%fD1FgB(|n|Na{NDQMaG~@tDGfScJEo zNKRw&Tsk_jw)KlL2^2Lj155${)2}aK5&&2?`oJUruqgC_NdOGZ0FwZ~^2e7j2@FI_ zI7;EdMVSjG0f5DZFKH407iWM;0F1~0lK>c*0VV-}iO(;?BmgkO_`oCpFtq!?Bmgjm z`@kdsFzETfBmgeU0FwY1n*k;PaCrup1i-iqFbRMwGQcDN#%F*@09=^?CIK)Z155(o zsthm*fQcDk5&&0cfJp#M$^etN!FF-4>NGx#G23==2kV&EI(Wa4X_ad-8B78tOwIt4 z0Jt^-Od>1ml*|Q_faG-{+=7LE;^7;%g z34mD{U=jc~WPnLzl{Gta!6YC#Cj(3ZU~UGO1i+0MU=jfHGQcDNZpr|Y0GOWvCIN7B z2ABlEEg4`E0H4YLlK@zd0VV;kFat~iU{MB`1i-BsU=jegWq?Tl+@1j@0pMkTNdVlD z0Va{bD4!|hG z=SR37OU(qt7TNVUlrJn!rnjR)W{anocVXec!v25q3mf_H$ndQ*oLgrmke}-im~Wx) z#!}~S!xwSd1e-3zEuUjI4d5ZrG!TcvI;YUTrCY{}^~H{}jF*k5I}3X8B>}8hoYW0S zSKZ`(9{s5YSV4vb4Qf+Z7i!~|l(-?YfZ?O()NJHyx|4o^f6VbR|LD!Z71!m8ZJUie+u%#?t5F3|v5SzwE0`bC4JZM0r?LLa>CQUp04;jtl!_=ps>TcerP!}dEzQYtt*=RewTii6rkAuNH1e=E7 z;G5_yGw7@nU?VR;8QwyC*olkNRS2ffXV|T~AjW?G887rO{xH6ne*te1a@S1>c(<~s z+wf6;xqtF9+tA;Ey`3`s(zrAice33_;GJ{7plfeX#UP#3cY zJ`{CE^#)aDDyu#OClg$_9%7iGBGBUj4_BKI4zrBW%ub|(;X}?{J>*zltctETp zPt$Owmyx*K*|clVhBm_Qglk_A_}KAzWML-i51mm5uR2 zymxF$GmYxMh+x{X*82=ZP*{Y8EoEW-P)>1}-<3(06uEZ;g?Ov$E<-A7Z}T3U>i#(2 zZ?VlgotU2yyPrnv`k!7C#Jy&GM3S|RcP|ormw!2q<~=riX{Pn9SO2EdzhTCGY3tT3 zp535-+j#P3_sQIcR$GRRV+~-^E)C!c{#13VrKFg#rCbg1D_M7zVogH%C z=Wx*vxy!O5(OU(a_O<)T(SxjBk*b38yx{QgN>unLN$9!%SUfl6$7sKpkOFSlf|#Ykk? zV$LxIJxq;!KbirR=)otSUu5bM+q_L(RaaK-ejDM4`~N~~VbHR$5R0YOKqOLzJr>gy zv9IVP%1g@QLAC^yr?`L9lR;PZ(o@A?&EDr+r*;&#zDL| zR_y)&H_$^r4S}M%cCq5BZX*{WU0yPH9uBc!T@0+}$m_`B!NFG%78*EbBsS#$3kMG& zbn41t#nt_*u?^MBaA$B0IdTtZ!*Y9fWV&~!WM3TT^zM|F?%gq2RZ%kdjE#4sq2N7p zEF65&9G$^$;Rqw&!R>q9ow4FTL$6r0Vp_V6eQwODRK+yETE6sUu_Ek{psFh{Oqo~v z<84dZo-Idr_ct%NHR{Bo#jzrOhtct0zzjP${Sy4=#M`~~cPK9$g69{k#?XAh!D~-p%8mby+L(GmvtNOcNM#k2coc)Ku zG&LNHhST3eSkJQa7~9rj1rE%Mdtadzd{^g=#yWhMt@6hHJf*$< zDJ2^Rwp_gkDYHN~(T6eS3B+EHSW(Esh~_|PY42bxmPDO8OpixtNbz87vC=he!|fG# zeEFYM!sJACU5v|-cv-A0tt#F=qpP&cL~v<)bC@1SBgV?7Wpo}!?}W}?4HXD>Q&_CX z4toP&Wbxqd@M5U0Hw5Y$@MRixY6V&suEu4DL0!-PurirwN%u8V z9u{w<9nQ8#*j2_lB#VM*cJEQvwWPGf{VEc5Q6x5zgp*~=!m6c1dc>4}oI6Lm!|7m% zM`96|0l}FUU#<(6MvPmgA#T%GBnbStP6zeZn5iYGkJZLIHeP~;w!>AC=?KQnxa@!D zEFqkNG}kzVv~e@pA0R zXOBeX@o;&(Xz;TT%kb9_k`l33`+ox$&rMyh&^JZ3IK(izO9 z2^9}$z-PDKWAWM3f722xW%CjmZbYo@>Hjg18|mJC2XFL~b9#41mSw$rrmNLEHh4L% zR78{aR1_yaQ&Ez<6Qg6&^Q)D-#Wy-R+czmW6(d6!@sKls6g#nEKg#h`1fkYHpHNAx z#1AaQNQsdSIFoF&(PIdNM2tC$*cVL9jTmtD+&Nr#x9}p?mWAe>+!$(u*S|aT5AkzW zUAxA6IJ6Xo@Z4c5;|WhL%Itu%F#rc{Oh2}BI^ZjJd};iT>F-+{ zcN>b}%oZMu)sJPz!rs?OP}}l;qhdu>*Eb9UteEa&bQjDx2#>06!|+sre(pI84;rjw zdnD%!!&5&n6Fb9tA??(;D5KlRF653K3&z5D0VNikZXP0f+o7sQd1UZev_{B?_8j>) zw%I=ujha{p8__u<5B@9B;=$j<U??Y3nA;lz879+MasiHWdZUR< z2@NysSRo>z(6=7r3MROK`yGtreobOw)Gdr{WCRiD zAOh`*61W&q6bt)LWk=kJP=GS;8*GaZ^n`NsIPMNy!1ojVX*Je-H=AHoYTw8|OX@Wj&JJoW^=YpfBMR#S2Rd8yf()ri%E~e~x6HGWUP9MW^FG+W4&9 zI0WL2!&wN1k4WQKo{rC)CT7^2A|qzTZJg4Av9g1|@skM6OIc++{`fxJpL&v7zsn2e z9&k14eT}L2Q(zU|_jq|1KI*$PFJnIMX`J9Y{=0GD!($)dK>3coJVo%dhonPm33ZiD zHD1uMT0WSjF`I@jIZqd5XUTHZ2j^!7>j?YXK=B$s%PVT zR`y5cq+8>n)|2ZS7q^_0H{R8f?$X%QlJ45LvL#(r+<1TMNu=@N){~OPb*(2wjgPjT zL>sqcPL?ws8h7BdYYMYWWH~+F_)hCNgD&+P4Q(t5TX$4Hk6O?ljf2)`-W#}e)oIE(OG0#k&K3%sB3+X6QeJ|S>7 z;dcZcCVW!h3BoEd{xsop0t=&nnQDPnoC$Ha53TK zqG%bRC#|`f@D70+2(OUr+X=@D+yz+GGrQ5Br`X);T+2@osy!bNs+OW+K=npP!js~n zUWC_*J;MO264~~QrI@OoN;pCCE+X77TAB#o7WgpXPXulv{DZ*92^&Pw^Mo<+`74B1 zisU;5)PN_eF$F^IF_(n;B3No#H8B@pB2e_37zh_+Sd>k3fz_t z?j_tUk_QRDFYqlwb;x^!F_|wuBJ3xyunk~W@lt!j0aBx$`QWg8a3bM%rBlx%)HX^H z*45;CX;nVBnedT7uH+Mh-xK%@;Xo<#5aF#-qqhiO5codf`?a}>0&M~Ji)4F3ZgFP! zqh5ps0!I+?hA3MScXx;ofwvJB_Q;i7LHMkgw4HF5zypMQ;W%5-QNriN`1c5ZEHKax zutXZJJ>k0o8wkH8+9wh|Ezl!;PT+dN7XkBDSZ3~-IWj)ZFk z_9Fa(z#)KD!?XQ1hGKKYMbio26A#})*iJg;62k40eMLUFmhfjHxt;KkxP1@dRI&UZ z;dKI!5Ka;J4q-ci9}-?GFjNXSSzra>H3EAQ77H9ic(uSWgxqS%cJgGxn+47zyh&h+ zaK6BmgmnVf5-t$9jqnzMy9hrea6jRN0$(HCENyg(@M{7;A$&|=JPtTZ%Ir>fy}$;- znF2=>b`Ut3aE8EngwqA42&V~LNmwRuE#V}ATL^7|PZHiLa3A3!fiDp*6nLEQB7yG{ z&J%c!@J4}c%K+yJtRlQXU?0Lc0!I+e7C4dc27$8)I}5}wOq{>8SV8z3J2$-7VEm) zXu_)`;3pA&N5;vygcC(_alY&;^GU8FbYu;`gD@m;FX5}A=m23afv*r=Dt5k2I8NY4 zgyRK9%K^s<>_RwFU?0LUvMiZJs3t8U93`H|8=7}iAGCAZ=mEldDRVR71kwH^VX=7W zdBPHbuMu*CGdpZf622qwLqhJWXG?}E0E+}x5cU<%Ckd|K1}#M=?L2hw@UV>2=@p)lnLUqV~!gdm$ZxFsO@Lj?e zq|9@K{YCqLPJmsibE`R@u%p2H3Fpb(!G?VBNy0&*XdhtJ&}?VEM6o-?@)Lx*WAH&f z7^*~pb=d`0kc`YGy+Eo9#F9aT9R!ZcCpnMMmSDr1KcAGVIRqU zkg&JFH}b(x2-T!$XTWxny-PkgfN-Zo_2_(X5@ChZeIB81mFytgEs}c(`-nphnlfdO zIYRi7NS-8oMc^62mjwp80KO_PPWZk!q&wkY=@f$q2M8Qbcuca-Bs?x~5#jfx?oEWl zrOY*iuSxbzgb9H=2``r#?IYCPuvZ8#6Uny;uMl{KaJ483bp;$Fk`;t%QZ3;gspcTU zi=>+43DtGC5UT4|68=(5+Ccb{z+Hr2m!LgBsGfg^Q0T>_N3XVViHSVg#BYSf4D z1%V?7^+Dcz!Z)Ph?jzLJ+zVJWC%b)*Q|wL2Ti6ZoC*qBGK8WXA=SvPFyjd0xSl^rv zZz1GM4A~~72sIMc622vF-$D2{v2zdMhf*eXRL_U66CRZ8XY#>NcSzb2#_b8O5!juu ztBe%`2ulQx1+2OtyW-O+rrwxOsExar@XhL6zpW&^TB@^_aFW2C`6Txd4i?GR3CjeY zBHSXd-~vE>41w*`^VdI<3ALJw2zBUtnDAxk0=o!*CGZ5H4t)i+fd5ZcAoYa*D-b(D zcT|5Q5IekBY>1*ggx{39zd`tlNPa~4y1<$qfVGl+9HEZza|zWUOY=#tA&kqA@+9FI z(f&GNOghnfggTtI?FpzOQUjrmNYe?g7VWDDZxHwd;j?1WON7^n(S_R*2+I!m%~E5weT$8nJUf;YM-Yi-bRuY91&2Z-J)? zzbx55A^eKKwn@MZ0y`3h#iV+|ccjaVCX7psCK9fbGG`L57kC?Csd%Z$lqnFuql3OF zCT+?GcM*Op{pgK+lJ62eE|MMV00Y&zZPb%6C~yd2p}_HkSBUXb3C9bZM`%m-#e^M1 zas^>Wfolk{bym$TR`s-enwOm z^aeaBZm%F*EU+ixWYIo|u&-zzLx`J(91l+>)HUHe!jzb_m{99}FX4J=wFe0I2wYG2 zvX!fS8{uCCK1s+gVPr3TpCx=(;9gcrzMu$u5vfg1=%%5Bl(gn^H9>-a38CGbVUpuppV1p?nE{D%xv6@3Bq zJ&Lh_RX1llb1KDd6C>vn+M;C%;Zvez72zW?@~kDaq=B~QgL?>nC6WgS-;i*9ov@!o z`}>3?B3alE@L3713c|^fy%*t+L~-3M4t_<3pfZG>G#`)h@34DXFv%ph?{H8~Cm-&b=E}gxw z0kA<}jIdg=R}t0-tS7|oNRFaGg!2WCB79KlK7sJ4NKVg}eLkToN)a|onfK>|>j<$* z&9QSk;c|g{2tO(c=I&%}D#^C`%>=EXK+}nf^Y0A_2B+n5( zB-+~!1pK1FD!{6XvwM0kifL%^3q84F4HVlUrHvxw&unKGIEnCx)MYN=I#~y%2=9^X z_Yvy2x0&!WlKm+{RkWW_o9rl|jwfdbwRMUH0ct~35^7jB<`L=) zzL+p7ExwX4A^mh6;S~aR5b7@CZo)4~nfnPZ7k?fhd_pAO0j#g#7O5>AwAo+KPCc78~x&+LkZ0={VFYOf@GPhdUaJSlS!;V(sUEa6`SP9^Lh zy+9*c&rbKdg!d_Bl17ZJyTsub-HVB+ds5P2Jm=MX^2$KSv@?~F5sMXv- z*sdnmq-XPGe~qx8D0-W4k2vHs;ck&ExCl@mg0v^p?Y=6)LNTcyVOLQ!itsJ*{8U1< za{*zUWM4v<6u5%$hXU6UULYpz%$I#%zU;3Pz940OK!}~@oFS-aIN(JByAaN+&XpWN zc%#6%gay)%Ji7y=j*bKzBHFtU4i(sk@M#&=#t@cDnNtZL71u2wd`93h!avCawfhPGTi|-a zHKKh-KFPg=t7Nb`K&W;eCwyGO`+dT%NsT@sd|6<06yO&Hb|n0Rz+Qw^V*GHzE&?YK z>H=~u;p0+fiV)98bB3T*geid=2)9c1$4!~yr9Fg|lKl{2M}bEPpOEaQ^1+V?+er4J zO8|=nb|h?+cJBpPwJiIlV;ITIY%+lv@f0`56|)E*7Py#jwZK(`!wYh=uP3}%;7-C} z0-qtgNZ^Zv;qJL*z6F?Dmv<>vDgE?A!eIgfqX7qsDqt_DZYa!zZe}n{c1l`5NIgk^GQQ+bDK9;58zNABV*FBZJ{^!rzLW z;|R6OOd-_HHIJ}K%3PWct|I)VNUkHq+Zj2o+d;TO;4_3P1-?S4#vdnKE0U)Pb+(O; z1N^nry^2uF97L$Do0L!TE<*LvdcseOqFwpmLBcI!{9A;LlKnKHdOm(d9?2x(JrWGV z33U*dNT_yBCtM>Y%_qE3%1jaJ7_yR3<8v+HLdm|J@N@Dgb2nj;%rg54rwe?A@HgV6 zql60uo+Q)}>qmG-vQHw^ zw?-G|lUzfHcNKHSkY@<>{nC^9B->7a3{3=VBa6&9;Xd(CcS3wmA}3%55bB-R zXu|J`izeoSGYNHwUO>27nrtcI!vgOI%)MDyPq7YS?;_Mi*L{Tg+av1`& zWz6ZG4-O*4Ys)zf8BO>Njn#Z`F5wQ5#9#e5e__0iaJxu8PWT=1{Ii6;q>Wx8>@3st zQNoJ^zC&0hf&C%jP>GPxHGnk&dlJr;?4t=A#Q2$nJq6xExLexjF2e4jXeD6o?`W-~ z*k7gMI|%hFG>q*5vqq56J9LYR}y|zcGXrB{z%|@!XHTXC-T8(2}2_JBH`$Q+^%t)@KS-N3H4X_ z&Jm82GNac5-XZ?%NH|_3dl8NkMMDe}$q9tF%Lp(lA6!h>ULy8B!p9_H*AeQ2(d~r# zU~~`RXsOWw!m(of5yHy_o+2D0@MFTu1eQ!;nNs&Igtv+I2Et1Ojw0+LW5oo*;R2@< z#wENL5Y7?pDZ&e6@LWZBq$W3P))B53xIG`-OQ`Sn9wLm2NoVrGs_XJdj?D+}BD_&* zbUz{gmP_{h_$c8eBKbJsB7tuZ>Kfo6D&m(UZ*1Nq=<`LdrN{H4UqX~ORaESLuPHwpL{ zVN|qN68=MAPs0BdI3Qp4QG^lcFB1u82%JUuqS$#G;YNW?gtZde4-lTW^+9-t*tv~R z6+KI+ijEMfKR+f^e^yNgR7LfKYSM5*-8q?(56&aJU5rl=>ORB0gm;SM!-U$i9?e(g z4#Gc4_C17u7I-LMnMVjO5XqB-bEJ(vB7Drs9V@D40O}M|Pxxnv&mn~0mh58)bx@i| zc$=7nzsQC~h`^nMMFRH|>d^fLp^j-E5$d=Un+d4BI7z5O&_qHVtd>>ZANM`Lb^({7{VFOZazzFA{1fo+i{S z?#fw!8lU3`wad&R)V_(ov4=M#Mf)Z~?J|1_wZonu)E;+^P+w|oxB*c2RA&+vi}pqN z;Jt)rMRG0SCjxg6E*H3;@JZ=MrwD&1k{xFQs!5{=-xbMQ2w#>Ne=XsABDtUNVS(=u z{$61FIe=djIGpfpfga&!1>Q&a1%W#WR|q^n_+4?xyM!l1vT`oqy#hxOt`sPXw2P=~dC`QSLhPo(ZM32iZH5n-7~-b<(f_5h*A z(k4QUy2tZne?fJ^wN2s2EiBO&VHsLC<^EBa4#m<8HfcJ}Jj8OY~Z9d82 zgj(iQLY=ke6TTwLn7as13%s9DC#m&>Iz{dw)Ydp*}lXLbzA5uOeJ0iq;WcE1|fV&=tv@gwIGD?IoNg*$)t2D3Y(| zgQp0;B?0y!;SU8CE&}|%m{dV{ooKHmoGNe#;Y@*J2=&)iCladhvj~49CV7PaPv8o| zuZW!w6TU8zTL{kx+(kG@>^wlYUdlW|I8Y?tBmA|L`7z<&1s2^3IJ|pqm+45T{ivSs zm`IKxd|KdK!Z!u3BCHkT*ARYROxm1JayQ`zQq6;edS`KjQ12{G=7S#-R>_bax(#rI zz&K!4ZT4hTOVT@=3}VK<)w!M=N4Q;TJ(aMZNG>A$Mj$u)U4%asxRUU7foll$vD7xg zHuAt_7vW=){aL~v3p_~pD>42!;jcyVT|)hK+b4u=r2EHi&m-9#uqv7D%zhN>F3mlb z@M~hvRKji|xrne#B%26pMe>=6TBJ3&fbiV8#6Y4i2D?PyW zlD!{cM{(u|!fj&bM8anz`*gy)#Ub+u_lV?T!h1w=1tEU?DQ7*lnow`IHxR0#9fYdr zc|uk6R=(^X5UQg19eJ`3Cu|nuXAx?4k8rQl=mEmr0=E$Ux0JbuP!$~}Y>-;35*klr8#N|^-G!!gq@^wjUt>X*(Vd0 zh@?kYE@870uxdnhqpzjdY^lx;ign8t+kGC{&x}V!>1%|;rL+@-*B0bD=L5ni0t-`s zog{mE!dhRN%qBr z`b)4Y2!AYfUqg7SWZy=(Mdqm|O_>6pAv`Vc5TTB`rwMi3i+%=BN61=2l^j8+gW+t# zpGb`!Ak>lP2}11!hY8=2ZhnSvmN=wpDc}pDXf)vzk-Uvi8}2?rZH^}hwK-lQ)Ea$2 z_zTfqc{ku8fujg@fSpgcRpN6Qp}vy(DB(=0(X)iVknAT2cL^+52B?oddlKrl?Igm9 zqG&1M^#V5&J}1@OM|iDBo+MO%7Tg0kStPp?{?^VNZTcBWsnJA2ZI0Q5+8iEXTUmxJ zBYaAF@#=hV2jO32ZMKK-J&DhQglEMeM+h~N-y!_G)cr$39RLfP0DFt}3c>*blZ1Cj znd1PfdS%apQz`Z(5nDi5Dh1w4sA2ptp{^t!CmbpsewI*2{=sb& zoKcY51r8F<6!-?Aey`ya;g6&#KOkHtb^nC$2O=507jTX!>OweIU?0LJDRTtj(^BSm zLVdnDmGA~Ba{=LOfy)T57x)0-EP;;_{!p|(PWXL+dkIg8@rMcHB6)&P-=;WCSR<>i zPY6c|ELskDKonIFZV}j%@Mh6Ih_F_|W*p&fYH}lFI-!0qX+b{NM7Trlk{$r88kRj! zY@ir^yFF*e=5fMuvHbab@D;*=GD03F)SurxP3XxUW5Ei*UgFF+;W&Y{gs#8_!pjAY zB3vten@9LXfvX6+OEn)Q)cxmY2z5ntoN$el`3d0@;`XA?0&bHdL6YZ}PULcaE2pc67 zKOxkHD_IHHLCWk!s6ji9ut5~fB>aOYT1=?HaIb;gb9=|bgx``fA0_;@z@7QvUcx#F z+QWob3VaK&s!w)rJw>sfh~*y=ju0b@J_k5Qx?5#F*g&WOKZ*Qd_-VqRUXMMgep0RaEmMDYlOxi^FyudYthXrmS{4Xi_)M|c0sK&>?0I1bW z5~}1_LbY=?q1I?A;XyI}0m9b>ZX$e5;FE;9nthf~SF=Y5b&dK#zU)Q!LsHkMy$Ch? zWI|mKrt)Q9MX1ZsErhxp-9xC$(H99-(FsD`(fW`uCJ_?&uRO3V;X>(LT?k*1?7ax} z1;PP@du0tXn(%u9ClT%vIGgY}Y0brizY(~K@TUUT65c0vZXx`MNbV+7;}7S{{x0Dm zS*D&NJR)Vr9{^k?ovSC|3nDp;@D~Ed6Fwlu&m{b@NP2|Y94iR5Mr#SxAv+1xb2_36@^lhGv~xYbhj6r1 z^A*A|0zV*BJ4+r0JR;h=5I!c^`w;e%J~)Q3ufVB<^^$!)p?(K8Mfi1*yq9pG1lStF z)1qh_;co@*A=J%;1B4e!YaSu&R+H<`ck;mx33todwd9L{`gi4$g!-!&;|QOYYAzzY zUf@bX-6Y&bsGEcb3I8l6y^*iXcL;}ymp&oXuHAkO;1H4QMfjo&i9-m7iR1*r-%G>I zBkUmq%VNUI1l~&+75FgWOo5vTZ?kBueoctQ$*QDJ)B796>%_D%nmEO@n z_`d?j5N?+2lL=oDIG0d&Y&^no;^b9?ZKUq&2yYO$o$%Iz+(_O-c$>gOgh$2rHwZr# zc#5#QC^|zpT42Fizyngv7~vhFy*uGzfddF{m%5K3Y!*0`@C~tZ0pUjiml4jB?DrGu zPxfsfd`^ttNw{1(*IvTT65faN!4rgSMe+l}|0iVzz67{X91H|=0CRsx zY7E7Wi|W~gy9G88z9n!Q;eP2ay9gf=c$lzJj66!168J8m2K+ff?HciQc_e!hmP%8O zBGiz(g>YR>ZZB9#_`1N&`6Qnq)Hpm!s4?>~p~g&?F9WKV>IwC$B@+qtXDd>KuLg3B zUqN_4;KTVOHxq6b$zA!fA2gEEnnw&2FP$d*nZW3Jz%CLtUGl*O!Zso~hVb@++-goC z^aRc)#2*LFS!XUG{HqwhittmCeLdjXCDeC3 z4ioB=f)j+gIdhIsH)pCg0P3yca6-LRoJFY1{uJT&q(tmC5)nr8vh*$za`a75^j{C zV+7%yGQ>?JTq1Bb;cN+^#e_c=MJot<3S2`tUEnst4l;D?&Ik7qYQr7M2agiIAc{^A zzAxkRM})di32g#=RwOG3^@m1#66#Nq4kG-T%%P(QpA$HqP=EV$CZYaH>LNn@@zSM) zA4@gwBebNA))N*8+(~E)e1=ee`}8oO{z~dmLPxT{M;H`%j&PUwv+dUab>!(nsIkWUoi5YCH_U2S`hT2>?)@_vrqvOl3-c! zv1G{o1=5XENMA&%wm#USEQvyYiId`E(H;VeuYDii0!zjy5qPPB3pv`_^$hP#y77+qRhqZ zL8Q(L*d9;4U*n^`W9H11;a>@ua?(<@ka7p0#QK3*BwAjatPX`YmIR9Ya@rzciYW4P zhbyKPheHo7=>J>W8-yYvjyn*A4E-5QcjCeF;=xZN6$^$p#tQ?nLJxZ^X^YyoocbpD z6uLlx8FkfKSiCI@ATJA&fs zdS%Xj!@`RKv2>kKO1e_9>{`Ww4=osR$+>gq;A6*Pg{B%GWBiFkUVZ@W?apIp%|j5m zOBr*{Lkm{Jg$2bg_p>b9zj_<5zJV+y|$t( z#Dg#Q$taHnD^?@6P(Wy_dkh!7Bpnuw>miIecuCtwl?V>X| z5yPYAGj#%&?2=mav)?0Cd@r+vL+&6ncBtXkj`2|i;&6JFk4mB2_rjVMALVmget%`W zi6}zTUl9vsc`ocA5PZ+UC1Kxlkyd{drTrC+1!JLDG!{uaEFB$m*pngKdmmnQF(gOq zSkV0gj`6~*rrVZjx=b_J-bu)$i*{b_+u~=mqfyYI#oe_P;cS;vG=Z_f_xTL^yeaMT zKcYzA=NO*gbMmP9Oua+PjL-iYsbak3YkWSq)#vE@Xv3NGd3~hRKHHwdP&i@NmMmea zuBgZiOc5vXGS5w8y!_crv$$QUyWC!a=q;#?))j}mQy~6WX1f^1l8LVNgJx*EF7+o| zTFz!qy~`Ah!PRBUdF*BfnoI&c?8QW(CRTBl;8_lik$*yv$2bP~AQsi7v%Rg8I%@0b>A+>b`IQ(IBs z-NyeIC#_l3S2Z+(q4zyp@aKhgje#xJ9gU0e;fn{(mw1>GAGJs{#jh z+cB`Uwo^J?8Qki=hAJj7QDYWxJWR0gN!Cf~eYRXSasNtkd!RnrxP?lmBmdoYz&lM> zW0-If-?CjaaHP&j{f(jsUf-g?)(Yxx1w0fTi6kq~K?{(I+9A)zu{c~843`|M1P#<+Dh@&YJJ@rp`p(du$}OUjMHHDLc*Pyz z7s2+xx_}GWSP((}Oly$W2e=G&BgkVSygnSXy(rES@U)p-oWwPDzy)$}fSltN^YYhF zfr+`=J5xK1Lj`!n9ZBufT?gGa`?j-yh-0)mZkraZA;)cNlop(AzaEVeI!|f4jMA%f zm3E=hm{H0r?kFmSzKq^m{+-^^j9yG%dGy9JdMD-T?Ml66MlY|pmx$g^{X4zwGkQ1X z)mxs?drhw1D(bB;dU?eiEqWLHJG~t;dcT@iZ^w+@$+>!~skf8S%PTI{k~w}}`0w;q zX7qk7uinlXz1QaIt)bp7MlY|pV?^(wf2X%=M(;Iw^;Tu{PRZ5Vje4t%US4r86TP?o zJH0g-y<3c4#v_J!>o(+*KInI=JiQ`}mv`Np^L-UP$21K0%noN5HMaXI(H}St|6lpR;X4^gqb@3Jh#qSb70IGI=)pehJWs(U|wfS z8IQ81pzXZU|D{JW^J}7CrtE;(^SHCspXpdAYl(#bM|a1&u+>q2$aNHK^UE!MLowBn92`o3tT=Z`T zy~f;w*n!&m;vS8GZJ9M*6Bge=JLqB@=l(AHDAz4ZP_KZ!j2GRvvHZgp4ErHP{-q4M zN{h?@$QH94Zy>5vkKhh?gOG}(K^SEs6cL3EBhaa>5A>kSV8~?j;4aeobiOjud7>e| zTxzHbhXURZW)3AjU3E6q9phK6-87SMNZ-`wukZDsbjzMD{B_K z&2uTsRpT5a&N_WL5DrDbwaa;hozqGDG?QZ(E;Qemo1OLD`mfrJLV#WrZx_?vM>QS?j{T==(J4p-rBahqC9Mz!~#pO2W8j7 z%jF5j!{msKJ${;!a3f$&yx%eV4Yr2~&}pne45Wojv7MT~z~Jg?FHawr-Jc0IlNgHa zF66_Hf?W(NA-C+mGS^K4P92Twbnc}*M#>Yv{3k)@V(@TmxEP_BYzajdjmY51tj9lt zdfDD3fLM=@fX;uj9!D)HoEk~<;FnA}xDP`)C;;VnqyBw4nS67z_5TO=1BeJ0ql)9l z&`p_$n1{q!=fc*A;1zES1Q|nq4iiK3b8`%6&A}^vj@%f+P~l|95YPWr46*$(F~oFh z4Bc&F2wPh=CSemp=!J+OezwFAPg-IK9W4_>M##jFljv<`Mn8mxB5bdOSkTvbnT^@` zYL;;gK6u0QLcm{fR|LwvuVX^3>eD+ANJat`-ZyZTEGYAbgsSWDZ89`1Z&@=%U`1kz zxZC!|BbmWAq-tyH?H&mRW5lezaoc7sV_OD{Vh&|kM>&a00(BTL5UY`d>1m1Q(&m%| z8b=^1{a%PYGb%u@%hrSDizLt^$O1v{GM>)xPa8)gZ#6bi@AWall2YDS%4AM(Ya2;y z40yP0jnsAakG3}fa*boDn(Gd;Ns}o5Ct_1n4C6u28i~5{U*&55?!0j>#JFGJKFSig zN5V~mNd=@G|37Qr0w+gNt=~J{(=*dE`E}~Zjy^7E4^%4KycTV+dvk6iE z`%9*)t4>v&I(6#QsZ*z_4Q51w=7U!fR!s+?$qJ+V(r}bZ01+^sIQ7{=qWU5(tUVtM zBspxSgZ}n>@T>4v*23CD{;=#PrJ#wOiAvPGV2_6OuRX6B8>zkQ8n)l7PE>v2ZeR6XG;4h6xv!4JcSGyjkyxV1^UzvL}qWwnFmuxFMHyb!`?gP@V0yqSi z7*9CSxIWn*0*dl`PXlL)^j<{88egd>t~N#`hCj#YUf)8kVH@#>ijpto9gqc zmv*68)Njd5p=zDSPDfy?yOa_I0}%5VQ+z1M4gWA|^?*Gi4ZAFcWs1T=Q*D5S*S~{w zMJve9`tqXW3+Y>*0yl{2k;#gjKj?TLY$>$7&l8n7oUZz?Vi%$O*z zJ7alJNMevTiVALHZ{~<8g z26h$e69v|mVVigr>cpw?3TC}L$+_|(%o?VIY%D35xD6X0fTkHX{uPL);;Ty_<)@6; z^dWJ}RnLC}$Q6f5ja@Bwoyq zbGJeQkl*iBfc5Xur@xUMhj>_>6i@<)0BK~u<6V4GUKOlSG6w!IxU+puU$!rcfBqF@ ziFdLX_VlIe50tTcl%FDA{A^-_7}{CBZ<;U{Ri z)|)`<&VG;vv@5TLD9E%S<2)FE_os+}c=LQ%I~s^MfDw>ko)5%mu;Dz}*P}>gI*=n? zm!!yaP>$Cnb(BW-)N4ZN^J)aPx+}w?$2KrUD#(m&&AkVxbpYb|FGdYhXQy)=%v@(7 zb!-Du{Fe}>orZZXVNfPunBpG`m^MOSAEIVYVQ{G=S4<9xF=2{e0>vB~Yc3IbHxW9A z2)&e*1?kL(GBdKFGN$;)u`+}x94mX}ER1dIB97N72-ak+&u2!po-@VAqP_tPWdLU2 zKF?mLvb+4Z;@55i2os+VsE#lP%AK=U-ufV(usuU3A0@ElZ&L%dWw!T5FIC;eh2D}( z4&LFwcVPk|E1H%UUDL+A;cbGz9DDJbWuoZ(7A`z9z!UYx-a@y|zz_i6{ z_x;2i<0oScfv%$a(HH^C$$BQa?G3DQcJLaMr*Ir+m!J*wnE|2UGh=r_3Ot=Inu=$( zi-ysc<^nba41w@)7YqYm8osG74Kz#o(lEk*lW7-u;u@3>4H%oL2j{@37a^%x47zO3 zgPclC{F@Q)Rf}#ga1$n-w-Bl_624Na^{+!WdhTGxcTtX)_piWvswCH!LR=V|S}sU4 z*^gf8ZT1zQ@9&0EwLWatSNB4K?7tRr9S8}U5&YXxDhRU?fTBB-F3`V)E|B_YGv+RN zI$elbq09T^sdT~YBXog`0bTf}bU9h+!iWT2^48lR`>~cWbg6iQp1%&w#J2U`K;Fv% z>GwuR2Y*Ho^EIX;&l?)6NTCs9#IJv>; z5%i(vB?+CK2L1X7dejZ%C5A3%EACJw8P`Z1)CvYTtiI!o%I`@O0Pn zP5b^7?R!RO-^YA*8|%R9?=U#QcDJWr?@YhmoqoMP{rW)q^@r)#pQT@apMJGIl0suJ z{fc8-NhF);*NOD&()8;g>DQyvuP;l#zC8VUM*8(^zRnIV#l)K++3RPFJ%7g7i)M_y zWX9ObW{kaJhFHuHzhU=b#<)6?yObMPT8iAbRrtd0-Xc$@`w4kwySK?xdFSI29`1e& zPj@}vly^>5-eH9D&Z><6c8u6At1{w>{tf>?ef+cAl|1aCb1wZb2YU>iJ zy`67qps({C4fJ=utAT;eLmGfDr3MB&-`7B;^8*bGb$+CQ;m&3aR69>-V5IX?4UBev zu7O#dr!+9T^J@m$8$lCt#Uz9$nB+S46X!qn1J*{;4``Ff?=Q>K>7uP7zweT#_QRbL z9`1r3=m)-OKfGM~ff3Wk@J+%KQDg>UqgMN;tskpFY446DF~eH zrYi_$V#@egWTb)snBH9T`Tdr*>qUqz42s_5H5ZqiNm1}C+2&XZqMUWw`vG(#N#@(o zGTOf(Z>4|~gxDoWt8lT5e|JbL@*>u~!iyLf!ix{c)9GTw2+bapr_$`(5+3eiSb=7I zQ<}l=ggO=@rtu;dreJ?r$=B=sJosid2<+$+wm$@1TbXR#;m)Yz zXC2HT6WIJjG&ccljh=S0&W5VG1K|Vb!m>flGzM~k0&wbI0iv=|s z>%)D~(=)xXy{7R|>taeM&tctW!6HMRBi2pyrXBWXNjE5Ud&r(#i6t^TYWs8T+2BQS zO<;qo5g&0)WH&2OesBZSHV+UZFk3+@$F713J@a;`skN1{>zaNjnnFBU8OOvN8)D{8 zUCa^`?pOoYoEB?ZF)dchOvAG7kZ5t;8WY!|FzKAEn{esagF|Ksn{sf-S7B+#7!FDy zcZ@=%%L1e@atd-0cp)tND4OT|_kp`(LTTLlQ*jvWPIkyY9N3z9b3gRA^iyyxL}=DO z1JjZ%;XckQYwwvC;k4f^ytoT$j-p9 z&Tac_=APUc&e-|B+$p}0QJEs@B8>QLd%GD8i@3MrIMdswvbU)t{ri3G>WFaaE1sn< zpN$t{PL|=XLl``7*gF{+@q99JCP+{;nH_ef=@G}LBQRb+&xrsdGMUldHX;;1U|7Mz zu6qvu&3F7;FcdI*VA$QuvKArK=lJ(A4EZaza{udm6PSCV&`v|I$b^L}w%7`fs?eCD zGzPYFR-|!8T8nqGJ;@o>1UZQ^i1E&OemR~nQq_%o>PC$~* z7$}Rgi7AU9Ciu5FcsI~8vDvt?uf?(V#6h4Suv3mrzuUpEfjj}1l}&NkcrXuf|V znw5^ZX?jfi!`sC0*i|~$N49|(oDS1|&GZ=mqtkQwH!~&(ZiZZzRur`riayq`k)BAM z4Tehi1d)iwC&G?8+3ILNC~rIqY(`-ZHG?XrqX=`liD`y0 z)%wrv=3=M0$d>bpj{M4joL0qlG}6aH-D@92a=@*^JfTHQP+j{VBo`~Y)^?__g4L~w zM-kZSo=cN77W>%KV2b~73OU04Fby{u!!ad>dn^riUJS>S7!C{OWWBG8;h3UuRbk`t z5M@;=uOmhhhwr19(55JKeH6NZA&g0f`@a^<*9l#^7<>c0Z@ee4NPRSV%S^&rhQ4mD z)We{{A#fx^eosj}%b^#UybFzCA@SO`k!_IBj^BbOQD{cC9Ce8dJ@fcr;AZX|kK$MM zXjI%m%?uVW>Nev1DSPV2Y2v(|#QCIj3R8S+_BR~=Q>+sbb1ivsAzVgaC!zC<9qfj( z94>~x3}NbjmW7^;=%rz_tdY5v)HKrQFwh8QnQ}JNF&s$UuOp||mvskwbY(s#rz&fy zIUBLryzU2aY1t?+LRODD_YjTa!ukXa+$N}KtPP`MG$c*>>fgX4pM4fQE)FXcJiZv> zacvkK;~{C-7s*=BfF7{>?~oqLARMgRBur&JW2I(qzM5@+23@f9Qxd(B(Y?)+lxD4C zWtBOWl?7(SDTs29W1WMrQb5q~#Hv$vB^5Cc)pU6tE@vmP>)*p;sZIP>?`M!2Hg_TW zs^BiPA}8#q0_h$W>#j81+zN2*D&eiGEW*+Ec9B8^wLqVm~hYSdyJ^ zAA|PeqA)t9pQH)>F3(ujwa-Ss2>?a(J6-Vw$zEtMetuSGwF3>Y91zP1}@w^(b37jX7aU`(WPhEBBWB+Mj1KaS5CJ_-3CO zXKHdzr>sivEDPaRM$ zZ&O|cGj9f(!?g_eWSWqkpdqy z*Q0<>gyOj3QAZyS`S-Kc(yw~fWD{`WzM5mx{^@jWd1kv=d8!>WBjMq051#PJ!>`&w zUyVr{c2GvB9n>r;zn!S#7}RyWsiRNIak>NY%yxU_2{)g9320>{2@iLRc)IKPrj?zg zl`%pqn}B}K69OB-6L5>2dOWRfyn*`07tsr28<^r_GZwCm_7wIuk~-VE7>p?b*1i+j zXj;32s;BC`3(*epT4b=oO#slzypcsY+drFSyXv+q@HWrZST`i#Tc_BQU#H+LwveIC z47sT-X){UfxblN1>V_^M~+s0;vCvHLDaLPbf4I4R`My8%fH@(ZIs|Lvw z|9sYI>vUFX9xT4*@Tt=|E!!Bu>?(5_6b&qBI2p=WtWYy~VoRx<#Y~pfnXK%ftow;p zZ&+5Y(8iVuuB1R&`8IY_xU-)dEco9*P|M2e#K^MpC@XKu%GHA>(jzo6p5;E347^=; zyOb$giqpm32?LlAu}Zv@>|;x@ zARL^USZ>kLMaS`uDrLv$7G-OdBY;BkYQ^y({u`BSwc<9$>B4eVC1*qLE<0nml?EdY zC5_`qiQrg<_b;#WDQ7R^y*y<*Z|vnEK&UE+&hZN1{xRYn^Rh9B@YW_rZft`8_kPj2 zj*TD-oD3YE=J_6aRL7rkj2* z+|7P^JKFkj^7e<(^W^Qh3tk6eDM`%$tLl>rrm?s^uZmALC!xORth7SHxNa;Fq{DAfnytd+yOhu)1Rtm8U& zltOwOwQ!-sOR9GX7pzHBD?=82Qr-y5p_gRg*!};)OYu^RB zZlN6mCQ9oT^o8BDb&pex0lkLDX)kTg3D%`6OiUt%Upz|rF?Z_8^i=uAkT=FQFhw{- z`KhSaqIv!XjC9daN_qbRgt5U|%C+X_TXTZ3+aQrcrCc!i=Wg z?=uCLnxrDSfoRY(eQX0$#6P_>RLr;f#dCHn*M1m@#}E?t`1h@B?`@27L&YQCzzPeWs0zlW|cTL>OcjUO8FG zDh5C>i+Zhxag7K3D;@wR8ZOG#J1~SoF|yAkGbzIt8fSsc$UrhHS3Ip7mru=Hcd1Y= zg>@IprLu?Dov1qx(*vxl9_m8dz1G{og9V+Wd&|9G_1=ipmB$Y2nON7;2QdSFyQgR3 z&tdq3J#QG*^{^32f7ZDpV;v7zC^h0IvJk?7>!aP|>2!CMXSO>oPpnmXzbuvQhME9Y<&!cUhL_MJll`)Z<`dOM8FNntkQ)EmeHK|hLrFrS< zUblIG+lE0G+GJz)pyOk$1%4~wLa^oN9h|8ww6U)8kb)(R*V?>g{-Cq9`e4LM1t$$? zl*A8h8OqOK1+(kCi!g&zCA+WFyJIrefz~TFsSd{WHL%Wr?Q(ki{yW{i3*+`NMcXIW zuoPV#?NttWY!x-e&9bD_EM)So|9|YVP=+r145&GjFoae@5lY(~{#TqW@I_HZ{n_?} zrR>#Xgo-(yGd%2pI<8^jhj`H$I}+2ohIQcLw`R4R7f_f0o4CcTpa?=A(K;Vt^-9N- z^)*p0cKwv5lh%UwgtGWCYp+5me{J!fg9#36U$bmGA+chiwn1R+^ zEKtD<8SsL*X?SqJ0b-n<0A`aN9)xJIlQ$Se^HZ^Tw9ZesE@L)w;0nCC5Kb~bVM@wt zkp-w!d7YAs%Kl?e+34)_!j5M?^cvK5)7D+Ayt^J+J=P}gV zLWe@PhN0gO(P-wSu0N$V zj>p|NsdJorE}=~hclSYu!J47ECtr<0Sk`45fcsM7u19LrYYd)}>Q*aD=D!13T*mnh zlt4!!C%O(`FIQIU;gPTma(xkccl#3j_!it8WDVqF#`1iKbq|+cQ0WdYr^8Knagtg? zZMt5_{L3>2w*xQE^#{n5>U0m3XSTaSo<7*x>+Ub%;qHETy6gF-)9ssex@Cm_OV*9@ zIIoZ4`Cig%W}iu{K@%=4CeJ*R$JtIE(iCPqbxB0k`EBa!nGxX7v@#92)ZR zQ6v}MnY8~(Q0lRxv+A(x6?fM}K7CVHgZ!RD)CPjfR%aN4hq;<(A+ zmryabx&3}3K+B{AUT(mv;z81GM|lWQCTIvTG96-Vh}7xG6mIh>633^KBIl=nJqNMC zHP_e`NtQ?piB`n)Sxjfq;tifd+tWR{Dw(vAc8B`G$mUW*c1$X1Xiv88K8^_Acbfw{bAQgFC`G09MT!`+EBk}pWH@?XwKpdIFKGc0zl^!{H!ZGx}Rd!17F+X z6`Ht`Y6xkMI~8|JGk6-PB-Uutm!h!SVC~a64ozHF7Tccam>uh&&*(WoG|T$wPp#4+ zkcdhteEkrBq!V{9p;LoSlb_yMI(;)qrw<}qicU|b>Gal^PE3jE1ciGH^btzQRX;(c`ENzvK-2Ga3kkXxl+9q<5I|R!Lr`3-^53fU?~e$WzNbOv1z6 z=i`ZslJTqMzD>(zgqFJyDj7x&Hi;4V?KXjD!Wan*+Rh1e`Kj6?YmdX`E`JeWe)zsd zV%IP>{yDK;-*vQg$cz8BOJOB~XTEgk?cP_iE4lIfJJx{b@6GcM=J`kS{1cx@E(>8G7Y6cSpuhlhx-9SNv%ZM_wS&ITK|XUU&(R>&t+8Mfv5~%2ZMZqz zLkt!&UJn|!?2(3B(9=n+u}9tOO2s3J!jVL)B}0 zz)@~8g%<{HGR2OT=PZ#cH)p!Zl-Ew{erUz2O~iL%qFf8>@Nf^VNpEs7-DBr}3HRgv z28F6QT)2@>-j^!2a`iXHT7ql0*=;y{cvX!vX18K7rL)tM|!dtQy)4f043*6fwyxMaT6Cmeah4I&zjq`km&FM!5HTfz064!(9so5bMh* zD*>xVaJXODBYR?A75C>$mzimoorceiz_p=(p6k`ENcjKqXbx@=$0tid3QboD^`4WA zwYxR3M%6Of#<7CDh$tC5xrFb|1oxAM^aPoLC`r!K8#zzIrw3aZOz|%ZGozrlhGFb+ zOBe+`92Eq?lPu`cxFDva3c4gwkc3gtkD`JgXp#k878k^nR6#h;9yLwE7@K*yM+>C4 zGQpEkp^#e1Lf;V=$`mP-A1-M)k|*xhvrgbx%UZZC$NCET5)PZLoR4VEE4y+~(d%f;7Z#g+> zw2kVT2$@81yOs zQV@z(GHqCEVLAIC`^(2Zy78~?FFVqOFnxc5(~o(@;#zI(_gcrz3;i`0_Z)bRhRyi8 zoD4~RIT!qLmyG@2v#;21Lta+h28+1G5DQP(WJuG56JRX8a_wEv3zwZax@cjr7N7x3 z2_vUFo@hL77Lsd8^bNNP@vS!}{)rWM)5~2hw1kM&Ke!X64!UZo3z_Jd0~`F74_TSc z5jka-eB*Q&>V;ismR|!;iL6k_92*QCMN#D(T_?+W=W2$itmDHJ~n+OSE62S_^iUHklbFQ20}>IqC09VxAgQmG0r=Z|-(bO|h4b8GlyfKy!u~)J@w*Mx=BzeHCLjuW$UFE-Xpzj*?Q@N_eh_5kMt!rTY8mS9>X9? zZmAbRRS5O62dZ9QXr5FMMpw>M(Ew-tE$rt0_Ar|`(3n3sz=QD~dLutr)|$$3O-P07 zn%8=4^M{dbaA0fohtPYJC$SZ*Wt#9`2REfhaEuv zz>U_f;HO1+;&NZz=tP+DufjWA11x;aDi!|%#NjK1RzH9sDdZ0d>idA0Dl(U$o=^jP z4`(RVPr*>u*EkkpP+Nj2{ZuA_-p07m7#!%PP9D;&l-5n57eIfn8fD<&q$PK#4rLs5 z={jRKYvNd4X8_0RBOKq6!12l$N07?8M{tZlZOJtgj$_Y)qbxB(6u*~5u}Ty}{1(4N z@iTM!RXV4;{H~6{bE+ad@~d;>>RE!8rHt2#%l~HQ`d%gy#aXLCwP4&#*4un;I-GY z;e{P}#jBCcV^?5Sh~C$yqbFMchR+(-0cWIeye^63*9FJ##W*rJ1CApVN421AV=o{f z2q{MGvTeC_>R&d>ws6MaNI;34-S3-WMp~ff1DA95pU4M z|D7@MrX3}IL=)$HF)a2IiDGZo#68l9=ttT)F2M5}pp_3#U(a)b7XT_ej=45BiESgC zJ#4Ls^bc`X#Wm$rI=+D0#&9`#Qmj)Zo`@o#f9T<=w7^VhA+!~)%XijdsfLdL3O=p{ zyO;$#ce(Q!iMG2(!9s@1yr^Io;d{#04EoVM|AjQ2aoy8Bl5v_eT@Cg>hQ^oNYWHZu z1SGAltA=uLy}q5RM7o~l{mUty828yY?wyP?cwsuX?k8TKGk6_?0-Z^0b@AB9D|SR5 z_k6-8^|jf-$CO46_v+w(MMdq|D22we9BurISfVt3HRCjCyN!P_VFEHhqVZpd8+t|9 z_|M02==o?)xs@D5esL{)V$S*&>2Qak!?7qEsPPf>-zj6vJ^!V6Q}kYf&~&_tK3sr3 z+`lEvrpB^mcY(l#$v)7tRG566WW}{p@Wbt3!^|r+4k%1Qc|oL$NVfxbJw*D2$tNT- zhsaz9{(y+Yfy*Z)GT($k-r1Fr`PONLN$9v#&0DLZ8NUX6p_#hp6Z>QbjRpru(yW5$ z(CMz(cGfQ!I%k0#Xc67~&HY)+K8hBVon@Qw=zIyu6=?cy_jptV-OpRkzUbIaaV_sii+-hVfHnkNzNjN?EnIaM^|!$CsMCB2VNT1~GE1Md$5SA_wvF$WCq zeO-oDe;e&LUy+pE<6;AM4slPE_QV_MOlK^XPo+M$BcF}rxYPN%7gvnMcFSKO{yQia z`~2KVmFtw$%MQ*-Fih6b-OH%2B1~^?ST)~HZYVb4_m7RuhJF$lZW{P>FcP7b(BXQX zCQ`l^+Is@U2|(cf%XS0hg+7H~$fFIMi`6rx3t8di8?&i%A`_1w$uha@E^(>pZ&?|x zc{f7`HC~f6y+ns}gZWH!Q47}x(ROY;9u$`gaH=Efz9a)f38 zqStQ2wH2SEOrEMa4-FD$VOapwFTtl%;v+ZdMBBGu!@!k{}~FL zRH;{_OI?mqzYHK#!oK({17F3loR>EY`FFF3txjuhvijS?QqKJ(+TL)T4t#LE-~mL3 zPF42Ci;%R*hoi4o|5U~anl6?vK7Qmz>tGEWGXj_n^wpM4cfG;|^3k^DpkKbrewoC; z;hi3NM`7x&Gt`E+u?1^t8!If)Yj0yOLJx>|7*UpLamqugcVY0!! zbI==n9!fIj_+$ko1M_4irzx=lm&fTvH%gg9`3@W9eG#pW(wOir8Y$zF{+=Y!eiRYy zLNv)oBRzV=z}$+j0`X!+bvDq1X?eHKkarqL{mX`5&XwY^2W>9blhDDi(;%jHa%}-W z8iWR7(aXYyZ)%2{iT^!v7oLxp=l9L?Q9f~7n;xa~_a!dj%X9cb3A&U4>BnUns$z>I ziZh{YX(6mb^rs%x@Rk9 zB|)C0n1i0R7#~}$o1-G5F54I0%Dt1iHt2?4Xk2dRs7uA1^Wr9WNQ%Jsq01`+AjZ+R z`FbQ23)ZSW9<#_!ed!(Bnxflgxau9%oi5f|V#6n@X-aDusC!O-W%tv!WZ z>tx<{GcR;#w16r82hoE1eNM1E&Vl{yWRCa5Ihdk3R%9GV1K~88(nS930on5~_`vYs zxavZ<2egEVQ}rKS1nNvYqo2yIA8)9`MON_29B}4G6r$*3fm876ZK987^hv}w1-%>R zt$p#M(eE{7pGN5SgoTKoVek&T>Ohk@Y**m@JQ{|cMo+MA4r8z|cdY0y8 z5+3fJfTz2jZ|X>K9Xbr>cNmd8OGEp~_euMNG&}=Mk2Mp|Y2wVtNtiU7wu>&28klua@EZyjFeXO|*UDa>1 z!pt{;3fU>Rha@ZfKwKeH{5&Bw({P*#z9h*^SI3!{vYkv8*hW4eiPLwuo$Q)86H_#k zjET8u&!cD$j2*nZ!x3WfyVI|QTfR@8g2VC;{F#D-(t;(QC@)w9%JX`P z9mL;Yo;R9jgU^LfA#cHoh5%UF7+Z-$|0AVwn|elYF-P`B@;K!{a3x=_4PU(}$Yy*9 z0S2yf+8;qW4glya8MV_EJGIjq_m>AHvmKb8zAW9N?EkWP^fU;v~t9u}j(XR!qK*-xNcRctjNR~K4pEyj6{FJ}^8y>diLaD+x-!hzo zEo@!k`_k}oitf1Xv)wi(7;hO=V~clRV{3)W;lp#HddS+o)R?C$d)>^!mr`(Ml9`&= zYH+r6&56h#Z+Wd*+r#q!YkPBTNyh93yUpjrVoX~>sZmRoSIIT|ZR{1sB{ocnk8P>V zRH9xhcnV5dhaC;Li5Z`TCDtA<({q*?>>xF63GcmdENq=xkD={T5bh4|Ag{W)t4f)C zbxxa_esuyDMay;Ma7LK;S(Tp&I1z&pFoC07yIc4MKWxp!OV;J$!xe-<%Z7+3m4JFWElZ(`X4Lly9) z2M(!>E|rVrMrCirY*^1)#=XjNdHLtSAmv%{MM2m~?hi_+LG@c)+lHM@uQI#w>cQE1 z`gBgYzqWt-t*8Y1+*E>VE97mw+;7^t7z8)+zC5Sg=l=j}Y9p_G3JX(oe^3qUnN||2 zk`t^Ou{k_Dd4d(V%?kl3b zBj8(*fO|5GMy$a7K8zSgDbCkI^vlCSMOgz>YFh@)u#N}yYnJTpwf?f&^H+(Oav9aV@2VHSs-o_z9UQCu3+g(#@4o% zHV>diHxS8^)!uYf2C4WP$7ii5b&Pm(Q{oNoJr{C@Xo7Pei{N>-LFx5=XT!M2Byf(0g!aPZ7eKhko1-NFi5iDASrEL$#VLd*o4cM zd#ml2Q{MHL`$ZLK4sb2vbLyy+Hdg^@L?fg?Ja}9kJmqlk3?v3md7HsAkQg)GHe+TW zF=kvHGlOQ#^kK|oWso1{>X@m7V`d;RW(K!EW;9!J%=9hC8plFwqJaPzESHroTL6v( z-F{5jJ+$->;6HfhJWk41Dhlymh$~n0M$_TJVe$BJmSi_y2R=?qR>;hFC=F~Q<7XrD z8JrCY+Y|JVn27=s64+F$tU3ZQ97ZH$@q&zPVvRtqLLgVSCy;@8JVBtzycc764;|#b z0g4O`C2z-oaFsD~ZbYcYk%meTZmG#7HEm$F7)i_)fQ%=End)!dy!i#&R<2AvviSUR z@6_q(VQ>$J!7ISZV;h*_-$Z3(bo&@#wi-2jJ`2Q|wNu1dDl>n?B5=D6S)?*MUDa$Q zQxma?$rDtVy*(;4_DR74zuBhq<^aDrJB44^d9Om}K@CXv+(3{J^#e&!uk)l4cUyLY z1dt1JO!cKLgGN@ylJfC#iF=iy{687|UqE-AfuWU@^B3d&M8N&`wD=1lSFS_+LP*vm z{EHAb3vp-Re<=THUs#B;AIA{0n>b}cHE?Qw@Tja_@v#GjuI*^*4&$BN+#HHthS-j?M+YC@Q=YLf+u>3fDBwqy}TB*Guq^$=I;u$jN%1>Glujq^k4lDh4k!mFJ*~whG)t zJCe~dBOJ}pQJGZ!BN!((FoB~D%(hNIA8uw}VI@y{DQx%sTy$UtoH`SY*2z-uKBpr{ z&o&zW3JSjOpi{kIErKu`KTN`N`%g`h)7$Yv;&BDgoIC{78Ef_8GgWajwSHe30Nl97 z!v$T|7U0NJg@R-D-^WpuODvVHBdW4nY4ks*y%x>Y{cSis;@GD&11n0e{c5BTNja=f z)!%NrMB+wC@T zp$}vP>qdbscXLf)#Hoo=m7IGi-SxHrro`uZi%Y+Pa*cyUKIlWuA{OLY?tCyByReBY^TCV~^5h+R$DfpeWa`xort~p(kErvHx&JNcQIb@`k zqa;FcBkb;vY=#ewMOpSkaD+D1*6n|ohEBu^Tr{wJV;PS4Q2kO|alF9C@q#y^Jgj(T zt`F(5_CiJ~F|99eSv;6esxNkPL2xKKHepGNH*C~(C}%uz^jwT@o%~jvqB6L7^w8gG zm~w7WM1TK9Gmu`DURPF!iH}m8p0VYm%9yaKE$cY{Sjw-vb>j*1nMfpTi-r=ja}LNh z7JN(a{tepipTZ0xc#qqutly8bzML6mPi>-^NMzw%Xva^;7g2p!O>x|WSEWNn!!riI z=5E?zu7xEJM_ObV8fsJ^O9==`5b<~s22^rouMhVTcqZ{$zt%zXL*v*oER|s#;~k*| zI8@3q0G^aM%`r!e95}v#w0RouV{6Vx|9}~tg2c-WLP?zUk7v92Nf3TB zSKnYIcl7myF!5}BdNYwIuTkRb(~0sLC7z#7l-DS6GZ0A>E3Z-FPt%F=8YMoJPL$Uu z@we$jd5sePlune_DDiLUM0u4&p$Wf=>&xqTnQgc=kW?Y30AI30U`dT=&yO1?=pe5V zPPeBMSt#qC88YK><6Xi8Z^$PK!C0F-Ij} z@C~p@#)ZzIEXi*F6J0qi>O4ZNOXd_Py;RF-XF%urwKF8k7vTH@J#Gcyi0kWiT+H)! zT+GU_nAfwI%VwyKdza1vXrXUxAIh>$O2TOT8@6rlx^1J#%{m5b3%(}Sf1}@`TVRHg zrMmuNpw(F6On!}v#9}j*n)8=1b%8TE#f4odotpP2m`Zh4c<cYg-2QHd}h#v`mG#kx+IT+L%sy# z@%M8XCw3PMBjW?ThG({mp2t(i33yV*2{;(zgl{@d;K0xE$B4xEv#m?ekNnF7PeGLF z;_11W;1AKu{+Zx!(aS!Wz`id8Ta<|xX06>bflQVnToyET3yOfN2QB$MQhraC-#5zd zd*t^q{AQ+W>N-c=1)P3?_C{OWkfC-%DtJc0p=$b~^>-LzvqTrA(LFD1Ob2Xk%34dj}ZxJ4{yKj=G(|xl% zv)zm2seE>!gonEq;OVaCoATMmK@jj6Bb3h+fjeRZqTrA(!MOgXP5oC$*>?9G@^rfI zlxMbkxjeQ0%OpJ9y%bM(J>Rr`+@;U@8Ij;~tgEq3{uRo%{d+KqJ$J#&Ry}>jKD)XL zvPWJ0yhUwy!7ji1`3v^D9#qhz{oaP)(r4tou=WF2?lbHz`1HM_XD@oCyMXVDj#`Sf z3xF^C@dGz5n&&Qf^DeW#z49(Z*}+S{9x~Z0m);^VuZUt!UV62}tdC;WEae!)Vb&<- zMUC}#aBK9ss&SSbd^37|e&a+t_*3+H2>4iq$_VBua4~27_GltJi(&uPM9l0&cupcb zkKrNQ3E}WuiuG&I%gFa)bC;YPAC+&Gw%}-RAw@T?ZEa+yKsCo}EOQ`p#3R=!c#THT z{|y?)Xj}~)lunZ{w#?)MASdHZ*XC7xo@W-`V6!?9+6ugMad`)?bN(W@hM%**cfGDg zX}J6_3yWLg;vAk{3xiqT=v&rdsTDK_pp+N9&-Z0m?Sbc>Q}{ubi@2W`bN zk|$*SJ5gK#0hpi*|EIRfIYft14${qchrmcm+_whHuOow0fk3Egw9P+YS;N+XDo~fh+Xu} zDE3~)W+irA9Q#eg0^jvFuyFWZbtQm^8^Z_*AOhPf3LydNx`!zmR&>tnQIv~z;mpc? zDAwPMgIZ`_#=i$|?U%^gEF^v-PMjV5hTiX$zHyR!DCbDC&ai z6DW1Tr4S3pYyBpTNVJ)DYM4kIOd^AtsO95cP83eNc-RKs9fEm5vFD4a4%WXlcoScw zHAD!1W)aSB+hp3mWYIJOjRjjkt^`3%>@yN8H2N({GO>S^SXSppvFvN;+xSFuX8lL_ zJT~N_E~7I}S7JdQ+iC(2)LPE0|0t5iS_{X~c@LsE{Y;#E%L3kyPa|fm*dxV*CmU%AP(--V<)phk`Z-1|egUGr6Y{jBq`wF zb;W%~#-!NU>VftW*CMh&Trjb~vS7rPBTAdXer50Kc&#WVcANMN(VMrilcRGjN9SY6 zRexBEHN%Q!x1T^8!Xd|!O&WuecB+h>GeDEygC=rcfZp^zCSQk2jUe}ajvzrf8Wm%~ z5Mp)QU{JDL+&6&R$O~6h959fMpWA>1SPoy8q7Pw?L+EA>Av~e$$rCEh4rH{CN>oO7 znbFATjd3iCF*5q^ajX=IwsA~`@U6+4aso^sr@)HRjWW6ShLFK`aL5YV+WY93^ zgqe_j!x0Rd+fVel9!jYL?`<=ccjXmYo6hY16_9%xcW5wg6G={KtA`wqF_Ki{?DjPj zimSpmfrGa0)i-Ug5C1DFP$mp~(_Bgygm-F2eGTdKTOfo6sc6Dbz$i&JNM85F#PLTW zPL%*(dX*QMu_dH60(HXJZGn`DeY?}T+~(GcN&Rf1@E4*$pWYA&DX6}6dkw!u7?RbP znR4StLD~e0N{_dw7g6U=0Nemk=2XQKPv384Gtt~n@)>s+q8nX_;{i@IzTy9q*m13Q zIr!=ik$lSdTaiGS{koaw80G(HjyZDY=9uvr=a}&7t^$s0r{|eBZ9C6UH=+&akDOn) zRfz4OQ?C!j3Vf^Ux$0tbkVt0~Z3`T(v0)SoBk{M^BnZrJxxp)=LZU?}_2Xku*R#v* zJJ4y7geK{BLPDco2x+(ZYo?>^@>D`qY?G@T!>i1zyvmUBDmwmCX+D=%_BlGg;pdr` zbfhoLpFqdVBsmplB(a_m#)HD)!5N=J2sSXNCmgVdIFAt}>O6;|3{A)VR|QQEzOAf_ zBs~ux8b9iw4)YB>|4jaR3S~nl$N>ucwG^6}B`nr1Bc^q3p*_f=1J(qcW{uHll;8Bj zS={k{Ef{VX0tA=1&ck=OXoi4NGnf-Q1Ri30_zkK;qL?0jv}FZ9(iQLV2Ft&V3GYFG ztSd;}zK4n{@M|CfT3-b$nFmv{pinV6@F-X$L%v*X)z^o6uo(-h5$k^wd?^RkWd|61 z`Pyyyk~9Ec=B4`Pa_}c)```Kt`vtLz2suh%JBDtuSM7RuK={q=>m>LtfUv$@+^fN%EEmOSK->W zgmlXrIR>o|D`9D3=t-W?ajr!TD#8pn)_7(f3vL5ka0h-2*gezpJ&XwCBjIA- zWOLyXu4m)r5|^EM;7ibnIf_OiZ@2k7Y7D{xyfK3Tz5#uO!DVa8X+6pBa`Hh$PlTN=By zXD5{k>AxybpbR)1ef9&&0IATZ2Ev9<0J~6aV4Wt7L1|>P&Lj>V>Gr-1Tu(Wu!yK=M^*w>0pMtm%-g0 zxL+9hIxg&hWD=dyv5o*ff93cWxr_;ap>x@p`H9^X6Ry`(x;y!+Vlk+R5G>!rg&E(5 zZ3*iVR-4lggmT_I7v=sfEO!Qp!s8A@QlclKr|1TsM=SKsMlC;{L*XUg{so(V8+bBa z<+#Cp$f8xpe8FS9LPlF|nH=&lz8bX55JOvT=uu|bIm=9k>{2Ja9@b*bI3V?fU&1lM z;!T=#0ml#5etOTyb7hQOL5ok(X~O*ko3Y*ySBnWLw z9_|QNeVoB}>nluY;XCa?yTFk4clOO-kK0Jj&i^G| zo47W7wOh~E4qP(V9TAAyfs0`F!ME6+gY*H*E@xL~>bX!k+T9Hv1e5x2Lz%djH|Jf&wr3!BmO055=t?BgHTlNaw)e}4IY*8`8!mS&D%t)Ss0wS`mGwwet-s|Kc*|ntzP;dx;KNdPg)FE zc|g7xkQx6^X~?`-fc>8#wzp7SF)6w5(PJ{ifYrff4J`X*+(wK28Qh1KH&2KqMs%>@ zr;S*NnehDsDY*DP$GyKW}5_i0-Qz zIQR7c!L?S{P-tU|$-~j@ci~}D@x;0bW}sy#!{F6^H_}HJr}MlAaf`2yiDAe%CwO;6 zk;FEI=fB9E&XCEjzvwSuVJ+{G-_ zy&lEs+jH5Gs~clsmsY&(^=X;hDZFS~d*b;|(952DGqPj-Qpn&ose?fWc$8kms3M|r zCJL%o=WATYh)kV8UaNL3~Btx>WynFb;Ut0L|X2zSUze*GO(3%DU60q6-| z3?n3fh&#gw2?)MB+>`wIJ&6P3#MGVyZEn=x_?J>hzKtF=`z={cSwt)SZbJGBBS7mtpRy{g-=YSSSB2SGPz7p zb6b~?SSAn<%LIW#`$-3A^i~ge+1Nue{$a!>wsmCuRfuRdla>;QDX!rYP)QR=W4;@_ z!$~NW(_#N5do0&>ibK328w+M(J*cS0y4zUr2-s0ki(^BctfHMuWlmrNL!N|ku^O+! z6R!0xz+^xReBc`@fYbgCet87L_P>jH#A!c>UwF3Vu}ks*lHi;1bJXa+7ow<`8}jEO zuDKw`%r4aaLD?*JHns1;yLco&!TyOh6}hd8O+{OdRdBcTFDMMVrSKG<9V~b-+&%1^ z0)AWvJBVu?hk4B=emHM1#ln`j@-RDt7-HHG&-TY@j=X*E*ma~}jviaTw*1oL}=3ykd?H{nYhuG(0`?d$O1@68o zP4Y7s&Czm6K9hm_G7GpH|9v1&@8)Zf2NMlc`v$H#=l3eEl=!zG-h2fb*E5b{8%*zg zj0o1d`4y7YxX!z{aRHN=G^BU)VUqhDq%<7vN5cwwalwDDT>aR)c}zf73P`?rd^8!d*g})?UF86N!g$1++bf1f#KOWF4?s-}}R~}T4|DoQ^ zcM(iC{{8o(UCsU6m^W~I8wap;3;Jj1_H1ip#5pWuH1VQi@*gtO5mp7)*~jqo9ehZRBx z8h=%G!wSJFZ7~396dFU8wcGsNX)DBeZV`_(BWkw`3m|A18Zj&Yw=?RRh z$PU5!lXeK1LF-uf#ycARae(2wJn4#@n7t5vyh%Qp&wZz^!T1Eohj4ivF399z`ud{I zDM;IJ7sUWFqyaZ6;G^gu0G>v`ug(Z~g91LTfM*a8ir@?-Uax>WV}KIRBH-6%1pJ@^ zKB*<1L%@4x1iVfGf2n}y67b#`0Zoa&QNY&|@V*%VO^JV2!1D?Cbpt5$oREV%Ftgwz z+92arh1)>5ZzKymM&X+HSQYHKE)NNg0N!~>+I|t?zc~YZD*;~xyr=LN6aIb!|1!KF zX@E%v9o1MCbv6?2TSZo+&g4Kp`{xkh2G zB+LV8oE8uUSMOY_AXgLQyXj(f3yVRQ5S{A?^I#gL9>SnE2y+8r9!kUPMHq}T>I_Xh zOAvUr$Yk7*D$nK+?f`;#cjOmKVHj;ON1CtVE$V!Pr9PZ4wTJ^&LM(jCiZy?nFyBkV zJQtfQ0`rW*+(wv3(l7@SW){qi>SixcZ|0WTJe z?1L|XcMXcvy{zvd)P9sdV%E>MA4IryK*qmUKyaf3zL^u61(Plo$;|*`N@S@p=UwL} z>PzkuWMthBZO7=CuvMiS^dkQ9+yQ)}E$3)~F&seYmBnzXZJ&ZPr z{Slf*GRJzX?kr@XZ@@lKhVAsg^SM7191CFG`4AN0L%?pSzlB`1XtG2z zqcWJ9ZCSEOV^Gp);Fm=Mp6h>XM!@5IuHXXuhk(oa59624Ta#!PR>=gz%0-~A$oQnW zEtHQG2-4IR2Ht4}LKxwDtSFLasz0!JgSGVT6F?$d3$mW1im)C_Tv>K);WNgV(ZE<@ zF@8D9Y#nPKg9xE9nap9gg+&;(lPlQwlJt)uE015u*iB+5r7_}EZ4;KpRxZ6(5EoQf zH{M54<27@-fC~@Ma6XuLO$Aqcl%r#-EF=3dRN*Jax5{9Wf%`@=S;lePruP{uNEevzIop0bd zt%l)?5@AjbwSocSJQKZes;d=E3g@)wg;SP!+3<7Fw|4rakf=SLTieU6Ep}@YZf%KM z+uN<}0UhQu92`hV}R94K@_RrN;JMcfMbz5Ao&TaT9@t6`kO8MFzuvX`5`{irR zeC@=1ZTYj*cXfWl&zOI`5T!XYN^)K<1qz zBBc<|5+t61L_Aw6@eCy5*#e1YAdKIVsWtW~Woo-Dsv)#!sIgn7)>@Ry)TR&~of5TV zN|cT%(Nm{HJsjeBD6w7kMz%{^@LFqECp_EOo+r?Re#_QPgZlDt2Sj!*>eURD?0qw0 zNEmJ3M1u(E5bB4X$cnQ>)U@W9`#Vm9mNN3Ip?f`A09^Lpiti$!A1HpYrsPAif(C4N~eQl;$mJFFB;KKx*(0I*z zx>yo2)!KxAGti6e3iT-on?h$uKOVb!A43+O-hPp*Ek4Q+JV_pS3u0R%8M(q*UozM{ z8u70qD`iIYxjfu>*6m^8uQBjhiTq{EcL zoZ!5e-Ng!xXUIMd6uYq6$Qd$NrEs=}Z+f=obLa(}tzm?J3jmeJ9qSV)uMg#Q9>#qh zP*etcFtKk1U7L%Y93+?`ge^3|sJBtfg%~w@3c{clkj1k@t4HeKIfmWNt;7V2IVX>= zxqOcoh1`ai1<-1(_9qbFv?lmL$@dUBOu*d&D5Hbunc-7Hp|pTT5*?QfgYFF`3%T4237vEcvf;zp@RiK z2W$tda=~QuS_^|;f|qgm8TSu^y&sM?2!8`E)_oLc?4A@A6=bk$Eep|U?GhX&SvfLi zE+uNn(zCEgh~99`X!~}ciF-oAE#W+<6}&qx?va_00!^!sG?W|7;$U&>FqmRaxmd4a zZ$@`bBZ6bT-F?w;zP51DK)!a$qGDd0JGS|x&d zBL@u&N?PoOvZBwipZdzB+9^x=Y}`27gI-!K?t$grWtXw1OM>%~(`B2Z(qF~bGY=f> z!?l{{qpZXEIn&z9mdq;;;NV4{?7Qwcz~qtR6aa{L<$m0TDu)gjUl}L^LO>^Ox6MVJ zqW`XLECC9iCrX3%;9vrAlRRV(_H7djf*mKj;_wgH>%e<}bH26=AF;yK#vpK|S{Z6U zuUoXl9;plo2`kO<+~{$|hQqgrb}J*=`Tq@8YCYLl6r~MDX=9$I-s09?xd=V+ysbTr z9_Ub&*460soYHf+JXEfn(j2$T!-G}-Xs~ngW7e5+RqQOLO(6TQ{{^&J-!r+eE$dgl z4SdqMgX9>AxOVAD9KX{U4IT)6G033=5nnHLfM{lBMQ#J5X1te2hRUOz*=T8J2tVyF zqMD`O;8-4<<^K~g7^}0yL$x)509UWAJrH;e0}BwKDY-RLo~6Tg!S_PdM7FT2mDw?l z($&?)3!`CCTfSsC!ZtG)qSRPEQkiX-x;YdqyEXq9WIi zvI7`&24(wF^yVPv%P#>-uk&U6!iATfpD_1X{oEUpp;+5(C7C{h``|;FvERo`#BnN7 z)~~!uvf$#byczph7wTFpA)vOO;{Pw&AU1_+hc<=wS5PJE89mOw3qd&g?u}?3wG=*N zpwe0e_tJkRxkK`H?mB5>;PO!vqJ`Ag}wa zywuw3^0uf*logVAj>LGn?YmKWuKhLqcEl1$8omV0elCPr#1yf65GIg|Bb0*~B|bE& z$m?drr&E*o&UAJ|DC{TKIt%?&*>(a8Ve2 z>Z87;&ZDz)iuA7k3s7d+34qQ7G*qZ;?6;@5ZL->k$a*HAK_g1z-b*5l28$@|tCFU? zfqXP(zx-n+VB+e(XbMwVfsp@(O?s$aT_L)kA|Hn4U#*VM&nMDc7HmJ zhL$Le`x%KcX?Tg!9!jRUwFCEgky{&E^SmNh2V}9{kN-bN{Kq(!vki>H>Q&M%!PBkn zzvg)k0^|6<5B`tfKPA=DFW|?mowVOO<$3<1?$QqhF$=!t)p5%woARdR#{6WI1fBU zXGZ_?aIeJX`;>Ns&c*2Xh%I4>=P2ZH#TdMu+nk#&XFz)VWpEA z_cZLFJrdLq&!Obag@U&b z%iV;y#pf($khV^^wuy4XZz2-gIQT5n#ekiwid2tM!YK-li}Cb;`>14EHBuk#BS0aGoprv;TEu>rKt} z@)b(?9;JTaXTrsK6n>9VUPW^*+4*ZzewXBfr(q+f#P z`Fx7c^D=%BgGjtMG8w;wuy{xcyG}cSaVDxYhnHD~ad`Z694jT#t~nc&T`F@l3k-e8 zq$an00vaY`$DxiUe~Deh)QJ@J{fiJZTZDQ}MNp;vPhzvH{Y0{Rys}caQe-%bZ01>|qBP4)` z{|O@`fCy}gY8eth#Bak02_ORYU4@VUB7PS}NI=JHpd<#T{{uZG2$>*J`G3s437lL- zwa4GNx2L$FO+`^e zQ3T{EA}A^%`gjVc5s{}zMnptVM8sWi{C|I^?(M!kS&07M|MU5GGPkNuRh>F@YClzV z$}_D=k~SBd6{jeJuktf+dXT`udCNPPgLt`hA>r+{P04?)KP{3M33&F06%;;pwQ#P zd1eNMDdAPvHFo-Sy(E741_*H>1ANP~(>jk^e$u3%c`*11f#U#=Lm_HeDbOq%cdFBe zLdz`jAsu%dnJ~F1=L|5j5$6jqTOy80U^*Q{91+3Z6LFjbIjLMuPRcAua#8_OI*9zt z3h?Xa1zSUgSLuMdpvSCzvi6zPlpD`9>l{I6$%^W!LCoeN8xo|s$jSoMi!3gmgGiGj zcf1)D>tyy;-Ci%Khbc_1q*}?@9aSqiry8rhux`l}oE~=Z>p<{srg9I@hx6JGUQO$$ zEELrT!`;yNX)vZ(d9zKWa{V3@M{LVlxw2JDxyt3r^d!7FV~o1^*oJeT2=EY_LY$K!Uo1GD=Up9cJ)DfCI%y0Zd2FpM(c|e@^h31;Afo zkH5y|-;w}ku{QB`(wnRFg886^rQ6HMM#AZ}n66*W6evNRnE4TwU@;-G$+hJU&+TJJ zmR8o9#=-&!oO>1ZS62ZFUOqA^vQF}geB5)_>Vh3XH~20uSb*uGlV3SlP|9%Qg!1?I zgnY9&eg)9aJtB0``~%;C;mxIsW*4GSwI+HsQ8bw+dT8V?Jv8VYuk-j7UeteX2Zu| zY^2EERAYLc2dRIYaQ$(48b(s&u(_qkLF+7gP%&YVz+Q~Uya>u!XA8=iCNtUbcJ<9H z1mLib1DFK>CmtNYEC4vN-~eU;zYtjCeifHBy&=Isalz{7EcI0l>EAdNlVLl+&aR4k`U?7NhTd+a>2xTJ@|4IPe`J&GC6;4BSyS9&Yb z&^XJ6BYmwOea_5m#J-~X;fq*^M(mebKg?Du{jglFAO5QAhXqKDuMY3lF<$n83@>{R znAwPJkvd+svJ5Xy z%^k}p_(6zA?+(k*;rAog-@KnHRGv}!1ukar=(*3i9Wxy>8|J>s9~I0!SVFKVKjqT2 z1B~`KCMI#u`*Zc7Gv_0@4{K5xc+AMbgChj}$7!`u+5w1Lyz zCm1}%FQYfVWokBfr;zao3)XkbYI$*U&uwC!FbRPVe)N4avk`L*+$|9k2=U6=22(5J z71K9(C70vXHyp17NUE0cTyxtX#!tUv`01N4vk{#SW=llRgX!?oD`W487_Y!Dm&1R* z!!N)(__vMmQ<%i{qhFYrjVLq2|4TC+emV)mPgezgxg35(u$nsy;P9{J;=p%dlpj9A zcQ|1)(1*o7os~Hoxxk>(UgvO115!UCQ@3m+aN^}o&-8BS49)+a4$8z2eQ@)qjjN#u ztB1OZ<3}YAa1?+R0>rL@?(N6-hg!>9+d~$mRx|85b|;O|8;LfJCOAjgZ*>vVCvVgU zoi5E+Gbf+Wc)vvTY$&b=FIXA-(eKR6M!z+)C3?|JR}X$;_MYf@%v?<_R}YX0s~!lD zs%L&i>%}toIlQb&!MuW6RUDq_1-4e0OPj0%ZL$%s7xyIIF!8#JUU{h(?o8w>$~!nq z@Aan2?uzmjP43?7V?7Ucu*05X;fnlHj~A>jBYO3lYX8Z)aekcVKU;qM=uc*5qd%J2 z68*)@;8~4pFPpt5`U7UJCYQ@I+X%|D0Ks$WW1w06TorRW@cS{@r&V9jK^vNcvH|t# z_@k*=uyKVhhDpEO6{jzYrUCYXHxrQaGQZQgm}g*EfV_Wbc(a&mo#X`H7n^(;7dRy| zi#g7xyi8_$(y#vBB^ynz<4hq4*mW5SzQd<253-kp>{%uCUBMsX({3jY>X-gbr+btp z(LieYb?NUS1I*0TgkLxRt`)%ahT4Nf9fj~Y_42!Yh6dkSxd&f6vmc%bbY5Y!lW6t; zdI`%!?vJ8?dQ}`4lTYxl=y-&W9dKX#W{|{Z+&SKI0W+!5u4V*(5&~)<2;>v6n=llx zhcMKYZ>>z{q^`R$z^M~zc5!%Hu9my2ggZT9r{8}CP6Jp|a)B2^0Lp#xy&WiU{H6pwwj6* zPWUiYiQoTet;`T7&VU%Mt*6fK--uLl==A((cQaG}ET;aR&;w)g3D%G+BRsg1D&N)K zTCX3+ktFpasSYzL*BW4Esa$X^DXwc9Zn&Hh%yRljv-*etXKc|7}HxIqMT{+~L zhisuZzSY!h<(K09-sG$7P4riOkBbprY|2+(0;<;|^!5-E>`dF%8UITx8O**-X19G{ zz38FrGYg=H7uqCYE{-p2LrcefG|tKvKdZmoQ{JPn>f>68ca#^kh9*R~N+q^!W z^U_=D=6#t~&UU#mU%ir$t0(%M-Yrp6EM}H{l=L3cOTSk#TuLlvdBQGKf) z_Nv3P{?y5JEvz40izkX#7S#*x-O#bVhRwqp={D`AMp_QCBFW7Q==X}Lt8P~ zp`Yf$vL=45c|DQ(HV{y%g{j&6p@oj|RRp0+FAhJ3%5{VgtncEttx`Q-jBYSSr&A9? z$brWMqrEOxoQlVxrIwEIISJP9O~yKv1B2azt*)+knT46{-ltOYZJ7Cgr8`BeRp$?Y4?^K)R(KcT82CIE&*f9Mv>g>(U<@Z?s;k zgIEp0KTUbdsCSlWBHFtD_2#eDU%4kaY(-8P_p7T! zr(5ubTHIr|il)^)_O}SVmiO2-Zwa-0*FsF}8yNQH4Te7u1bPvunoNUUI6HWv=hKU* z(IQ`x57H*{K=SxkDAWc-a6GNpz1Q+Lfxv;#(Mc-I0syI?1DIu^asw^Y3vVY$KirFN zU_Hp}%IAPPh;WQLh7(M&U0TlbsAO&oc|*cK2yn7NuCkUx_MT`qX09feL;t8lFF=C6zP?%<;~%iNel*X_Y_yG;Em2^m z!@srJd!nr{b2Ygfeoi}xd;!+Mza+-LoyGMdxS+w5}Aj&Rhd`WH{r z!@lb6X3nT)xYUepi0Uoo?ytUT=B%o3@Y&VB%N<^(33QUc3Wu^ULHS?n2BDQ8dv>kF zEC3LMIe=LJAhmJ;vj9Ncqkq?bmhI+>^;%Wn7Nu%%yA=x5hY@ z+3+sl_W~`mmmZ3f?dI=ccRG!WULYaQa4#LC1VZ7fd^BGi3Le0g3ph-JYW;lp4| zYk+u9Lri+2G*`mGEB#8m{GnOqMDA>&UpR33kOYk!xvZ_BjQQfid|6KOsS# zcI*y3fIK7l!jsx~|A?lyR`Yw;#=V}Kt#Cl{VTK1Cgf}i&nrM{D2R{YVKzo=44Z9&N z7!mT2EcTr2$S1NW1LKWGR>uT}g87=+Ke}7&G?O~6y1o>X(4}CU!e?fg z3-Yj#^F(*kcesuJ*}1R)Y$cOCF8+nB*elB^s<4R7wHZId8rpt+#_RaCyWiYKs7L7> z<_%O{P1%oC>=?df3O+w&e~(r=ahQ*#?8{R26)F4HDf{A-{atr7@SK-Q*VYg*{?Qct ziVfI5mV&QI*^A>1{QIQrm6ZLKlzlv9pYiiX+~q0zl_`5V?oU$i=Ti2Glzq`t4V>rI z?PIF)ajB%Se5f8`pmKZ4et*jTblpCtmQwu@HDh26`&e!b8$O16-oTneCIhIk=@4UT zS8?RSn!N_ru#?*qR*fzuSGV3>MHo}tn>&4*OlC~Yu9Eph=A1D#u}ZIOYF(9n+0?MM za`o}0-Ger&>6jYVB#;_dWxm3zZ3XY6o{p(mRTc=Q7S%tdhE$o$V~b;ILzTniW6h_3 z^sNBsV(83eusf6;yw@gf)z8p5j>+3j(mAJs*%3PDwBQU6$19pnwwMLL2?@X~08UH* zW&!ZF1Yi~bCnW&00619y%u^B%v#7oMnE}{BR!Y?zy)$C1Xg9iMFVF~sAStgdyB&V% z3f_=#oSNV;3xLxSfLQ>Xo&d}OU_}Bj3xG2Oz&tZH&x*~nWkQeW(i+RwxU~>yeLZYq zMWUV)M>#h(E3sLP&6TmaDmKrH>dPg4n!Jruc0Z5U)-EW&u!30A>L&k^syCAW8sc z0Wg{X%mU!;3BW7>#u9*8uJ-~vXcJyTMH%1}+yzvt^lN4>P!(4XK7jUQ0*vmF46D1_ zuv%0ZNv=3BCZFJEl+-FF2VOnGp3M>38WH5(GhbL=z+{z!F7BMP+oo6?J*t45ln1~NsrV>Cxr@}%wSSa_jlnRyt`5}@$_}MpDNI&>lSSMv5F6E(1 zK&!0wvKGr`=2Gu>*Icl65p{&hz&Q-V)E(?hf*e;7+&28I&Jd);W?_9s7|x*OhSw3) z@jU|H9^mum90Lt{Rwl`5Wp^(2-xPGvy64O{T8i$7l6#{M-75+Z?nBMeL7}NkDks2g zMaMJfNaVUnCC{V}>9?IOK%Y2}LU;)Sz{*>x9|Q5W+`VWR$7gu!mhu+Jc@T@UJLm;^ z^2|4tR9RcxwuA_ui!H_nI`#M*gJPDa3}(w*f|?uyF&Xma;yibDN#{{a#$c)0(Wdpq zKp>5vP#Pl$FP`t}W8vpj5j7XB>-8#+f0^Ta>U6!zgH+i_-K|%BxD{!?`qg;Jpsv;H zi`1cdRb;BgNd2N$Wo2B9)FXP;8I=Q@>U(5YH|P!^MCu8>Dtmy%NS&cqW$9du z)E~xY8q_7m2N~24dR5lv#YnxMS7nJ_jMM>oRaWW6NPVDJWu0D()D3#oS+c4p^r|eS zi;+4*ugdbd7^y$>sw~Efk-9{e+Cb%Ta+*xCUaZ?A^_E^$XCJJe)QPw^P%2dx@x@48 zSaP_r`Vqi^&&O5C>b9zla|!19uIe7zCTFdmxUX!uHy6e)EBuz`Z|*;`Sd87;UaAzH zM&+Z3X9(ff1JyO0p9 z*>^zeZ1}h~xJ>KqQVR?Br-{%*bsc`N`L#w@j3!m@ zDh!pl&Mhf@S1anZgMCRAfXU>ag{VTaOkU+3E>il%p#kaQmbJ|*wFUd(nw*L#^Fy zsCk1^meG%A&dSVqXQpU9|R!!Ob>M2uQ_&cU7 zcq*}Hy#9XA_OfpBho^AvL=Sv&4#EqUWAVeIKuP8-;AgS;;jMDk z1Kx&iN#78$Npa~x1Xy!7nX(PS*yklmu8gXuc=LFA zGC>P|0mqiiB#Nu+F1U8*a&hgC5!etdtPJBqlDAHIF;yzFMxwuU664CG%9k}kNr@rA zDF#m~vD=BVDTxUyis*%;5VFW94y{_FIl?+A9qT3*A+y^e$#p6@Cbq@kmn2u-qbaRV zDr0dbB?Qx5;nqN6urhnwnxC|qP%O?h(_K_)+L(VTWbdtcQMc{6mfI><(UZ8Hnrv_h z^CUpG)Iom8MqSaKu*teTJxS(izS$Kj3KB1{31RBZ6U)>F+X@@u*NEc z7upHr?ttON&KS&MWjhmE_OU)r{gY{SEv7pg%~RaoYJ0|;>gu&q394%6^0PBx_EkOV zvU=qC-J#}-wmA~*M{UZ&%Wmq0WXzEZoVL#Xl7&$;k<=7|gh0c149#q+C&fntoA zlGcb$Mm@iJgkbM=u-c`u`97IvdzJerrk3DV>H-Tnd9qVuevB!XDU23)W&v<{0x*l! z1v>uB>&5>nnJGqB2t##$S>G?K(ct8gbGpMf05A5oE&e2t+{;JIj?iNOLz6?8PXJhR zUsAWNeihcY(ci(=Yb%SHp(%)62g-GOOY3p;)7jxdsb!cIMR{jl;Y9+gt1#KVp(!)0 zPcN8^v|xuPt~fn776x?{yqbtF6$;@2kZG3@If%0R5#0P99G?~I`t>hEa_1q{ulxrbQPj{wRdr}7_{$4M2U(^K0 z@fjH2h6PL?yU5GZz)pZOnt?^+z$_AVfhFMTn4Yy%|F{Eq-=I3#XLZt#C>M%ELgKhE zsMj-8C#OJ9@M~h)c^6GERC;PVs@sQS9snMnvw@90S+6A~mX>@XD0E(h&} zSU#jD)_4n5EjzLB8p7YqN1;2#EmHa@E~d~mjW!0dQY$>w`sWx_F=+nV>1QaDPp z6U&RgG?qK1%~qy*nfUH|v^Jyh6syPcSq&p|^X&Zc;J9Z=3=D7WmACLKR}(+2)=Dwm z^-zo0h>cWh$tN| z4y*0B0Qw_Tqml-!-3Pr3ohpSjRthTXmdq}s%dkwkRT>ie|9w-ltZFy_z}~w}TGvQa?Ph z=vNJ{onrQx`B03B>t+8s9Lbh9%i8Gzm!5AY8p^Fxv#l$sJyUpQ=3@AMA4J)L+I1{$ zIRkIbw(Q$^pkv9y8_7c)nj@xKOl4Pn!*O^YCgJo^Z9`i!z3#=<9tUKSd>R2U7}4GS z6e0QuG5ljU0cV>jnN`vmxN&q&X1hb&Jn&f0U(-qmn}!7EK+w%{!dK7kx4a3Oe8)Y? zS(E#Pl;6C(dr~+Xm=0dDVkUV|{RlA+b$PL-eiTie3>~Vb=X6d%{MShequv+jypxI1 zP_ z*oV)cS&M$MW#46@Y`eMk+Esr=KaGka}iyGm$zCZA&q!42E@5HDxYMo5*c0QteFV&qOM^m>_k9 z5KpTq{JNxC%<0ysg6D~2^X`P`_e~~xL_`-;L<>+VI-*-kt&Zr{2GMgwG+Lw*q8X&? zL~H6@Doy0(ifEg_|3*afh5$rgD#WFl!mmrT#q4xM|5ik6{=NaCT_p>zWClGi7pnHn z(^_W=7tFlOHJQ*))?B+!x$w)0{ZCUaJj<=KG?tD~X%4qK%$V!1LOM5#&i#zI8MX}{ z=G%ZY&_29{SGgX-)5j&$^SklSy6nOzu1)}E0dP$MFbjZd6M$I&T$cdM0^oxQ zz$^ehlmN^E;KK>PEC8+-0P`a<&-Q|qFgtuRMH9A=jmpb##$>s=-u7Pnn18!4@*b?@ zevOJn&9N?n-}-sgRcezT1zmCs!rlf{=MZ04Qj+n_^v#JLL&YgQ#nZ>|_HGi2lQ~kP zwBn9LA-Cj3!$5^e8X_AbRv{`!;I_F(#ZcZvNvyX1cL_8dK|Ro2B|1;e+XQbRLc|=# zjvq1oVu+N>ows;_qU8LJ0KriNbaOv<=jF{Y9@taIbA;J@BKjKe$mQ^GU0ZkraCq(> zMTnan{TQF>Kac$&b3Su()u%$?6`#8fs1NIflH!WYN9V?; zBLg_njRTd&bu&MF2Wbt@t$Z7v`=OPA)s;0#8Mx`DAHI`tlAzOcbQ$S-oMDC!TLqUe zxEABcs%>p~t8dDWaUt1Y$hobQcCRK93k)wu6T0lRGLJTV+O!Cd0fqo;N2XwJm9-`B zp6y}O&{l?Hu}6iK=&Ib|71(E{C zm&LiEolp;EEY7#aEY446v9`0OqVtRwX^h9M@Hppq`~W=W@!HDE)z}7#;fb(QLyyhL)R)l5Z`wYXW2hE` zuEyrwUXkhwlA+8|;Hd_TBRtP&rKn+QWBY5g5M`{~%`?hMZsg zAsCHLJF94gLV5c*Syk{71B3DzY9G;hQ0kdA@)s%ZaDva!R!!lX0^I-$EfB9fwU!t1 zrnS1R;3Va|=%P6ea=pSfVZ9PBKe>wBw)PQ6m->sP$52zL&iQn8E-bx;5b1n&F^mJdK~6*>gp&%YIYP^X*_yq=b+f$=~d=Z--46j zi1FEN!n)zix1lWNYR)w&YO$_e+EML%$9Q}wTj%AcE5-dY)869FWUIZO4dm$c^r<%F z>`l4F14s=kb`3Yf-F{fZv=ImSxSMZv#lbgi>gX(3oU&e z_n*d#`7&!`1ee7pbAx+YTj88Le0_)lrr|h2I@U}5VK2+(j;ofcky)!|4l4KHt#)O3 z>_)XAodFoLCZ$h$ex@cSB^R1TvtGDaPNr*S?qzc$ciM~LEjzftz4se@juLP(L?jiN zw^DC=kuQ6upDQ1*USI|xHD7zcY2WQVa2P9AJd8@?Wu`C=<;Ytt>|uv5))wYsN-^)3 zIBK$RpWN^+XsesC3^^>zha!s5a#YuOt$wgV4Qg{%iKwch))j-lA>c5o&;XXV(1W?Y zql!a28v+AVMpf)moL=4{H~borr5<>3nJ!mrJI(-Qj*aukp_iU^G?VpgPk%Kz!)=xK zkcLx;RnMiWANicIo_yNg6~5aoJR&!|e^XvtTwY5pesG2|iwe;~9+j=lx$VkjxkOmq zAGS1SeDOOem-Xg7%nhGe=v}Y@e68SXorKS+a&v{l`>_;kTje|Te8Q=I?h~RNmP?1F zghCdCMP3q|v8>%V`6KGKo6{g1%p3<+P#|k{aOSf1#W#W!udVj@6@@4j zwsB=rM%With2nK*c7;`*c9WlxI`5R%olSx~#8~WExVSEE><2wU+ES~ew2RF#lg(-= zIMi)5t>j}F_@_a=x-;L4=)($4EaCbk7b&U!G)lCi2Tu@&;XcH*R1#5fu(Lh5jpo&r zuZBv$gH7=~??g`zZZ{}$sOjN3_(0{^r0=x<^R&TC5NV>etd1VK)GoTD#hO)qF@F?e zvn)q-O{H$2X z)3dOza*2YJQpf1(x$m?@c*l`9A5j8s6k7IU+N>fBl)4&a%)^cA(Ay(=dt!QfVtTu~ z9l5=^Qm-TT&bW}R!FO%extXgdeWkw68BT9+S6}s9v2|vt&t*stgfIQPc;9C#@wx~+ zXT&MGH%VZh(}XB^=jMGuK@5_v>CMB6N}&nKdFr#tj6d@qx9xVO{*l5&Es!LGibM)@2iCEEE?f6T6a*fpaxv${l- z&&ri%8L!Cyn_H+p%KvaTE_+wPT-vjn!TGta*`?XNJDfm-^o&A7YBIafgkoTL-n`N* zjeT9ES;1tDBLl+)d`%%q*PPOva#!%E>iirx*tZl)vzN8IZnR)+cA%|ikH5b1uYXBk ztExJGvqBlw(*-Nhp($S1++1mHqpsuz_wwqCcpIoV$IQ`z`W_l*L^H?J-+1fUGxyis zGxr*M=JB{?d*;D^(e|{qs#4_IXmbGOb6>!N9rKmIV;yxZnWIVb1k!Bmr&jj*4XkEI zxmaA&DZ%2~uvR{BV+=&q2Pa1F1XaUV&+!#!T)t2e^IqL&%HI_H8PRqryKmqt2PWRda(;e2m`v+wdD61$2yqoVKfoh(zO;!VK_Nf#HFp))TTNxk45rH)Dl*pyEYDavbd_otTWXL*o0 z;UNQ)Hso#!M^!#kbETt2V>aEMMhOCnW5Qvd@qtOTN2&D#q#Aner52mu#tmtEa?wP1Q$s3sy0?Ux+wVvY`BBR}@OCK~AdwG4h(&756)>Gn=}>ff-=>i@L%qK!mVNd>MmB zcGjcO_$ya~fAsx?2~_cdEBQ=E<<^=9nCe*kzL zjcTkpbLY?U=Cm$o@#b{wQ1a&9NdD%xdUG|e=k2gQo?g8QL}NDAv0l3+UY^}clBVKR zYc+G|%6Q!|A_u`gtKixnG7ErP1sDY&MA{cg1pVItA!n1!A9+9ff9@9fIZQ|f=jpV- z)zBea!8M8HT3O8RI@xw(EEg$c_Xee}ed-eV*qbqgQ#o#Tn&YL$H{g=Rd>r#6>Unig zGRy9^mhx<{XahRz6DlP09|ZTjR_!x;Xk-|Oz2ieR1QE6Q@J5IY?WX^SiQ29y$^CfbYKrF+Pe5xnvpKYKl27LV6cOXA7$|<8 z=sB16kqb?S7w>e&2!ik7O}*9L_hZC8nSA=gE!kmC3j4#Ygc6CmF8ECw4+s ztn0|h`ree;_QK@+>J^!7?{W4cX_ zmWVwPOz!xz0fEI`YGz*sdryP}91*fyZgcFfG(k4U1aOy{#rte#cX)p)=|F-imOIYm z+texCA3%|c-x6L=*^l?PRrdHD4Ysku>Gt!kFHdBNrl+M}{dD6!)7#XTveE5oT&H+7 zIm0JuL0(Ou@FS|heVkir$$S)APJ@P~v7i^D2 zBh#K|X67rOqWgO2KKyS-5bF$u{%pPYrx|1WCjdJ>&E2leD zPAj~coZ+<)InS#JmK0Q_E++dpETLd;l+hA>0)u;HHG|d!3~$oslk%>~H^I;lw6Ro0 zUx#l6Tm1{AJ>b;@3)>OZ4IbjJ3!|65OOe!Vn+3p^5`b9%+?@c-0^ptmU={#~iX9HK z0QgD*FbjZt6M$I&d^G`>1;E!5fLQ>1Jpq^nze(@gu7YUIt zIQTgn@v5JKb-^#p%0?K+sm*$`pucKBf8BsS-+=zM0sUPA`uhg-4-M!a8_+*vwK;{; z4{G!U&j1WRO|re)FY$us8ZK19ywGr=AMK@vi@lOR)m;-FWA-6g4&*arwgiimn^*81 zJRpWSEs_S(xS%=T3fk4wY?+E7)*xWjQLa6ymTc9BpMe?^7w3X~0X^Abs9REK;&Wpi zna(**Y%HBN!{9vwyj}_&=e%wKn-@Fj!D8l9SovVy;9g8W&ERdRYiQzl*3H>K(# z&8N7t!RBk$vqdKdGTj{~f(35F!OrGq*m1{~>}uCxY+x zf;%vE?D<57B6nbiPVYf=5ZUN|FgTSK zr*?OY|2slsec)p7u&Ngx0sU3qOXKO!g%$9u`X&vq+~FK68c-{NP&(wHMlH1l7p2 zfZ`bZhuYqXM%!x%_6AH9dx(nR)$BWwI~Z8?zlj(=$R|sa%tjAe%~oHRwevF-@yW3J ztHxEet#Q18GiTGM_^a-xlv%sYiVs6F2`*N~NY>75xV5mCPl%%VDPe1uW=Q~;maN)< zSrQKp7{eNc4gW{^q&djphu@Ja@%nDs@le|FaN6-m+VMR(Nam4*AhXo*e_!5*asLwz ziSb6l57G$M$WagfL%Ej5)Mdj*e8T&ry+`7zh8cK#n2R z9(lO+^nq$b{QPp9?J})IWO22$QI3x*ax>L&b+Mq`#$HzXR%^E8&4K?FIip_i6GcP= zwGd{b?_sze`Um00_d0yBl7S!YaqAC8*KuFH>yTdaR7c`RKcsA^B5N?zfD%(+;g%WxBgSoxSJIAG<+#=7u>cF{ zN<4(fLRdF1Q$|S(9uy-ondjPn3JFg z)mGyhW{|`}u5(P06J)6eWl6K_Mj=UU;Tq=H8 zkZXSRd=QO2s*E&NmOqx01>|M;v38I%yg~^Ad*5Uj3}V=CTxEnWh%y~t%tD```6E+8 zr>DY>61nS;5)#^jKSjUX$z>S|-FNG6?Gke!r&UB&y!A!#gQ7goUazN%ctGW4VGMlc zy4m3U%E5jqQ1Agkl0e6iBAPE9$ou^|@fx5co`W>S>s&Wp1C+#bkfwNBt{blbO5!<4 zQ@rihjn@Dr@f;)-uTj!$NLfj9{YND&XLy@fKuLdUGHh~5yK>dKpdH!eddp$`QKXF$A$;zj~>9r zd~hHi8oggVNUr??pFIVn%a_$FZPynN86#{AmB z+7)a+--4rQAn3q7&)3{vYfbhbU0pOzgfl>&q~^PH*nkP95+`^7PRv6U(=;JeT=tm$ z-MIgh3}(6z*jB}Ex(D%}(oqr`$wQIFWU96{5a%`_53{SC#BIywgD%W@=@WpqCYsKq z8O{`!CNi9s%r>u`*IdvIwsC*ncqWlg&&m|G%J^DW9p-zy*7qG)SnVNH@CqyMqzr~O z1-D9@JI{SVFP6cJ;|f{r!xcTNTIg{!N4GzsU*l4P7gVOX<0>8-+7EK?G^~Vg)x{>C zh-+7LlB5*DBcMV`u|!ge8KU@AQB0}z20y~f(Vn$Buu8mlRg(e8PP*sgWW5}<=P~74 zq_t&-IeGb4Y<7^`;qdjgVCFnRBS(dqA{b?1lM)OcVk9eaqq3`l)WHjt zzExM&5vsM-esH7dc$OtGA`rLz|49YREqol6+^HUF+)72bvYBPzTn(=3QYUX?nWgTs zdYbz231SET;uD>$`fcg3z!Pq&`7ZTpo|!_pDSX;JOSq7?g!2m@p)O_Z{mGir*wv*G zosw=XuWLess@>7k@HXAHr(&7N?V$j(mAf(d1fEiB%0 z>z8fZoEh%n)NZgjG?iOr)BUo+>>x{2J?WqxMQZxwpM>i>YCg~`GH`CZ&!H-?5_ygS zXT9-)>J6Ra^EhpVVit&gRvriNKCi+Bzr_{)VqMTvarECL(al11MUWIirdCSbgYn%P zo?J}fOx56LC;)5TgZu&-vl6wZZMkrn(=_?FL^s2%`&2fS#NiqMZ%Vp!j{H9WGp zq@_3sEzL>UU{goEFDD!}OaWqr*ADU%1$ovB`=O5Q2E!I=pa|!{^wuDP0H0Q%>G{mPg0T;vz!X|LK4m_ zcraryrHfg0xx?r$336u3&g&gQ5%y4vU1D3IxW7x{ngzg%3BW8@B~g1o;?TtxCxiRd zp=|;2PM$3})7#-GIwO>=aItbSK_|V66B5!pu|1E5isC?5P_c_h%Qtpm4m3bu7pZ}I zYmxW+gc`H#hYm9N<|s(JfVjR%^Brzh;+M1j704iVW2u#FBviK)uiKQ4n=b2Fwxqho z$~2R{LjBB`>d28+NBn5DYK5gwMR<$KdMjbeThHYB3&pueahAn#YUwyftvAjah;y;x zERW-iq~jc|I9n^70_lv7;%B{Xgk>UktbEV6zEeKI(e#}O{lfbW;eA_-_Z?}xCn@HD z@U{x?+nezoC*KPVuY3a9OC9eH;Jrk6Pmb|kLWo>8dS@E_DMBz$=!>8a+QcKuMTIvy z)|}SyNzj2Y`B;Q{*o&IOo}jSXfOcR^K0&+iF7m?wkRNW#x8WL;3tH8W?}qtK(R`}W zZ1?A*cY&c^o~H@(5K)2-aN09Nxtcge zyOi$fmaZSYn*i|YJs4~)!40a?il(Hke^R`6E8ZD#y!X0zm!{*Lx&C$1%GGo#(7S-ld9nZXAy@cS`TdbiB&C@zhSxdN z$Sj92Fb-4Neo$6dG{lF|C`hf$kE!=K(I1HFG!SrRhe+Xee4>{HZLHU)WM+`JE1=U0 zrcrsAVWY8yC1r6i7w#ZKI;%8ydB4KcgcM1Ccg_m}Qs+r&0M#q$ZzIdVQjXgpHDHk} zX`BY|aJ5DqS&uQwo`a1teEp$Vaa!?x?gkHSkUf42?R&Ao;_U zqSd8S+-O2s8${Z2em)eA^{<1=nc^b14&GFH7X3TK@9c>Ge?z-aycX@kuW|ANo5~wM ze3cQjEk~!HpT{*JyB%eAPD{j4KAR6;M=UPVdgI+*Yav(wm&S{QGI}AqiSlHuZ}q+= z6^QQqV_#;=C9XWYOg^*U!Op(97rvfiq+<#9m)Q{N{+VVhIse`yF%a%1V%ZlFG~8W| zy)0*|Sa>xqru-)eh$lLbV==S(mLN8j^?oM*mlURBaOP?&8!ZYUY z#p(?y>~Bi2&q#31Of3DfYy$H>nL;-!i99>8Y$nU5kVakR>Uav*VF_uQC%EP$mbr;# zi^Q^}ESr+d;b5)ao=WD3B$=%eTwBXR`DZhd9jFbb%U>-5=`XR66>m4gs|gSuDYvux z;ahNQpkCyvcc#)_mZUw9q&+XOY?D|5SvDnSM}e&RHI3bcH?tgmX za`L5#mY)16($p@JVLQZ|+d_a97NM~bZXMb8tH+W%FJ#CmTBnuV#q`4C@aPSX=gYOs z(Gz3_+o~)`t84p$-78StFt4T?X%KrN!HeWJk|loQZWUdIyQSuOFgqSOxMIz|@X_6M ze2@vc-5(uOa!qr9kBi}qYaEwza{#j>bAan@+odchYhO??-xhl84q z$(gp0*7ZRn7q82`*vXu&H~ErPSh)p z-lz{_XrWg#XHBl_>0_g5^6j(qc%LXv*fW3nA_a2}7x9YI7kr%qRSt*J3eHw4d3$Sd zJNMRNsU-*j&dp@e=waW9DLN)BQc;8_>eH_-J``u-9N@jL+ZNR-T6NS!7n=>|0$rUr zRqom+{bZeIb0!utoQkK$-Gyyr)R-22)I%KS8YPT^Azy>bpoz1jQTo^jVf{hVdE-tp`vM= zoJC&UTtdFZ+?;>T&*u6T7Bk~K8@U?LlWq@Rw)pfI0uPkVDIP?n^!w@!@2(0vD{c zID2@p0vomk+kr*?;XC+5m&l{fkn|PDS0)JKAn&wjhM8fvIQ(IkJ!+bz?(hhA?+)|V zMLQ!wyIGPU7eQEii{jP0u*G_lsFe0YE}yZ#*nM_Au9DQ*Tq8%53{^+bpQ?`Lqz$|J zcypcCu0E;&8}-pxZ1wToz*QgLgBgj#*xxI=*l+dmQY=)n_hF1(CVSHHEbv3kcEgiI z4-N*`hQn4Cm&s>-^>RgRQ*BM6UhIbt;V$zK?-h8iS&nSaCJ&|rfu-slelW-^W%NpX zP57ed6S)uItX?J9n0$gE&19CR)zdzw$%pi1#dE6tVqWU5wzZm%KvQrX`VX8ggIr(8 zY`+-m#&7qnfdvqr8>~lpiYTVBfAEm?z~)!4hLkbp-Ty}Z8jWl|?LKZ~6kWX^J_foO zgJ~}c5ck8|SU+qrdZUHFhj_53CQGy(A1br_tk1MS=0$%?uc<&Ts8`zo`+^6pOH;I@ z4k5Xb)8$n4XlH2nwACYFbM;6xHtLb3V)f{+algh+S~gMwR(JlXzAPzp@b8F+T`EPk z;Mw~X>PrwFO!I0xC4RA(U=i*G&(&jJ>eY4zQag{mZLh{w9p5F2!Y)%WyoMs6rnR&& z<}C$UkA?{H0s>rd`rx1+UP~z6gQ$CwKfNcP)DhpSvA+pkbUr$T^_A%_@nF|=L`yUS z_@;Rw*46L~m}9^Q*5HGpLO8RTy}+&Cx+v!+D1CRmNE2$Ww!4y))$|p_UP4+Yc0W`W zgFpN*AFHKlpX-}_)aUw{CG;nsvGUss>`der@fyv`h|{BeakI~Rc&=}k+lV^0;o2q}uvXje!Hk9Ug zHO?z$ZOyp!VSm+OztF469o~YEqr)@u(9cWTp;bsd?Eqs>Ow=nbT96`&>Rf7ZWX*`l8b83B z<3grsdf0J0p~)pIYL}kR?ADb5o}$N1PqtQ}uqN1ZHual~>USh8)1OW1aBF_zxT=h* zp&7Sqe$wz0PWf40&9CCkaV&5Vnjt*i7BURAGcx2QRhq`*J zTS33(GO8AlKG@$XyUH8;a@kcGYy4Ji)#4h79VjNuLWOzT#>4Ea zFsG!$F!+3yVz$A@Ss9N4_C9mz@n{iU#0sL>!K}ec6W7}*r;ve|LCEzMbLQU==0w)~ z>h4PFjC4{@_@igywpo)rCUSccrurA+4~)qt*oCtZeLJ)V@1$P(rreDC-u?cZ`E*Ua zzD|RZZ3f%i;HUl3bDDAO+rT9shl>MDadaYXrih(>-}QAS9^i+!S{+}h7;iLw#*5dw z*D874MyPdTomY=_Rf0&Mx+=9f!*hh1$&w9}w?MjmS)mo{9%1 zH+ovaUr`s)!m0?L@}b^{GG&TZ!ox|NMT}y&r$fpMN{MpVe0kpbgQD`V#c7{r6;>QS zY6GEK?Ae&{8E$+PA!@xcW7%hSB**y7u2zkxmR-vxO3^+KKgPS7!NC^*rpH;eab|SV z7vD6_P6fUK7?Zj5I4chN!JQ6?`iOl9r(a#paS2c?9sfPjlLB4V7+nf>aSlgv04jnj!rKmR=*Wb5G^>&NsC(e=2!g6&~MAHmL9^j&<) zbn&iyc-91vdsD2HRb+!4H5Kj~&|>eRn1=JFu?cnBt-&M0`cYx6xo;zqni;zD)Ok2h zYXfw)%CfyuN;8n1=Ssf>+SDt*jiPZetp%VaJ4KQ>R6chy1Pz9-P>$i3RdVgk$V*p#XumWb)spg#)gy(6rHtd9dL#7|;Ne}R zx1{haFg$52s#&^v-Js99#YQ<<_Y|yT8i7{Ad}(^Ha2*_~i_JI$iE*kKrf@hFy*oM_ zu95JlZum9w8GVePncR$BI2V>#{53vaO`!1Wcy@KB@Rd4Uz3J-gG9_JcAG~h$Yt+1a zi8Z2S()CXt6ynCv-QC%p4Ba#8HL5%MIHBSi#ogJRpnB~|tPs(tghyAmHzG4NbX#B0 z9S_|`yVaW=^+rNGjtZ)A)O*S?o<}$xZ!1(vW*5 zHRK*^$X&f9mYt09$)-7+M_DR z@CcohaiKA4xp8J6n@6cq1YgAJ=5zH*v76VwQR2rB+msr?L}`X*MAlu|08^TgnkY5E z$wX<-lVAxY|2(W&&L4;KO^yc0;Gdv#djdP++xq-T;Ta<{TJrvgVQVu5j(?h0g^cYH ze>1V~gw|<-4!g5&h0i=xDl^nZpPl4rFpfRaM^I~)jo-}I~b-%M&!6^8uReF zX2$4d{Jar`aAUfj{E)zR$e!^)Y_9;7QM3zj_kezi&bQUnL#4gkqh}1GpB6S3We=oj zomm%UekqH7PxrFkmZiLVSiY@H zsPEPVw*blHY(L`+82Eku5K6%sn^i>{Wn zb+#p4k0fqlIq!T&pOrcC3BH|3@{nr`t*u&8@?el1k(ugx6c0>p)gVGrGB=HvCUe`< zWNt2r_UKkZ#Yr$;?yMxVb%WAPJTzX)Oo`nriFOmaG3Bp`(WU|UE|#_eh@+*})MLpU z6B8@KBhBTdX2JROhE`|6Zk~GI4YOdpii%J$Zan`vBPu!`@%!UK$x^MCw19Q|2*XKjSaeu2goZc9qL~jDVlBcEyT9 z>(u|kU=A+X+UCT4p1(3}&!hda8J6J{)XWF?>mwe@{|FqnzB{nG)@Mx*<=PA$UjXRY z)1lFwvi3$_l+hjCg;7|-bSP7(+;|I3sKqs*epZ1z|CuYdto;+II8WDH3Y9P3OTc(Z zc~E^x**3gIWd-eoM~$?%V%tFt?T_)yz68rfp}o%PQa5x7>dROJaLUG7{?xvXLPdbM znR3Er4|*lbOu@Z_>fV_wZ-d6}i}4!hYURvmsnun&&ob#kCis_r8~pB}$MWmE5hKME zv@TQ=EQW{cWfnAEyIXTp3l&9hk%yp0E>vLK>~>P*LU^d+@{%1!K75gNp@~$M+)N3^ zDXD_jUu8hGy>l+`oEuQzCaKKwlh+^Y;;?epT;TbM1nUZJD2Bi$>g!thK> z^d*@ixAX1f(WJ#{vIkOAP`C()Ne4#`c0%wl9M;1kHLeVA;k zO=!V0b<#X(s+%X-L|V-U#owv{rD@6RNGWxdyi$p^jqE%$F?nsHnuaQGE$X|bqZAXT zcr257^FJ6Ymwc3p!jl=&ESn%!P7=hjuY;ILw`={blB8y>sY;@Lb0eIcXQlqyl_cht z%~~Hw&91~lx7y)h4OTmy_5M^osrpjseL(N7scBd}ca_}qwQj7AYjU^|@=sNz+>|;# zoq){oR1$HI>1KA;x*9XP6yr3r+epg4vnur3j9Yx20=oX<|Go?0&DM<(x&I~-*~FQR z)u!1SPfuq!Hl;XH{P>UR#ctka8zn^Z?$<6FMthS)S}9xKS?WrS_6=}--n}E)Ba0`{ zXbyt4pQBrvJdb`GWAeHDrN(>p%JFzVzj_?2?y;``sS6J0SH>AR-5BZQ)?Wel9X22M zDgl`fd;^2|0Lf-f@s~F^OV<$HXKdRY(+|S=YYz^KEoU z9Vq3FH;>iRTXL<@0}APq%hW&GADwAwjANJAxCAawC~1n;H{CLvG-ts@R?xnaOBvH3}0i<1bYw#N^Z*(9isq zaQ|gx{w=(Uxg{JwfffIaBh<2^_xhDL0$>VdAQPS<5#uQw)Fcwf!Slht=wOG=^F{-x0*{2j?S&=pgs6g>SWs}H21eQRpoJ|MM=Gl3 zfH&HZiKXLRBsC(V1F`g@go+7aHTpUc@*wEFnmipFoK z3pBr4Ri%AgX(U@Wy}qmxNhRxrzqj+b&)l#07NUPCvVBaLcT}fZIsWkoC7Wi-8jqY*TBq zxernyvYCYCK1#w*!xw{*sMr_$w{m^tByjMcpnLhjHb{4DkM_(vxRks;z^zFL?rvL% zbpX3jrR)2=I?*DeG8Iy$0+=qVZ5f=uV12<9-}+F^N7(Opz#66x%oy3m!XS&oUKaIg zEm(t-D1s=5&3Wa$k-Quuh`h4Fxp)pAkaxV8bKLyhU`x>eC^8ex^a3dcUzDa zUfFXh%U+<%W{*qA%O^N9e()8JsWbjAW_-pUnH9|bT>Wp_+1K-;+BoF#y852G1 ziMlgTiUppBz%$P!u<9#x2W48PQVlO8Gxlgk$IzDaNG$Yq%A}^evnQsq#ZcMWI)@N_ zgc$zucqiK%bcN~1H(V@RjXSGb92;|8YF)$$Kp5jE)8&FoQ~&o+rZN8s4hC& z(utY;@>u>1>{b3!XL8X?c{Z1M?iD_;_D!f!{Z8z3P*G#%S+c4u`jMG$&f%7K*OV9(75={un=dfH0({GB-mBl z0^?^DTR>wY&(vbx{brk56FM}7>C zWx46dPXp{)RMMUppE7syr!AAo>uK&?XWFP|slHdNZ0dV&WMRx+1Lx$Cl4}hxA0u7^ zaHu5nO>hhohRV1dK1pRf3XoUhj5PIW2Yp8t+IL5Vu`&NB=TRT{-{68*H1IpG^yoi1 z_ADFy<8bRt0TfzO0GW*`fEF96DS-0BVq<3+BV@rA8;t%#YuO@zczLkckdc}KC>D6! z6d)#9Z-~3ZyxIc%y^%$HgEOcW(N1z3A#SR0cuZA&s?e2Xu8?(e1zLo{)63gjp(Qm} z$TrUvvdwb^vEDV=_9fd{i#3R~Sgu2p8*^KWm6VniyI6$9Ti#2st5>;}0$qF;ACCS5 za*dX)BUg^fR0)@2(zZ&v_8>bwd)#PUI4i4~N;=L?Ydkq=O-)Wx=k~PXvcllp-crSK zrNOzqeN-A-82$3lzMjlfgSO&G&g~h^)}VJyHE2OygXZ~W8g#KfD9UH?HJ05*4&!

    Ks-;xt;G9H7L*{`W65EasNHxzpwi58UNKvD$L9NtCd&j zYhCxT_se>|SN8K``u(I7ERtsb^M1G2d#)vVa=)~X9LgUKnXooX=?4PdbHM~pCM?6@KUQ4 z`szfe$9fF6<-1aF`(wBs%Q2{XG6v1#g>)Ea&rOeU&R>%zx7>pR%p8@zW4QaYSQ}KY z(E7ZjfF~%JHBz4gknAs}{0XH?-Wur73w z(7WO_VhSjFU8=s3%2O-Yqf4?If>=(}2ncJfpyoSUy~xui78OfZboNUJShCJW&&+L- zg!Kl)pS0JK$@$cRDX`pOo2z#9AnMzG+w<4p$vwroJ7>P%(7Zyj@Re=t3E8!h7uKs9 zjgwmX0@K{TyF!`C^n%&p5xT3E^{lq~kST$0YtY~ZEcH$B$5X4!JNyl6jCufE?_#7s zk^mIRu`>url)s^T*1Etckkli+3D`Jkri${b`aes&=olw*x(=G58kJXDDQLtVS3X-& z%CZ$j=kd8N6+YREoDgIUh-C4&TF(&kZuv}x<^7*~Z7#CZvlQ^VaBZ$a{qCTiA-EHG zXDYG$@RDt1+~@I}C7rmrVkzMnpXd%1 z?jmnnS;|ih%8Bpf-UR-ULEc)~)bE$Gn^k@Hhx$+Va(R^uKA#qMZCg)=g)6kr4a(0A z%Af9z59-@mH1+%C=fav;%i&EQHI~*^3l>~8Go)bl=5C>Xd?35y1KC|2lwTc`AMg6I zJ07wt^sf%eiA}V!eX*CTwv@iT7?LlvUMwC;^zz!ET&MXxS-v>n{lx+A*9PUfATX%k z@7s%mzFiyi?OK#ulY6VIdhoc)%5K6vYVxkZiW#e7$melc+3H`vsvO(b^F>}|y*9PH zQfJw&X%^MqL@xV*(4v%B4l$Zshp}}X^AkB%qFSCjAGe6llKi+PpXc)9qD*=9i(Var z9FR@z@55Nb8i;HNIC-y7Rygq&>9RkNmInmCpsYm&Z@lI>PFV%_vlrM#6MUe4!W zl4zJ7A+1PLr>4_B#*~X}E&a$PjhD}pWzATl6YNFa@W`Ku{=9E1oZhM~&#|S%t~l*T zLOvIn;PZD}DSPj%Nq5zygai_bTU!1!tQ9 zcV+M9T20<_Kj*W(WgbTjLoA01$-7^$F6jTBhn8N>*SQ>LBjT=<>$`E1k092>D5w89 zmZ=iYq*`)arS74}6f5Q(YT}AqnY-4-z|e_p)XU*$gIUJkG6!;taTEtglRnfw zMO?rdliJUah^Y(H^`2ME>SgMse!L!5B}s;y9`dLBK(s={9DUH2Q9K&olg4?R(Z3pH zIiNJBd6s1=FM0D+R&bX_&Kgiky?U0?6f1LH&sU1NN8TfIRrzS$GhhI7KV6SeLSE{3 z$ur-Sw`A}fN-q+X49RQx0gZJ|m$lgQ0eGz9Y2~*j0A=NLoz%+fYI7Wt=oXyP$HXg9 zCG&0xfo&LHjP8D930FDMd|Qe>>n^~*}cN&HZc_*337&{oN71V4x9(X-@ZH%;~yL=Q3Lmk6DUlC`JVREq4tbCn7hrmeymBC8Nap z7UK?mYq-adG=7eItrns*Ah8NI-c+eUiDTlPZ6D7%Y_U;>{NxwA{pcVN@smGolKvz@5&H7kyhp~>R*Tg!smIrJQ zv6F5B&pOt|o>RQ0d4htB*&-c)gbNK|K`@lW{H=4HQ<= zE85DsRL2r2;vXb$E6KRUjd2{{rBQG31{f14wHQT?ikoLCSFR?unPwzyR?L>B`Z|$X zi&NV5+7en;G_@J=fc5m$7EWJJ?0YP>$wagIHW^5<$+qc71>X0-v};B6Atg2Srus!Pfw0<=C1?-A)&oh?&qAvJ9I05FX7YZ)|QwSR&Tv$Z@VN zYQ}H;nuL#Ms8WyG;Cx@OeEQtRjWR6zka%B>j=L6+MyuWS=hTyQ8$f$hYQ>2^K2eID~S)&{i{xcKwu9UV9?Z_b{4;uo*ny-aaVa;J#*~_9v!uQ%4wBw_3`)+pjn*gJB(sE@a@Lu&U-R6l=~dnOe7fjT z-4(C8ch&{dD)&QD4y%^6jyu>@YpzQUNotZKH?AY^S?m$xUOKi4F7R=ZebfpS_p`}I z6fRCVR%uD4aYK4o>Uk(X>`aN(6&*Zc?JR`a>JM)ZY&lKZqdnZW) zDYxBRhkSt;qp2bPfcxQKaPqL_?0=|__qNu;?R=)TtFeF&q$mlwbjTI^bgV**6;V_! zrYfgiJgM|$`K#0kNZhjxOOqBWFF={DA`T9`>C0tNJb~l%(xvlBP4h%-KvI zZ9kcB16Yz7lIp*TZ>ajLuJtL4Ilg`9QIxneqp^A)R#lplR!a6L5x-d-_N>to4%tu{7yvwYcyXUR%ii$vXGN89VjH<52yl1Znr~y}i6@)N)4>5{;-~ zh-?9M^4jy1?OHh_Ha>CC7V?yM$fs%I(p)t5TzT#R6(2?|P$SPf%AA(wK2=w20Qc}Z#W60ws^@2Rehl$_O5LP>U(PwhSPKT~@x zamgo8506g$(nJKFy=2MKO=xIoZ?XVVnQPE-KHRfMO@j zOPs0@gIDX43-Zy!`}7>QeOhv`9!P7SwiM#&F}=k_BOj7fE3yaY zBvJe%T4MESq3oRt)I47@B<~u|sm2BIm!kUe!ho>5XUvHyQom5pJk90!3=v1{VMyjr ztA0Hz1)sPCSmI0+D5v)4^~)S(%nvDFZPwH3Px6^9t=KuFyTXD{-j70X52=AzW^sGy z3AI90=4p)p`@9&Loa7t&?KJs>aZx$~PV|*>;t*cX-1m=bY|)ck-uS+1?Vv^^OR2xV$L=Ci z>x|nbpCawDSkxp>+h~@ac!rW@L)0W%R5YrA#_rAYyHKrrCh8{dI+e1|$tOFs$&MQ7 zdxl$HIWk0R5gW=Y1dt*f^N{oS)W)(D@#u?{_LwDq+hbXMZ|Jdtr1dvZWMxJ!Das<~ zLE`~sw7otxxLBD4)hx-l)Q%lp+0B(YaaMzsk%VPMgO6B!EE~;f=y0;cst`9@IR7ZV z?L-V#-}dIt!R~qSmh~S#s*WF2t~?v!v1#(2A4Tt!>uce8jT#m#`_Sk6YpQD(d*j;l z!sF`RMy`yITMt-X+46~7ULkAV`>dvh^VS>dpvM28#*{U#KI;+ZqXnYc2W63XPQ$V> zwI*-=+ueP{H9YRZ#Ro0+MtQu@l9z@RA64n%p&E}Fmga`|{J1p)?J*aEe5Ma^TMb{P z(a%34iuf(rK5)8T@}gMtmXjdQsJ&*lVw@gCT!UktlrB;-CNqF&sK-)rdPb{2!d33G zvg$SWOqGPoT3K*T9jlyXfG8hQuCe!mFh?4Q<_?e=rOf>S8uK#S4QS;j{)0L=4Mg04 zLrg^F%2A$jl5x&u?aq1DZ{bTOK)mkBZXR+P2vRKj{X_>}Ge?EMOrDe5+~3QUvQ!gH z-vZW*fqLY5KCt!)*f=EFl_W!Ocxtd;3#%(gL!0^MwWFzr_gs6N=NDtgio_hNR2xW= zD0WoksXye*yYq1_lh>lxk~h=l*=1+HmU1jF63#7VNRGn<4sU%BhWiy1@O1KelW~Cg zM!z+$cmCks4mH^u85tPP2AT?uvyb zC2zQahh|pzL@!tC;y9ghHuu1!(j$`P2tt~R%HAdLqrk7v4ewYdx*Hs324 z>-7K+U-y`3oz}Atv7+N`OUhb2-HCX0p@xj^s|(tQ6{QXNB=2nUXC_a zDT6gJZkX&RM&NHzq@N7c6p(Zpm0!C)s-{B_HceP6jN znIMg&^vYKCAw|nQCd8krXA#!K9)VZw$Y*bW=dZvfqN;u*4EA64GeqxD&#NV(oK|yj za42e-ms&r2Z=&bbn)M%@Av$BeJSQ0KvFMQdnR%)_6TibIh@vnK$)<4MFx^*hokX!K=iS88 zjL*Bkk{@XMKzwV9J916=L|LjlPT}L;%b2Y1N0NQ|b-n1>{suF*#Ar;2-3fEp<`$S9 zk!YP=A~y-Rr6oCf-bBe3{4^L_Q1@ySG`7G<(jm@>{>M6(dly{LlYV)nmB%}mD{nm{ zU!F6vRX|IdRWM=2o094d1MlWlb5bS1efY~7qwKY2E`{N>i#lLzAth@qPm~KkangIb z+?r3h&ug6vS>(P%F2&BRoz3ZhXLiJ!o0*-k!lq<8my?b0d^T5?W9OBy+quoXj1zTF zVEa=dE2?|QHc^yKC;9v4z1Uq-jhts`lefK0*q@8NN-FK|Lc+63>zpl4FE;Ek>_KD! z50%rKLmF{$=yuxE8zdQ#6P3E%{^lRW8`mB7sG+gK@wg67cv8FQYHf#Hl}1QB z-vOZA%k|XABg=_CxA@9Px+S2^-8!$?*Q|rXbDP%`%S#qh{4m4o4Hk0DG;x>8;2?Sv zWmi;6G*K{(^RvRYXRkEnd2b)-VmD+_T1c~F7?d=#Tzzfpq#cCD7btc(tyqSzij{bz z`Ko)|3+kWuxEj|Bl3e?g$OWA@J)yepqwEeIG37{;$W+e{mOt{Wp%H`YozzI)l*PFZ z-d(zDVYzTh664KUh_sz|8LOqr+zZmQo^4O8oJB7SPFY{wBleW(>B)ok~QVmkSm_~_R~^)k-6 z@(hhri9G9`Qy-ZdtggAn5CTp=<_e7l;&z!&Nje$@Fd||JJL-SH2k-Sd?XmwbipG?QK%JYGvH*$^1vop13Rx zdWB!!+X-8rfLGe-Mvf)GUF8%Lc3V%W|DvASbvjYN@~Xr+u<{wrMUCx#mF3+R`J!8H zZM*Rk%qjazx9lF(dqVNd zh1%9SS)ZW@zSA6VNnSU5CGtdTo$4QtHh={OaMZAYroC4Uz2Fffr z+n?7SU3L%l$}~dMsrr}FibnGgB!pDo!q-XZIkHLOUoUw4c6&KCXXNvGiC`y`Cf;I>H_^^DV# zgf$kf(W)4wi`E_TW!17CXDs_2_8BsS_qD3-0G7|=Dm{IK2)x2IvLUi?%=4q?$$IUB z{#H08(pjXs6=tu$UQIGxRvPhBB$UUhSEGz;F71z=>dWg6jmsGMS7k+eGHi>{9^;`m z&L7Mzv}q+~e+|wb}7IG`{JtCU1o5VL6vp%KuBhvJUJx$QMVi&f?DtcEq-5R&ov!eCw z6F^68QQ_Fuy6Ey&I6aD`??Y^E4aJQbQ++tg^j3I1%Ejsq_$zavh4*R}4FH340!{*n z1xVA%7!1pL6pCDjSX*eomQ;H)sK?hpK0OL;S&y%>e)Z^<^{YaAwaOUP@`=S3{{z$7;`z_6H*T<1FM=JUIPqFQn!Q!^ zr-3+^=*1itexjG>e2#Ws6n@|1Y~q7%Bj;^ddJx|+)rhvwy7qiVm*I0wh%%eMc-ADJ z3BXI^quIkH5|DcvCthuDfw;GpGkZtkeOIb4r|}|spWzcm!sAsuN^=!C({+DyzRHaE zm$f^6cH;Cr%X!T{E?%0cSoRr)W(zO1n{HdAcFC<$+T>dblou-~$26R;s)8MpA|HhCT}&yD9ahK={> zQRqQZjr3M<&Dw~hwI|NZHM|;0L^glx^2D7rCA6=4Kvj1|MfPc&O2tTYv?F{@@)5rG zhE7?NiN^@)zK~{Z$k9GxY~|@u_YGezM{BsD@r3dzHew1d%9{5f*T!)4dCH2DsIqew z7bR!;m?H1MjM=MlYX&zt^Ig@RT~}(Su{a55%UmX7#&14%W|64ke+_SOaSHiSGcN%l`~k!=H!PuW6f zKe&6|cG+#YWvsMwmT&WxU29V8d&+|zzFO+ZVSr+n&hVXKCQ7ct0J1jZituc4F z=YTylUmDAzYvL->)^GJA=lZ^8K#N5c_ZgD=7J1K7Q910kkr7_&6G%g?9@ad|){Hmi zIW38YZk{x!F)9J!{=GG>;4o`yi|C&3o-(k~q=J zHUI!jyHb~tJ(#aAK3p+<%jC%NaO;pnZSe3ooW8O`I2!lmZ2Lj2x2_bgza4UWuT zxjoLEgjXe8EYSIjF(B@%`jyY*o>g1LJ~gy12r62s zFHkR9(ZKjFfZMdp?6=6rIxHAeMAZBey-e>!^VoPT zbvsU3eps$->w0?}kI?1tkyF~Or&`1_)H`{=u@8dN-mNvwyZ9<Sicp=n^cnG&WU&QGTm27eJ#>S7_^&q z?6yagi(_kEN*go2v6s$c#pCCMS7*Qr;;KFg8E^V5a@QD#HevgacJ#p`AQ|SeLQk9m zLpv?ggcJFs$>QJzeGTCGxXogI!k-ZDs*nGT?DKqMwxxZvdUM3N@-{|6qP##%f$!wu zH^umYF?h;FtwJfC4J!vu$|VZqvPY6jJ@%A^+Xtum9}zjT253G* zA^SFzIBl&h&$@W*_##O2B#Y_h=UvnXx195Je#I>;m1~_lA}*9NZT6y7FCxcG&lV8t z14iSWxy68b^b(z9VcnBeosp>prK#^7pmrIwdyB}t*0CW5vkiF--jlR%h~gBA@jm-%L!mpG_;>qp}22+HxXozftkv zBkEUvRwrAU$HfC$T>NpZFfAVTpq{4JlCUPVgmrX6%u^mftrPZ&I%UW3z~u5n8aX0a zwT2|45uMaZGyk;)*47S)MvP9f!5;6-WqYPPCWA3dqA15iZ|vD3?Otk&`3#gudGq$h ziPT!0B8{HxpKSF-k+|CT&;~pJECjxCdd8?Hp*|MzOUY3DRysLeSjW=yOPVr{)2C*< z9#6H#fLgCbBErnD!LvW|hmI8e2|0_`p6s1L(htyG7-t+!NJABclT&lM~#Mx zhI-ky(l0L~*Bj&E`CiX^?#)B&$QD}DYZttU`q$$gtbqi^sI=vUdwFEFk1dA!Z#$Z2 zO5VW&-H@B@@_`!9h%}-9KHQTS(O4NlL*ZJuOm1=&p5bRcZ z9>R2+8!gTg$4p$6JoZeKQa;w+nvYdSdG+atTCP4URxs~aRqmCsji3l->y!6-2gNz~ z<(&zZQlalPB62CFs5wAvfLR@Tg1onfyF}JhUR9S$#AR7Sjh|P$z&NUN zq675}3a-N&6xz2afYVB|tx=t#qq>@3k$PRdHB9dZpIbb20vs%Tcw=_jmKj0y;SVA${3pia;X(dkoQ(q%q!7; z!X#(EM(rI{Jmg9F4M{J}0Wl|{z;%A7lLbqVwC8ieC3ix-RBML7X^9hRcOAC?0#e@d zWlGT})iYnbC%0NrR+Gq^(}Hm|gVAa4v&JgPdxyDG&v@6ViZ!F_IJB zPUIO|sU3B%OCRN3wshLko)>DX)Ta{X5rxtN1#DCtp2Ea|E>u;koAgDbm8B#}0=AC=$r98ZCYEA?oI zQ_f=&JtCLZPK|ZQS@k^b=wXaI8pM~A@e~CyUqGtODmrVM6uE+5U>8KEo&X2cw9cCw z>b16w{Lr=m>&v;-j+Wn|1D;3J3rNy!&-*?!$L?E-Jq;PuiTJ(R^qj1;0&Z#^<0!#W z_xS@pgm~sA38(i2B0i1T@w<$xxWV%{i?U_&wItq|=sr(rKrYeABKf zVOjDCs~rX21+NxTo!8?#$|d)~W&~fab0qNygnoIPOPzM!V2wn*;NwfDd6xRr+ACqE z5p1Eo5iFE=r(#+ad$7b!fi<2%fsN19*EIs>JIz$`ea@SiDy?TU@@gWk(>!P(X>2ou zF&AE%VJ&nLd^qzm{`kzJq(Ae3^k-f`>Y6#cvxIjZ9;G;R|MMLs7&~539|BH)hXzgq zF)!7ZqBQT7`p-zSmcORf(rK;Qj~fm^K9oj}*~f}c{`wQ z-;(>VZZ54BY=~hCCc8a^*9e&UB7bh{@{7t>nP9r zV#=I$Tijhu+`FybO;z`|2T64ziX{GxF+34GE@?93u7w5~rw6fQo_5P2gB*la2SP8nhT5_95xO8QG9tKV_>c#*t!C zdN{Tg;eDzN&w`Tkm_^RF5!3kKHjAk8&W^T%=OvYivW0em1yr>m{QOeRP zc1bhhTC&hNHvgh@Hm`p?F`d`H-m^HW*LxDjbe>QfcqMAZ`TnyW72hkD)(g&&tyfC3 z{#6|#T{t!^Ak~Wln+Q8TnOc+XK#QAIsh8HK9z@z5IN8^RM$%&0&s@enhvfrJ5lb=S7WOGt#mf*X-Ax)nDHB9oq1cND*Hvz)LlDPQs>p~Cqmvz@&1TRqj{Fhb($EGTg0z& zi_YQIc!^W^30Pgk?W$KPg=yGY0%@=XSyyuDE&59 z*CfTP1J~2|rO^_Fm(_#D_ZQ?wA0iqrOLED+C>Q0~+PvJ3f_T2s=4CG^&sK`En#MPb zaeY}|4ru8!w~gnvi=Xedi>L3hvI?fMv_h&EKhy7pAZU5Nr+l3i`PQfsUubP0;=g>s zRq68mR<-ssb##^ce9gHfB+e*!HJ6|DGs@G>OVSYZ@|<>%*q-E9n_gK_Ot0k3183eL ztDoteTz_7alB_hJ$G#|Qy6Bzxa1Y+l`+S1Z=cNn0-AB1SFN!xfJ0_mi6zMr4ez6}| zvTnYY+lG92i&6L9cs~sKg?)a~J-nbO(5s>v_W-&@{08>7tc&!vdr!aCF}2*Q@v#HO z4ZmZ>Qi^l66>-SdJFxojx+4DA8GTr(z1c3; zFRB)EZ$;9J9o>p@tm(87XY$;6d(HS^Cm5@I#uqJqnAY~(sprS_qg^~7K%IQ|^G4TA zKcs&@Dvjrs1$u6ZJ6;qfZx)lzPk&PXKBcH%Xd$zu+qqv{5_^Lm>BKX8$Hq7M#w>uZ z74bQ2dquT}{>WN4x(lm;u0G)!2UVN6VYll@5AJpk&~8K(S0qPT;JtjI$64;QP3#h0 z^DL=9Q&-&p|S)miLx~``I(<=zY>1gMVTvo|tb{xoiGjeB zobE<5ElK_tq|e<92D_VnRsYlEZ9@pdu{JQSlxl+TA+| z+N*bB5=M5GuyDMv5!)4b*&c*V;^TwyqLQ!;*?MLfoj?*=xHD(nT{Yd~;-w1zzP3GZ zZTt2-mRESaC>NzJ$ze;p!0$j`!^({`B6T&uvNIxmNUu)^S4=a;Iq+zyweM&}EM~w% zrhWTp4gA8;>B2%H+nDK@Uu@)7ZT6{dWp$wh%{cb51lE5EF~!uO+18*38?b(G;(~JE#+J*qPVQBovAwjy zc(I|Rg>m(n?8|Je2%-6M`qzJ>U6v~Y2pjF`J2|&9SU;v3x7Ogpa=#Af--`F^?8ce6 z)Enw)n2S1zLT`WVdt-I-%>JY&5q>Hw`=``+OfM`o!#vY>!V|5;M{c_t_}cHR?pE_HRy^h+-b+}3cd)xy|HXf4)9-8> zbF1M)N3vUmej8A}s3vB8MDARKPYTcO$*=QIcW)EG77{^fMwZghSDZ41YUEEK6co zpV(1QPGdMrL`GV){=e0;h{|MiajUt8nr268MVnZHRKp>O&;k@g%(**sB{NB#c9(*9 zzMui&TqJm@p5SQrUM=&moXads1z;u#^HyTIRr^Ueiq#U@p!IGRT5KZ-ENJtvqlVVH zT}(Y(sF$>Lh>E}fSm1j&(Z4ubmdfb!TcXIy+m-hAO^`5;l8ZD$Z_Mh6i zf2%fuj2QZNqZe#?hy7jOh<)Q$HYd;LaR$dD(39=&+u60zOLRZ0{G`3#WY7L>#r$p* zh*yTif$2dh8ABIwzJA$rg4a*fbbI=x2NH#Jps)iQ`(X)N`|Ns^IYMtR^WE%In()UIQDLKhl+^5DUBuMy zJP!aIa_OpCIINAvF}3`(>oz)ka*8}e=qr47wcYm_`S>f!{X#TkVKH9ya zdi%7aAF03U{mee`KHB-1(p-{c^%d85eMWVl)SDox?jtIx>4%#1`#u@Ie7EUZAK$6N$LzU45m!8}k(yTOb+ zrdkn|t~iClUHJqC-qFn)qQm@Z;ZTr%?O{~wxz9oAO|t>enT~kh_Lyi~)?s%y^H_(J z`I{gvJ4IQ7Iz3N~%pqqroDAVOAbrh&MYJjR+>mkv8Yh3R(BU;A4k^5giGqQR)Oxl*oSx!Ae=m$F%p4aiv!MJ$rlTgqDmIqzZ_K`F4Ttq}LKyP0zeP4ia=WcvF-|NW5v zKH|SWp>EI#4yxr@`lb?x2i-P~vAld~`=`#%#zNoiI4yMmTZ%4xI?q;cor&|ex5>>_|FtndBoQ)wV9T=-m@q69ojKemT8+yPrW0A&KKBT)*X(@fr ztuREf940eSO?%54sm{m&?>@jIa z*x=rs9S9C}81rafOZWOOoh&4o%1nlOD%YRN6|+XK^YlfDSQ~TPc@l2B(`Vwg8&MxS z{A8_Fd7)%Dv=z^T`tl)B}o_SuvVn|RWhLO`ydWzuV zZq7TV^~ocu6Ib~sxArffJuN?F`hHEwe6EuD#XyB@x*e!pwBOAmK{nT%_jS4h#Q8$K z(<8+=c}yiSqLU=E6|XT#Sk1CIp`FS7?Jfm2Q!u<;Ce~!!?@N0Z_KO!LFqcA+5R?61 zt#`Un@iEcoW`(ueYb_GRXT;F<`^_i}x$Ab+AWpZ~k4S2aE*un<>aXX6>IX}&V*X+t zWBC_b;GH9wtwa_Np8&W@ymmFd~r&LLlDbnr~MzEQ$E#=>waAc zsc^f>i|)3#mZ#-+8#4|5yZKmZc??K!?LqTPvuKH(bvOH9$N#&G%4@L zv0m}|9;l#!aSJ2|%||mIWf!kqEPp@ZzxVQYmNdWQDEpXfayRqy-Ouaq`#VJwrtj51 zeg&ESS^fJTRPtE&nErm0nKiAb%=G(|`w{WWy2-snY#0^^_Y#M@n`ixE1A%YQ-8D&j z1)tV~6w`16WzpWp&YAvXXB7L0!x!_RFSSm0yRyVa+LPlBdI!97uei-Qjo{3Dx4rA0 z8J|<^(!+VZm7QnavPv~~s&x9qmaUzAqY3oEVl-n_+1uSe(aubuKf!(sYY%JHEs*Zs z?(Fjx*UV#`!xrbY9!;fZ+5KM8$hGUCZPEI#P8yVUk?k*ov78~E81&Wz_sN4Zc?hy& znfIF20q?7T7PM7d;mKWVFMtfYHW1MI#<+Hb24(*}tVV3nNRJbY?)DjEX2(&|aCI4u z-)R3h2YWR`KibooVXfY%KQM{Hr+W3v+V;~2CAR(`4y}7jyVdkKj?!$`9X4&(C+Iyo z#Y$IqKa+=fC=={Qd^np&74XO$fOvMiU$>@rD=BsBe-Ni)3}RfyX4}O?V8Ah0xP9TC z@m?Xciz|XG7BpLp6UHBt6RzZ51%WSG*a!qF)5sm;N6 z>OjykZEU#-J-C0s!B#Hj+ftg{r?|zwZZwOj`w=Z*k9GGZ2=I^UnJ319fZ#(Kvj}^4 z?*Z!x-zYq$r!^02d0Nqd!ZBSDJ;XAm#i-zZaB|Rduc+ow>0Z_0r~rrdB5l5#kYvsG z!l8GE8w*!xW{tXxwoxB9r<-S6%M!|XL`;ehF3~0Gb@QZdsGLnjJX*j=b)RA@0EHv^ zm!D;P(1$F{iu<&H4bNZEKMVyH8m*4yyVb~up~+I;6|p!t02}SItLzL^gY;lG`r-l4p?F9rbAU5~R73N5+A&|d%k440Spty&T-;Y?1Fdk4JProq z5QBgQeP*WTttdg`(YCS;(PsANh0)D0N4v%Q(h(VR^MdMjk31*3SeJggeTvwWUjKb= z&U54RB_w=RI7lbt1{{|?920Ue5|z*URCd2N+9O3-iPW-v>mGhmErAs^;z9;Auc@51 zyWd;&>He%0FIr~xAuFC&-RQl^Zb1WRT+zT8yu1;&jcRwzk>O)^iH+EL2 zosk(vtdo1g7I0NHyg+R1&19LXm~%RZA4zx*)6EGcw=(f3!`Mc{L|}^n;OazdJ(lP)ih*Dci;& zM$gti{7ZAGnvNfXh? zn6_Kg++So1grVoi0SY=^Q>}%dB8@>03MtdPe=CKixj$R&On3st43^99y9U z947gAYj8GxT+q11GXd8(DDsHJ?upgriZmlVA+#H*hua?(75=+Nj|vBOD|iWQ?du|V zKn8Yl=EEA(xT}yB+x34N!HW98U`%f&A&Y4&iT&L^d!iZ&#;3w-M{zSguy(gl_a7`C zFqNMWqlSlf{TEoJ|GTsC5aU|!0pV&8DM6#d0^;&EN2!m7(~7H%7Gsytz#3OYqnIhN zVxnaczT@u908REH6t&{&3|YSlX!qKEd1_qYg)_F)GZvFzBz zEDLS)kY0eFIG4yV(riKF$h&Tev+o21*Eu5R_+2@VjYht-$XsErhi8@)Xcos`vsZU* z0*ARHYp-Xgu?RTMZ1uTER`cfb8TjnSAd$_us||&GYdhA_%2Bj7+Sy8h*4jDh*7T%# zc6wFbIJ+)=sjn5ahx97WD(lqCel06Tj^{Drd9$B4Q?j1B9$5YHteg%Kji@-@}fLgdTE=5LWvLv$=$1BM9GP52X=#Afl z#Yb&%^~w+3>dU@s_rZ8Y4Sm0;+Gq-1JUj-~2=LTdd`cffIF|a(8bW_EJ&nq=tn9nd zCe}3MO&M!jSc2{&tD=l{*0GEY8{T`3P*-kPBg6aAHdgO7NSheNd~Zc3<00AHuO6j? zxjx!ATqjzN-j>qrk80#K_IvRAkOrfIzK3k+tH$^dIBEMlsoj3yO10*Bx;}Fd&)Vyr z-NReA#JCNmD>@(9x<)(e@(k+Rw{Aj2v0sbve%<3tpCi1nR~!B4bJ(9eqei;5%8bOa zckBNriw08)ft{6z+AR@E8HS@(jJ~;v+U(V1!Uujff|=?hVaLOwVftb%?RSd05icNa zDCN8Gydbfu3`0pNOI}PG@LAuZACp_89fXT8|^Sz{pnX9d!5viz)i7;cSm3xxBi$Y(sJIyb|>3h z-a<`Qvv$&DDb&e3F0U0i47hxwyJ+=*oCsvQU;iR<+pYi4hm{OX%TEfoiZs4or>hYp z3Xh7%pR31`gD)@&U7iVkCyExriic!I&rTYM@pDgH!YstC#HD%tzEyGD--n@M?K&r{ zr`UN`pQDulJ%tQDuUZgGf#&h z2O~XGMO*#77gJ!QYleITEZ=g$SE<~0ADMItO)J3}s}+|l~VU^ zEHAR`d;Jcg?c_%M z3!Kxf>U`TfbhEymOw;u}<1doJvT}hGv(p{Sal3KNW!I0lR^t>rtKNSFRrW~Kl6Jwo zjxWsHsU)jv&V;cS{-DaFx{+RCv0u^+e<}PVe8wYcvtA(W-b0?#Y<6{M)S$fV8`&FT zfV^+i(~@CC_IVv)FE?7-E2EzEjg_SD4@ayKKMB6G54Y7^$$lN061|SYpz0GaOL=~W zxW{m<9+!9jPEva^$c!5L6QfVk7j*O7_n-Fsie$h%MDx4pPs?)-DORs*^l;w`dj~NC z?fhBCS3OVIpCP#{qsexsW zLAN-(tlQm%ZiPR_-)zUbdFFkd<=w7W{#iEAIWW6znO1jqjAdx@L6sgg@0uNc+>qI( zn85vgj`A#fDUElHcEpPkU!%_Ym#QxjkK$C3GMyrVa8klYsG;h?D$ZRDMZeh)#CW4D zR`ryldQ`Y;blF3?zOh&H5DhwE{p`C~la}7^I}3X!Kew<~EasJkgTK*xpO~8Upp!vYgc6a^D-}^S_LCGe2r%36b8e$4_u7`oZ(Ve_SVhN4SVcsCc z!9l1aTWc+*JGj@4@zeF6_b@#fjV(GfpUd5ueJoT%6BB213`_P9<20*F*BqF3ZOG!j zo?ax}ySJj;%_fZ1N$v|87Tb!Uq0w=1)>{#D^k&Fo$}PieP{YRk6^ z7F2KZk&)Z{x_+p>`3(V|omv36`FG~{{AlUTPo$boym?xXU%72|bPo(Y zJ9Uo|A~>~+c6W(s)qO!Q^=EErc53(Hr^M1dquq-q{2O%y*se~hY*)8yG?$SKJCR{g z0pSQ^>19`+U71o7yGD1<-iA~%)%<(UXlhXbQ;F*ncC5&)w|D4tDE$9_tFJ*bk@JS6kZ;=Aqv&(#_niV1ZKqa z^1HTgFMyqJFVTrS@*CaW3E|Euadg$d+q%(c`JUP7-Ajz8gg2q9LXN^az)QrY7H4nU zv$Xyt6>8wte?k8#DS4#Cmq}Qk^t)|kYH9tKmo~n!Y(4wZ55m<2VSK67{>svuw+Y=q zv_`ro0WGcnDpjP3^LI*rMl>V|{Qp`?_e0A~7KNl|xC}EP{!ZM1ounc>l6${JTYvJutIyWoM|I^a?Z_lZB z_h<%w)gAj!{`=efee*5j{Cr-h@uf-M-zLV1(u69o^K@#z&Uczd<*JEZqNUR=*)}{>hv) zO>~x*Z`-av+l0IRCqi7wh_#R!`Ued^D}A9nPc6hHqOLz30upxl^_VVNdVq zrc;H5xg9H-%c`WZxdq)}FoF2{gR|31>u)LjtsdANeoOMbkigO0w?tw`gDi=t_H_I# z-`!n##E|N0oUDs7F;k1{zc{7N8$kMw(4nREztev)GD?UVv+VDN6GupzICt!1 zVuJ8p{@Ym0^}d_xeb>|OtG9R4(&hy$+p@4!DAQrh-nd)8+c7J2XIHm9xIn{&W$lnY zoEOrLSq+p^E_!)t4j2RWEtTHWA$jJg%$#((%tG{QHX+>!x7ah&kx@!bjG_rlu#A(+ zZM;C#(zL9e2~WBP+ys_0A6lI*jFz{B5ZptXY}n!dw@Df2RQJtqiqv*BBD1PxaEkRz zFj*Rn1CVVLQDbUuWeU5yYqWb-73p_wYidff17d$Apeg*7D5&O}f9+|L=xcqNA}J_j z+=5`yg1XES{pQ~$5*GQ??OMdbzBbMMP_o~$?U@6wK*~!@UK6JlV&Yaf3!o6x#LaD@ zb=&Q-pVPPRSq{DXT`9mw`lsJci!(+C`7MMgQ&x$^jeCL5lE6@I+)L@kJU~sGJqz<8 zY=k9ETAa0mU~#K+g6v`rAvgU$AXvr1=oKvBhIY< zqRlS@J4YiM_oKNBO3Gx6=7QWlliMe^XKqgDbN;)1`*v&mH*DljIQ_dA%#BC=_anP! zZ(G{fj{s$;#plw-s{X?%Si1QrISDrs9)1Dto!zF|OB)AOZ)xLM*+kC^$zC>MowfcLhl}M_)k9tB- zaQB^g>B&@L=q20ju9<19!i}oZ4`?b6!s>#Xd?EF2{TpiA?B{wfqA_ysfQi-vMX$yKxn&{ z4yAg|%dqbeNmcO(Z9JU%_VCoZVm*ts&qgl9Ib|tHO6e4G$v|4!{1-M*sLcn{(^BwlUymzU)sEYHlc0?6rEn49Kr zO3&SP`_j#4r*5CV9e-!f^7h$jM5bByu-Q{mOVq-`;^x;yQ;Wu&7I;)gCeY1l5%7}1 zdil#*z_m*MvX(kIeB0zE$_v>uGk2RhIwNVwE0IsHq*lQhZC$#>n=e=sE@%=@Ex#LE z@~otJLH~)1&uJLYiL3fgDwRua?6E&2p6RgQ3BC;0=cHVtrJGkx>uW)I z^UpL8qdBXj8v1$3PCwVDZr?87L*{ON)|Ty4+o^Q3o9;T6K-r`Pz3f8!qE)XQG4B>U ztuWK50XVbF7R@th!wn`z%rq$7#vt82(p*MHUrGA@mANnSJfx%fW`>R@vt!FupJ~kpI(kh@)dCuI{ycO zy8Z_;rl2}u)Q{YO*C|u`6^J{tUwK-&I~E=mJN4OKHox)?#JuIOynygx$Hv-QwqoFE z!HJ3*E>-%fd>+e9$$4#3Hol~U0k%aqaq%>k@hhpmz|=q5 z)!zK|h&!S(_ik3G1QhDuHHL)nrTH)Q=UxKLhLQHS`Ig|~3%P8O2*-bBPJVI?| z?K<1wrJKLIEPrVI_rkh%Agvx;iC#Gu!#=+@6JnmF%&p&2M{CQyPi@jL?O~&VA#%ERX8TcW33X%;*=w z8~=pzZG4B0Ep3h#*b}kW(p1^_j{ajit(;cu1Xc`44m!+fmTZ1KO#0@`f)}Rwl$~GD zPDEyUa~}6Ve(UB;Mx<*~(rtlkHMBdGWsyMv5~gKJRpy#1bE-1eRFPqdDj*4WdxN`O zxZ4}t?HL!OAirHxY;ki@`B)$}XOz=)(ck&X7rE3-Ag8^=<|5TM?r*DWyP@hE_qWxR z%hipXs&Cv+_4QwDt7{{o>a5pAD&%r?BfHUkZLN)cZggK;Yhz!jwE=Q&bRP<^IipQL z42x18ubD+`lU9BEK$|nJVy|>_Mk*#}XLBZR{x|0}ochn(4II}^MmrJ-ciyx8>+;@Z z7IQ2?<7`5*hWZb(a#AFF?4)b&&SZ8cGP^})@#Z&{*qg#as@d`ar}}SKu&-3@06c8& zp0i2RG?Yn^8po8>v|Esp1KPx5syM0TXkqGhtMK}tc~dye4BhxHtB5ATcQrXg<+}hk z?+(1bz`vcI_8j`o9SSMAGnz#zT{>#zTH(qfsozXfHJ#H6i<2ucBn4GBd{Ki=Es z9x;1|8_1}|8^=_|F%_S&mG>MCG%o#_ek|}w^gn1p#XjG;YdBy)jio7QDRa0 zws%;Yn8vr9T>myn?e^HdFKyl{N$W4;_~y&hyZIQtJ$6+Va4LQjG{r}?GOho8`uzt> zRw0Lf(6*AFko5XLgrrK=yUz80Sl9_gTTYqOrS-p`-`?g@<-ZT?zhAIQNr>o-jIF9@ zt4S;ByO!>eg6+30-F!lwHL<9^@f}$+Ot3ZO=F{%ap(xuNO<{F!{*5)tT87SPFSmH} z@ZzQ;8Tu>RaPu(I*!XqD6~Zsd?h>B*^7hy^;Iqx|Ufg_GUYp@l+Y}sRDcv$*%X720FHFsCpI_F@otnpCo45Vg7-12; zVyR^oF0XLwU!B^cFe`y?`I6cROY28FG-t%WXP$h>Wn4h(@0?BoH0d4{**Sbd#T~8D z_*(Xv<&8?YmSsif7PM3Rh=`fZ6sp88o?Bj>{efJV;7iBZfGBq2Mk9@BOevQw9ak_V zQQMHm2`&CA4Eh^tRPCw%a%*k+{shh5Zfp3*p_%_7%kw{2y#Fz0|Dz0uSXW=^5I=-+ z6riVbF>9BniQ~&B@Agd3;DpHKmNPM`e<#vAbzuA@Bocj2zj0<8_ z{~(<^mXjf}VMh^|N>cBo6OznAb7Ha}qPbA&N9j9i$RWK}q8^z_D@c_{^@yFnC*<;- z5qywyrHC_|N}GdU`5}98aRTZ7u{RF?ZIKy*FxB^)|BLE}YqU63TFF!u3br0!TgzWaC z3+eCT=0S~yivuEpErJ;RF1oE@mjC}xi&8On!^ad~Pn)AvksuNQF-NhT@^HND{id_Om9xKv31IHhCka%O{#(*yHH|S*@`q5HRDN7YDsrG-YV^LMQA`D_sH^Cx zCTaxYy+~gYKo+@s{mHavR)OyjGnh4{_?QA+6{by6P#|#TFxY~3cwdtZ`E90*e{7z= zwwp4f|FmhClY&_s(ll*^WXaA;zRPyD6rHt-Oe0jqO1`Td!5ljRb~8nZrMZgX zX;Y5I690jK2JLgxYIu2eetu3OLcQmuyhOy@8?~`~*X#~~mNx!a!ry#lUXhh({6}YZ z!O|YB5F3ANstjsY0r8=s+Cy~Gb``{zXYUd$>8~nLT~k2&VJXArKQc}t&P1V!{=5#w z_>|QHyBei%gqnrhvH6c0JWz5s6Q>yeEQx;6)KUn;GvdPvYA z1@1hk1J6oDe_^-IrxY9@v8$6)zjX6IM{W7eLen-;e*UD$oXhVSxym0JMN&w&DTLpz znFxesN;MyuonN~7U-IP8wGfS+n*KTh*I#u-e;MSjkFpJM(ln}6ueX>Ax-64G8c3qRY^^b7dwIy9QuJ}qAN zS~N{9NzqzcYZ)8My8ag8Us!n8>>W$Tr8QcY6>-oC6)I?xx2#p`Hg)k^QyLMuhc|ys z0dFt%FKdQKnQ#6Yo_5SD?=|KeK-X%wqP2HUGf2Vkxd?{ab6oK87n20XPQO~9wTv$G zPu>}nu)&(vGFZi-#^XP_fPHpZk|wA2@q|b(5yJ2jxKH}gr*?Suj9)qBR^tk^EB?n(&qUR zUS4+BrxZugO^>;SrQ;Ie0%l}MQ}uS84=9@Q-0Z!1Uef!}F>KPZRzv;MBJ-BVL>3y! zuD^xqX?~7Vv+I&YCN zmRl1Ah%46j`PmtnK#mf%fhUv~rj*EZq~ux2{z+jmEIVdrG=UYulySHF^_IQ-MOjvN z%VvFHYWe-M+v!|X3R4sO!GO#~EOrZbBS<&bIUjQ7oq_f5OLn_uLdX6YC1*S)H4r1AVBc0-)m`~^?0_gA^zUpf2N zIs4Zd?`>YSQDZhz{KlkOI?lEihg#yZ!}&G5-=)p}NeCE4MdOw>{|s}zJgYc{K-#~) zB7|3#HvWs$#`b*uyX?Z&-^xYaL%gy(j%d<&<+44=J;?bU8IFZT2lCL^_`?Oxbbn`Q z<7-PBf2O~Csmv&9Fa3wI0)MF5<0HgC1euLL{K0T05)(Rii+Tm&Yw0r8!t&zge-lNy z0a|Ij0!3#xz6R9Xd<|OKIB`GgM%u24)0Jjlrzt2_zqz#Wo3gjl%Kes-DbOE#BP6%^ z%6(dB5uu8|NpD5>Z#1;}y+9NW6qETajaHP1D-~&Emo|T3Y4c8u+r~HfD{%qbzqIk^ zKc+>O<@;;@e|zU2WMy^c`St!ZbaN^40)w~{T%kgTcIoupQ(a3`t3S>2E+ zsc4l^|6cX>BzMe0LA4DkUl*k)> z%Bjxf&-kEEY=w?t7(dsJ>SjlW?2Bq*0e}m-XO@WV`i&QTiPx1rzthP@A z+4JNJ)x~p|I<(>qCqrVR{FJ=__Bon+nviX1qHmJ>yR47>Ll+R$p##3R7zA4OH)*Mu zJ_$g=Tr>2&03DP)S&KlSsV+m~31vvrR+Qz{(Ev4hITC)qjomd^{dMnjjUiao27+`& zg>7S?nI_rx2OJxYqvFXc14<z+aPOv~AsMo{3VAsUE*6W%{qQ@BE-B?Py@f2>2SMWFv5G?6g60?&uB@lHo z2!Qe=nv>^>`$^-0e!HWLkcWX>NcY<^!J1b-Wefr;-Ih2dQqmyh9tGRR2W+}}FShkP z1*=I2R&~pwtJ)HSEox>pv@YG7dDP6R#A8>rJ?3qQYA@6iKOD6U)AZ;P zl>6#jXTziR(K#TKs~xqyYB8ll95JJH*@@gC-%|yGP3`3STs)!5G)+|z5C3zvQ_Ot& zDp=r#9)H#GpccCy^r}{l5?+UVBlnPJqh_zAqzJ;wo`F?FqlwUrdxm2nm+4YB(VTuN>28+ep9Q^_XkNUKWHp}K5Q6K47YhT;A6nGPSByAClE9rBPUl>T5kvX6_(I=sDbU4jT?yi6bc{ zaq;P61&%>vY2T_%L(jH2ccPGou{j)i>p%$4gN7vQ?s8OJG;tGUsG$Azurcq!mz&Xr zY{x)C`C){!*mIW&fmYkTuj6iHC@7>qLo{FCMpihYyx+U9{IGv@E`7jK(s`Vd*r9mr zWO_Gv_ai>M_+#LF6J$57E0sV}=(v&I-12^^M2V#)60OF-HRXp%VN#=ThzVUbFO*2< zd5M$==d=Ab2p)?NRkhn3kFWw8qDwlvAAe-P3-AVAH-rvBAF0fL1kC|@=I3gc5c$UY-16l)df40 zb*l@eBv@|~W2cb5hP-AI9|9lva@#D(jDjH9)}sZ!R>_SYf-I;C)y?oxp}IxXtZsvf zPO|dDMosuc^{Y7K6RIAt*&$~Ff6S*d&Lg6SMt4=mEOERcZrsS>F4@J?44Thsy~|NM z-q7#Eg>;zJ8WE8bhFP1i0zOkVC&RJ%ZJmYcE|$#x z-905yvE;TnV3Xx6PZ9_I1_G2tK!61;2_H*pjiP&82;noK6oTSGy+(NXEZt41<*}=i zA@~*evUEgpCL-$S*12#q!{CTUiCrSa1CRgr#E?oKs# zX!GSY8+FvIE6Vt15}E#rpssr!u?s!R72^C=6-pE`l&H5udljl*S2O8|H#`Dt(l_RC zN7-6z?hygh*ar7s;95nC#S3mv0|9rXJPKduoDBn2}CyS z1fqC{?ZjE!sX`)_j4${0z%wi+&|Jf9c5Ty6-LkdWb|TKU6K8AD5bK4|=)p0B$_#I_ ze`B|ZQAa&QCK#MI7ij3yz({W`xR_abNE7G@6KCNfrrrF~bk(KZ9{Q=kwml)K)0NrU zqa$oLrK`J@_%kNj-DtLj>Ryouc&vlbZMe4R2SW_6I^{`E2=eS+(yygM8f(=DB9sS+ z?5a$cP~;2>V{U+|~=2|)G zYn_pw!9CsRV?jwyHp`Sg)9?5lkiXsH%NNT(P0kECc`ovCr9!8dp{B}JhN?GsrTN#G zyVej|*HyWRxrjZ+gqwvrieWN*n{!CrGxWGtldctQ*XBC9s@oY6Gte^lqwAQ^J+q!a z(8-mJHf`;r3z(BD8*LV;Y;+KPFhJgxTF79#gLQIFE8uL~VNPqOA3aklfU+yt29%2} zh3dm0I((R53f28E4ARyfFj|GK=>{~OFf=*}l|Jdsl|I|)s7}(lyk9`59&DKgKey59 z^2@p-Z7q<%)*B!(?FnnobKaiv2|K5*e%~Tr@YQ1ZM8R)(n8#9H%u-U-whcm&qp9v=^QesjZnJsw2{~DS?NIyPX^gFG>?R{&&`!d%VeZ`#@vJEK4-4+ zcExno%3+InkzqSsJN!JH4cBM1x2=0L@OgYR%dHk&JI99hwp;fYh`=L7Q=&J6t z(O1zHd&QoC@vS}P@&j)@(qh_ZYi@!XWP}I#0&AEF(Pb9;Q)ESGKnsgz#)0URXJ~8_&@jo*&C0-WlDlPB^#Ve>S- zNt?w3Q7%8tXflM>f1~YuioVC{1GOH+Y#kybT+0t2?fBF7;0-}Ll$zL7n7CcasTLU2 z13b!vfC!?2?#dbO1B}LT=zDv6VtaeIekERE@7`0IVhVd^n;niXWAM{{uLZv2Xxidq zYc_wrts}34Fx3Cog_C3(csW(UDQ4UfD}dBnzSP#utUm0Zv{=$v8i$Sb?SV$72?Vlj zD{wQfP}b7sC!E$9c_T=09*gyiS-!MnI7pEOhpu=M2yM{3VV9VDyr)e&le^K?yaQ^K z6+HuYK&?_NQR1Q!XMealLxVdXfSbaJun!)wm*2|f!jU~j?O|I*FCeG_WwBl@1WT|H znXEHNMWOa=x&|1$T@(9a_502Tb1Ohn`vZUp4ni#mwLTWdw=tb-gu=HZ5&UFi-Q#|{@B4bgO`$`e2F zT=aaO_YJ}&jBe2)K>4XIV;0K$7=>zqYlSx8V~(RC$7u-soV$hGUSVjR@&+1Hs!3@% zw73jF>0Q-whvwu$T4f!=u{&deQlUS5-f{oj}x_=l}XE# zxzLEd&wGY}%Z?XX5ICZbc?pi;SR9>0BHihd zlACp@yw*;}9F?%%OJCuB32_`puLhoo!qR;WdMh$uI-kEbEF$1h(E+e71i7WOb5DbP`cm0?0cP|v&Zggn;nV(oNPkP$s*2FAVjf% zO2?hr+3r()28}0U)m>~-hT0+)U>jS;s&l-+O$!H`ZTheq#H6A6nq!;?vp!&3u9`9W zgsWARzC!hB>v2}6g|JY3##brQ1f}wpZ&LWZ+7_}BT$hxOz4Yus@T}Z3rF%|Y+zMIs0+DBx0u$8qj$TAg@DtzZsMpeoXe?lM5M0IY z(2Dvyc}L9}6#^^<%F8>wuF~@YY3))~?nMRmm1!-NupWG7xrKkbl{>p0P!CT)9S%OS zGhi59UW^#qHLL}tuW)e)^9|E_=14FbokDXPs7As1G-?mIP`;(Z8%?!@WlN3+uF~hV zr5B!Y3#$wq0i>W+oB!T@n{GXS>9PCsO@|iz;E6vj{%QWDKb-Z!%NPIRrqW}{+$3o! zCCNUlK}~DIA$;?Om5Y-Wo(}W>PoDW|>j(Ev{_>RvTj$>S=;r5Uy!n|QUh?V#|L?$G zcOUxkJ$HZMKmKyZg5fn^e|q?j|Mv6O9$os#Up#p6!F5jzTr_|7iNAUGn-AUnpZ?1) zI{w4o|N74d{_I=Fw*IT9{`cQi|KUHMckEyEtFeS7t6|q+6)PIG{?dnM>BIP!49V7KodWH{vMgwX z7OnKjz}xA+FEFL*kNPQs&osi7k+{uZCsS`z2yg?@-?rbaAH?^$#&Y`AMwwRAZ$jAb z+%zU{09-V2scbU#DZ`vH)TcsI5bh&UHbeEh4KhI|!*4h672T#}T>}(1+jNt(qo3}Xp|;Ah<6X(Q^(Jd;P`f|ucOqugY~SUhA;J!CQ8W}@INj>{47V~T zql}%h?ih(6BW%-TsB}2#xEXw8ebkL8cFJy^jBcu1WFjz&hz;m=tkuj>jJzsTOxmM0 zK@}FKBmU)RU^ea2fNbK3qR}jDN268Pjz*)f?e#Wc+v`ojUjNT!)3t>k?MzyJ+6IaX zlBR`8%LgBP@F&gF3cYs7&eU}l0+1V(HjPOt&up63q%@}DyiXJznt1#XGX;mW8^XN0 zD}2X^+r@0&q5Ykb8M7#b@@8>|tR*ZI6iT}#Y8BcWJ^P|Z1*Fv&j0Y6Z0|!;>FZ^|* z*nHa93)eMybPl$UC^J{ZJJbx>ig>8NtL5P5EaU~YS4;OR=LsBM{ej5aa*iuFN6x&6 z#aq$yPQZT#$>j&+98<{mSpCK#ZBE^gVK_5xdd>k%hy<9+4uu^x$d)^L$uwN^OdXbiAu8N)D&^vn-vXIxE5U z9cTr>X43~|FF#D3L9LBGj%_KZ&e-L27FuPyn4tC?R?A+J^V5iL`BnLJT5auSD~=%0 z({Zv@*30ROIlOD$%Gwf6J_TyKT@_=%lf+jvQYzwrit(dL zRm6`Kabab7D8;cyC~m-P1liWRfc2A;lUC1Ac{q4VFAIP=7n3?XAZ89acH&+}q02KPbd*uChHLse~B7Kap3f#bFQCd`%>jZ=!@QQ<;!>Rxwn|Ld2rk z3(p$8SV^-Cz z(UVSy4nI=xJ;9RHnAjM|(j#o+^?GG_KO{6MA#Qk*P-Zl;W2Um^6CY0OQk+SLb@gr!H}Q(N zh#Gu7NKAR3(lqwNnp(kf45sA(%P>m0`l{pumi%41=@cSMt3>PR+7dl0zE?h9MdAxv z9AYfnzvt*Rsq_ zl1&;1*&c$@he_8UaB*EaqPWLGnaakY@t*YZs{g3J>aHDqrp~1 zvbuCjtMU8UPFCr#upp6QX7ub84RxItp4T`SvwV*b z;(CdUpzXn%58gba;W3>K%6mGnCo1$4H|qBk4~IF`#^tXgSUZs!RjZ6^6#gQxE~Z2G z#dM8vIzUaK3g$AgA<1!3>3RPg;?1-jmJ`&OIlILcv@`!!o-a{0K1K`s4I(PJb*09R zpBS0)%Mh`toOaY}zIJUnM@@95?Xt!Yw_?J^PQKf4R|i9jIW*{3c-^`}h%`!v1n9=? zIHQ|-h9Z{A+;>{foS-)>k>|QwP|;EEZvFe9jCXFY=Ov8A?1Hsp{c=o6NgyUlI ztb5AKqG!2Gp2lq zSIiat-f+cZ`BH}B=-^g9SSOI%BfD6T#f?^h^8tF>dXxQenx;)?jQOdR?9Em|Kd=i4 z0j*lZ4w-uG)Hsj;dnA-aF2xApiIg$JeYglFf4+n039-C8tfiaLWqaS#p3t;t*w3EH zN>knr(YcBQBlOTK==x4IW=!y97dd?w8li@F%<1LMk1oXWAH&lL@K-o|Tr(0&9%a3z>b=$&4m0@IAt}rYpYWFUKV!jwPo<)tTz%DC*%k?i= zw18H8Fy&GzwGq-cqJ;gAfD%53Uz+ecB_i>J!PxCEc4s;E)^hC4BKOrI_hpf#TBOw} zuEXqA;6H9=f#L%W{sBfBv~UBOj5MYgsLZ49YQ8I(W?ylL|6$yWn>tJmy()4)+-5#4 zyE~>W5~p_L$-;-5aB7&X-mysu1M=6pD2Hf)__jJf5NuzU_k=sjdvs@_P~O8IvI>5Y z&-rmWGm3|e(UedKJPpC-cU+KgH&{NOOV|dVVgaw|eAv}y7kAmKj&q7joJYlPX1~gg zXAmdB=;!0KijWUWd*EbZTG3}|OmUcl@OhTb=McvYV9w#}@QBRa)9y#wdwC7_2x(>% zQx5=)7A|iN7>S6<#RQRFamIWaN$AXuR% z7`&(YvITz1@y|76(ZnD~=_n%#SLgfmb?C2J^fr6H~;fkLT2tCstM3$aT@c z4qRt%YlNT9qdz*%?bYFw+Q7b-c@IalpBu_Z27u$S&?stkFWM1J)s!A2o5_AO<{*d^FhODq4e3&46 zWl+EZZcm3D6@Xcd8mH{Acp~<{n{{IctMI)o?&;w&E2~sxf1?Lud_ZD)B~>?k^1VD1 z*Iga20TR;=vZ=Uxuv*OUQdGDggY=aRBcL{!{dc{LXNEO{Q#{=hfy&;l56ZB=?8Yz)^``~R7V1<3)FUxMP@G^$ zxsXPiXoqSr-bBP<@SL>>U*emgDRzd;#h?%wF#ycnVwIU8r(MoWbpT`EK3v-XA$4IM zW5T)+Yl@fMFxI<$(pdQDPI8NTnB{#~kmfi*dOT{Hqot{@aLdeII~Rrm>Rj5YEFokZ zKo>CxK%5M?^l+2q6$AB%RYT+HpxAic+G}dNg?hBhAUh>0CIzK~u7mSA=U1Sh%45KB z3*c=`rdV!xSNv!m?=D4&s|)}isX;bcyYLWJC86t@kQ~OVb-jsNVNuv9fd7O9RLJ_8 zp;?EJI3JrY>J*HpH(^3uy@JI+V(likyw)EQ(f-F!)Hqj18>RT>t(C|})#eP^GfQ-C zj8b+?X}l|B?5m;T9wp5TN%mEedtlsYruo5fn%lwmY_&mFWGE5P5RnAezAEgV9&2tu zBXoWi>ftz_U0Y1Ch@{>*XD2S#V~w*_6(vlT8PkOJogdnFT0+m+406xpuAQB$QV({= z!CapQ#??xI1(|nnmornBBnIPCu2_yIed06!@d^u?JVGlld1PO4j&4L41Z^`b$owtt zEZy&*Bo)yl^6Fg_3E4Q|nLT)005FOpsu?b4Yg7YR7icYz4Kj?Zswo;|yk(Mbf2wec zs$q8Grauq&nLDxpV=GZ{pGiayftpz%(Pt~H90sqCjP3LZ(A1BTt?KJQh$gfgjXK-) zG~ui?8>er`CwV|Ecr|U92QAKqxFYd~9QbT5ctcU%1ri=6d*7fxY615L^h1iv>o+{f zYCmb?-@VL`Qjx<x1tkc9bGM(oC%n~pzke1CT@5Dn5ge*tY%o@LN{Qx!6t0I zDnF*dJ>bNBM9qNBQuy1jQw0BC;liw^6c<-~r5a%xM*ym=SaJQ^|dU&6pJcYSmpM_pa2c594F0M|#7DJ%&Z zGc`n-mbWP@X4>E;_3%vSX2j^|6uL3waZ{r}L{VIP_Vik=rgIwO$kkaWKYd!x@-t0# zqwg72W}QBroe76y-G7{>)BVR|&y|mp)5-A)s|D?~9T4N0`0{v+)XUIl9|J@kXa+ef zB{id#=|;vsTq@m%F5y5?#7+DBvyl$uI@+cd(CEO=31gidN_j(Dwcik~Vfpe(d`Lm? zuRZIN55{VSzErUZ`Wj!-Wg&PTr|X`;1uHEtSimVYW)nnpV=Y^c=jdUPMw-Jvw~^T5 z9;p4&X}woIcFvRz_3|D|ZxU3W`seh{nru3+u_jw?f(CYG8LF>46TeP`6LXslP9~J( zcfw_!9O6xoxi|w7%$*){>WG2jR!4d?+v-S%!h0D zsrTBf_9SiTG7#2*lQ2HzW9J=f3^t@{h@`v7T+lq*&`#EFM2WWKKqPop`n{_+2v3!? znvlGO(hCxNN7>y#vb=x~yMO19(_a&yNts7dj|OpmrTJVS%cpFQ&Q)n-t?k#QgWrD6<$ zR2_~BlNoCPGE37hzj$OiFN^dya^*cju29}%BdzLzYR1Uy7OA9eE%4jEwVMe&ogtd> z@7L(hu1}^bx@sB1&4q4{0WmA&R~I7q4DB)x-h4BarrRiz491^DbJnd!TXgwCt5?!$ zmyPJwP9sQNgpuVKDkX%|+gQ$K&D}c_yR!VO1YOU+NkWXv7&5i#m{d?`I%)e0DQ1My zpAkH&-G(f*zdq#1hkF$+0@(W|v(Z&Q)uN8wZ{qNv2+@m16mNDYY*GzY@V3yXnc96z z4+e$I77$3ux+o4MSQ>S~RXx&Y^d*P_3v*+-!IW&Qkvo&{*vq=sZ*@rZ3nPMRd_Yp3 zH8wMn4Nubsecix$AE;RJ%!FmXO`JVFo$O-S0@q$dbr3FSMWeB;ybzbDvl8s(ylZ8d zqNOOAUxzFlO9*osp)Vu=oT=ckCrm3kNTLHZ)UAvS`tI3FKs^oZ}GLw`EyJIk=eA@krag!!o%x;1Nm!6B9#GN65rcpTF z(PPtbHgS8GhDmwc=kF|0{I)x615(!WGSV619i52}Jk7VFO;5LaCHOO5=}wSpN3vjn zd%&far8}I?R_D-d%6f#(vwTN7DTf*)(i6w|k9P-t6jnQb!cds8q-dS)MY_>MW^YdX z)x+6*rZp%8(6$8J!c`Yfkx!~K$2jsrc4Lapj2#?|pUBw;5F4$=9D#!(uXs=bJ!Zgv z9_uiup#z+t?df*oP$X5cyr0A!C1?nC9NKu=jr0=ZX_U^ z>1@&;F8B9?RL}-Z>QFw>-!=N1As}p>nZ9Kji=okxDDKuq@LubC+8+mF1o|my20+toCO( zxZrCmBPjQFq+DgANmKp0f=F7~h+u>~EZ%sVUh{8+Rba2mdW43yuk}nJg5aPbBmRjt zyr|PeF+c={XX_xZeP9q_WS@|zQZzdT!2`QY58gSgA+lgw-V`Jwqd;Gx=n?r0vK_<6 z0BPv-SsFptYEE{T?rMl2XL4C61toqLSo8Buv}+D+!nGASA6r&)Uk!$%$Bi=KQ+Yy^ z^(4jPb8&g7_00rl#ZBmu{{P@sj^+1T)Broc@&d9`Yu~iwNR_TGoQT((OG3DPp5O@j2?})*Q9G0oYG<~souHxDhg_`tZ z9vqpG2d-`P&rB;}Ass>yvfrk$ooB+7*Ra$ z-m$d!dCMZx+_nK)#5P4>&2|2{g=REMO0y_2bHC(+V^K1C9JJJ( zFwR~@`5_Xjh+)Cy5FhYVBsB8Kbl3_2fI-KfrKS5(L=cdkk>0Hn6pz5}JYE5sNRHi# zjeN{*g#?q!0J|gRg-=)qoMc$m5NilA?#hPmXzHS$I1#$l zz)X5I{z=EZp50cDV>W5^m|7uVQl^eZ8m0TKxg=7v<+DY!=bN&)JXf*goDywFbXk4Y z)O6VV$8k{>;DsiB5-N5(lxO`#r1b%-F2bz3B3{GMhx!!boXC5unrenE>nCNf^^<#? z_j)=*G*k=gr}||2sjHSDuAe+cx}FL#-q7A7_>PDOOAzwKHBcy9NU*e%5qdh_nfLZ&s;Dxgdo9~3b7#s$aZ-h*Ex~Jf;$)3Tc~6@AzFdq4 z$+Z&bD)P_8#T1eG=a~P3mifA)gCi(~$})?+(EQ6|E!-f5jay?7?LgJLcA%VCr4!tK z`MDjUn8oIQ9#{781bJgVm*jc6l5l^Jr!{>|=YD;pfB1%>!8PLp#o@87LxX)=MuxsU znj@bc;IJ^yCG8uEBlm6{C~g?*AGkY7TJ=09IWLzK>f;ymt{og$$XmKx^7&Om!#hW| z-nC_{cmBYIz4f_zmn>R*MUq^YOXgmB#pR3dylmO>i!WPx=N%U>-Hg+}boreZFTQ;9 zz>+(!=wEtyaY>T2=aRN%3m57CB)Kk^%-b?HHhkqJmy8Z9{`>JgtH}r2Wjt=(^6dRhbHkW*6;SFp0t{Wlw+e0IFFSxZhGD_R8x_9Zq zWh&d9C9U2%I=roarvMdHrZ-FJCGR!4dHk{9KYf89`W?ci8_k-n`oUD=`AwYlV~hP-{n?X+sFxW50chI(!;4sI@v^bKto z8v)UkqdNx&0*G63$@&Hmw{9I7+tI&megD{&g)8qE9UJK%7z=S35w7hYEn3r8ZrgTR z>z6D~l9jn+MFZ4`*yzIOTh%{2wqvAt?Y5zTyDwVt^^vV(#SAa_(h*WP)iy06M5SA0z2oBO|grqZ8)ZeQOzc1F6L zk)vuIx4L*||Bh{AaQhge>!KCI{Uc*r`?nbfFQ@N+0}yu(ji@sP0y*-D*k>vhqs46u zP=m1a(j>V)m#q32B7Qi8^|jV4S-LDqelM3?`zZkxVXVmIhS0Lhl4MOTx#m;C8I#1$ z#>AzIVXS`!C`jq)xugYgI+P@N6nt)zQA8yNiRjjBVY%l0z zW^iC=bFpuve{hu1&(tV5^xBoVWZ4;7BM>(iN0B{YzUUju8nK)y<0AymnTj&E7DonM zcrAwqKVsfG4Fn3qUE7O;W1}@B!2i-*vhWk&zjkn|@#*44l=%pWe_E}I$SPdCn7;c6 znQ-RP^$lOV_@hPcX;4ug&Cq>&Lx+ff#y*T zf9Q0%m>&O1F1hkkl)ZLn^Uhl3^xdZ{zh>KLUH8%O->N*r?i0-SvAd>fS(k$T(p+-M z$24D^chQQ-u*=|;Ph9A0L;ah5nn;qb=8`oZQ`3flq2c1HA;#qRSddw!7dG%3v*2kG zZ|#i>*AA{LZbv_#s;VOPT=O2YxyCf-B{ZCM&pZ{dH^p=FjKed+Gc`|Mh=7_tbqW z@BNb>o;7;=?N|MB`d>cwrMr)O@3o1&KREW^PQ1N(ml|W8#i@)EN zym(cclI%aN>}K)ri~PH6Q(JP`)wMKb=#*3U-_09VZwf z!B}ybTdOXxi#64+=eS7AsetpawFzgZsU6cW^8V>oIhy!^*?DWvzZY}`u8g#)WX-d zKSBhb)%?o=RhD3)L7QmlM7icBD%D47KVxguOu@*$iY&(Xf6uhEgKG|)YW8JLhjg5Z zbF@1CzZ8=%&>;B?v8-0i6pKvD$mq>zfP5XJHm1q4%V4sT*18EAW!XUfk>p;m8NjFd zWr*kQWC2XAHVh=}-0T5>tq#Ylr&ks8Kz9FEoXu!7>n3os=>I`Y96gCyNtRP zW&co|liB1K7P3h+!nYsV)v!NPT?;c>h{6jo1hkF+6TZE``x>zBGDxD>F!WF>?!r3F z7Q>rLj<(hDhjruur5CE&d{VPO>LRI9^#UFLaY8D|8_de58*79f(1*6tevURy)E zBR_}=>g6-{-I>~drS;)@;0{5H9kgn!j+$qNC!CgA-!+z<+JjU3?+Pokk`|9z`(+Ag hCv^O{a;ooN{`(!J!1}g?=c>uU6~CkH{~d4k{|9fHTk!w@ diff --git a/lib/net45/ServiceStack.Interfaces.dll b/lib/net45/ServiceStack.Interfaces.dll deleted file mode 100644 index aa81d89155abd10821abc327ac93d70ede60d995..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139776 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 z 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�UJZmV@7n>VH`5XFVnaZ- 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 z z&L>;#1;5^9BGhaOb%8xXQww#P&KCCu77L`MFIVw!okhGYmNX38p}M*ZW~G$g1lWjy zQQDM-xHno4Ar%TivkCZ{IK~QRECFUmMpIZ(!(>o@4)KdW*Vioa$f^-JMcbFzvPxyel+nkey*7A)xQRw+}t zA&{*Zw$(lmY$23~(k%D*G+4evmW2}xWG@a45+7mK+6@&-fAW@Drt(hEKA!+FHeULGc0=y=v%b@EA;dmc{W2)F4^F9n99WSMDGfopjCBiClku)`mqJI)r6zzLH zO?$>fdT+>6YPHo|nA$dfZn!4+6+s$-gd}lso+M8;NK9N0iIh6*5t>qNF#y*}hHniA z{#p_TWlE2y`>fI%{PDDBo&S`EkGDsl>n>74QKl(@V#j`DjzQ84kX;5zQzK8ZN4kkb zmeO>*3z;GCkCXSpl%^(~V^`N8Y1ndA*An0wTlEw|Tcf3fX&V+Kxbh~Q82~%ts6J3s z*O9DZJFVJBJ`!z>c+a4~=Z)qrU3c`FC29lOFg8p{Tq1SUJ;>dSgHtR!ZC^$#9yt2| zhR;dpNc;I@{yy@W{4vkQhezz>;nn?x!`r<-wr%6XBX;ue>i)vv?cN`Y$N2Dwojkm{ zzi@cF_s5bqK0IP453lYo9NzBzu~3f>kJ!n>tNROwH<`a#Qa)Ki)v-R< zwfS*vPD5i^PS{cPCLoJ(yEQV}L*ncxF7#rZnoK+y=1jBe@;-y$vI}Q~Y$m=eVrwu~U26P0QoaJKPJ_A?#U#SX z4%b+Yk&>=9H4cibd&m3TxPILq{#5|^B9*%dezeUG8>wOl<04L^$?R^dwlPMgOV49iL zd7f2xztZioU0uV%DLCIG8}4PhrFn*v5ExF9UE0Uzg+KE_>wv(bpVh_sqT3qL3;MX8 zhm8wbM3m|*Ds$=;T2GI{l^IGf-(0ULgAfceF{Y1)@Hp=<`O`4_h-8sj%a9$Fqwz8G zcH+i}yEec@qMTbSOjYh9N`}v9@}l+#GfR>w36({(xI>bGChWCn8@hwIHqLwyc2>fU z=+%VIuLIG{ z6*l?xgMCicxgGojGMcA!T|OISWp0pPS_~axzukcs+Dyu*aH?RA!6b>*QzRy-abvRB z8jjA5ei6w9MMT<wLF_J!v;L9vfy~sn<0Gk3YMFN z!q?Mil>&&SguaZF(tbwdtS1Ieq563(J?PZ|DGud>neq%HRa~f3+m)hs{f3y7I4n3w z9%yVfE_0|@e02&dX3∋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

    JYb0BB488CWxz1YZzFB& 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

    s+d9S23r`@uHhA)~+I%d97_-=4jEqUo^tw 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≤=(88d6N@4vW1Cd< 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 P`3`IH_kaKYVc`D&WekEK diff --git a/lib/net45/ServiceStack.dll b/lib/net45/ServiceStack.dll deleted file mode 100644 index e3173979f317d73dabc7d9c8f888e4fed446fa80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1633792 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%0DNa}q%dmTKy)j`lH!ZqbKBgGFU6Dt%CsO; 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

    XwWt&nv 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

    o*`;CO8XbNV9{4H>AJBlSr?)>!KNEPKBy{;J z$T=u?rj>t65im0`lt`=|=rpcGTVgeh{Pq+xS-C{3Ux!3<{x`uPT3+xW7n!eak{u*E z+#ZE=fP4x$hKImmErhazBqvx00+vv6R!3P)zK9l*MqK|Q5VCaAF>Xf;vFlOY%fiS$ zzh{25!{AL_F|X73DAMrqviG;5_%c&1rFF_ zIB+oz)>N@1k&)BCdszC!MCt1tlF(n!=?^mff}Or3GIIL&3`?JwDE;puEzqBO3G{c^ z^mo|lOCrP4mrC6kF-?UCVjl}3b^2lEm%;GSz3szs%^n#A^DyqBr;;)&uvPT*^-0R99ZEO#P0wXT-@3L}F~Gj2jAd`^c4 zBNieL$&b4Lsj*9F+}0@$+j6}1N#x1k&FtLia(1l9_9 z*CEYOYBH154f#^kCCrI@g+oeo-L4b7JBqKkbv3wU&Q2zVFT&UHzre2lYeRf7r=u2L zHl8^0%c80D>!1arJyS6p{xgC$QTfm-2I06MlVhHYowy-MspRF@T^HaP5C9!o43S?U zgjQkB;&+2>`x07I4QKCW-$Py5Asn$DjBz_9r%*ly(lQRO-0+DgUpIUMu#*aMpuDe| z=}(D$4K>bX*EclxXGu)`@x}RuS9M@KlHl9;Ny!>byWdeH2v0Nq?XFz`{I$2DF;)tei7%#2fnNYfvhebQ| z+0ly14dZ_3hVfupGVSysv{~-KaX%EbQ|cca1NLm>GIdZcr5!KMICt754Q zjEEt1qmt=1yOLe@Fva7#Cr9|H!%{((RNUVqGI{6oOS z!YdFSPh=|akwSJvy0FO~$#I}7?SWdCTL@yZB8As=R5e$}&c$ToIJ68enG0~JlsBi> z;Zdz=e5N&xp9o@VE?AFNrxGiyPh>e?w#nV~gv92%L}o7%`|Ojr(1+KG=Z|hnIBJiz z19BW<_N5s!;gwij%6E~UU(;>&c++MDKqFpl5CQ;kfCsC{Y^~A=w2mfQ zY288SQl!9Z1G4hju3Q=SDm(S$y=2q~rXWu)M8&4x7UIBVYmi`>{Aq~AcCb6~w!xMe zxMr4RrV80QO6 zmw05Jxi3g2jz*h5iu^wUf%1;p;>`mRdq7aAmO@UzeVpt{oFLj@t?b_5v}cykOinty zA`0yDIsm605~UYoR54jzfLVJc!BkFcU*QBwS!Yz~=j4tC<`GvTszM>cY_39{QrBOb zMeActfKGS|lW^Kfm|MH1gmF~N*29CW=G4E~nmVjuMq|d~tr?`fjKz&ib$qsp^8P3)V>;~oiQ%+9%Ac>>UN{3jX=#7qt^kGi(grtU z8$39%?T6L!$Vohsc-Nl|d{o;Gcc`}MB%WwnmUd*R&$Y>pXp(5FUhO3GqQ3Bn<;eJO zf{y<(I%9C8z#G!9!XfsbgX4h_J8}8i-+=53SCZJ@5p?|ZjPtgjk0Sanbnk_lZMZl)<+h8!c^j4T_2Kc$fI8|>>iVQM|&$*H_kUN$O4G29jO zd0A1Og@_5)?8UtQG?pwdl8P%0NWM7!ODGA3RLB1j011l8mAAVXW2a=LozZR?Fw;2f zP8U(6b$v5DOpjkjQpI)`W;az3r+82^WyUfkdV;Buk-Zb&^` z28bJ?%kd5Wh!Y2G9%fA7C2Z1z}}oPGV-}ozo=Hi}4F<7YxpN?b2|uB1s1W*bi{(=5kcx zWD#eXwa8%!ufaN*m!R7 ze+vSY2oX%~WM1W=0#U7pjcL_)?YF($oe^ulT;4Na zHmlAjGD>phC+qX^BF*vNWc;1gH<*RC&{5tb7t98L>QV_{5M^ECBQ+<79eRQL-Szog z1=EbI_#FQaOl)uU4K`sKsq&`iPjd*SO>$|!4{m9&6ViS^U_~GT_Om&B1F}8VYT5Ds z$Yhu4vToZ{)@iD&#S9W>FpTqeAq_Qi=n}tdmpH8k6Jewpi_z9({9TopeYRR3I*GN3 zdCwU5^~4r4+6rJc#^_~j{>d=+g+J3CA2M%>`2RrmSZ1T)rk#}U@-r^!r{tURGx&1f zbGm5}0swJ_K?nfEnFb*M5N8>L06@IYAOv{Hg{W4h-wiIp?X=@N$Ve@396xEnT)8QH z?eCzJwA4*H0&omS^0Yj09NMQYR;oUTK)C-{!%uB4Dyx3BfIdJ!k3_NMdiwWUv}=Ux@6&Iok7nr zK?ML}$RGp&;{66801)RIgaAOCXAlAaalSza0K^3bApj5;8iW8qTx1Xe0CBNF2mpT3 z_Rml8Jwe)AKj>ew7EZ?}7+8n!=Qm>;AI52#h$pTEup#{{kILqQAALjg@i8@&As#o$ zN~k+n0Dn0IFJp(w!|+0ULSA*UB{@8gQD)DRRg;*kJxkCb17+A?oQ*a;;;$DamJuk?!0DLWTMp}jW8?_!u}2bcGs!IV5bn%t+r7n6J1(4n#p z77{J{FU<9hKM79h_n7rnR+##opd^u}Izd%{X^uZf;&Ik*cQf&v4_O$@M<+)7uV6}U zW`4Ecs5=Qv?9kRh2z;<+F*E2Ea zCD#^HX$=XMU)eRlwQl}ZxMIRmmp7$?eZL>`uPeH2!FtzH}NC0R=zeL zN%e()*$h>6S_R^8hZ62bpQEFn(+SZ-1>BMW)4>va zIFeps1}p)9xYQs70OA7%Apj7U8H4~Yxk81KQowo1W=zP;zscEWW=j&hZO&9=gMf3 z|JCzkOpE5sSkBe)Q3fYb!8eexiNkI{?jggG#@a|eQsnYhAs+u` z=YP#48OuF(T?cQnu9y8`cwL{ux?YYn z|8LYaPglpPYxatFRM)$)qVX4<6mPt)Zvy+UF&?#Q50aXRs`lWwrQS|ZpBw%pu33MP zPxx2){NQi$Ib#DprfOH=+5)-^P`luA+ZmVk4^`<7LaauuafLw$0K}CBApj6p z8H4~pe9#~S0OD$c5CDh|8H50`w!f`q?|B#qYT0`dHGJ<`O|`C`+^Vc-*NyW}9`oyUi z6XXD@CwMRJ60Hj@*Z(q(b#PKI*J|6adUXCuSX-d5T#MkGAMzbiWEDJe zF;cD+I?una=_;yDKI)rQbm(hMhZX>c>kL8wAg(tE0f4x{AOry7MuQLlh_wbGz?5(z zY6bJyQ;vK-=*s8bqQj$!0@ zQrEYW=txZ4RJCoML2T8OZc3+%E`@WNd;!<#%_mwvA1PsVe%O(iUQ+4uy!RPKob4 z&w&dojvTK$tB@eB>eG69h{}QYLh@3xR`Pce^T7&IvA-jLAF4KbxNI zs#N*#$4DCcD1F8qG~mgVn;!}=3Fp|8d6+!~+?+~X&uLx?%QO#+p23rDyl#V=#NK>d z#q0dNu%+a*9GxFKa(?V4c$Yrx{McGsGm<($b_PFUI*I`3IX4@G04F>CRiLoqx#4Ex z+fE6W;YWl_V1yQZC7t*=@;V)D&+)HjI9!|X8*G7FUJ_gK4{6PDKAzTe)|>V@@+wkAmclRMZ~-%h ze+}^F{C-~IiqEV5htciq=FyGB=}MW>xQ*O|Js$Z!URw(Cu!Vk%T-=IqclcriPYT~Q zuzv$HLv7q)YC`}Z?lcGifVj&b1OVc0gAibM$E{`>IPS`q+q(RZ>SRA=!U%v!_Yi^a z$Bl;oKzu@b+{Z8Kn)?^CHg#%SqYQP%b$XAgGm2B&hN$}qO2c%z{dHuhQ~N1C^?T{z z4DwU^ArX>3!~nZ`{6)OEAefB6q{cGebOJZri8I*N2AMvTkF^kaur2be^oBD#+fK2t zXQ9c+pjW#C&>E~;eP~9Op#a$&U6GScIsToXsJ0yv3%18k=`}>D?Enauh&RD2*ipeZ z6MmP1ZzH^ug4Yt>888^ddE@}ld#3b_&%wtTd;nBKyd{m}pesO8?Q4_+%!XHh?AkI! ztKWoEJ{1gta?kPfZx^8b%|Uf`ke(efC8YhU5dGyG>qE^4;}hGyTeZi1ReZ<=+=*mM z;UoM-IL<#mz&vpl=&5}jNnz!lw{SZX(r7roV>M@gIc0n%8;HDL(a&L?kXb zAIYiQAZe80r5C754>Cl!!KBx(LO^5u8%^a=;Uvv|9cP-SY0wBo$|{2$C9JB=U{^8< zN^9j{H$WZbDlX)92ZY-mp$N;KudsU51&Jau&Jcn3K;Y`LIG}^c{lg+@3yaL~tc_5@ zLF_wqGaWoduJYzn-TZ3u(!tXtZ%4S>%&2yt zQqT*J9pug@A?MFr$4o~h85vq!t0#D#e=2Za!G9hw|9Gy_h41^KzQsF-catF)!qcTo zonS9Ga6&2HfI@I3M?PA`g6C_g#8XIPP1N3@P>2%g-i9_W3086$h#Gzo9;L?Z=nlb7 zn9D0u1P&htr`+&I_*LQ?dn422={N&z>nlJRH&_mLUv+$cRw){F1p5Gy3z0S~GxOrr z8GI0FW`li!SLsLdJnkR3aKRDcq;OY(Cnr@2I80#TwS={TeK0ej)38iw@Clm2Il~plR5aCUEH%Trc z{$@qI3TKr-M`3*gqZGrUQE?=E4T-6g9RCisx&6Q`X`HH6lIzL`o%VTl+Wmp?p;%cK zo+J~$M?K?}Y0UW?L0ol8+8%CS#5i^VXjwDfY3ze}-+vDx4jXPwOX$wH6P$GLB_y%r zqewA(8f3$!mi!*X?6AnzjbneL?n))aTvhcwA(;+VAg9V9o^CBg=x*a6p6#VFR|C>a zCZvNQw3EsN4`iQ4DC?zEzA7yY6Kp&}M9%*eNJ;zeViUcltJKADl>0W0>v&6Bm%nv7 z(Osu9A98LtwP2Q`yZXj{*OKM2toCZOQ#5oajg6In^%a0}E_CO8e~%OLyR22EUo@?wBY{2XEx68mt# z^B;1~J`-PmGYmET<+-j;x>Z)=oU_l0y$a6R?~7bk#yhHvpFzg%h}kL16qOTI;GT&H z?61Zs7?2=UCu>mPbBFPvax|F0(za(R{hARMV=$;p)})F9#H|^LxPF!2@ystH#w=|T zx$PGMGNokKKHX?^oOcIDrsJ42#2h%-|0{(2{2da)c7e_H2<@V&(r2pT9oan^?@d#w zzOC9C(>xD6mUvB7atqUls|3PYC@M}f@tb#frU1b4>-Y`cLT|5qA3tjR_&DZ@^O2@n z&i@qYIDUiSxGo6W=jxjkYmNU~gb`=>cL{wCLaR1P8DizLc@NT2Ep8#2=4IGHw26qZ z@;*ttrOrq4zC*mFVUOhfig-)o9?5&+BuyX2bh05B!cXJ<_z@9_a{+8fpNHSt`NR#; z$A@`=a^nKJt3CY<73M;Qxk$p$$6tal{!;v4B_;`93~Zsi9JAvkfG7iaDZYwn>>kiU z=sL{uPevsxQ79H1RJQm+6Ob`AL3K^)K-=E?NIFzqQS=W~zUYp#MQ6 zU42N^xs0tp4zAX;!Oe)8qP zbZ{Mj_Qn_JEBl5%fy2E~6%f})HrAkPEoKLWvO&_B39d&P>*p0z%!@{fnH5zFIk?Np zIsbYrk}1KrR9@V(Uaxc%r8gkSCEH^`qm|&PmjMmN#Lhut9?$w6NO)cPakUP>!i3ZW zHzE$SR#XBDP}I^xlP+I?z>t6yBu@ti$*FbzT7<>AMVQ*9xHqiY$duC3sD_@R6Sdg% zOVzU0U%x_BOUg%~v&#zs4_DJR0co|HKksYAS=r=(Plti|WrJq*Ggm zy#2QsWQJ3F39DmjFZ}`T+HLS*tuY*!vf}xRn{#|d=lGn-Q3G9m8p-dDd)A9f=-q7ImkLC<7w*jwN9d~+L;XQ#4(sNNEU8L!uB7A z)|tsZ!M3B!!84L9GeTeOS?NCuD4FtCQ0?GrfZgCZV$!ML>-dUXk%tm|fc-rgK43gW9FM5;SlUH_+#MsCgOA>dsc8Vcpks)nbTSBLbf_94IH>d zuHUc%2PA` z>AYU1_ASx4@Zjhgd=EdbV1bh80d>;OaHjPiMD_uxYQg0CBG8%Y<|=^-Zfw5~#AV!1 zwU>L7!M#ZKvYWu|9v@mYWmun;T}(1~iSd@ewn(D(1Aw?>k#Qf292qZLg~~T~spVN- zR*w9th39#5CF+E*k*bgqr2aButK5sQ8d_cM_^$xdwV|!rt3WTaA-x```1GKfdgUNw z>}3WS+5ZQ$EP>iBM#(vZ|3i2dbBdKPMj&j2Mdr%cw8pGh_(~Td72BnOMWWn*n%c?>l5p% zu;74p@>9fdeD*q%%BzCmsadUnAOB}?zg*(m==^&O3>uH`*YG_FU$$@Jk3vi0J1if@ zccO*I3PAMPp*x#cuJHg9#D5IHL-?-(=HDUCAcxG;FT^a>S9SVvCj2I+kQLA4)gxt?!*v=CTc^T`kz@{&pg^GwkS^Z0@|zC+ zNTggDzHSx=0+59UApj7+Gzb9{A31J9ncs6JL1AIy97yn|{iR$NoQs77(yspsk<7&D zFXA#I>2J;eys_)?-^F!YGlRAxpyFI!AB%y-O~M;#b~{|lYZ)>F7o>Bt|b=l z@^(Uw!Cw$t#(i9SBreCeUV9Y_Du_Rn(eKrz+C4nZ9Q-wM#d-G6co_LtMDlk=^zC)k+{MC+-akm$Qgt)-nrXX4Ve3g#M}@~~I2Ox>fD zsY__G?>_ZDwlm?)Qt8alnep5l{V4H4rY9_DVvf|RvwnF`0Vloasw``6t-C0v!LD^# z^eK(TB!)#vLC$p*4u`v6LrGO$BhZsetUO%Nv(Vw)nG@_P98i7C?4xU!06FxZ$hx*a zp*IPwA@r7k`Wp1EC(@|1o_d;}27}ex6efeu&>w){ILPzktMI*=W#%(njkn?B1TLyc zfelDh##Z$3!DyS+R)qwGK&hMB8?I>lmB-J)aF!cB1XhwHtJ7=P%9 zRpc6fVw&mjE;MTCwmL6I*VFcizN4`N!ru(n--|3Uaw|`TpGKS+wOc{L5XlbRsgawM zN}AfAxuC!t_lKAm{+#epgb#na1P5GcDW4NQPYiXdBg|{VFmDhuZW_onvAW<;W|lvJ zV#0c8IE9#|FgpPwoHMaXD9^rjc{oOZO^FXl`|CnA)rTi%oHRWs&0M*R`Y}G00T)(3mn`J z$exvTesr6BcKsyPCb29x;}A|v7#sXmd-**QOD|AukYmKUX4?7Ox5}c4be$^;aDWs; zBlZTuD$6@71|wPVM=XZ!T2?V4`d1{DUS;UdBzA94B(96v*pf}LsOxTD?BOF#0E0Fg zS0>1TwXTc=-Ns%9;=LJn>a7zf~QX!Ge89F zKCQHm-7S9Tcy)xj8nNu#@~(MYMu)NZ1F6X2@m7EYjh-AQr>^sbUE^GDJOW4~8sEgOab9Pm z2c&x);8(H3x~H%hrek($hK)B2E04i2W@$5QoMu>Kdy7$OwO5?bT`U?#-OanZv=IDKKUlMgH==!Cj76N-ij zdyl~cQeZP-f?>iA7853_p3>c2>=~5_le|eAW5VzN!h~+u>p^5;LQfMDy1hvj6DE=g z6F0^LozNuBgr0Z81X5r#q1!N_VliQ|V#1W};#9+g+gn@0G;i8iOgJ++g1_)!it9~< zpYUL66Az|%(-aRTu^~(*4<>Jn2Rfl?ng=kLp@xs;V>AR(VDn&#;lY5#gXxL~GrEht zh6f+Pyo2=Pd1R(Ha||AAdlJGcneJJQMJ$pEZ4DrShq1Xh+nXIs08p6>fb)($3{eZc zILn(Qb5muSH!C~}9U>?qSalp+=Nnh0jyGC{(<3~e;d;IB6Q1`r@qC6iQ}KKX37k%z zPv02NbwV>W&wCf2&&Dw;e8`YeJp+@)KTpaCGseiHKr11p^5084hoj6LWQAS%Gfd^r zvnqcRRrzzei+!f@hYf}OUjMMlvKA3%jZ2LXKx$)->-E7;YNM~IHs*N!sx}}%k@PlU zZEUi!+RzF0>)PluOc-k@Bn37T<`^baEhfxWOz^vln;Iqz8wE;UX)Gq3nHs@gc;LI< zrtlLUY}&*F-zzB|zyNpBn@b+d-53vaLM6?EO$`sm8U;v!%>!Taz!{u?jF)^1ZMw0e z#g4LKN2R-1)$Ayr*)$pqjLUfg!VSBJOKB^vSB0OHw%SzMiZ{@h&VrU%&~jW*d$!Xt z2XyhOx_H&0(Hc4Pv&&Y|WplC4-r+550#LYZ@P9AK}m%hhlPEP7KI-$puT(F07fedNX$ILNg6J(%_Ni#fu7&evT@!2rCqpa zhpN9gK+>BytcqIK`5S3!qb~9HXemXszAu!UnwnYK z4=crFh*L=YOh!{1a~Y2<(Bxs|XkDu7a*Wp0MqQ;ZYbi&xL~kjFS)C6n$MkU-RgUQ> z$CyiTYNW{u0La?CP+6Xz(#EIn@Yk%L*;BgZCsSoCI-58mwVt^a`KxLayFh3ktsiPLXX z_K+QDhBpps>q3cvzrAf}j-%ldoom}%4e#bQzG~p{$)PKg8vh^3q4%aVd`oJmH?85D z(zk4t5twJxS1@t>;Sl(69LvaQ@DT<$(f~&p;AjIJV}N4~aGU{-H^6EG9A&bltO{_;pgt*L;me^6=MO(_2 z1Jh(ibm-ZfvUY3Az)ml(4(z!nsajo9wV;BwHTdBAu91vsBVDWQs0WMj5F}Wn&$F*f z?Dq@RUdXdQ1An9NEQKO2`8Ax4G9ar2(Hd^?_3*XkUcHR7&g9}V-|FJg7I5J);GtE# z=EYlii&5j9JXSp2s}8Yy6)moUpXz#X@_3qJAB8B8+hu8lbobgjkXKEd2-VfqDguZ5W_ zn9sx*7d9gX9bl3BCgQm_tN=v0!!xTq7mDYzcFaee!5ls3G&U2@U&fw|&08^&QJ%pk zG+^=r?ZXPrJ1)ClwIhJ)S6eb@JTi>luNv6N>9%2AsQ4#f$Qz?=2o3Rx?mO;RZ?UMO z#ryBFpE}hIz%0HbSXq25H-;`gIZ`u#!oAFPPZ_W?poApn{SJo)5$i_j66*4Bg z`>yQbYGbi|xb&WhOK<3w@b+2X_wEBQBj?mB>x2l+l&v+g|yTa||J}B?7so<`@rKx1?rqUKS z6==)GO$CX)hQ!3mIBX2#0a~qIR8sGP%t$O;uG)|T3D8x?oA#7SEW(-yGQozveN5Y( z*W7l8$z80lS}|eMil1(6#m?Y(cvt2^{%w*A@sq4lE&O45 z@6q}Y1hHBeld~B!S|8HM?PrR$Ko<)Fv#KSv3SzJ=Jh&E}gS1I<0z z_{7$G7~Wo=Son;AUrTH|N9l4=caZj;sL$f&8(Sj_S2hGa!DMg%n-du~rVlG3R3n8B zHg^m*9Q*&-`r02!m{EuD81+R7vtjjh=Ks?AVp*d4vJ3Vv)Yrel=l58ACOih8DYrL_ z&u9HFi9HZGY&qhg z6f`5b0WL9MGp$kx3s?hWW!qkW5=(RXl$QK2r_V@Zr0*sijGz1ynaw^$kP_8&1{qli zX*z@KR7!T!8Dz!R`GfG>q1X8XnA@B>e*kmCRp$?2?x^bg0o+BHKY+ROsq+UgH#&9x z0Ol^H&L65+xaCYhyu%LzLcBi? z?;u2>n(zmNc+D8L&jQ2?_Ha8w6j=-32S^SjhbX8Ro&%>T!z?2H!$Qm^V&3dH1h=l? zp%#MM5>55xx#1v!aaBw-0Vl_b2nfIZKW-y?c<;e1q_WcLB z9@FLw&v0tzU^cAp1(XKqYep2xey0-eRYOW5+;X7pl&Mi(`^Kq5b$Y+pg}k^*&^aSR z&Sly)#Tn#^Pq~^+Dq`*B${G%5dC(WEO~s7U*Ir+V;2G%O9D!w8{Qx)||6Gvl3=)21O1fOt`IU64D=| z(F-(l(LpLUm~h^)Gb ztD1mHaBh^z>?o7N7M<8ctm9vZG^|)EnE_}(2~h{3dKD;{;lb0E@Dmr^AHIfOrvgc@ z@lmb$+8StAu5l-C^CPw<$3LIhkbYgpdE0+AYM{OTR<}q?kSr@(T^&2N+3JGWv2J5%#WbueiR!}!&E;G&gda};f~p)-C5-2Y^_<2($< z!fjK8MR;lB0`ME1s>Jp_Z_&Qty4FzdAnkTLmP%YoxVR4&3U;0H4vJ$D?KeTG2Re&v zCCGl>qC*rZ?HQ0#%mDH3$TL6xt@3ut)n8tqfcDJ9fvE_)XqJkH2(XFE)cSj8=J5!` zTTwYMSS)%LtUMTvs?MI~r0ay!rM*luJxJOce^sA_7PJ~G2Z_r&6YKn@C!$9Uaug4y zaVL(1=jAwN(#OGjDZL$w+}?btcV=l@HK@Da3XVY=?=OAN?LB;9%I#gVU{kkuKA|NG zdfna~2(4N$(d|8SpwsQ0Gtln#9yE}4dm9@Zyoem?jPW7C_z3yRZZG)=vDw5eoMTR3 zg1NCTU!CrV+PM=<=ad8U5h5#Fn*mpQ28JOpt{jGxM3q(mAPzSO0f0EdAOry7NP`dn zh@%Wb03ePw2myA7k!IL<5=|;smMEo#;nwrf`DGPe+C5yl0~$AeosK5?(G=-6T!wNO#62L(cyXDH{X=0IL{yi0OEXu5CDh^3_<`PE;I-MfVjvY1Q1?Sqx!rU zo_*C#TIy4eJN~Xv4F-D{Na(x7BqadSzSJND0OA7%Apk~$S5UMWs}G&AdP7_3YPZsf zhNDo2NfRw;ckdrpAF2>Y-jCEHS;sroyt~3Y%fcPL0R~sGs`c-hkSP(L;)5oc?zt%s@KnQ#_ zzwAE(0Kwq&_>l1s0ElZ0LV$%TWbi7=L@P{;<^~+8FxL5(u@VhNArtA?@cnLy-V#Or3;upF_WN z{SrcBku0IR@%DRA27)EK-b52%9hT~4R)B=8V2{Tb!5oZP6-;ZiiRk z{Z&{W!z{smfO{@q1i!v+cU|}8+cQ)jXpZfx_yL0UTn-_0gu$bDyHPQ}A3G*cH6K37j=mgpbO063VT^3X-yLaZ z7JUx`ZwctWYCcuXBx~PkOQhG725M#Ch8Pmex|5$7&X9bkH15(){T=)m-K>8Kn5p)$ z6=GpJ`205uhU{tUcQCRT%8d3q3bHY>;%uLUpxSaf4!ghI5F zN&4FZlOmY%cL1pRx|`VhpG*@A{&k=`lMJfJF-67y+vrXO18}P~zgm6@0u%vX-v#j!v+J}Qod%E3I`V3Bg%A&$-HaKj^JqNSXM@>XW6 zq{BK4H=5*`h(bt0Sof;zg4h#G$PyoBg+;txQNb^#@_^VM4;K-!I=} z{Q>#XSVz8opTHCApTIXgNEd7j;zDB&w3G>nvx%VT45X^;4p5ZrcBJbDupXY5Y+EkR4Jdv)+x)O#*ygE`4!a{WQE4FSYjhFDO2-a=v(Q&|@} z>%o>tA=nP1sF%{Qfz;8b+YjnCwsAqTkH=>6wHHCm8V~ybbr(84F;&~)bH<+Qggg!A1bQ`p^Jg9$uJ~zSrF{F>y~tKi>ODOgUe{tmA!9mOFJF zKO*($);}d*m?@KQs{R@Is=9ty;EDB5;+r0%OV#zBs;-HM>Y9CbSEPRz(y#pnwnKD3 z<%Nv2dvI$hx#eJk0znHlfcm47Fn_CQe@pgQm|%H>hDWv{JI#D?H`27*G6s#U;jab_ z2pcJ|{kz(rY> zhGnDX)5%El<5K>(-=a`EAg!qUhWGa(TQH1B^$ z-oJ}-sR@5hZ6~1mWZTmCJYtBMn8yHYNWaM#9|zC+hUgRQEFm%Up3-={IpkY$ zNc!lI9MT$JXb$;@I3#@}WSt|aQ(G1j;-brMNbdqfZCCsRyG1#}+TQLhXl4WS9xZ4N zpTp2~a@wiwiLiAxU8nYLg5;!A+Y6xP#1qX_zfG#|6;9A6*jqvhC%)Jm@{e&y`sk3t zi6@&w{wWSg9|>9K;N#Sm$Apj*eH$|S08`r+KLJ(|Ad*?5a8F~8Zlg6T_HPPZXKzuf z$-b~K4L1*PAAt$TyK1WeKsjVyR|tO4En^pKgPP=E`LwXF0=8IAMg4vp>``BX+Wzm zlm{z;hOJ5@h1d1~oAn0w!AEngYNh#3qLZGbh8{5^GXhPUDCYj|3;x~_X)Q#s4lYG7 zY)J5yEvzBtodA|%^R@S|T>!&2@?Hh6Bzyp2^>oyK;&m{rpn_FEmD_rP168nt80=vD zAgM#}5$iM6ajH>E``D?y7-D1o)cyXa2*t0za0@%u<|`0Gr6+s;RGy4<6cySe;A<3v`n~`MHlWr zucY-$1C7HGb%<1R|MCfbxn&aoi2Dpe03hx+2mye2z#s$w;z5HD0J|Bscd%aeUdQ44 zfbjkiH00A)%VA<=d^-4lczX{xJB#Z7|K@q_eQw#^B%5t1kc7a7huwPvNhnFAgY;fP zRXR#Q2ks>(S?(GeiUNWHN+?PYq^KxW=|~d`M6gm8uwXBUpdy6d`*Y@bZV5rZe!u_M z|GsvgIdf*_%$b=p{mjhKN&&YI$>dHdO^B=CQQgtwh#h$=Y&~BToNzgC&MnHJ{uwhbbMJwj4&H8M-`?#EoiB7}Ej9K$Lx|wQq zXZu%=<1+CCTb@6iyN{>h(k~6UZvPgZ(bOGe!`q}D4<{7YBbaxJ{XgJRDNwbck8>V%xw!4FC(r)c8RmYQkfjf$%d-qax9m8l*CBgJ` zjpb&KWqOCYyZk;WFW!#(@aM;c?6tAq>Fzn$$|J| z@=1dvp9*1aJ?b@C+?6GC@1Ro^LwBap8DQCcSBf$KKX<1H13=u9A`H+9&Tb4fJ`Lg8 z5~MRe(bs$Ru}9IK+(f;PXG-*Lm9%}4sN<9H;;sgw0T?%A*2ox7^r*1<+ z*WN>zj-d8l1$BG^cQW6+JB6>(@<7U#0U#bs5e9&GC`A|m;^7ow0Elm=2m?Sok|GQM z@tqW50Eq9V2m?TTFGU!zTTrXQVEtQQlRo0pZ$bqV#?Aaq$QD@-39a8R0_sPC%#P&W z&Ey~Rfc)&xsWU;};S#dCoTK6m3`Mp*71>h1Zc)DurwUh=ejZa#7W8w~dQBNLVDk*= z``w~;7_t76sEixR8ilM;V7#UmrK9*-+*rC3(_G|Fcn`a!28zMC<2{PEvrYp!+t>Zq zXy}$J=sqk2tH`zjeZ4RrF--g! zVC76c?2l=4Bll4Y>bOt0E#pn%X61T=y-FWH!m z8>>5qPcA;4JFF}HLHt>{EsZ!<0m7Y&+wi-B_+nv?0Q(gH_bG)~dOZy?Pr6N}yE;#F zEKvn_zF?&%XV-8Kc9l0Qx?SO*%oP$cyP~4|v^;%=5AXr1+7}4sn%ejZ#nc}r$>L^Q zAwo;lP`}1VT1P-lK69I7MGNa>To27b$MAeq@q2+fCk1gorr*oT+2xluhCPYW?TT>i z!?kE@k^~vRQh5L+aTN0r!t{9$#pTxzx-#4DnHi7O>J>}EnQy2bn25UzVZ1b9T-*mI zm3&mY2>Vb3q8~*37w)0;C=07;!SU(`m(t6P<9P;#bHAbk9}0Y4QR{k#>}GUY#vfA{ z5Tif(K6Qaja~W;}$ewy2q2sTUG3>Z}O(pUF;u50tX49h`<`LaR%m)uI~T;NUq~$ePE}tT7~Zvl4VinKkTd$-Y0XL&e~iIP3*Vj|^BVi5Y4$_- zwWjk#!lT;uZ_~*;#!nElo?nw${lh_I*v|+^%dn=~ep(4h-1Z9M!}_Q!Gc()r@OivD zu=vYnX2PBAb2!O0O9xOb#nZGC=u`(Vw&(HUp?7jqwcI9-^NwM!$ESHlhdkNM`QUAQbfQKDy!qE}N>q0&6HX!Tv4fiRRg8s;6S6o%=^K8SEr}$}N ztV|9V2FE`IjGy7d;xdcT&jJPJE}?#cva_I)|CUh!~Kqg{*NteSpSKc@vD;Q z9~sF{5M1JqeeThn^RTP!|aF;jf4@?L`tp#7B%6pN|=*qTpHdG7>=xKe zdh};t6E3a}&OKrDY3$4rdw@-e(7#Z>LXDxhfnTAC!)qq4Zz!MURX_J>)Qw`Z96Dol z?F|-B2ZQ==D5gQ46u=ldo@?_h#9!>Iyy&l8tFqvwplmO{I8d#WoJ5(wv;KXT+Bd(; z{t`T;%}rf7qobjJ6(Pn(e={?RUy+%uE5ibI40F{FO-c6bSWT-dGm@g16y$7-n~SAH zRaf@dLP4pvwdUR2+YhCdeCf&c_e8^sxkWcxp=)@nCs9b&43*2>`5ANKB2rmiFF)Y6 zBRuywH|F4T{PKm{fJw{ngnWPM!4?j>X+QL)dUuZOUg;sx3GpA564VwjOfKrr ziuqQ=b1jJ5=oaeF3z2tkSAw1~#}OG2`#n^8n->fh7JQSs!dk!zJqqHJ!me+rd`x$d zhdE4DW3s<4qlYIwxU+UCuH5@+t0P16ITok5SW&pNyVT!wJ^^1nObf&r3k{`}LHrwH z?%`1*(i#62czDZTL@B|!XtKAG8;A={A@i6)O<*Ay#yyYZzqEHe0bw!o6F= z8zszioG&c{^VuN{W_yWr(EjJ8l+)eR0b9Oea-ixHGgB?;@q!sV zUSJOhl0&K;k!5IPYd3a=Q?H#q6@MAR<;{|?%!5l^3S0aSVT%eoHfwfu={%_vTEx$g zm(@S8GZDqoC#-!1%FFCbG}EmRb2BQWnF&2f=zD33QobJMR98~cYkzc&GwO3*jdKjYZwkO6!9&*sX99z26glFTL8 z8OI)aFwMDI8r!*N{uK@kqn&@SA17={T=x=JXnh4?$3vN&@eXc*r^s2M>L1d)!n%$q z{ugw*7}{wFQJj=DK5QRjCKJ~C)K*Lhn#uFGs+Ew!j(pVb*ZJyyK@y_@Z|Tez{8jt)7r_R++|wbEt-(!Q#D_f1 z8C%6qs+cLl$@BNEb>gRoeehyR@~;HOnh>r3&8*$o5dqZ$E=n5A`b&zVn|jgJ9!a`M zP<OAr{$63L%9W>ahz{|A@`n)YZT&;J+-`Z^HyR%^@q4h&J7=yE5KjpAb( zeeOHxb01KBXzBV&0X0r}JsSy4csMv|0tXr>-$Wj=T5IM!%Td|9Atn>%H{W*O-QcxL zh_%$#*VDN5cP%)AO62m262EFV{ayH`6~qiYFVezMzN^hk8YUOri6UtS{^TOjf8 zrdYDJxsZc2+48noM};ZTr>;AxBR*STXMR#=%-wD!j89?srIn7D`^ieYTQ`1E$Ljvw z5FM`-6O5?;%H@62cR5X8rPIS-048o4zBL`5NiC&U7o^LH|1X3eBz!N?rz79Zgi@dn29)m&+yI zk3q@kKid6t%g;^bM=tUH^7GGjKRxnuv-y!rd;osp*{FN7ync&HbKFqWzb2n~8$T^VF7ajgr+I0Cv$fm)+tEZ6EhR^)XY(i&Dh%MH3+Cy+%R(4YDN~5e|JR zGtaGbRL_C;fXnBM$#B}iLq27p+dA`AfWMv5>X;YE5M`Z2OrN-QC@ zd9<+gj8e&=eT?{RN<`B`0^X$eB~QRu0MsIiTX4c!~H6H5RT=0}a`%tK-H2M$HOq=fC_Y_d00brWKX;j}fQXw-Z)G|A3 zJgs%{?ZJ;}Ey@zW&e~R_zgDI_jNi{nw5tHw%eiv^wCA%3_qD#9o3_2{W~Of8b>~E% z15_EBdGz;0xH7Fe3)Vw-kOus70PTEHA_u;3!gx!3wv# zr8TlQo1^5hL=vg?U%wr9%&eEDaSQB9V-Rl!Wp^Ltm81(D37;-rQ&p@^J!Htk~ z2Fy!o_3GoO6j59nQW_?MK5hA@8fqq1MY zeT&qsVudpCU|T%{2^vMp7IbBuBxWm&vsD;N;55D;3d3A!ElR_>t^3Euv7R!uJu1|2 z?Q!|b6~eTZ2SIsHYsQSaLnC;Slz3|r(o*BHo(nv_7l&0SMS30+=3XEd%B*kAZ6v?A zI$B4~#RDowbQ!(W`O+4o`l ze%rq6@Re#>-KqzOQDG_CqT|YJ;aKz62RS#M^OD&FM=5%G|O`HUA6Yy9Z z5t-!y&E)U_-r}-Que`0%506EglxjVsCAol znXK3xS808OJP4hpcQz<+S~aR{+laDfffbqep(xik#FWrA)(;f#Tw#5@HvabhM?(_h z{tCsuIsY}uqt+nFRWDErT|`pQ!1xZiUzuFHORYew6Au;R!iMShFc2K+C2fGLe5X;? zBkccW9b5mjuZJ)ZV$a_iSj!_z*1$PzSF>)Lw|vPvEjHA?552*>`zNq_)Wa_de$2x! z30?)fGX4SI*$`$)zf`&0Uukt?W4F@FfM?=ye74wqI@}XrN3#fn4H`p$)zNyAl^^0T zxLhvrA&hq1kJ^Ke=Gw!|QkWlG7`eEgh_2*IDg(p0xQm=jB+`0dhdsFuuRC-6`}{tt z)@OQS+gh>x+$wqbUGg$(ODCn?PR>Xw>6=l?T?@`bqKa-)U|s&D0_)DAEUm&Szpt++ zm$!Up>aydc$TGesj~Z02Je6))3pHAtEO&L6a<*1eo<1ObE2g&{xOEo}*5YP&Zf?H2 zNTZnVgofquP2_R3y1$vntU$~y6nZ+Iv6-Hm4L^&HL+Zy$&EpSIyt>KvN1A*ydo#W} zQ@&5+f#3$;Z%g?epDPb^kM~S-m43O@JuzW=GB?hy)&Z!+1TL{;kT zxAxp^gSXk-lOzf@AR8>XpFsxog(pRAm$#-i)TEY1lwIkzf?ykQC~0V>_L(;_;Q9OT zT-yLCE=9R|9ua1UTaXddOBg{kB3l^mfOM?7D^1JfbLNv(9OW`s`kQd2C8{IJ#~YKl zQ+c8}s24?Nbu_3tGM(_e{_X=5;gEpLK)mlDJEQZh#L&BZ&Dh+dR?Y~W_N@!4F?>#dBZbDGGenG}sG1yq6D z`zYv8zzl-5h03RaCJ?A2-#NB#e(46v->&lDCb2tNW;K<8(+T zV6Zrxbg-T+w=P7U)_}&;OVkc^=a%^~vi0w?G6$Sy+mocQH*@7}nTfPFb`MKGm|@MS znbrnNpA!et$q3!qOlWm%JR9!{?{?gTs$%o8T`^aYPufSFM6PHbwcAXt(=yZVOHMSn zuRZ}Y8j;QKOCCn~uzxCq-{UC>;+|3*n zM_~5SW57S2Nd#gRy17!wRtHn@d0of5IF|nO}-Kd>MZ9A#(N@gSzeeq zfxuk3&@8_vlJc8oWfaz@nwhOnG1HgdWP|(a1DMf>Y`**s_vI%Y$)X_Si&JXwLIg|dfoRj1;TB9ZP_IosPYHd{LxRwRtlBQ~d_7D?E8RjQmRF{898bjkHT>1q`c1NYp>&p3E4E7~{Mqf2t$OHWps1!y^ zZ&rKvHwuo<<}UcMVYC%S7}-X*$yX->Se02eO(gb4BI)Xs#?Y&?6AG zoKKu-K;r#L)ll`UMa+&Z3#N-@yvj<~r~x!nGjZB>N%jbD&Zph-%{-AmtDd9~x#uw1$3{WZ)`dGF_dFO|m7sB3Q33dc7iYa)~Y+wZa3bJ8nImK zAiXw;Y3M|3Bb|uZmo3+1VCZO6Pic}f)BH4AYclcANizFL{%FP4C>kvC*}Z`5ws(&| z!DvkQ;B~o+MfnF)<3&D%U0g+K-6X< zC?1=s{T>9z7yck4@}UOYV%8&U6g<4CjuosJT>4c?w5Pa~+1WV8!^JW~UKW=ANGJx! zMN|t)?oYDVHU-=6+7y0(F7?kK`{$0=!_)2rR=wN>FvH%!UmEzxohMfW1# z%0zFe{S}LQiBIDAH$Xb_mobvJEU&SddBltJ>CAjP#-#dPz<(eA*YdBvS}P%%uW!V^ z_I*Cie+gJW>4Myi`7_G2nXfIYC)FDeK0Crs`PupW=K4nU!PKp@5SUw6IB?FkL^s%9 zTp6E=MD@_o*m6w!x=VRlH%qx&nNL>p29V@;(weweNZ(NH?|fC=-sI;9`S}N~^?&l| z&aIAK#k7L8ek#n&BrQ*p7RxqT`$W2_=d>lIN@N*}nyA`)?S(&u-}p$8eI57G@K%vq z4bU+vfzG>6QatVrh1?(?ABDHh7KZ`{6FGrgs?CyMjRQ*7&hA*-+F3_t*8_aEn+_di z@HBDzGa{yEJ3NuIVgdIi(VTvde#*{n40dp`l_itYsnPKlsOO1#u4&eIW}>#T zObT59BbBX<&q6M~m=vVQjSPuCvg%Tb>@{RA{#+ARE)~_2uCInQ>K`yoJC?$~jM$hK zgvHmBot`#WPx%I`JFAiRmr-G0T{deYlcWioTJ76XZQ8Up>^jwr47+Yq@VtLNOt&UK zZHts=>Yw!sYBXD=!Bx`e^4go@$Qai}GctQ{)t}ai<*dG+Ub$AkyQK?lZP**vLZQwA zQgef#OBP%9jNeTrCE$`Kc#?r3B@rLp1dlZ^E9~)r+OW^7CDszZ0U!z~!T=D(6kz~} zQi?DDL`RA+07PesFn|rdqlnGjNvBIcnbSNf^9-_=_5CrOVXPJZ(D~KY_+41C-ja=v zM(FJ`Z5!;mYCh zDY2Xasv`iQn4@bgd8M6zJ{kf%aCQ@fJuf@yU%q*Au8G=cP*>-2^-Z z@o`|WoQGkJ1@J^1(jynsg7`$7a;dN#BTFN2Lr_O|YUg4faq$;w_~3H6#HYXomt1bU zq@R}~yP;3}ue}!C12Lv{bwqVESz6qvv9xG4A#W>-tVd5GT)DI0E`f)1KZ+Mmj1O@9{}y=j~HGh{!P3|dQC zyOmKT>`Ut1$LXj#h9{seeHKtBU3V|pg7uSFE5AYNI8JkBV}Uwd1D>2&XVa$49ng>w zleyj6i~ay*`+$juTw+EJ!=t;m`#Dg4zGAgWF7a#?kn|Na_CH+-Nln$Mh_T8qBm)PV z4CLy25+)n(pe+?n#D#7pAvkM2BD}kDn$!nTl8SrqkabmN>-D{GiAMBYI+xzHBXnOR zO#CsTtjzQlB<2vYwGg)AkIEt6-}#Kz{X%z5!}Ge{g6BiqJ!ktn$Bqu&)vZ2d!RKKO zpJ$1zd@cyxb*(;S!RO&`_BnolD~84xxiyG8|a)>J*v8@oK6%|UTZL^#gh+1)f57g7`(rf`N+7=y2+}4 z#Hle_H>UC-Nf<&z3@ouctrUaF9>Nt}l4(k3cIuMh2HN*|i;4eNs-LzG-!j^B>ky)2 zcoyx;xxkcCY}C8hKN`HIdWhGu=;SnQq-i&~nAXt~enWnvE(97I?V&miASbFWR0<)LB$EnvSh ztDO#)D1xg0JCOYOHTlD4p8DR(B<5PC8dF56=qwV&f)ywmjc45%^x~x`IoY`z$C%`! zyd6u87G{BJzsfV~o+5K9`OzI&DjUWsZ3JnuPehZQVRF%YNlme!Rf^wbP1T)S96A?B zxu-jedS)(UBz6Gdye7sK;DZF?qvZ|i#Dj5{T3Tc7Op%IT3ZLheXLmbtN^{vE6=6+gcm-aHLxtAufCn<=?Of3!hYi-$cldfhE4>PF#rn}ym;hh?pC z9*3!4dL;JH(EXM57R{dfhr6oh?vF5Oe;qZ1^46hSk4Va!hs`OaKOejS8%@g8b^Ow0 zr8jI2ec}h{s1hv(-}XI6d~Dfu*WN)lQi^BMsdiW=7`i3&1f6jOjGMsJzFaQ2L+SBX z(Y+;8*jpGS%ucXRwPW*@i9w+@emrB2-gpAWaFG{Md)+qyyJ~-h4JJRnkBQGFTeWmj z?yCT|p3jkIV|C}mCN}58W=}rs&U;4xBcTSj4-fC!or}LqHkG%9 zo;aFuSbT@dwLn$*uec*^`w)K7WNllIXA7_&F-#vvBkjH|zajJI%l-cJvSb3l6$YWL z#`=0#}n5P?st;wBPG{SSl<`XU@EYmj1hgy^So*G%3AO8%)rf3%lJojMv$I3^D zP{r#)gGNAYKo5M|UVHq0iJ(%fS4bKZafjG60=BRJ)>5^wJw7ikYATE z0K~);VE~Bk6kz~}Nh!hr5R8944Ff>*rU(N#;-}i^I|0SnmpU5&qCZ6#0Ae6T7yx2& ziZB4gloVkAh^Z;U01%wh^;{W{uCL*+PU>I)2+rJkp9X+nQ0ox}fS8dY3;@Bv)cY_1 z#Cj>h01&fMgaIwlub(;?fKSf!d0GZ6PPKF6yT~*;%6l-pd}_V>_ma=!kOIl){$4&0 zzzE_y@#h+oX=LSi$;w|S_jm+Z8C{GoTf#aJV0E-4bsbzT7xP1)cco|_=%DsMC(6~& zx#VJVEFmp1-_4BIxDKZ?Kgsj#JhOR-c7xTTt}S8mMf>@|*g8;uNhB&wD_X6pg0?{oco z!G98+JIHeGVzVWnuX^}0j0&fPt^W~WJFwv0G!wVT+>IWg!Lj>>hqX2{`i?X?hXbsR zYD&&*Vjf&Bm-r0I(cO+m`W;P9%BOM!U4U)j#dQ_)JKIT|DiRwS3AwmYk+_*4X~>Om z^C6FD54p4%QZ7E^tqSS$A+&pt|4cpvGkV<+WNO2FY$&#{b{e6(iu4rqBMDp_(Kr48 zk)wq8K2feH-sK>;8;cd%IanJV#eIHF=0M8pFUn`f5Q2QRMG#xo-dGX&Oil)jbG*&g zw_AM1A7e07?k2G+5Wo7Zz|jzEm74%?VBSn-_peh`{OH0u2rm(nvVq%+wzv8c483=BkftcGj@ccI>{d8yrtX?)*?u0)lGTeg zn$!s`p9kaYKInaQZwabH?$;#0#9V1LofL|%>Ypm`Z|?5Z7RSo8z_NVRwv82_Ei z5#iBXOhtO6uhTyi&m&L5_%ZP^Jq(WMU#$nq({($@XObHzS6MY$aH%k7d1>ST; z6aQKZzO#W}uC%w@F1ewsV?lFkEsTFk^yMI6PhF0tPTAsI8;7$kt_DMY`Y*!i$hztD zCSkAEO8;7-Vi$W2pAY?KpSlj|Rp}f`H8tRZw6~-^KFe)Et$f`0@BNOCT0L7?yn}Lh zNpf0GVjuo!=YPkj+qrWR>n0i$n|M;-t6fw#n3+e*0Qa*02xz-KD()>wT% zJ_{a)RbNKLpxY7KAcNt|w5886aBbBw<20#x`4|Ms6T?xq{<85F8vcEk*%bxkwh`66 zk_(!cEOJG$FgdnnXM)^{{BSAV;iUMFTJ zgZt_`V@4ygd7YS#!x1_$LNs(@q$l_Z=)bJ?u*o=cqGi-w7_L*zo+eCwlv3eFp0|Lne<;nS1^oL*6JE6INv;ww2F*9A~L{K^-SAIs5X<6g-_qhHq)fsvv$)8;ztNhu` z%xrykGjsJl%=G!Qr@?*oy)aoA=Iit46Fz^0Xvv>!W^Xw8dozDNi8pSlo6smH&rIZw zA!%q1sr0$4{%pLpuFmGpHWidJBnet|NzbheW+rUv*J@wjEM#cfaHe@PGc!|n+nfU( zADMroXK%=xjF>gvN7luwc*e``A$$EA<*tV9o2sH|3)g_fL4R#$qOQ*e4g2wxnr|!% z;;AeF1nxx|Lw_+)Dc%+w3#RgMW|*@&4dg@w%3htFoqdvO54oRJ}*`msmAR z>`$n1a0lX+AbthHEyixD19rTb+iI&qx6*lO?cRiLdK)@42m=%x{t3gigP<9|3>3T> z{fePa<9UW9wL&igzd>8mCSNnzB}cjmptzhdJul<&s*ryWla7(#^qEWr&KH(IJ(_Xuc9c+#3La%GJiZwIiLG@`6l{ zKW`Rg?kDb7Dc8{LLBOT&B!!$B)XFAx$bwGw)T>ZW)Y|vN=QA)YRfN5OJI1!?EL8uA z2Op#-%j(A7IN0SMT^63hWLvO6Iz}-W>-*t6`{|@4FHlL&_3^v`naRmPb!1>b!cT|MLS;`OLU#nLxqj9{VafL!naq}3X0{MNTJygTeqL7|Y>A)2 z+EOA%y`sT`+e+xrIB}y0jS7wJ|jCf84F8FGyldypm!;_j}m1uAiJlCfi3irGI8Er z$5-;K{;n5O`x}9YO8hdUTZPqt&-l2!r-kvy!CE%+YvB znt@5)j6=kN7D0{2*j(BuH8wMUfsW`Lo%=ma&-o>Z0dJEB(st@uF z3h^{@r(<}hYR|SH*G=`kW?-Y@1XB0f)!-@dt;8YK)Hmp#Q1ps#Gy6K#L*#A>T^#zT zy_+Zot2J=$1c3u?i8oI4#z`3QdjvDT;at>v0R!EW+}kyl(c=_e_9kX-xtIo=A6`x37J!tXV@7Nf5{#p z&qoC#o2jiHHxzKX5q*dFTNOl8}jchAPXiZmCit7a8gZDXBARo5)4 z+6T4$ai}j4#=jRAcgrU?H5DNJik4-c`qUJMa@uO6~j$vls3dK5=_TD(6z#vTgwwmHr_S9S` zy9Q|n;IJq~7{EH@PuY4fz_} zjD!u44&9jeI2p(ERl!q$lj~SJ>7p$b^<6`c zCzdK6s*S68ZQRGDwBBR8o0jygecK8C8E+z!M$UXap=zm{G(ClxYj-=ECZX1==qF`X z_n|vHEox^Z8fJvrB-6%7!wp8-xPQ4l?zTV;w>1Opx$#@a)Nr#TljhLwcD6QsWNRz4 zMU+`QRU%y3aCQ){YtXuB4zIlgN_B-@BgKvP1lE%E4LA6>JIT=+8Ax2|Bm1)T(+%OHS4nUmxkkn z;V*%U+%+TEVbYo0$ zHQRt)ER5QKYHcCK`2h3t!AhgDF7pw}muXgQqWr!!h|8G%-Os@aau-)x>|NOBH0+Jo zM-=;^!N{%_VPyWVE)DRUTH0+p%D~3zYp+5KKo$@z$X}wqq=l zo{iGzr#LN>dw@O+0oYAsMc;rbva|pSElK(vbg7+=cCYAF_+l}h9mL6^fg#wZEJ4i zK1kxY*LEKo*c18(Y9F#nKA|?3AD!JM?ya@`ch&H zOxI?bb+9G9^b9KU`Zr7Io{~#;d9pfr0mXbY-WKU9`etoX@lCx|@6cbv@)k_)lh;Hx zzRaylHiy&PO&DBR@g^6$?9%BZ!I0f8qk6OfycVo1_n-&{D^n5uVVbHSju8NRSCrC} zo8SMC|DyTdb8Y_h>L~u@=Ka4L|Kqf-c*b7f?4_g1-iU>KR3^1XbqFmHXTWMt(FxY& zIT+EmG|-W(+~-%11JYYbM=4~5^zKw z{zDAL${9wKbMN^Q^S(c2ORXnKdVzF_SxNXoTIh zxH8_FKSAgM2Scq`BpU+<7r5lnUs9@eHJ6#l1gb-E#q&u)by`a!!g$u#)NOI;n3-A5 z^^6}zc01Xn&mg&lj>3#C_Yp9K86`9G$zz6jig;53)vl)2bS=<2H8&-a*V)RU0OJ9E zcn%{SUVLFjH`0aOo>1hTwf@BY1otkg3+>8cauFO0lQKFnbZWuVM}y*c%?1xs@h-qw zQD77?Qo>jjU+rR8;Z9Ynx8RIkySiP_D?w+rhb&^#|cwKhH#E_n`JU zJl4fgP&-SY8m6GS#UdU+jrSoK_b11@Vh;BP)tBfn5-i!VFIZ2-c#lR1-}h%T+rx|c{^}GC8fNVqpJW1J0x_d^Zg12-W1>3&Ty-mz za_EE}fnO{d@@g~zr+3UP_=+4B!eT+|OcoUvf#qX&)h||G|VGa7w z&X`iLc>3o~EW~^I)N;Cbcc5f_?Av4Ak?8^RG$h$-inTDWwk*g@%xt-bsgWXgL8eID ztTA-!n#8@J;L{jpYT#M*?+*J9@M2zyc)y72D!E@BmO2JHhxZNq+d^IW8C%XNOuP=589WCJY&CZamJyWOb!bJha51#V^Fi_cNS-?KOa3S zLliq~6E>Q6eLubLKz$z-=sWrh9uHNjsvXir&6XL>$r294S5lDF5pNqkOFK9p zC;x1xQ1jP^Neg-?)Gh1qRE?;-zGj?-$By`DlGGWW%(rX!o!!|PTg~6P*zec?C=E}= zI(vR8;F#oo1RU;1kLw5Sc${YE-8x7;0^2wL$!kySfwtlD#KmT+!CYSM2^23jg;~Jm_vhpfZel<*z z-JL_!T#{{;(48w=>h!5Lr}J8!&Tn)2v}}tK8de^#yaK(e7V>^jX4yC$X{)eQbbgRNtf3%*XP z@6g(C5T69HvY1)GdjRO6L_A?!gySa(nNqSf8SXA91-(Yh`-@+tv(|F)!7y6=1FcB9 zPL+;NCS3NFSg!%h1ZViq_|!*l;~cq@TNP2k#T8FWRfSh}xvRsLz_| z@8G}C;J*3=n9+!Ae(&jAzxO1Bzk{E=eMg$N2J9C0FPXbzBZ& z=uCDe*f{nNV4W@|d0Lk7RCb`hH@+MP#c)&_g8^?D!{}OLu>A0EGEYp(@G>i}uzrb| z+4`ks`m$VMa9{mm%xFY5UzVTpWhq3XERRn4GJyHjnkna02`T@O_+oSr&93f2e#Dk= zwM+ZKTer2tAH)lXnwBWLmMKs(TSB)p`BCZQ;_J)s<*(d`6@aX|n5->vc?_p`?CO=g z-pq++E7OiinKR%mnLBfB%(dj%q$JO-uzU&YE6vQ-uQb!=*%u7%tA8Fd8j;QC*?B(C zgz$N`Tarc9I~(}`r^lw88UW(B6kz~}<5PqIAl{WC4A6M-K=BN(wOi@@q?>cKmaa za9{me%xFY5pTFn({1w9QZNp@`cixxKy~)Cc^_$Ji)^9O0SHIOvUw$_l+*kiPW;7z3 zr~heBUxZQB-xqTon$fh zYTOTTUX*x1Mz;Q-j9mR88S$lLue*#-{obbia@p@Q`%I>M^=|>Lj_y){BIAwsuEM%HbKvHYt_(aO;iF{;@esGrv`hp-W}UXAO^2cgtW~3Deo(!4P7+Nk?b)%ZXzwYZ|HL^VOXTHy*IYGwD&fY z5G9P-gJUuKCBt`{3}@>PlelO^UmAyp;jLyZ%Gzl+H~sEWZfMibZ5q%TB>R0VUpE-e z56uftWm-GVCn|~m49o%IZ{B0%+Z;9J{spA?yW}hTQptNrD@j9q1?h@x#$Hak*)YBe zT*DUCzDPc^(e`;^Cj_WlUjrg?%GIH!Rhg=6v~jrF#>pnbVg0*g08^#<_sq=Izi;OF zZ2db1cp-ko;J*5|F{2ULybyoJ3$YMhh<_JMIcGjeAM9U6B>pr6n@g+qZ(1fd&tYy>x8#NOADEe~KVfFB{zEf;7OXP3ul^WjG$NbNf(v{W2;sB9 zR88Vb#b~2R{=P)tx+Yqy_bOc)5*h%)r3eE+oSY&I0C7r+Fn}`5Wlo``oho^LK=N!O zkyY$^c%2sX{;3t!mx(rX_XFCLvDdNOAKCn)gS*s(e#1}lPG)w$43NuQ`T9Hk*Q?Ih zaoousquICjQ69uC5&NV#?F(dZz?^pRz@Z6lrW0+;-3`Aw7(@jLS#F-BUDs!&5_TI!CEy zk#}DiPltuln;DFZH;TuPV;d6?4!GN_YiXLh29VvSr3eE+ye~x<0OI{A!T=Dbrw9W; zEK3mvfEY;;27ovtMHm30o+1nYF`6O_0P%qoVE~BbDZ&5{A50MjfcQ{~FaX4dQ-lE^ zK9V8~0P)cjVE~9TQ-lE^K9(X30P*n@VE~A;QiK5@K9M2}0P)EbVE~A;Q-lE^&Pfpl zfH*fr7y#l^DZ&5{=cNb(K%Ac<3;^-z6kz~}&!h+gKwOX_3;=OqiZB4gMJd7n5T8vE z27vfniZB4g#VNu75GzuI0U$0(5e9&`G({Ky;<6NB00?GfzHcx91VdzxFaX3CQiK5@ zu1FCEfLNI#3;=OuiZB4g7gK}*Ag)Rg27tIaMHm3$ODVzt5DerzV+Me@HbofFau(>i z)WHCJUY{Zi0P*D%VL%%6=%kfx8Dcj2(66K+4A8yPtOsPKsXu&3{UNiGr)j{0cpD8y z>AkpaT;rtt=smim_zl_}e|4K%AGAG~T;4iA=w_uhKftsJ^+62wsy|ymx2Hj|yHW$w zhJ(G0;)(Rpel6sjELR+CfJb|ww2KE{2eHJr;OKs(Xp2s7hPq#S_=}?Ul!s%He@Srs zl=`)o1zP(bUnOsUZ`!Yx{h!!P{dCch#9DM;fUYi1TgW+tOx}(|4_4RPNl&`CFDbxz zG>?PTVUM|{iFsv{jQm^+rYGVeUa93Jp7-^huUm`L3Et`YwK$#boxZ#lr%!sPui!K~ zMiH4>`7;2kqwlDr{VEQF%jFVZ$k3{Km@-~3Y8XRqJqid`rQM{HvAyvPK;>idZYB=Z zi$y%=z6Q=taVO|2J^Je+&6(le;g$z+^@>xg-^aY)8x=t#FD@eE^6^FR(;1COuxwD8 zOl)N@#NDh7Fu8qLX|U9;~nQIol_HiO5R`?n3RiO!)NU_sA@c?uA6JXK)>EV$BO_vq4@@8 z99MUlCKe}qb)*%HbKy5ZPK{52#bo&Tm<6xi z4yjl*mMa_|1?F(la~R2)xI{>FR7Z_R-Y=@@q=x%}h4(rAS+v1>N|Q>}zla*Mk&=7D zI}ZS_;qoKzB7WUZJUm^nRHxj}3=!C{-I{~$qQ6YeJ(IZ1Ql0#LOSrEp+#kJb{H!Sb z*}L`tS10enqJi5`eqQwGVR_kzjBrEx{Hui&H*7}k7as8qiR0@A2R3zZ<5cBfN274} zY~r#&G@ef^dN|qT5^s9@H)TS#dyA!90 zS}`sr7OmI0p2TvxIO_8j(^K#1&@)TtYVNH~2RC4D1vkaaqMK%>FFXW1a>Ff%e+W@& zK~QfZx3M8czp9Efx5Y6a&+N_2nd~2azf{QkhCF+D*i?R0%bkSKOS)X#e3PnFuXMA_Q5X3; zUbHW%Jyz`z)$SofmaAVFy;qPL==e@nD`#&GXy1Z@Z|7;qEkd&HayRA9kC8y616b zH|FcAzqgR}Yz6H_Id-(3>PYpZg3Ms1Z&A9p>DP#65Qp}reo5|V4f$7QX6rAQnXCW8 zOut6-bA$Wp&tpa-viUWlOUWO0E8PgZt{QU`8Xdc{-PSIzq(X#v{WH zTWh)$a~5>`@(kObYSFp&OYJ^oFe`tA?d3sveYD%9BPP zAp%Yke+MJ}JP{9tjpx9mMWH@jIu<BG@__vjd+srbGLOUO`tX^x z<&Q-xu?7iqn{W{KD7cPSNuGGM_&#<**0Cy=EJ~!AJ}cfaJ_SE z{jt8T>gS0p%cVY2)+p8<#g)T^8;f1bne?7A(v!L2hD;wi6r9uW_v3CrdhJDaHy5$i zJ$8=~T(^Mr4xu#kTk>mYo}JVV+^P6brHh#_MMED-uM6z2_Uu9Rsm|x?mu>8}RDP7TAAXjTIjces-Gc%JCs(6_dw%SFjn%1#v_jG zE{B^n{ong6qjB%w?mx@gyF}lkO^A;ryDU?N-48@48}&0hbdLjjIgK*tqwAbhH!rJj z{~S_LdmDjT@7^EuOMuUFs8tHjv&qOP9$@IMwOTc)bu|=z;%PZ`tYm9?7{5>E=D|!U zL@kLAm(A}h=&a-HM%`%2ez~i*!$jLhbQnWHFT0K>5R9|6@26nX1$>K?m)8CHl?!N~ z{9=|$DUJKIH0}&{k;O;;kK#Vy{}A`0#$Md+ii-tp-ab9vM{DiDRMPxQ&Z4l|PHqJ8 zZnz!EW{&QMI}v!c5zqEaMOMeMH@6YdV(K9grvpISD3tt+jXX7Uj z2dg=>Qg^76y^~Lwiw1AU^yjXtjc`13BkA#uy@?H;)s~F0p0J^{B|nn1d9jY%LCA8h zl8@hxtV|45DRSk4fBu7)Kd2)2G^&Wzn8zB{+<==xf5_fF+Q2#A1iXt(=*U%{#Z!Dg z4U$bZ;*-Flc{Px0K3Y5LGWTPo#x|&VPQ-8P>m+piUgcvxb{Jhjz8Iel(39o1ZGQ=e z9+B`j3`SP}QoOG5tMG=xW~5`8TFfud1atqZb(Bo3D-%XHWf+70k^2ehAMP6cDTb^+ z!*q?O4tlunHL{lw&;q-i_I9u*U*_ucy!$=1DmVHX!@ay6R=>=+(Ok6zefypc9+V%UU<5J?Z{ia6qoMK zp02SYd&c{xWXgTK6{9z0y2r;`rimZ!BR6uUzW{ox6rIlEt1lx{^jQ8H@4fewWeV50 zYtr65-ghzGT~sW+|EAxs_-FQ>p=&pNW8cRFrrR7-4+2Y#7B4p9wB3^uf~WXYPk^-F zFzN#TwD8aH8S<~9xiR2*kJ{Z+*^JKA=@+0J?#owF$EcyaC|6mZ22v*+o7Iz3!xDnp zv(Sj26Vb5u&A41;@|!~@6}va^0CB3nT!gui>a?9s^uj|o>8oV6StXgtsXldZuF&d} z?pieYBEP0>GA^Sm8?rok9)G}6uGf5~IMI(MHD)DGGsA?7dGV7bg=;kl z$8+n%<@LhX7?pY*$|%#n&cC7Y%m0oBFZx)tTs2IzXt{;4C?rUIEN}p94*SdL}W}iOFoTo>poT^^TB%hve0YFK@Em=}&|fyy2$eYLafXKA;6v*O&GOdlJ8X z*_oV|%goy`sJ;&=;~jIG6l+^5nE7qoZOh8H^X9`3N|sY!6TkiOuSlDFfe*T0meBb9 zN;Vedy|L^iVn+3FSC8sHDqC0g7w z7R4{H76l((7UxK&XgSdu=Ncftbp3l6jn7b8dr2*K_QZ8>ffw<#3uZTeLG>*1){{r+ ze9mT(A!2EpAB=8!Fk@EUl*{v8gS_<+zgWhjc8qNYWWv#2iUsRIIUqA2rR1 zs$bcVONFX+eZwef)^zt3C`kvXMak=~(=y3ev(Dl<8rPSorLj%)tr_%x0J`j<-=ukD zi~VNVHMf%f&&K47=5DKPz7y78Gc#L%-Aq5H`j^3d^;a>Y5!w7)h^1Q1*@W3Om>sjLIV+Rg zL_eR7%*@vFX8JP88r)Y8F{2ULe3@M7%S4FAJXidoU6Pp#U1Oy>VK1!(EJ32&-V9;< zqC3hquxnRObPV_A?dl0`>~dK*?KxFdvKQ|QEWSTKHnArczlamtDu2ZoBc(54_HS}iJ~@00vHjmT0@ZLHQ-zj!T?)P!E3^G9NVm9+<(zu!AY~)c~7d?YDIYKLYe`&!j!g$_R zB6N{^6{b4!3oi!W+sR!ej03AbU57Oi(~Dt(APibdX8K2Z^6mg|d3T_F593>V543ok zYqW`;s5OkmWNEfgp5%G=ZtM%fUvi|^a#UQ~ zj^s9*vCZNArt7&|WRAVWujguPt+iW!=Jqkto}BA78dr z6VL9tiAP~tNA^1SJDeN6kJXzFQ!(MXS5H#PE5lP;ENfhk!PJMwuTddmdIxJied?77=+L>$#-Z~ku=qpgoc6JR z-1JmhV)L>n^EL8sb8EkU40nqz$I3}!^EM7|*6{gL=5pssgp*oa*?q$gS0czQN{^a1 z1BbXq$$9g<%Zi?zH_y8qaB|)}?;<(adGox>3%2v-t!;3Fm3bfZku|!w0{*=$w4S^E z3H-F4yH*R8p1YRYn&+;6x;FpGxof$tdG7jW;F{;I<)d-#+M;SZcP-Dsh`#^fRP>Yb zc!tql%eia0HqTu@Ns1cht}Wn*zW*TxW91B^WHBsW_1pH*ss?^TuQW~~J|&K_@h>D# zBeD#*A{pLxDlzEC(eCW1Kd;bKQ2A^%pO#&MZvdkcd2l5a9Wp6P=sILeojTi`x>}va zw>eFajbn;NBkQ)OE!LStqdyV1<}t+;?2ULZ$s~KC|;){!XZK-->e|v`-nV zK6X2J+Jd%5>k&On*0h)0Yo?#`PBOT!-i;ZJ$mZv~U-WZcA^e<|3`N_=i%hC2auv^59a*{(0(V z0P(3D8GB^Ds(Z>;$4t9cP+ z4M#4`iK+_e&aq`5+1*M&L)zn?{tD;NHJwDP#mVGmUwB%O$jv$=NpdsQ%xry{nYsG9 zW_mfAVsKx5GG;U)o0p@jyc`LU%290U^6#zwmS~qVlg?JV_XheU(7^IvDTBzU-=-O5 zfG;a_tL(=WN2FW3=`xqE+su|_9J}eI%%+2??VvJi$uma0<~XCxu~9m-gEMh)>+$jP zg_*?0OJd!%S)g?OaDB`GZOaWXYlD313Ssk3t+nbGR>w$8T$_wkhPDvx?t;n6P<84) zIw_)^1yk#5zE|qC{B%oR?HE3+H2521XQ#AP7W(~vM>`vDDB{pmU3xd>BGMUFpNB`! zyNmI_fG%`T!@k=HTj+iOXuO5)F~HD0!M8Sq8|UwSB!55V1N>dV-xC}dA@>Y0S?7io zt>Qf4|F<}^uB=FJWi{mzN+o_-yafY%D&Rf$EnIpQZ~q_qPKf(_TuPeWCV80yVadzJ zn9+#7EmGkTZWFL})3BQh#Ep*fyE>YWQQMSHd^I)4^Hu5QB2ZCjmPPGAl9FcbLBPH& zvzcq)VN3C_8UDq?=9s9ZZy_V7FOV@JTuWJd#F`v=2~gDX-i(^p^|03$@o8}VHY~L* z`NUsReNRs=b53Tnai*WVl{{?Cr{UHgUxQbTMU?W;ZNpb%5!q_n%JSZ36^XZ#AN#uP zbp3k=(Ks9z(Rc@DG@@_y5#`6J2xhjr;eKhOk_!1d@liX1k2{hNhXNr3vQ6`2C;2}Kr2M}}{{DCT zy;ngki~c=-J1ahy#CI~L_&Y^`t9*FYm~Se3Y&2wc!GBo2A}tctms90iy;=N~7P(LB zqFX8o3}H@_IWMgKEDft}`h7xbmSMn7el+Hr{8Jcp_S;mk3_{c;Ai-!|p!)FSFz}(HKJrmemL<#OL#hA3TbRp*XXi{~ z8nWR}8n(;}+%O9nwFUGvJPR?ph{2DgY$3qvsAqjT&8P7&xLhtVS5^&sze}1=Uih|d zoEGdBij3s(=j7wAD(@*!C`GGYOXrdGZJ`s4DDu&_wMW*g$jTO(T;lf=+31$-e){C+ zgCt~dxm;q#)x${9RG~ivI=%tKC>oWmspyyMhb@p?;;+fi*6n@<qvl60@s0RFV6~^Dc6v9`8^l{{_%J*^a%bXEw?usmGr0)rcdaV5wl@@H@|mgY z`FhNb`TH+yo{FKLN%59np%Tfj;|ExuLGDnsp6@2R*xMNq|c9wu>}FJnZO zs%wqw(_mWSGWr`rV=vM842}wXfdYs13o%svFIr0&rz$V>BXc^^3Br2^Y;3VAkYgE$O_iHJ$q?zDo$Gh%Uv1$IE1l=v)0=EB(vCtVv&a zwXbM=9!Jsmf&z#2D`br5+fHL8n06ZeEm@UCE-i~}6n~?otTd~}5J^2F*G z1gbL^quRO^joC7kF*P};Ux#b3bQ)D)urjT>IqqH`$xjomrk(L`WcPQ*w?oifkN>XW z4;0;(0koOtuBOcLK9+Z5y$x$L@)cYME0bsIwAfdHYr8NXM{BMwhwglQ2ejfl`S@2$ zH?&tvdkTfhcofG9S$8K?xDX9hJap6U!qWCs=?{vwtGMViJsDVPcC|@;JSKDQi)lZe z&1l2w0OiXKM6F!@8s>k>p8rXfG&7`gcuB!Bq^sDP9S0VZ-1s^%rnzw=aFQG7;bKAA zubCU!{+`@$AF0mqFk`Vh@6(>+(NWYD^bYa3LYck&^eVb!5C8DYX^*FA z4>KPm?FW)}pIp7kx^`*!?~>awJS}g@u1 zY3Z0J$P9pAEdFYDM>$OJ7-gykUW^)~uxGdl2-wuWxl9npo4Kv-Pdr+v4%x`8%TF z4>hxF?NV89S7b-i?%#!oXYE_Ntl_XZ)4eMiw%rnMwUrH&Jp8@Qc4eFG>V{2$?jxF~P=&o0w8Gwp8I9=M9`;*cYWMSr?@z;O4t1EqJ^)%_ zAH_gK@&DA6EQ_i^jtVjc*$becNd~A{yV}6F-o~udwe>*zbZ? z{NKZjM)YkD`+YELgca}aRM{VY#OMh)*So>OomM;s1JAyn3Tf;p;QY5|) zlIvmo5Z|?i`ya=bFsicuui|S7CtZWLs#~=$Hxs2eC5`2F{EJrn;ky6t}7 zlJ4k#!S7o9{(HLZJiKK-7~OWiZ%KFAf5Gp6?f1Xo;s3GrAAoUH$NvYqzIU67i!57m z0c?uIMOqn*DK@4jq4$pIglYm8c5Rxn8--p?@1d7a5?W|!B!tjwNFg-SNgzN-Zy?_1 zJ9Dpg<-(8udr#m!bLY&NGc%|6IxRb|GW(KmeM&KlfZ6CVGHU!Aiv}88zv+zv<0*PYIrSx_RO9`Jo`h>eXzMwOL^+9bQx`?INO)RJv5y; zCdid`$W2J^(k@-u)j4H$GQj>Fg4i(hMS#Kl@A*vz*z$=UNAea|C66lf2sPrCDr1t# z(Cl#0tRB_br>}om8;lM7>{BuRv5X;G^b!7m|I-#jvxXj!FtSUGd*GM1%PLE@OQX(9 zR(BDxEe-9=C~-6P%SKONI)W(O8m)<<~_#DoYDt9u|TQ z#~Pxtj?$rfO^7#MOZGEnFXQy$xi2im8M-RJ89TwC^Ug?+ww~fIV&h z=Zf|Z3GE+o^ZoiAKB#bLx|WJyP;e_uST z<^+yV*ncEp|EaLq>c8al>!WedE9~$=@4vw`h-3AE#s;x?{s&L#@?Ttd{!dQ7KFZte z*3dQl6wIPLro-b%@%Ri+@fftg`Yqqx82EDqW?qkZ&Sx6(jAS@U;d!3k!Uwp>5X$M- zN4aD71{tzomLx-2JaTwShP(yVZ~27Azy$>^@{^68ZIEGgWT+^76J9JnG~-lT_zCm< za^hBgl%^wb>ydZsL4!11=P5iJ?JWM$xcPqlmOoMaX}XRX7T(H%^5=YoZA-$AwXpgv z?>{F|T=}zIVJ&}-1Cli3g;_Lz&V=95;@5$%Y|)9E@7HhNnDT{iEZ@#gNrkjJ=y`Z`^J!#X)<)pn`WT`UhA-n7C zOj|Z&bHTGTF$@(;1lC-9pWGFggf;-gf73N|1D3{BTzE3dcN2*+-M(J=4vIz3dn7N& z$wj{rF|7ZWvNiz3rzye!5TB(813(O>2m?TTo+1o*mdRyp;n5m1C*uTajXCF_Ei_9~ zZhjqFT<&?23;jeCM0Nj8UxRKSBZ#eGYYmzk_Boul7*J@NbS6IUi@5u!Tbdp zwysK&b`8iUdO_UPC2KBUMtQM&j(G82+iT`BCz!UEs?(1r9|zGwBCMT1oau#Px|%VS zPxNb;Hb0*aIGLgOnuezyIf|$~EGRlX%~l2sEpa7 z_h$0m+`Q!zy$B0dxZ^GP;1N@Pt$vohzA1Zc4Mz6b2Dd>u?6obJ277JCXM?ue%XbIi z2ILd{UiNxPky(FJXCSKZ52KgC4b3sOl^-JGgpo}lD|=E`TNM`X2oq~}vKh|SWonXb zCvcK&XWZek?E(fq{sZ~CmE}{LGu(R*dG9IQfPA7?OlmI+yA!wm8ltQ1 zl?L~8-dn*vr^qK_8LhXr&v2T3MYEr91M-PpgC^o!eJ^!q!vfnUl#h8ViA*Lr72|1J(Ft7s0x@9*sb_;_Drv+7%=pt+C=$I zsx2$$R*0r{*KSHnh%j zCj0Zl%s1%s55OnrjCbMOXYISg#lKtPA7J9kCwg6WeuJOpeC_7pq(2bpfkrBy=uN0< zw+yGbM>Gc+jeMfFM04wKntMfau+hjTdRsKN4X3$JG=~_Cd?Id)@XCbCvb9Tn)+LxH zU;EzhQ1{m*l#fgJ{oynZh~`k^ET8CI#eVy6njea0uF=RRdQUWW45#^#Xbv+P`9y!H zOGt)UPU*{WPjf9j_e5a*bqsXiSN@PqZUbB%lC2aOi47>9EtXF}49^*ra3ZwInl;aS zKb8>6e4g#7=%?Vxay5-FS@o_|U5VIwjqlD#W6q& z+!I7?DI+!3E6TR&0~!Egr4(Vnf}nh#DymUrhG-%InR2ZwR4s{kZqP5+V{$opmEs7} zQ4c1-+tk&ncQ$$z7KVCFfOOW_?F6+Szr>mx5WQbE4yzB~4CWt^g=08H)Tq7jQ9#UIw&{m(4WgeBxBB&uiMtk{s;d&3eQWaeHC1D~ zOG3)NJo#sP-B|#C%eWDhSmzAfH+vVr_R z%Fiuk3OSFEwP_0TK^i8^d_+j+lQ0IijV|7v#7_DVmCA zRvM4R-vm4kfW0yNR{Dh-kWclS{IJApTs|aB{4=sowJL1Cey!dsErXRBXl{WfS{Z61 zEJS}o*xI+CZir}r&&s!j8<0=*AvCCYqR=M^@sT4=7UC2kJ_ezS%}?c{=hiU(HnSh| z*F!1JHpl;dsjVaZXBZ90ipmaa$|d)CKG3}DDYE6u zX8*AIgzS%8ugLt$0X!A}%F;gSLq(o=@N7cg6jr3Yaa7tr1)*vDB*0*Pp;(-bL|p^& zsjaSb`~+DTB89bQh7-Ro;xmj`KD8Ml{)>n$ze-N#x{~s*r!sTY0P%DL@+9Wbg=lrY zFjyfzQ)W0iEKl4gtzr5lYf|FRk}v!;pQyQo)8LzpKOk@zzf7ym{Z9IbUj**soktCe zvhh%6h_4~F^Qo0hsk)UVHXG#2F)@49pt??bx5CVKiR<(s9qe$i6zS~YzJ?<26K~7& zaPjwPR_(fo`X@KGbTAcqHeyGA#Uk-JKqGrMY>LkX&^CqWTZHP%b+qRfZo*SytL+m+B=#j`ldARwOfmvJ+$23vD$~e&!F#t#!UtVsPqt88#4Qv_9mIF z&i6HKGS7K3-Q7X0MlUW>Ma9eK!cj|}FNZB~7vNSd&RF?*?P)uv^YNu1^6|!ISx-mZOK>J(G%tJ^zM2=l+}v#S3Uj0H z;8d?PczpFLT=vfJ>+`~Y!>-H=3lUwzPtT;v`r1iycja2XsC=)J6IQR6ldax>Gnl`T zUwc+17tLgEuIH&RqdA_lkfm~yhBtCamaOaM`L-B3qfM3TPwQ=5>L-F6XUr;!i4xJ1~mQB8pKMpCJOPRxOYEI>gyYetR7; zl;7SkH(PzvT+eR{4Q3qzH{Y)>&u@SC{3e9wH_qv#vYjdMy~{b&kFmLrF&M z{&w*tdCwU^`8d+KUIhi^OZe`rTtj}Tu8*EQmpAmK`h`h4QV-C=#8*M4D=a#DCRsrC zdz9}!co@U5x}n&7?7>RYla5%lKhpHAn11c2uklV3^eaTfBQXhYFT3o|$}CWMw-%cV za7O2?1&#iJkyIJ+#$#yJB{x-?8{H`#J0#Teiwd=ogtEGQ7x-!%+Nh^|qhGRUVsl~r z`sDhijcDiMv5d>4vVTVZB=XWo(q6sG=s=k`{kU7PyX=hpGv^>XmmYw$Q6T*GSx(K; z)beBRZL{X=!qk)YUa-oVlM7ReJsVD(ty2Y#ntdkV%x&RNnEIFRU)?utjt7~oQPs?~ z4ZqJ$mtVW)gu>Jd#{7Gm**Xwkm@3q?jb?V5{|1-MdTQFp!qjh!`|yQn^JWGh^W|L@ zaN+tqnuK)*#7X_7eEH+E6J*~vXTD;XpX`)kj-C00VV)nt%$s??VIICcrHN=8k9kZc&<$khIbxkFz+;?P?COE+;2c`>g$ zBDx2&4q=$&ZD2&J+wjGtUK+IgA(-QnoH+054 zjJ`ooW?zy_UFK_PgQZh=ZJy|KyM)|^!BS5U9VrR?WZ_pOtm=9LsQkZ{A`DRc8xp_% zc(-00N4d*D=mE^$6VBJjtu!g??%2=gLQ%O`NM6QjgCPQ^qP;8 z4WqpwA3tME`BBKqPm9*lU2W1PsaOVp*fd2LAUWqEV||Qi0wn#jAeu)6#=c|vXhsu9 z4}GpaD;aDyAF4ZxL}w$;@;Lhzp?^=}+wEQ-k!}%$o^O&@$k?=PxC~X^0c9l>Yl!C*pjuDcSAnNp1k9 z+&o1XVEy$kvgHZH;Hs=HTb?xZIeoY-Mb~Ic5iZ@9$gxE#hXEkAOc4fv*eXRB0AlMD zVZg$m{F6n^atX0wmWyz*=Ru+ip`nhv7>9G5m*bR5L3F9ymHay?y+2en=ROUXq-$-n znf6e0Ycaoiu~?YCUSa&SG(}dJOO1M#Dr--HwfHVHd~d;bvHorIEo9}eygweEy{|$b zW$#AZ)sE{3%V!Ozdo-xMOW(*wlkWhq+^>G$kI zi1j7pl699Nml?iu_XfFC?Eg3!?-hn~R+_e%=W8eDb5lT_2#n`oVuP*ZaTk8$7=HN8EhBzP$hYFYo^fk&d^1tk%GI zQ!ckj%cTM7IsvWe`a`l?wG~#k6=m89T{Z1?K1{;)EuVh}nJOYZc2HDm<_!R`V~Q{U8#cD{5=`y9-2eA>p6QcQ zhFO%Oa!GZk0SVqWFVWkRlX=-+4)Y#9FT0cEK0fG|>)JZ+F#ZPx*@rydv)NUYQrQ4h z-YrEKaI}w4L*DfJK=I9C9(c?M$afamt%+~>tKUe*>)G;m1lno#Y*^V0awpv;9R(YU zMR3s$Lv%=BtmlN>QC(jnOJlr>%>FhB);9s*U4YKBH)b)qtAo$?_`I%R{F==$jhMNB za$ET~T5Iz3LlscoF2G@GQ%*L1hhR(v{zo<3Pbi&3TL(L%e^Y+d-%aa)3zItF69TFZ z_=~ww4|6EhKN~#0`Y~?4UteAa{KxA6A)=C2$S?K^IgB;M5MMxz-JN1I2#YTi#^(cB z(av0C?Vu(q;)n3DTe%1Gf8e|FQ=|>!2l>U(>_yV$t;~Y3rI1wom+%pPjh_^uMk3x+ z2)A|oA0ak(#4e;OcPQ1LsOaU^CLxnT^Ka2^#}BW&6Ju#C7q$urT4rhiu;-~U^#ggR84wEbE^F9Ac1j{Xvm(E~(N3!J;+5Wvm*#`54;lXLL zh8qQQn8JyST4TCWe2WR+|G<~Mga2I$`=;USP0uaiah3G!7w4p;J%VYOCR)R5?ouf! z-1F))R};O2mwOJ^3ZT~M>w_+Gz7maT*77!Z*V9z1aK)r_?JEkE9s>xnUy3jQ#QrJ5 z0PVlN4q2~8Ru^kNTi_<&s2@%2K8nb*PK1DiSkYsAM6JZsGW0cyuU0CI5xA>06@w@Q zn7(tOMh!U~RqtY#uQQ|qG$0=YSu7;oMXh|6p9a&=Q@5VE@=!K&IpXM#(M!k=xKuFJKWzs z*m-7gOuT5ym;7bzfX@N^|8IDex>mtwUeW@l|_X_+Rl;%H|7e{|bg`ducl| z*BigkDP9o8_MvfYajvZC)VcD0=C8%+H~jRy>GHOY4P5>e>)$4S`;h$P5oK6pWQif| zuvC8wlYrVk-yQvz#=QDFzO~G5_tG=O6rAaQc z4>r`F?FI>=H}MH;Z}DrR&$j^v^Y8Fmc~`gr`9zq{fa-}vbH-PHj`AL}n zL*aDvg7)X1z?FaT6MZgyGGV5-D;mKsi_n|IRImLC=*4|Sf*fz{-PXi$lj8U{p7l8X z!`Bkx_%CRWBY<(KqkN4q7Ihckv%RB;N9cA<~LKybRIqgN6)j7 zFwTl@?=W76)M<=bD+Ei$BZtaH2kvIfr$jkSgNgM%P#!QU@RO9EWueg-V?Usnjq}6@ zX_iM@8cDyHU-8THOGx3DwKvmmRz52zQaTq!+#vo5T~R-%YYE8v9zO?TXYyN%Q4?|1 znjo}t)(pV)Z~RtTg&UAh)C|qYref40+L6MmpgZj-(T+A+`9vJj?u|xT01C_)`RbaG zs7Qe+?cEfO!iz^r54$CEWbdl>WNK5bO~LCd$12dP%uIC+$R~O?tv1@TS{} zOdHnw|47nRytFBu{H*aUN`t5!G7OQ6#{mS{aXdAoGgbM@c)lqY`OGZR>ss!R89HxO z-^p3N?MTL`bI9}DA$_*(HR<4PFgYcD3G2v2{3ApjZ#*az*ID$f`BHTB|T7~i* zuyZ*%j3GJI*SuBfwM^0{EVOx_d0BP-RLzt}9HmM{cq@0&3^f61*xM9#xg=~c2|Hyd z>_!$=_$7q>p2AK|!Zsygmmdmyx`h?KA?y}G`6=+#`SkX@(&_0TYmbXGknFi?F<q?$2P$6e31Y{45S=lUE5ha;sL(;co3x^J!L5PM_a*^ixKfM+x6VdHp*?l*)d6rBY8UYBXP}@nE*W(;sG&L z*GsKWJefSDc}w^no$$40-uFisYGK;)*IGz9FHrzoESM&2*MNMy^%_IotXeo&9wV0O zQy8$ZY%(f4DmRK-O=J=BYd)j#`S-~;>k$Ugv~C z=61`k7AUMv!R1<%sd9qq@^Z4(7345ZT~ThoNEil+r1B4jyDiBTaVwdxXym!_NNtU)kka*d!t}SnEd*z=P zf%m#}p~@M6@hT`rG;A+y?mKs3Yg>+I8FGG|h@SLG)@e7*%=>Ysl~3EBrMB)NTRX@` zdl6M<^TJ|xwqvJ-88!tFNNc@yOaMyPkjjIfKfO!kVLB+yfvhfK zGU^NwZ^s^tXnTGbKrDf=*og5ODXm3i{k*B@bhr4fiJ$ncC0h8dE!sKayNCF06ZA{G z&~9f8k(W8F&Uq#Voj{#$wwu zG?jfgpi0;-d0K zaLLDmFe0#9&(6V#B@eJy_E$_jm=z^d*xl1dBg`W2kYS1l?<*cpviwL!II zQuGTKeT^TJIkY{NZa>Ah)JsnrRnA76)WcI(WbTp9n}UM zS$?#9p>X#q+?Mz$+*Y`RQ?gXI=11YS!L4j7jLERpYF(j@_5hPl^t-{ z%eSMPu)33+Y;|Xx!Tc`#T1}dZI%Ejtbzr?_{;Q|YuDE+XtMCtIC^6P?G-b0pXU zxUwfdaVMdp3H-!+^Vu^k;2ep+)yhutAvo|Y$avYoqn?ce+Zi11LzpSulx4jsrat-o z#P5F5v1HcyXHuDHLj%irHdORFA;|0u?E_yxt5GBeKE#99ZzmKyrp_6o3iHI$MwuSX}I+=KXsCZqWAm|Bf{dw|km3`4g4;Ajj zWe*%zU@j!u4^(Mpp>sNKMe>N6u#TI|JB1!_)rolRR`=>_%1@aZ9|UDLqhoXJO+%+% z{rY5PkbUCHs?u~x~_wDUpIRH{J-GMlR`Gfea+(8r2vw!7a_c+8n4wZ-UDjsv)<1q91 zhCGzF@i^Q)jxdi{9$HJs<4E^7$~?;QsPKcwJolJy9!JYV$D8pu#yyTTkK^Q_xo$j; zcaMJa_@+FL)@Yq0n{@sr=pnBv$mkR@lI*SaQ}YBrmYw>)MQ@CK&IRV877!}vuYu5G z$Th;0a=eJTa3v;yzr`01S(s;2Jiu2IKDsTe5S>f7SKDkY!1rM_W!B!%_bzi+<+q`& zDqK)egH~09N!#YKkU=s(ku1qYVr1gl2?T1CDy*C+0cs~HVuU*xx73`UM_HSU94m9- zIGASl&&Q|oG32?ZkS=3;W|Q4r#$76>K|UbXCgFf0Z;h>P0*#a^W>@uvXOaJ+(-~K?hI({BicBKARt8AZ=(`$icJos?Q)#pR z5`5{*_V!#H*crGkI|9eMcb$}iz-LFSF0w8eE7lV#rz3jxL|NEh(ypFVxAyu$zkFC2 z);^1XovY>ZU=&80uh!RX^{?~ko?FnMUk=rXxeGdY_j^P~^<;7Nyp+xCjV&I;79p8O z5yb7x!LqH7+1YVGJON7H8V`iiffHXwd@O3}_2}llm;7NjE&`pLJm1wX?rZ_|DD7GB zp?+YH8I|ds#SecZiDXmKC|axAmH|&6v5kS?<%%Wb$zeuO`J9=^cKP?b7n7pB6RRGD$nHQCnT;@-t;m-*ZRL)YK7CxxWN^{xT zmdo}}gLe(c$Cy<1vN%TNt80LwbG4?NTy-s+WI&Sd7p^K3Q4(*)hV)Y9AKfarHWSe1 z3_Od#A1{kqtNn%2{t!!-u)01rbkcmk;2F#EHj}a8 z-fvlDGb-L_S%hzp#!2IgiKd&1Zd`*`e2L^F>zsustlx%J0q~R)9fu&*Gvx!tMRHXb z3;=O)iZH;+?~2H)I(i)X+(uv>_mDfzHd@eAX01j1Sn~Qp`fzdjIgB9Zq9L8Pjg`gN z9*tvt!(4`w)|rQ8r=!hIL3Jzq$i7?4$yT?)sT_k>OCev~fsdfjFQ;Grwg)59u8dZW z;oHIDaQRtQDVtfNobvrmT66x{|xG##dsDcpo4SH|o!`^d@fn6f!d5)33;x^wE4zp5kg8}`7u91CB zMAl7YeP=KmlxH?5@2z}OX~RbH>8l6P9k6b+l8urNM=U3drYOT|q>OwMB%fzqIa92WVqUl4ikSFnS$Z4fO1&2CRf>cRZ6idNHl4SpRq zuh*Vic=+NPEZn^In)E-xNYa*0D{=++kB^w1TDB z!lr0N2e>G@C$kZk+L3iKpYu=WFOI`rHsJ=WKkd6@x+}x=9+@U!>K^8@vY8EmIi}NA zsS=e&%sZhub^Fe8!s;$KLG&;xQ^D3G&AOWA(Tf@Re$gcJoIRUl(^<<=+4xLm1}TGT zr`q8E2u|wT%;QFyIP|_`n7Io7NAb`0)q+U3K1WKr_)2tc?w!E=+EqZ@o?h9KK&?Tc z80k`H@K=NHd)+V3r(>S>B~4blS0ug$ijlpe#)i?gK=gv|rWEpZokG69uxD&I*g-co z3CXoQs%tHtcIrC&Vg*RiA?ye`ngK^mx{|(V!0PT~-Q&fd##dijkFEZH*W(9YMi0gF z|ER}X!MNJ)q^T9I-2evjCn(7^7Va95&p6H8+pIm;J(Y+d`mxMYrVS)hE!GA;D^J>l z>#=yl_{u&H3d<+cd-Q#p(G5zWSj=qwD#)l`|CsVk`OTEdW7Is|jZkyznDW;~&^-=a z_*KtCl2&xgI%T#F89-9Rx9}76Eb@sGm#Sf_?`yD6 z&*Qf!6Y$qCrCS>30T%G$6Ia@xSBdk-jRd@gC>9HJF1ZoU%d3WGkBb52?Qdo@!bO+O z(MptzMcDKuf-NYGck+bQQH(J~n(#PbB0N%DM-OL#wr6oeheKtso+(^m9HYBrCQ-{E+;+ z;lSvI_1l$!l;M8?+ImF>aAH)Ehw;Ng^9rG2ratN6b^dzBX_lSKV~5QZU1^ zhA!Cm&9KofYO>91-YM83dQ=Q(NG<4C%~%n)bjGbbCUPsbmh zRM|Pz>i%&4TH43lQr(M^UMN+9eueR^vLksS2dphW_0kj92Pr3RrS;s6A1A_&>C9#e zONl#8b;lDRqev#+i!7P4(Q%Nb_#%o$x5rYnt{vG`QF=d5<1c;L-r%8+|EfyCgx88L z8(*xk++z3Jh4H5%Qyv|Mjy6BwA(%-TAcz)h#)+rc#9!qOK;@_FuwYe~BtKEuGmIqY z++GJ#wl$Z$pUtR0@|4O<mVFupQgfF_0~lJZIyctW@CbE{5&pqP5cU{Z<0rp zk6+MNYc~Ehu2Te2mXJD5AyE>FV$d&rdJ`M)LLBtk*gl9Ym@U`(U8#c}yQrqoIhULI z4qY5jKeL+2jLa;vN+$fD^}mA5uft5{8Ra88%iNrwdd@#iI&ot=0X%iV+JmdCxp{tS z%cg_HH7Dn%Uh(GZh1qw}fpgSswgP5mav*^3@Z>#4&E^;a;7Ny{yyEQHWY4@Yn4Jfl z$(5;mZ*)%6VQY5hr@nao8-2666amyF4?lSD?EMUs@9g!&b3>zkvuV@gW=}V-_8ac~ z_Ur=b&c%o%#Pec$U6ZVqO2{h=sUtX!Tu;bT45|B)963!$8h&Ee zQ6EQ65pqvM?mvVaBjl!r)X^`e93kZDhSa$=NB$KP&s^4!Itu5=w}mVkQYSPW`5Phs z#!q0U^&I(#kP8i|vxtslsxV_`;{!Ws>qs`WWM(okNpKzBb>yW&UTsKSyx_>wg*=0w z@@-T@J>`e&_eJ~tv;9t58d(&dsrJ7tu zv7eMsKQG8AZS@y;b67qcuV@w8^q_o;z#ap0#{%{mxQD=!f&UiRXW*&F0Zub;%<+J$ z8u$%?G}JKrg}~_sek^eHI(CMEoArZTqYkoLlVCMr*D~-eZN50``iIQ*L&M< z115T(0O)#OAkg*Boe1c9?ITcWP2j$mJ16;2Tu5aLqr-R+V4f7zd&(AHIAATt+x68(70J>dX6X!W%fCMZkMwKx?K$Gb_ve~>vl2F?Q*EFZkL}4 zbh~`@JV3Y0-~YSuJ>l&0d&0| z5a@azdL^Li9b5(IdjCM6>pkUaz(nuzHA8y;$BV&G`9Bt~MDG^_dPJLD3+N_zQJ|Y( z>+1mB1lwH?=qC8u4S;TfHEslS6Fer+O|afgfNp|Q1-c0g>n8Y2SU165-vxBNpA+cH z-gGmdvTjhGehZ*$c$q-Y=5Gsh6D+tD&<)dj8=zJIoltlH(2cdFKsU>o0+Tvn z+7Ht@;h9D9$Qt-0cDY8N3)1x?Ko{hBfgbx&KL&Kejrs|o8}2NDF6sE60=f;~66iL( z_CY|m;hdiVx()v&&}}&X=YVd*M+CYJH+u-sZFsIgx1oVpbU$C3xSuIuip`o=j&~r26X+N73lh{ z{|un(*ZwS^>-W4s*YASo0A0UH&jY%C=L&TF77BFz4D0%B^DD5fpMkF5uY`5|CcXgZ z`kg4y^;`YdfSy}k66mTP`x`*d*PjUVe7*JW06kwD==u60VUv8_{o>N{bqSxeybE-@ ztoeIDx69)K-7dd<3DE8G_{)H9mmj|Z=yuurRY14PUj({cHh2xt?Q)wyx69~-fNmE9 z-7Yr?>vm~=9nkG^tU$NR%5MO=G2RlGr2DCFE+yU1#v{@1U4gFO@oxdTejf^S{hoLm z(Dggx9YEJ_({}+~zuyaV{Wf_I(Dl1epzCK?*Kh0}z`A}0x_;*i>-xPX(Dj@1N5DkC z_W?cKpB3n;p8Nrzr~97-db)Ri2VUu+KAF%gv7A@~1K7z{2!+`=_khcZ8 zAUAvr=&|qmXFxaHI|AKs`+frGl724GZTQE(0J;qy{wtu{@Y25lx(%2AJD}U}GJ$Tx zKL~Uie*GVSZo|6-x(y9<8&3WwSlN*BJ|Ec1`=Wigei6CFo)YM)PW%_3tJ*KnRh{~8 zKv(rffv#%He*j(8qXfFDe;4Sg-t}KVS9Rb20lKP9p8~q7u|QY#C4sJL?`MFn>UjcP z)fWZ2ss_5Mor7RKyX-13X}#xuu4G-}SmsE)5@jD3=(-%22~u6gjsSE8SXECIm=prK z0&Gc76?jmfE3jh@&=q({petZlSKxp=SXaP6SKw7)T>%T`wqK(F)@?t&2(SV+C z8;k*Tz3&j{djC(L>up%qJ8lE(dK>6^|4LZbd&*cq*ZUrUu6MN^(Dhz-9H8qxemtP- zy`MlY=T~(AdO0^x<($0#2IwW`{r5!g8Gg@BK(|FW0nlx6p+L9A6%zs778gzebX%M{ z8PIJpZ5cqf#X|z!7UP!%bXyqKZE>EkZVLn579Gohbz7Vu&}}ht3ZUC!p+L9Ax26KR zEoLqc=(c!RV3G&stT>bh7Om6v#VgVKmjYeyEms0`y?-Xq^**Bu(DmN78_@M0w=$sX zeT6{RdvpZodhaUG^?pvE>)p8upzCd*>s=Mr^?qNV>%D6apz9s=0=lwK36u#)*Ii0U zx-Qx`-xH5Szh4M+{dVsIbp2ix==wc04bb)b&Z>Z}-*Kw}x_)D(1G;{f33UDbBGC0a zc6C74?@58KpMkF57Bj%Qem4ko{Z?25(DfU!CZMP5r2<{mudM~>>H1@Vp2w%n1oS*U zAkf>gX9Xs0S!I?Ieo14N=?x66G3 z-7eAkfNqzg1-e~66zFzYcLPATi-B&JJB4+-WHtnJyBsOd?b5Xopxfnp0^Kg#ZVc#l zxl*9p<&&=fx?N^|70~T+lEB0+D}ODu%cA9>51+&?_Xu>mti1`K+vOI4ZkNk91$4Vq zHv@FL%-I~!?edyHx68I$0J>eS73g-Eyd|L9-VBS*KhOf0A0Towg+_mJ`(8q-Ms^#>-Uu% z0bRd)1t#S|pzCK?*YB{Mz`A}0x_)m9>-uf5Gob7D1A(sJ-n#&Ly8lU_RHeM%zH6f2 z?-vt~?r_o=Y1-=6ybx_)m8bp7t!7tr?+w|1xM za_Ic5){FXu3*(Jglx|))vZZ_y!3vd4nF>DM_Nydk=thsuj67TCQO4=YxB6u8EyhuM zSAxunLp+7`WnjP4X>rEsdAM=o8u_vT&@T+==5S|pE6ddB8Z+CHGSAuimK`W%$#xq= zWD`fcGj8=ZA_U%5@b?_vQShx2PwThC!{-S9G1KW^KKvfU|GeV2<@@>Tv+Ty+VK$}x zhB*1OSETpyF^(nGFvLx*hUL}d7tWEeeSbP#V#SmGJ2n+C>~H$EUZl3PISE*9HJ-4*YI z`JR6OLH&IzTl61W{@$X5@o&-K`E`S2+fBR$QqI$7b7gl$k&kzhlZ|(i6UMvXu=8WP z>~_)b2Y5<7aQ-lE^?nn^^ELUH__iR_aQ~uDI>xF^q-%lmYt9Rp->=+qWy-RdU@Cn_g z@inG+Kcw^5n0#z81^r(jo!Mc3gYDGdy&}8vI$}YUOC9pj*UegLlgFjB_Nq~|Q6qu! z{g(LaFD#7;;{ym*=Na@%NbL`jf&qibdY5xOhCp#KIZSZ?? z0%i9=$+b;TIg>3L(R@C@m4#EmK1Kk6?@0q2fNYXeIh-tV)m z;>ISbn4X+=SG)|qs-Q{Q!14Z+qX8fuND&4M)mG8b5`oRs)q52_oPP!jRn_}MtnwvW z*&dJRDCqi{koj1E-WAxzCyd=U!=22mu$f0!Uy*vsKz7zt6h;Sl4a&zy@ZEEM&@c8~ zec5gflZ5fbAno3}eo5fp>{G~QzDC@%2h=aeLtr@+j{L0B*vyJ+`rbm>cnjkAHE~qVvVA&%$q-)x!{`V$)l~Op zGfpaR*xlPl%=cJ$jwobmV1l8aDWy zY%u=>Z8>T#70Izxr38b)4Xih7+jX-Q$N#3x}X`F<{a_1ZRMiXfiW1mpB$Reh}G zKAi0y_Vra6AthYhLIu%jh~;@^@1V2(_G@$w;d>-gj0BlArimp64@ZueajJ9ld>7TB=#yS(MoU&HhF@T@&ZDz5V|U(VfB ziDw{fOJNrIKU0VnV!_H}P9sIH1GRRH>^;61zX3R9^o()E_)Va4KiSB(B9wxK75D9& zv7>uxA9@1;cii{RYAUS-@~QshivLnnw3Yw(Etu)mm{Moa?wWK&KHrw3%c9M0#rSPV z*6IKJ^Uv)tX3=-o=Le*RDU-e@vwG&tpQi80cnTiRuFCU5kIE$}X}uK?hf7m5JHJ#J&U;-Pel8BQo9`f9^&viz7B#H?LOyFjEFk)hQk4q= zL=sjG<|}@eAVD3c(v;waLS3y;2YINJ&@To3P|zblNFG`q;ZZ!oN0NVN z-(|M?C?qsokBM^spkHp#FJu_aB|YQ)bUJWJ9&hO&C^|11A{+maXqN2r{!)Furoy;H zZZ9o0o=p_ypDsbjl@OcqUHOnGY9H}qHPpudgZV%6Tlqw|0r^CmK^SkY&|Cm4`4xH# zg;q6Y67GX3KJ zptcH-l(iD61BUvT&sk~S5evH6+uD%o-3t80BrA(#LBi!6;}Uk$hBUH?L}PP2Q>m&h z(3`v-tJAl1kIf8@Ux^+Dk2}Pxh?q{6#87dQJ9LQq*wk2qv{j#V}Gt(8p2Oym-^>t`W)&vzN9vbljqSRFxI~2Y_4)OwF^Dc zeDo+d9#2ynIsx65mu_4fRB1&EY4sjGfqe9YL{cA#ZhmGMzrL}Ha~qwF?q`p$hJQB_ z51$Y4IgOY(Z+8P2jtyUnlf>K65by9Pb(0HQtA9c4eIqzKT321Nj80{7E6^t%G`-bd z*&4r>(L0P8adE_D)qKnlm)8Oc(bI72UbtLq?Qv{Zeuny`Q2vZx?=8i2z?v6Q<=Nq? zCl=ZXSg-sw{?hrBOlC}`c~WLM^-qFKAv1epum2@eGrm{aojch3Ia$s74h)FRZrP5x zJ141zyh^rGl#j2&7&<6yshQ|O9%OT@?6-41z8;62)ZUkn2(MV0M$Zz1^$&djpbM?N z>!v>9!O*=bx*@(6-{$#-3jmz8JrOgqDZ3kO`B}Q7$5Kfb5v*Llh@d;4t@~y1!s7X1Yee~ zi9v^>UW%|8`D9(S>Vg__ydgR4R_kUj4slkZ*nq0F zcX}bt@i|h**75-HRa63fI?`6qmle;E#nkg2?2}mGF|6|p5iOkBp7r`<6(kAE=kROw z2}dKnLZR&X*k)qpt9xaps!V9Chnsm*vYA@ewe1_7s_+h+IjoxqTtpNbi(N#Rx4uXp z(`sbzMy^#mm)d3PYL$BUs;f1+DfN_Ey=a-xHfVW&(3EPKTe6n9M9U&-CVEcE>{O}i zxe55Uk=aBWmIS>kxR|=Mw=Nb*!3hHyzd?@QF|{LWCw1x}@O%fJi_~x180AvWN=1t}}7P<0K+C)!CJA#_qZ zBKKX{>o$mV-tI6cIylTGM$9>UPhm$97KwKzoGyV=xGuuIr*LENQ@A$Vp-^M_sI>DF z?a~m}>V)}&!rYO>bvSWxMD++oIkz6?or-fjp^0?Eh3|m3WbVWz{s}k@Do^BdQI$<+h5ta|Cne!0d-!FBhhO%K!v9I(mrKG=@$gfJ zhhKha;b#*6hYG(!5`IMwzml9>wF{>~jcz`NtD$rgkB`J-WxQpBNP)A}RpjKVJva?K zdih*3kB`NpgtvI~DR8zrO-`=5Doz8B)%aX8k3WmYbiBo5bp_5=XUNG_*T8Auu_m8O z=JAPmtcACDtgXP=>P$Jg>MWcF9_#SAWFCJJkJ)&O$GQrft*$30S6v^cfyV}X4(E{; zxw+&)8$o%IyH#1xi=2GC$f>Q`8~gv2_`ImZ8^VxIBYn7yfOHN?<0x*a%oay3TzesR zKo;x;;qs3u@tj`X7^;O#jz(Vr=zH9cOH&S$L(kT-+TkScKXzo=R?c*&4G1_rzV2q} z`R2ghw)-1$r2W>>^?vII)O=|(`Tio!q}93Vi%wqQ|GoX)4b@V{|5y9Vu;gh~X&ROo z0OFYxVE~9{Q-lE^o=Xu1fOtMd7y#l|DZ&5{FQfRvI7y#loDZ&5{zfBPafcRaC zFd&^^!{gP|!vGMkr3eE+EKCswfOtJc7y#mp6kz~}H&cWGAl^z527q`wMHm3$ofKgJ zh<8(j0U+K>5e6I-j4MA(jw=t0V@B(aNh~0Yi)Y|4F}l%%MdbmJd#;xQ(xq8}AmSl1yRw)Rc-+s7~qr z^p{P>uzW}A#Z9qo^i}2{lQrJaN*46BrTS09Kd78WW3Ji5=Pym$_X+8I_V`0JZ{1m5 zS#Eqfgpggf7}?GVS+#*IS_bAlSJnQ2G5cC_XY19_0eu)IdcGx-cW4vpjGl5>>I~!S zCo>Qn9mZ$lMs!{6w%`uh_Q{&#CJp~V8b<8}3=;3lj8Rg7ox#hKCoCwhBX4s$m3b<{X%&KisOM9TztoCn|IgM8Dt_-D|SI%>-eC#Y-& zV+iImoDZ6^(J!FNnyh^t*`|1NeDw@%Q@n))Sbz?Usm6_qe*m5ATWV^{a>vL5@=qfE zQ5du~f>?@ncUomjvEX70g2r1pe2(C)9X?&~HV&T$+|}3JosC7&)wc}L1wb}KnT;<3 zv>teT1pV50TLsF++u_99^TXvK4dWNx?2*ZA#9)h4g*Fee8n)KK#%8|tr+bUOhx<>} z&C&j2u{yQ=4sa^11+XK4I$ij2e}P0>0)VYDw?bOB`$7R=8~ z#H0+CGKwHt6}r;wFz%O`0?ZUQktbMY=nmtD7{1nVHkqxNn;_&~V8vuC7%v1Fty}!7 zo^O<8=3PJvrul|6{EW7xwb3H#$otr9LZ*2IH-pA2N5MD!in*QUGDudC=+fY`1kNJ+z&sTovYU!Jtw{DGX!YJ=NmqF}Ya;_5v(PYGpq2zgv zWytIo0*wqA6<-8^b1_cL77Y#EE&=X)g?>;l*zp=k=ko+?lAxXmDjSMX4;v|hs0*;P zOu=d}^{W0yPUJ?TEH@hY4DYKw>N5qbKCd#*`$<9O`b_b*j9t6)-`v#m$P#fU@#V@V zuE$)!6^I=~SHQPCF-J40_2`)TjcdcngxOp+zK@I+x0Ae@_w+Xx{ww>~TufzmQl^Cq zLwK}k3QRcJ&RW#WXE9>2>2j`miIxZ3p6h7O&%70+mW(cM=c%JrK(}SN&pTQcD4rmy zVxhvB3r5g!dG&M+1C%kGS6#B!qUFhv zmAw?C7<9xt5tlbjgNVu?{85c2_ExNWQ58$Qfbl5bX=^=xECY_<<851`(g0ma)hPnESh0DpY?y~ z+^B4Own)BBG=6HB#?d~gq?V_)AXWWrQ~gLlD5Zd;_FoS9?#PiPF%nz0w(M*=%PE)t1#@ewE z`~}hN%DuJs$*Iv*27Vy$I|6N@D%z|LZUGq1XKpm0>imoHlvSO&!+l4*DhDA*w3UeB ztEmG)?<(|*>ZSc&i;wi?|Dk?fcPjy7|;_$o5N%r%OERobD%`%SrC?% zOFD|YLN!(O+V0?^J@s?HC^~vR2uo{*@xe$GAHt7aa}#ZipWRhtJVQG6hvHYiMpu67 zYFc0CM)KSsc`oT5?m<{C@VC7|5>{cG}{^9KnE=8 z92Th8)f-GYeJdgJyq!s-uJ{I)`^$$NM%$>4P4onPn$`sS?P1uF@imb8KA~Lv-By*N zY*9OmnpESFL(eCI%1`*|vILDE6j+FVAtxKFw;2CYu@ngA*{T-_oyc^}oY27H#f!2>o z`%d*mh@`!knAtGBf4ck#i8-L+U4BiFN;h(;4mc3G^cTh_Q&{8u+8KoHXn~*_!~b!d5Pu_8Q0mXY?guo ztAxHzI3lwgY-}HyZfb4`>K3LXtI5!AJg3dsy?Sh6Bk!n1O)Kh}He*~DO>I_Yj+Hjn z)U=dGd?RgB*=Vauz}YfXr4RNw?q97%Y(&f@X{BhX42s4MY}egnq#%*B;P z^lyjI^FV8ll(mYJYX4MH^0<$=lWPA;KFys}`*-qb?xfm(l23Cd)&84&nmeiXzvR>0 z7i#l~Xy8+DwW9^GDLGp^M$n+33oL8=PRV{O$mjs9?&;=ls0G-t@*>`PBjG}bYhqO@ znzMkLO~t+^-!HGyGKQri@q6*(6}0APe==G0b$)ux&-MeZMLLG?jSc`$5hB@~>k8&* zU)EUmWzD}=<#1#vXzCf-h4n{I-_Z8&Wi5S^6l@<#L1V)GcQ_3aoxZI;+ zvbA@juBa-;Td97V9NnTSBq;U_-B9)BxSoy6U2u)8Qs9lQpl64uf_=JZF#8mpHJHAS zVt3_n{%qOgg&|qOj>|2A=n%r`V+&%7=IX=JB#cg_R*MeA5SB7wbdU^ou)dW(L5aH8 z(&Pv?QEK>>^2dtAH(C0ATMfRbH**=LurfKb&C#Hu1NkXUHHVF@Dh}~}C`+x2hmFxg zR=dOaI8w4bH#X-_O|D%>bVR?Uz2||nXm1`!%axbIX;1o>X~}Bi7Q2^W-5tigjDxi2 z)dWuTZ_bx5VO`U=y5-CJ9v&P?p_O4<3QXKgpcTkRC1Q!V;;1>Yf@X>5>>{pA;Ytqu8(2VzPi&$Wg9vQ8nTbUFH#E83J6B2Px-B>MVX6XIdSuD&iV^gR_pyZR<~ zJ5hPh>6{XM7#GV-?>CNAN%i6WkHnt!pTE!&%CY38bOqy!D(ugfXK2g(WKL*=y5fXOY! z2is>;e7M}iYBr0|f*Im6R*Pf2+FNSMwe77P?IU}~wzam6yu7U?-WQ*?k&M_zwvB9S zU2y2???s0zPqv!_!STv@qh7lXX_`t~xv5KEZEGq`4%&+4w;A-7kH3u68A;O?%^_vm zM=d-SH5dtx=v$`EZ&T}QZ!1(HD7w&eD_n?nY%B1)b^GW=6QO-fQ)!L1F{Rbo#*~jG zGq#P67n1QB6I7A4k7*k-Rd-=UhdaYya8lbS)sLE6)89-yf5pEh%AEG-aKlufGN{|D z@>T|ia#+H>{G$UiN5+#dSyIBXtWdwK38u8jfmmXZ%ei<%MK1S+MUEy^<*T)rl&`{~ z<;(5dP(`*Clk#QxqdmWHb!PIC0#LN_&^2HBS)F`*O2nnyQZa8Ty-FuA8LPBrUVNKN z>-f{01XoID3fLnlN9f*9qN|dQwxE|rD^SeG2T_1~M|3hBZY*=ryD%P=4RT?;J$cC6 zrL3(blk{y?rFnOvH7K)^cBI#7-lPQ4euTC{HPp`Lc^^XmrAsH}WDgpTwCB5P-$bHH zm7nNz3q!oQw`zsAE~+ZgbT;Q=vB*pwK?fGrX;)<%Gi&XMuD86U*w3-Y;s z=2$aq!D|akVV13Lyc2_6y81?UhdzF3i3dOwXeUnFo#OE!UC`2q9=fwPt8V@#Mbz7l zm7Sox08D5z^yNq8sY$Wu0^+mX&b<^R3;4!Rz^)|VCtnz_A^JXQLCyQyvPItn_i@ye z4Wo8Cau(IXm0D}ujGZlaA0deptIHJ~#ksCxx?4u$jZ9|M%niTJtfX~P)e+l)87bSp zX|@ll*U9MReb&hwS-Szy)_Jc77|g$`6qu_KgmS8RU`YRWDGNvI}?4JRePS>QvI?x-*aNNI|$ni zDDyCWC{YV>L93)Aqvg_!W&ntMiZB2~Aw?JfqL?BK0MV2p3;@xbA`Af0k|GQM(V8L* z05LK}7yzO@MHtW=lFwB?d<#44PcQU*9~~+uW5wzyh=*fFFNPVj7^ZD8%vfP;dk#H0 zUGV$7`ayo)?-Axu*Sx-_P|oIx!qWb% zf%f8;E6?KBrnCmAIwW&4Em?b`hZj*XYFFPDEb{M3lObd>vEzv7 z73M#?`g-VRc`s}#-BK+J)_Y;mi$v%J;aZ?pc0}AwNeH4l`Ep`V1NyL8p}e-W9zbNJ zsqPyeLrIU`rip3%ey9Fj?^MoHq3KO}DJ$~yvn6BFvAI{KQ(q%K1*NQa)JRFm9NnjP>4v3$8m|2}*pw$*WX%Q4ZVV1nqo z{Mv;2s5Mc2*Y- ztBl!1*!brP+T7MWMB5DQ$q*Gwd)BGuNukzkTWfrVc#j-AGP;X&j?V%Q@=TC8XUQsO z^HW+rndZW|6OzV^2C618ha@-(f^76Yxh=klT-H9SHyS%ik0&&@kEW-pHpT~~&&bkR zASq_SU$+cPRimO?@$P$$rK(Yb9d8dURW;<&`OniRw72+TMrnh#mcC%&rgX!XWeTRe zMPG*6K?~Mn#|)0=hTq9;W8&rTS-27_id+Sr82nx&Hf4uD*D*9x+K~2lEvD~Kw)hrY z7HThb!(3t_>Co_^^Q`-|gS&!Sua4_!YwFo(D-w+QVURRo{yH;*k5Rb#6aEAK-HqRO z_-GZ9Kj9hTXP7q3yoO6PV}GkBn-8>rBb@rGy3MvtZKVygto<*w(k5v?KzuIBgfEW&)O zDC!0SO|T^7a~bMK5v+ZzT%7Va0$yTD=Ymalxjy;+S-Da8e8$R zh1z$iVytI!6To2p0~P-BMLr;(_yR!f9JoQ-S#IQq?)Ji<6x!YNVR^GX=-qL2sJX-j zb+?wr_I+bJXa#(mh<$UmqO)gk@x{;^SrPTx&zD54m$lT@P^D*{7dJAQ?X*XI{*5Xx zdJj-D;6Ebo^(+=cVDmNQv3n7Z&DQv$>v%1(GSFYrqO0aOHK(Qd#$0K7&Qh_o3Jdm@ zW0FZkol_}|<$Wd$l(*l(5jqdzixi9TP)ZsPOVTgFW4Wv~cGiAo?L4jaHSl5*YL*xP z%az&}!MG=@B@}vD!0G-5^%)Ab9yu00^k7FkpKQ@=Eil_UHYmjVtNmM>DgeKqh;1*8 zne|fGoiNUp6l^qI{_zqTHRG^v1Bah}5r;o4frCeETX~ii@yH_=Z%s92h;E_vhiDYr za(!cyIz|iU^I47@F@^%Ft^$)%Q~=c0Ie!f>>1k+x%JBXJoqXG`v;tY8#RK(?&X-pq z{>kw@AUjrHK8Vz{P+4)}=ymIs6uS%KqJ@CX)=$gY9+c0KD`a4lv%MP4xoq?e+S2YE zuihY5&X=E9>R0a3h7T)V-=%n29h@Vt*&d?`#I>7;m(V|{gkD0pt^xVPhpV%HIfQ9_ zx25c(H1FFav^f=u$h!IXGJ=%v9+f#Vc|yJv70PSMzL(?C%3}M3868tOrj{voUe5o~ zF&M6L6ngc9J+aZCADMJ<=LoM{#$`+>ibkvZlfTx z0yY|_HevpyWEW-_I`Z)q*nw;R9f%&M>!-53LqKUOZv>b4Rv7egKARk<{HL~RSUtp) z$Mxh8O?l8)%0>IYf+3k@ENlL>CC6XkOw(#UJgAG>v}n5raU|D(d%rmT4iYsdo#gmR zK3c-kjA%L1Bwk1ZSE8ewi;f`uwdZhLOEHYEQi$HsQ4Es7B1v6fWQ$H$M0a@nd+c~S6(42H0N77btGXBxHvchNRwRql=jQ^ zO{ws%6kErd0;?fwE0IWH{25Wi*Aib3Z!cVjYad}>yEj5k8=a<|PU{B7p)q(=53ciI zONh9@-cn<)b-Y>RTeiovWjl6|DGwVmWne~B^=O9T{TA7gZgHvPMsfm2$3=`)Vtd<= ziK)?dP%g;#En8a_wc@Xm=S!mvE?1Q)w&k5&{GAQe&h@Y_@jB8F3&Q)y8zfnL1Ku6$ zpH8xSi0D9O0a^+Rmc&0gYKVWK<2>GIQ^FgU8{smtmwGR{2}r%|_`3kb8I#z7Wg3TL zb1q6T+qpw0+X*K_d^0qCPtuj-$tzaRlU+|8J-)wCa~eVB!^}F}Bdq&%{%}iL5|OO~ zOH4HUTzP1h=jq2b)(o-|@7+f4;v3YK<15*_Fh!t7sN4b)*7W7R?+K-LeNT)sL1ofP z%&<+2%y~|v>?A(4+sS6oWNYI{bUT~E+0yW>t&Z$3%@&Hjtup#Z@hGpHLOc@{&+sTH zOrr^Z3pP@XJhWA^Z_nXN!mY(*-B-H#_PHcl1(O)Qk*)zLUc+|OHS8jypJ8^NnfXe; z&#CNEK8S=L5c_gjkZh$Yb_KbrVhzB?zCUCt=)}g$3p5+66P~jz*k*2d)QnKOvNaaX zX3E%MlFGfd7bVq{ZG3uw6iqi@CPVdBHm1?a9!ohdt@s7h-jxkIZ*rIjlm(M;yX zMMqK*$`r=hw;m_kY(JJEDj)tIWS(s{5sOj(AL`x&ysoP1|GzzV&Q03hCQV8QQYa~h zL>awa+>CBuz`JzQ5=B=V{Mf`@5&L=V|S=bN23|LyjSLCC$=3euS7wCkOc2tC39O zG0|P+;8olqf0ET4>}BZr7hpSD1SLO8AldDDuPkw#UzIe*S_&JF&)fM?=iv0Q8kY7m zB~m!;-RcKdr8SwgV~H_C@(QJQlh-aqqS~W`az^I}((`%U`CYI^nG&UMHFfWn$6eji zzRc#VA*YkpzCThQbc5#$Os!VEFC$wDGqo?{kg@hU@>S@ z#O;TaCY9>@A?dx0GJ6?ix0k^l%PRIVxT31PjBYitd1%ymLq+Ae8l+Q5j4Vyq2}$m-wNz_58#yoaGjax^bwGk3%u#;IU? zgMEwt4bb|d%4MFxtUZiEY7gT8J5L`{ZyjE!{$HIplQpg9B)>XCZSr=ilT?X)i0Q+$ zNIDj+Ms2p>N4rr@Z)=_E|=K>zSb3Al2IPyq^`lPsA^#T1Be!-w#2zpqpMeB2KpDm z;vrAtvE$74^ElfiGBPQ{ChEXhIdm2+3-ca z#%3R~hYfmLRr18U^1GhWeKh6DBJzv)sC2Dc488=>SO{~WcT(wMU9B-KS^;uh4Qyk> zazpoX=~1!Z9}5mX>_x>d3ym64e9BKB))U za1ty8_YiohMr6Zv>*%zoo=ne%8`RMm5xQ3a6ueIHrzcXb2i6U85XVnkPOE1B%FV-L^d3cn1&_ZIL?L##gV)7kWnqd z)jhS<^(j-PxF(FmRD={H*_aKd$ARYjHz|g+W#0drDtR3 zd2g$qMxL;zF0)NvJfd_2^E^8c(tK}2wR_F?j3A%fzSQ3}uZZS;vvA_(e*OW}Zra(3 zR-WG)XHVA;%*NKU<=B{$LaoyVEd-ksY8?D6X`iL~JZerjdO8@*wLZudA#`$h{fcR@ zgHI{AgF%CRu`~FYPkqTap_S%5V%lyKL~_*H1u41lzErMP#^6rjtY)+?(p;ES7_~7{ zLioPEF>(hZm~CC&4zZ%}nnp3VF(RA##z-3i*vvwa!mdkWR*O+vo056-r>?E7?Hu%g zQS(Z_4D(T&JeP!P{uj>@R}x0H$zTBwwfFt^W`e7j%)yJw_GHGI4Jg~bzeaPMJIN(i z0Y)A@t*4_WS&p3IIK-wnqpL?ektxkrcj`PxbBotko?9rOpgy;dj9PNmlAc=>m|GOw z+=9`46?2QCn_Cp>bBjWHZsDd07NboQbj^>WndZ{)F(ao5njb`I9&3IOS^XRH1E+HW zAptLQduH=rx@m!zIW%)mgOmODGLy%3@4#TjU-KrV%o+T4sGPK`(y-EwcC5?LZJVpB z*XA}uzS}`pFMlMx9OFJ`0Ix|{&RS>i2Hg=V4#QJrX^IV3wE<52n*Tq*FAAzyC##ur z%<%<)k!#^fECa1x#I1!3^`0`gk5-JJM$+j9Uv@y!Ck9_}Kz)R{-vP<+6g=R7WMm4y z>VRZKS(UhTw630>x%5ugz6Zk$9rut}4KF7XhSdMfJcyaska{llxHbK%$29_=I|hsZ zK<%M(VFUoG4;^5H)};%{CjGI?u@ROg?GoNegyC2D_?I#jX2|#+v^#&FKrsWnnE+J> z_lgQCjkw1**4m|^xtHIfU`oHNaSYo>2e$$5r2U@FMbdt$Lvc5PAeW-cqv4ap9$g-t&-}=+;X2k4W52Is z)fmg168YsFR;Eju7}mBK)DCsH0ah+FH~l&i>-dZ#Vo>6OrO_w$&d=a@Nki)9M^iZt zxx0TxG|L+7BnCCV!->S2pE6a=?^FY(dj4m~mR5f{JA`U@pEP)Sc+WOE^O}TXe>pq; zt}P;fJMz@j>o+MA?jF?z2{P^FD0135<+wJn-{NBT{E5cpjPOYV)-6Zz^LDKXvCz>f z!j=~QYy9{R@d=;7Y49*qvxIpH2xO`PbaeCNwYNs4-CQ32Xz&ODoYJVt$=9LmsA1FO z;3riY;j2V9szeB&b2u|b(S;Kit>jpT%G7o3F`(V(m$zF-$=ocuzaH z^2U05(WUjv%q)gE@;RHimVEBi*kR%<+_@On$!HWGLv#Mk7H;qfKA<{P)!{T}+(IvN zsLsS4%Dvq}z=d78)w#DrFBf`+Lv`rwQ11K|0`B|Dtxj5X7rhW5Ibgy;g@C(2h2VNV zR1mGLw0_fH_!LPUvhKQcDwNuGya2J1R#Q^}($GVdo7%aGOUi>)N;eOwPwqS*+)v); zs`I%(6bf(SwfhM!DxR@@4x523uwjTWr`w&z=&*-ANAih>h{e!uh-jx?GDO^#0P8v6 zIe?@lcvQ%n-Ka22_4wPQUxON2Y~2WD1i)r7U90c(#QDHHF|ux z6w7FQ(VW-wHxOt3x_sSOVJG_BIqC#4kw@3D#Am204J{ku?!P*;j5UmSrzgYBnhYbY zIRE#Dk?^BPypJA6&hY&8Nolw{LHj!+MAuvh_k*5xi9|d*S_f5esB|tXZFotKChKrP zqhqSA`7YLa?`D4wh7u&C#vVjmpYEj5Ry&BO+*UJ$C4+MK#;&H7TdaQ9R z*ovgBazsEB zaMoHMft&!g>$ex2LxR%dU9hzh@&f`0e#ocNwL6Dx%b*%d;qC<3>W55{Yg^<>)*ZWH zRfA?J{6O7$W)$6tK;Z%F(=4xqi>@+ZJ%iisJ2)F1x1yC>a?#o7@T?|R>n_H}=%KJ2 zNrTsi!p!z;=CYv3+{J(0AuEu#u`C-#`)dW$|5=#g@$z2i`gqyV;Ks}P$asOqt&j6T z;LGUqMLUL89wnb8Ee^d}{;qLu|0hB36nd9KS363sZWR4A{yUcr{+Lj+gFoRL{8Xgt zusmNqg#R-T4MFqc@x%y#1ut zan>5Ir>-FCXl*o~AXrcBwM6SF;cKv-nv0+R>Y(?3w4S<>ME&~%;h5{G(-9RVlfv&2 zw2hQ){t~SSUrzEb0^Tt|gJ1--4&dV^mX@wmZ87Dn)^IV^u+m~`eS&1HEo%te#AsG= zDnqT`lELp&2F!@od2HCGM`kw1ca=}uVPQZXv8r++NxBijsQ7al$Ewy>st{{4B9({3 z4*xjsYjaM7_&cqHM+fllv4@P$b=VyjD)t_q-^&hJ*t4k&muHX9x9r_o8O}&WO0<6GU7dNEvb*X-NWx}$2T%{N;p23Jd43MjF1oumbcC?o<1)0TV!UCLLNXrd=1#ZJu zG59qkyGAeY)0Ecjlk6XOncXwx{oVdytUu^+$#yyo1xPN$M?{&yZAfX(Wk!1QB-tm( z+6hp@aDH~HG`QRO10!FibL&iA>C<{tc?XTY<#|b74{lAsSqr!!x3tF9wcW9^ZKPbP z)8l0>7j5UwgWHYG$|3l(eH_P1=P`rZ;?O3X3M;TSLi;FuUN0^lPtU9v1_N|p{ud3VnM<^iP?{U!*Zz1y%@zRYW!+H!^f>n{;Hxt9>&x2dJ~G*Pw6&8{%(9{|8Gn7h zCydJAqEyfiDCk!d^saraF6f7%pm$c#Uz1^pzW&AR`Vjt0V~5|CgpU%FaJ_TJV4}#I zc`eK+EXS;_6-@qS9_c2nTN0n=?`z*)z8o|7v-oA}zMCHtY%8*;eid##e=blB*%JSK z5E7L#_A23fiP@!D4?dg&&;CqYbh<2|>^_RgU!P9}rHcHxaEnp6St}A$7MA?=mOZl{}6VU0nr21@?cln)4=Fa3pL;FP2u3U+J z8~s0nHkDh8t;MCs`G3JshA6di3CB$SYsx)D6=n{R-r%p8V)}KX+k!XjcS`W4{jztE z3;t$g@OOUDT8JdhTTndHdJ=8L{|B@&(_E|;98q#FVpfYz`cCXhOJ~A+Gu^we3Sn^! z`L@DstX8UxZGG>EM*U0QKShkMjz{!!1!T1;_!mFLzDyN-g7c5k73Z$XU)i~<5}^8qtp=WcCU9BR*-ngXvw|yrPT@~->1a+)MeRWJRTcrP;j2Y0 z;+>knOpe$ntG1{_rchM%a?4o|u86cIRNV0yZo2;( z_pzj%TL0y`u58?8Wv$C%a-e<29BJ7??R*OTz3ay+QCMYy$wuv6eVXUSQP+K`V=KCT zOFDi=cWmQwsg7-ggT_*P{ctuNlyy0dHcvz(!R$5)&> zAJYHsVr%hVVILUL{B_DsU5s7mVpCq{(q(hQ-6(0GG=-1$w&%dZjK!cgjYJ;-HF5NH zG!Aq7);(CuhQW%$)DcjjUm*lk&W6^xt)*~FlHoA_6nb74Yrn#)yV=p)2&=m(*}bEQ z)bA~+5B@2PDW`nXF24je|C;3#7dai?t%I`>2XTngDt-lGF^eN7b@dR^IaZtKV7DV7 z|PIE2l!ck$HnmCG^p2HpZN>KojYXG#)x3N{M3^`ikJ_WIhI0 znxc&>1|<-uD=X+l^~7KaMvHdov2Oz!TSr@Ph<;oQmYU!o0XBv+@hAkEvRL&E)>rE+ z6QGvQk&fSD=J(`L&%d2V*`R>{U8*bLo|J^!M$lwQiFWphWceKT{6f&Dd>9@-d&N}K z=H&#h3&r3x@Ir71-x}}c=@-oq3MZ%#P4~3H&XEP>V%(YvwYV6nS=$~+V@q?cr8#di z2`QhhZCORS^eF12JwDJqG7P7~u52~Ana2cFcboG)>K~nsNPBdkqq#KyDxfM#+6UyK zT-8GcV}^woO?Bi`1}+g+x1y&EELHvwNt*vRK27GQ9O!CQwG>VK8)}=Dt(&TKRT~@? zXyVWOAvS8}-<ynr(T z;PeX2>9|J}JEQtXl00v^f2!O#DFk)vn*R)+U{{>V#b)M~z;9!=j z(e@sS%QPX)+9O|L{meKFBLIeCzzBe|V!#N!_NEJ-{&oa|cARi8GRX6{#pEv{a}?&; zu@56~bELW1QEpC^8=$id+C|W5k+*Z??HeqEMR-f}weeBB_2yw$1wEHIapCT& zaN+T4<8k*ij~|PZX2i(2<#4RHCtBrOZQRw7X(A8LjUzGwX6`g*_7XFvM;Ufr?8XQ@ zogV{6?3Qhvi>k=u{VTcQ>+h#T;pT$ajS&DJj{ze9E{p*q04|CFBLFUr0V4n|i2)-3 zmd1b)0H25fBlN7!GbG5VFO{r5SD$Uy;TVL1M%l1}7w?pt<~px4*O{+*TASYq?6vyy z^b@{FaQ`(EzVPu*gS!aoosll!CE3a*T#1?Tx#%<349b3VLxo} z(Fy!P2mjV!jg&5sk2rX{^O-G57nVzDHas8!ws9^NCcpxKZ1^#mn@Jt-Z8$><2B{$O z&u328-GpXK(+}(`!?NLxvHw_?agn=P%I|FWWNgKXy2yL4yBYd&jB=H~$n!ya8rpC{ z#3&Q2A}e*#Rd(6% zJ4vXzHAsT;?hT^@vE>FuS1apAwLGm6)v#E~O~#lF|Bgpgo}v)6c=6Xbi1DwL%(AH( zYc6zudxT%+LFTt1^1JTG*T}E>P^5Kyb&9O4S}ookR_~X-E}J=>YP&%7-`^UqX)gdp5j$stTN!+7 zC?C`29-0K^gvY{n9|HcmL?$_V)TCv4;V~QRLdMma2m5IK&JY~LT{9FXW_?W@5y9UJ zxAiM{(L@RL0mrSgDH3HiX|2CGqxov|0FIlgW{bY&R9x20FPCJB=O3h8ndyE}A7S&S z>flBzc`W&haLMjrqQ|0a8k~BD$Y7$MwkZ?gHH==h76zQSpfP}I75!F8^(r}_ev5@> zl!qofFm;g{so||>qg7ccnU@W|P9E9>I9NxegnBn=c3ZTJNsDchO|W~V&P4}v-4#>S zSJJTTkGV~zS>?fhoyBRcGl$x8GNH4Lgg!&I(!$6vn~gOyxI1jRhbS2=oQ$5zTDI%D z=IMBi^_ok@ zyHs)n${Kv_*P8CNXeV_1g*27Lx^KxYm9hi1Y-(z5Pis0rw58TOJ|-q~v{uLSFWO2I zQJv6QosgK_-c;4?O--s!a(h$F)#i8)tC=3g_NJQI&~b#@jjC2BMY~ax(z{V*e+GM=gEr{4h;D^$ zjp)hHlO3IE{%*-tZRs3$koK+49=H1s#@V)!N3V6%b1@x`JLScg-o=~z0WWgX>vbO+ z)API?PKoIb@6aJf>#SxE(yw;ID|9x)acjd>wj$aO8oyo7MZd0&gBiN@8?xZdc=Z!B zYV8#rM%X{nIaAKpsxcQHNsU66r+A_ zf7Wx9iu6x2$$WSFjVFQh1lMenRnS<|LR>n#w|xZ9_1I|MIYr!PKHD7GQ_s~6AdX)w z^sPsDi`9Q*O@|GORP;tw!edqOQBv5jn0FJ|ck&m@hr7nCt#vytm`umUD@-}}x_C9$ zr89*4P^h!8?+L7=w(T)~SLBecfPMh_h+1LLr*|g4ZSBoohsn|DE>{(kW#@7(uQ}hQY1ykrapYFgdCpV7PW6rc5 z+N@U;2I0B>B20HrEd@!3I zj)K%r)JiBtS$?PL0*}N2bboL8b!J-8+L*|l60{D5tbD95Yz=QAsVg0d^=X>j!39e7 ziZ-VbSNn)7pRj|=ftw3m9o(b5LS%99R3;a>U?VK6Mcsnw6i<06YMF+kPvNNh8Khvj zM2VbnT|*F;7_=YYW%@F`cgJ@a8^+Ds%IOMvJiFmZ3)5(=JXU4CWY10_2@R4)RY!{cS%ZYm7MrO^- zDB*P^fjQ;@9?u!t^1FMYt;NIjFQTCx%bZ~`FB!TOvDEljo_Be^R;h`3nytgbU*jcR z5a!!WELjJzG_&J5TS)ka{Lh5T=z>(g&pZ1rmZLKIyx7l zHyKmWti0Wr3T^bBBVChQmyF(X)S7iG%2|IiGbOHO>h!8FOU3C}_9D;Cm<~F7|1V%4 zzhU-}Cd+-@B(1|1wS!-0hj&F`hW3l+D62L$tGO3*YtmV*JIZS7x>frKt0A3V_ibYS z-&=PyQ;y~;=y_(ff8A=mQC3IQt=1o5HKghw{xYZlx!^Y>`kE^s2ld^38T->g+L2tHjLb3o!T|FYbwzObvLi|6ap=^<;33j zOq?JzXJ-Vwu;ST6p%TLMY*y`mh}*(E_-jH)1D}SQL?q;sV$H_oohaWO;e}b7-rUvu zEnS1xVck9}*n+e-mf9OOZYUH>?VB9*qwBjWq8bivKMF(gqRS5peOuzx#@6)+ZzrYA z^p9LmK&F30dPlCIaW7OG)`5-Y`l@4GL(IGf_kFX;JU!g~DAlIWuWzsu9yoH?P}w?P zFBv|eH(eg$!$PapK6ojihbK_9;h{YlMju_`w1Fhpo6H`(4C~q!sjvpWL8vAn_n6hq zngYIyfIEg{JK-dTCv4Uc+n=n41^uTjS73T&ZY<~X&UU}!F%$o@T${@Hc=56k|v zIh-2k7;xZ8n2zGR3P&b}S}F7k?wiflVWVAh;*dhhcD~D0t*IRJl2wet8*=Eq5n-Gn zabeEki?zu-8N+ii*6Qk<LIpNG&<3lvsJUm;fd9Y7>=*#5i00t;GGx zx3_LmmgyQ*Z6l9cRnNx8flpBuLS9LbD?!?tE5p-=r*!yRtKLXdz16O|`P*O~&Y*;_ zLd9`&jIU-kdo?qe>cije<4%5L+!QwlC}ehJy}YaHz}$2l_&+J=Z>qMc4OG1T%Sk|Y zPodv1rPS-c3aFlskyUl6tgaqm)pc@Yxv^O)sFnQfX;xQ^Wffo*p3le1EBwqzm*HQ` zoCNBlOthh56(lO!PgB&60jnd8sVd_2t6;32l&qRGMVzXZl1`w;}v(Rplz$*WXT*YM|A)SO)tG;|4eMrvI7hcMRw3WEkh^d`*Bo zk{YLO>aN@g^g-`c{kvH+lF%xi6--CCw*88#Q7khxvX5yfSWi-6C(;Jl!z^pY7m}=r zJCqGZb|~~H?9;5OH+gmyy@?AvU+=JZL~YCti?htyWS;Eh*m5m9tnu6uNOxC7tBOt8 zyw$z3>!NZ6*E^+KhkqW$pz*}@3+HC$-tYPaFY~+1X6uZzK0@pKZ{TLP(dF_Vbo#3) zoN)3dypt++rJz`d+LTonmzuaGSz=O+C~Nl-!gKLluw(^Cps*=IzYAJ4p!2z9-;IS% z-HR%kZnO?*R?)XT6?aIpq?unTqVKk?ZwCRI?YJ>Fo4J5|cpv%Txx;pp6+6vjsexPX z@f}($UDi}?KWbjS+`f3OUvA%C)FE@%Ew^tXYX01oa(nlj3FY=9<}{Ss=ga{c+_Zr= zfsawU?`kWAZ^LqVv}Uv9VZYBr`ph^dmXcDmDC-(V zNOx)R>a??q>drnl(%H3XXWyzjdugPz>(b7eE{h^5S0p8^Vo$gBk!)gxUyz&%}Tc05`^f5db&EfDr&U$AA$4pN#<{0B(r^BYrZbhSwSHT%1c)pVUMyTkXaARVd0CQ^Ucrv7)L$<)qdl ziK3iaNvPH%t5B442FyfKnNm8GeoG|Qijx~tD^7Tyd`fA8i(yK1XOp9iFIbdQBds^n zxZycHihjn(`zhv9j>XBmLo*nU_o?qB%xI3B+~t%cktsH?`)y8fL65sa z{%x4!4D~j32&RZ=Or1CGLB!(nA5*FdOWF$Dtwrgp5whVYW8`s=x}qBF{2dt(OkK^| zTplg{r|JxfYo*RW8|K?b=WTx>l{+%0+KjrZ^`hor^W1fEe<#wSF+yjgui)nW8s9gy zd4GQ3DQ4$3s5x~wp05d;>ujae(SHw~E9M~FlKkSWB<$UBnbUPD2aRzR4G+c*6~_gp zGqFVmtb;J>)bK2$r@1g(#cT?11uU{+f|1NpGq!+o(#!K&Bhzm zjO9EZfsUf^BJf~m7`3A|PS?P$2XpnoN*_cbo(?g+LLgF5;}BCU1R_;64za7QAh#yr z>_P+z`GEx4)sRB?%>;@9OGSys_(B@{E;&(91@xPCZ#Bc|@ z&pEn+FqQH|tq{{zj!2l6)8He$LUA2wA~Wu#{2$>z>)%9Y!o$#=)QOQghTiQ?tZ5Tk zt=^#bkq)OlfgY7hIT|2x!R`tAWuaej=-4_H-k-Sryxj6okwVxbLBAyQK0cjO2k%r@ z&P&nudwAc|R8zW^Z>np#hmXVQ^6!zmdEU&48wpE&(B{sXE+_ByAn)?6`{=l7!z<(CCLO}PCowtcwFWdM%ox0j zXyWG&M28>2S^WG#>t&T<+osbBI_Y@~=4#_ho_{~Y#@RgY4=|Fa{7*GHybAxt)C|(S zq;Q`2`E|m9ht4l0(0_!$oPuJ__cw?C3q8iV?mSwI+d91(Ph*t4rN?EL9yf>kA8p!E zoKWzJmt~8Wtr&MigY6n(Kkt=7=N=r;JMP*iw$JpxuFNDn%{7kYcTe(Ve9mrca4;BL z%(~G-{XGl8CvaJ5Zz?Q3?jU3y4l*Z=rPj9VN^Lp+aV$&I^6t02%=}SEp|xZl>|RGv zhVeOhHglv%-wM5P z+?2VM@SlR3Q7W`J-?~X9%wH87$LD08m6-keNC6z`yz5>_m#;r1p1oDpc~{o0DCcb? z2d4hS%uTu0a%-F+`KW#nbLGuM6FUFpyn+P<*94{1(q+%|ac z$tuVBU*W$_vAd=fY=#U2qB7iG=-ZS2t1{dg?n1u$--g-6g;tt^zZdxP4C*ev z#>|49Eg;+HUzgC>yQ{V~bTwxSpV$vY*d4ogh0Bh5W}iaaL2L@sB448Wa~HLD4nIoR zo(aL^$+JM6 zha))v5MD-v*^7T6v9-Mze|Rjz;Xe}YcD)f5HmB3BCfy4u4sNwNwXHS6NwbfCFbr@GQ_CZBW*U$4_MJ0ra2`i7kt2IWU2{e!i{aEGxj>}4 z#{xl;P=ORj2C}IIVva@yqWYgR{jU4L7ZOb`O46ZUSr?2WPwDTnE&d@G>Hp5;WFk0J zRv!?+4g8<8y3E>1OK_N=Y;d@&j}UDvBoD^vMJsMHSZcLy>()E-N18if#h^%R>34Z$ zf0WsaZ)cB#A$Z85p`n1TY*)Y0(BSG@bLQ$h;yZjfJJ(T~xS_dnnh=JwG#Nip_Flm5 zd2Om=u{LQ0cR?v(&gHrjqQbFwGsksS%`x&JpTx>CDo2;0i~_UVQBLJtrYWPGitCXX z6|poTqa5ZkBH|*kSL_apGAd^ol^c~&aX$Tlb2h4?mA!Nf@2`CFf45T6N7*zYFcVS=Sm=8h6lzn-XGIkk+re(u~qHi(l3IG1HWeEj6B1+UoU_ zxH1Qh@*m}~nx!6FIhzz;JfAFVEOj-}k-8FanP%NX_qr(`-BpAybhq9lWUS{X)_aMf z^&LFdHJNc|9J|Ttcp8hv;6yUiI$y3ssd=SYSNX+b@p+fWyyr4EfghxLQxD(uO}f~j z@HsrS@afQ#@KYI8(F@ANM)QgslK0jqlHJNE6Y;Z>bo*|okU311N~0Kf^1njm$XiAz_(bBS7Ly>1lp z7|fOFi=C|=!KhE7cm#t?)IN)5{}S50g)-G%O9Qn2G~QJC)p&{wt+InTVcrH%Hq99) zJbQcj1EcBz$|~V68w}zBx%p8oq251DS~qS>(#DX<9JZQpMh6nNC-mnVyBf13#CiCr zFyfKvOn6E43SzJn3;_7IEM9@4cMsK#DIDcfm7hVl2HmWSlJ^l zffcS37

    ArT)T6y_hLvX7!YDb7q^pU0!J%-SbdK&x`tak6OZej`cRUF)iSf7M4b! z^@e8XRYDhf{u}u5rXZX6Iz(Rufo1;!__MYA&ZO}s?a?gzyp~ry(TPk*1ACQ+K%si) z<2dv$#r68~ExAdCOK z@VvVCm#$6xt4hQt)*_I>AFyd{_3Zl)D+=3cfAmrU=opestN#h5bX753wiYq@mlD$8 z4@X9~T|GM4yi0Uzm@u;bZ_0WTl)H>r!{u5OU#|E!W&!H?my2(Evhxao%SJM_eVr-U zybDunmrC7iOvyBL#C?{R+3H=w%erB|u^uj3tVRXx`j{!1DVw-(wU?%Sht<{pH7sG* z{{9=aayHxDU)4?@+uim%b@0K+82$EtO=cZ^8o@TsLopB&epX8q%|HG^`{uMHez!O` zyOr0F7qY9aYhX%Tt;$SRguPo9Tmh90RE5k!gtPc0l>ZMZjMF33=$ZUfHaL<#meJBH zbhcEy)?h!xpd0P(N2F~)h0ay0Dl7dQOtH0>Uqt0Vw6A2h{iL0tT+Q?TrCwf_3?FsE z>F?^F>7mPT1&dJH&Q%DU`k$n6baPO-!uZI}W_eof&Q9$@_U%(xmAhy7?_h;Cfw@+L zrSHJ03b6b9siP5>jqaUW7ok0G+mQ{fRIXm7&l%(%x4SBf?jTEQ zrE29A7Wd;816;{)(9zsjJG$>`9CmQa>Kb{tHZpu#hU+53^)lRGhUitWChmaM=UtzP z+)0aCaARb+NuF-zQz5+#q_-j3G^)KnF2_+x?{4DNu|8T$gDrtMyf9@PUT`lZ=lK~j z&+Y&05O2Vpni?YO$P%`Z+mNqW4n#PJzdP9)aR}MzfJH^hTlemup*&XE` zT#lfW+<1OP=F@ZHdshdHdwSjYPE|HD2RBF2HnNKzly5%oPt(%(ubQ~fgeXZtzKRx;n?PFZ&8abCaNxPu_(#UTD|IL@_- zbe8_-0K9$$>2~`&uSBXq-t3fNZ#w|V?-hJr{&*vJFTX-Wds7x#AI>JO4{Dy6+OXHN z?tUYVcn0!Pn(f~CqWd*J*~}LB`H=h|U#GA*zB`U{3>}McDAtxM+BSTlc$xnN;?(w& z9gg8--fuV_w0LWTp>wcYEt{8%oT;&B$lH%QS9fCHjb4dk_3_FZ&1?6;--lIqj%E$f zU^!P|xo;|;bkxz<+SE0@RKAQg)udebmZl1~!-RVmle3SeGDlJKhSS>tkt7*)-p(@` zGn;Q;A3K@WW{y#ODkF{)>^x=ELc#fCZ;JSFZezIoeMJ85SaW|`3+ens@^$u1Whz}R zy%MdPCeb?d_Ki+lA{zJ0@Lwd`r7Ak7od$EA-$AD6QL07ws}snTNbmh&*Klve&?}(q z^r5Z+-^!|(d6jYSSa^!G&3}}fM_KQKxOZ1)BiV=u&tIG1bvYrYx_aK2C9^gj-DF)>eO1ug&{oh2S1owyD*E@vM0B z!M%xj1&K#Wj1JDZaw6>!@I{;rNO0P@aQ+4)4juzvk_!oeJ0Q4#fNIA@X<;-`!2J?p z4lHLQKr+lOdwG;3!gPCPZN+&y3oXHYaKO)(`C&6@qySY_jEyOJl#;26I6q&Ue>CPs zg8eS&h&|=P*pW<7B#~x+$2OjvE+`0SBbw9qWa!@2eU$G4!R}N#5;PO6@r6 zecz5u*Y#%iGtAWs{rZ}WRPZW-KA11CJj`)TxQ7J?x)d|qBX6VRUY;&@rln?y1>lgfzX z?4*@VT_k5#bFo;P?xb=yCX{0Rov%nBXT?sWpK2O z<|Js8Wx+*!*bmf+pF`QeD+HG~bZmJYov=B#_F|X4H8LkW7Z!)q8`?O0199sd#Lc8) z{k?-vl#n*`XEx|y@j-Ii&7~^gxZ{(fl3-7}(I{J6s_{M_gx1OS)VU7$t)JQV{*0DLP3i~x8#28;msb_^H+@SPYi0^qwbUn06Y@|MgTk;14aP+PYf6V@Z%UT0^lbxU9_+tzh0r007FaqGuF<=D1Ut+)rfY)Nc2!OxF zfDr(%$AA$4Z^VER0B^>C5deRS0V4qZ9s@=IycGjR0Q@5ci~x8$28;lBCkBiF_-70l z0k9$li~#so3>X2xV!#N1@iAZoz=Rku0$^ec7y(d? z0V4n=#efk2h?lucGyCa&WNkNAVs1^&48u;zSkJh%+8dcUvz%TD=}ozm_031e%-3(G z^0h8wG(CqJhPuoV(i!e_+U8R19Kg9tr*oK?&7n+zB<9f^%4G8|Z;_5j zI=BWq+DjpLA}$3K5j$JkXvqdo#uip?G6mn{gYMxt60?vgkPJ5)ZX+yY3M9&%4W1ei zluW_5EGWGKS1(YR0=>wW4W7nY7vhr&B_Q~=d6MvR-IGkgE@tta5f(B9-!+Txjj)g@ z;CO>*-ao=Zrr^D1!C^-#4w-@ygV8Nbo!xa5RvzkSX|)`PgHGg-pS2X2B{T zjIfX?_^Da^Y=nhO!O!_H2hC>o)*RI2kkf763s98M(A}WZ z@G{lB*y#}FIq`Aza?ZdaH7T>D2*}@ol}Tsa1K}!s-HFiID-s~`JF;t8U7*^uK@dox zo+Y1b?8M;_q{-LT`>2TDxNSd2>c$K^>tC()lNJ?O7hb5q_=|2<*`ax0H>*%9t@3+J zdySs;I>8?uZC%Ts9c|s*YmT;V?R7_6Pxhvxt@HZ3qtzD$_OMN-mu+n^kt@0l(w4Wq znd9jve3YekX)C|AtI0o!RfalGsWa+88(eGf3sRSLGB6z#6Iw*`E!}SLJQlfHDVui^ zj=3XI7l`&aB6d0}P9~lc;_z8AWZSwpxmN^gOo~7+kB{rjb_B}_s_mc=Q8ijrrFv9Z zb5#i909pxPULz+K!*~vU$tQ`O@}n-~Dw)iQ>IdyjWr?!(ovGA$ZNV)t$*B->utW{4v&&L=x6slZJo^zh3Gr? zs{G~~LHz#tC&u;uK5w=suXsJzyGy}nIp}>3(czwbhzf@b9{p)k?~cylf%k3I*84^0 zP(k)S3*NJlbC`MXjQ@!a0;5F8=NLGMrL_IsFQ379?pm-BmX za={J$;IwUef8`vC^WK_xV38q*7d-xh4;lMMzq8-o7RQd6!uxy4Hrd|(!!!5jMUAy+ zIp{?@cBbbF=e6U6f9%tHKapa2;?_4F(EDrWP(k)Cki&(};m2=#BDA27IcC~1y*E4d z|9WKpq~4!9A9B#k?rEl{$N88xd*PXz&mi2FA9&!D-ewnvz+TQ;GCh-=tJ8v)Ki1pg zf>ZJIcF6LLl5w>D+aG#pho8GL8vek;S6d=a{K^MEVVrzx-}5i*o#4WK@satL^d1l~ikd&p-j=uiKm@7mta zJ0EY&-2A%UXI!O`gI>hvGd=q{A2(KNpR+_hed5fUdy({390Ge0xXbi(J6B)Yc8dpl zcZDM?m8RaQ1lKdsSw1@bAImIZADHmy;}-iBzuo$=URM8d{?gs=d#raaN6SHPs}lBO zZbDcw{X_W^ zFZBMw`H+J-yY>t?=htts>6@0Sd)r=oHI7|iFLDr>o&%k$P4_$J@4a0v_WN&n_3yo} z5^m1|EX$^G&R%|7(5`&wF!0RH#+~HA27wa|d~*|oBTk|9E+`6on>tqxf5aTef#}-E z^t@=Gl$blPBJf8B{w{He61Ggw!v@-;i54b(T&4$sY{Gmyarrl8;pGNuf5e6Py1)Sg zrS9K>zZ7_^fp+1{!hBxfz6KVri(P(8;5G*85di1?Nr4*~*q*q&M_`MAQsM7h-YM{3 zG=p-udE%0NyG)Ndp>ili{?6q!0)K4a_K8cR_cA??8K?&voJ*w1GCg+~cyQwKWPw*2 zctQfAEjrV4mVxIcAga1EJ;xjPnFQp$VangYhY~OlxPyVeOu*v>b{qK51UydQ6a(#H zO3Tk<1ZE9vzdmMuZ-IZL^va>VSZOZz5UBp99B!JpLk}{|aB~A6NWh%HnFfBWJ#NJ- z)R$BMy?DWNAwzl3Tfi~mQ`@_2pznEMC0GN0&v#RB`x2k6s)pcVS#aGj3C1Berje`V zW@#F^R0yx|)_q+r1lfu@a=Va&Qi$nr3~m&>{Yvo7f;-c&35)+qQ=RK%H$G(-Tp;8f zI_)^|!BQc5grX2h1`)TAJA!sbC`}(4gFQgIOKkde1revG3!q<3_FpB0dwWP_t@D`c7VlS&T}tjRBF?Ug?<6a zWhJHoyi^~Y3o9ITn@0D=oExz^L|$*o>;fkzJL}|xey@S2_6B6Z-I*u2Di?4SwV|nN z%W|+8gcNOA$d_l^v+&dV@I{xFptjv4{ zb!0UQfjVjyYKl(Fz`A6Tx?av%uT?O6coWiAePdvHE@rg5!7(sB?K0Y(vAWNQIC8-` zayT0Nn7{)@x{T`mN~o340iJuxoD~`E18Cq;VO<3EC%8T4?T%l!nG=}tlcVhZ&?4I#61{xe1=2HR(6TQJw>&NxwdSsSE#d>7^0`2t3{GQzA_E^V_F@O>x0edIFA04nL0sbstP?08z zW!4b~I)F5S&FrZ$UyeV8NlCFFM2gHuO@+ z`HJWN!GLLzww~!Dwe`#h?}EddJ2;2=lic|qV_&tIeY;UYFXNSMh%}t1GCYLS|IQ3o zDgKI=ri2%#Vr_+sfZJ8F|QL! zq&Vn1V#qYbaO;0my(^Edcab6?t9Rvky`vjGpKdoi9l^2iRXDTy;1mfpEPsLgMz6q1 ziiFBzD-w!a+7oHBRV}OKe^0AW!+)w(s9~+N3N_fAkhEqtWn%b2=6~8-+Yz&L3Tf|K zGJo_N)vT$Xof^CkvFnCH>)bMz-0!3fPaMbl9xLe{%4M`%=+pe>eKxCzr*JsU4y%Y#!)7>(Dqb= zdr>uYNH)QznI{i&1ekWSm)yK;Ze-(Mha1yLtrsbS9EVDF6pn{llxT1-sC3H3#gZ_udU0TmRIW7<9t@Xu9wU7 zMpwFDzZQITa;P6uuY9iSmFvCzc|s|&HR z6gURjtsfg`qKpC;CqScsL4}vB4mVWbS{)hzdwvWU!P>8oxr+LI>RA2#N;*bUYYy*p z*x>Zaa%c29WMy5XUx&&6?wX@}Fdh^Jm6sZFUMCXtJbHeaj985>(s`egyXpP`s4>)) z|L~2|XrkL-istxhq@gs?GkLfL*T%YGO1Q~@g67JfV_|BftQ0+y74hVjGRT-qgL}2$ zH1jhKZACM8D+ccI)mIE|Wg4vzZX+5riX|)4)vXXp%b%bkY4jMWYBb$B7yrE_KXChkmUOt^k{R>gIPcjA6@ zcNnY2WWbSpoc?aOA(P19e+~1>eP6wo`#+!4GL)^h?^~U{N%o^ifL*W#PfB&0sr!95 zuqEsNFZt6s$M*Yt4xzSEUcvbaw*7yrFdnndQMSmx} zclUTfmB4i?cMnH~nJ;L==J!Mt+(MK=o{Ly+1s}FzWjk11>lFj}4|zFhCCBap3&S24 zB3~hxQt+y{c7~ak!Ci1G0XuWJ1z`q%FbC-6hSP%o8T;O7-<$aQcZl&%jb2r&ICiqZjcKc!DGc`69j9WBea;V#aF8~9R<7fu+#*95g=!BY)k6txOMAOjhGDP2 zlYBvP%xfDE<@tYBCR*0kCb?fb_wrgS2fbh;vafSzccC_DRbH;kU3AScy6|sI6r0BjWlMgVLb14aOB69Y!Xv$EZy+rfQY|7`I0 zR{`L5+t{rU0NcfY5dhoAfDr&Y#()vlo*FU>8#0;2w5PuPZJm%EK>m+2=kX<0v%Jq6cY^~ zau~%HIougP!D|ZmRw^^^8(GMmpv}2SXsSk5aej_YqPXlP2BlHDT{r|?HY3jsN~wJD zkLI22Ws1OmUE#gKr^dIZbF zX)36T2x?g?OfO?gY?}Y~k?}qstEce;7{1v*g>UP!_iGHQbMqE{V)ZmUo9o|3zWAR@ zWlrt?H<=?&Qz`p*GH1t;ne+C$WzHN$sU4v1{#8^N>cl&QGK#NvD`yM0UPwxc|Ic@0 zX5N}GvtsR;v2fRxna$ROnSZT4GZyaJGPA{+FoQt)+7^?AySB{qtO+wbV!5`=Sh#D; z%mOj?v#5TUp?VFVlp@8kH7-5b@~Lx$bGTJ<(S1TJNTH zIGcy0SZk~QO=6(1?{9G*a zlXY|H9?T2)ME0l4d~eEWYe5>etBOD#tv^_vVO7yt^BMgwDEN+ z9C?w)D#$Ky!$P)S&ibeD@%rU7SVy0Gnb#-L9F8mzVAfeZft7!EnvLBMEvnm3hfKU$ z{aZjj9>&?c*T0`?=nNbT9sp(968DE#QCLK#^{tCV$B=BKw0JiCB@!20Bj_SmPf@PQ zZ9QnhW&|VbqX=6*UPBvJJ!z5^b^81+vAEj_J(z$GjyfT;{=I}ed$<*9JF>)~gWn!q5S=w2iM{@^!MX&=!{hzyE6`vDrl4J)Sqi8#8_dMOoz*29 zVD_8jxXC#VI?RPLc>S|6dHoym4SanzGTS&#D#2l--V!kQd1_OV4=;NChhtM~cE4W# z5pq{ktZ;QC2Cx4p`^uTWvx?v6`S*HGQNEo-mJPc2nqFRnmow9n7_hIc&i<*a?FNOX z(1z?vMva%>zRGT!)MR~#NS7YBDGvqo!_rds@>`rLDsVR;2VZoBJO_GcV?IgLNB3=l zkyAcRdZ2VZg_Yz95FdD_9zeOq881UXw#*phEwPuc+?%*PyXlRy=1 z0rXIB+QHF%TVW&wIa^WKns47Waxkawld6>`lEQ@Ho1?tAHpz>YY_Kh^YbYUcdD3Q& z-_4FPi zBUIw-7_a|Ss|Tm?#mnjZ_(!HI!iir08L|uh#)d6-l=~N(iFZ-!p&ae?_ZzwhNfWPs zi2_kvNi-UBikbJh=AjeU0i1aKgL0^S+)#-dyo)OAUxG1S^gHJL6M@_;I0BH@ZgA{kxmh`}t=5ucYnv@%r~LyFF!>^Y2ev z9^m!wWtMxJW!`@vZA<&y$87g?w!BXC)wDeYzn|IfAKUZX(SvCh6#N0^;=sBK9;p4A z+^9UWnO5=~Nl^CUHEwuW_InS)ZNWd7FPo$NGWlG!P_y{Dn#C1le3J6Jv%y}>0S7+` zXx+YSR}>yow_juHrejDp{zRTR@7y`N47u)TgXtC*;vs}Sbf}_=^RhF$NM(ioX(If9 ztPfkI_2IHUVwKiM%KE5PSjX{^#2a8SxE;YV@H-VAD{T{|=ed_kGgD ztI{{g@xCN2*q@KnQy}4~HVbo#QzdEln!C!tW2cgnkl7kd3dn@ipj{jQk&0R~NPa^#6%?jpS5x#82aR6UvG z!-FsNczqo#g%>xMz4jF@d{r+mui#C8+ z&fKP#+{~(_(60bXZf0e(vo4-87gh}V_|6`l7@5oQwfyq? zaar_tpqct7AxGC#Ub;X!)4cxsaKy8E_Wd&7@OOmZT-pm++g*WR`L>P`ZGOloLyvTpTJXHghXhL$W_Yi;Gyio)~i zvQRhI;9taIc!4Byi*d>oQk%a!p%T=E*pyqZb$-(>{DUU52 z@H)u-)16s3mU{@n)w{Dg?7Fi=)=c-@{)e1;f&Z!gOxYjxXLI^~MY@OX2dOtr#%RyZ zZO^7|WgF0mfs|^)GGvuf<7oFfb(>$0u<2~0iy#cTCVoeR!Sr;|FvYEb7Lp5!M#lZe z9!&5af)$kD@(o^=65~02FN?!R(j2Cys|&sUN97h}1cl%zdYo)<3XM$j-#LAMkk7}` zK6y}QNA}w^EkGejw1xIfCKE~O_lW1nsMN#f(&Gpz=8wW!MBv$+&Fu2QsTjB;70qG> zPQ!>Y;M0ZLJZEpxe-3%bn|9lI{jx4x+mW@NDVRv4m0X=}ESCKBvTA#^iA<;E_Ok9= zdGaBhwjIpJ4e(1M1er(Ht00bc0+sj zigC)Ic`0*}M$&(}Mxp+B1U}72hEkKTenq#0PvVZ?JzRwQs`0Nw{h-iQZ+0Wi`irc0 z(v!2Yu5FPGxV+pD{7Z%nQ--!p+nlL27$Ao5>~-)msJM8YlmBt8eYmPu2TV zeFpUcss9CT+!=5G^N_(3+5ori`j=zK201c&wvy_M|AfKdAc}VlT+Hd4CLVs7=HbL_ z@KaVp;YnvwL<`|PJV(VZJp-iA?-@_rl)dJ&OyV*hv$5#~LZCkVjvvM*-Ev3yAco*5 zm?HNStZ@?t6DcqBLQH(luJX|~jc9fpl1`hTg(hM18si}sEH!hDP7(s?x_uB2d^%dO3HFx7Ik;ab$_7pfJmFWto?p~i)@ zRj~DzQc{VysiJ{MYW%CbK|1fN!xIaw8&|3&l;M}$9qOY0h`1dxZbdGwo#rqX_0cZs zD1WPsJ}O8H%}v!NTc~tz9gFc-B~LjvLr6JR8zo#>*)W5sc)`3BFd>68g0+074EzsA>C%DnM z{fgXfJj$)WwAo}oixGoAJuy3WE5;-Zl2&R(JynPELy&_9+D@52??*} z4Q~(cpkACb&^v50P}|f`DIa#NjyGprz*;)ACR2k9hcQN(qSL8JOV+gm_&dtxJQuy2P8P=V_boec` z_(x;YR$0D?42l9qk4mA&IKeDmzI`}KX0?#SolYH(lZ~et)HW)G znF*PbFiybOT$xnyw~dJK>6!G3+o`cwdaF#Otvu9~PHJ-7>ooVN$@IT*Qe%3ZuVVMA zjRUXhcgg?qoz&?0kE>oEjE+~#&5hm?{if#r@C+;IH~w@<+atkd6EXxw8CO3sn~6i+)o1B432#)2XE>pZp%QFu0TX0m^#u?X1w#3+>k^=aIST%1p6QW^d_d$s2rCW=sOR zmVb#@(di3Bndv80X7ZJknc{M>tg_5j8O!jVYY;_LBo>JAm@bk!8W%~@PL%g0^0jqj z-Yb=E%$5B*LoE&7{&OQl6u^GmdO zi}s(yV;wF}Mdp|Ph18T5u_rK1xAwa`ON;EZ-t!+ja&HfBJd}mb(rkP_jFXPa<=W^5mm;H~^@(DeNocfng z=h)J$hv_Dqi|I#eY+o4THsRF8w#nSEzEguiDZE$H(#eX4!64#!H4zqTdlZ9fbit0z zj0R?h>oe|MERq&1HtF0s$ZX)pl_8^d?h*3DOyYMbQ7 zn)Lgs9_si1rQaoQD`NWnC)MvWpAo8lU%#ogB2Q7jA5{>W?T(KorsJ8Ij(1!!AWTr- zW6@af)d{KjOdXErGrLpMsN-LtMr_QlltLj%V}HU=RPEvSBtGeR&i_Z-d%#CpRsa99 z&m=RGvSpIZWDBrM+2tXb1XyI*EU;85Dm!vFm__i2-4lj!gN%`5ZV=Q+2Xd+xdCwsX%_{}BRv8^28d zq4Ff_DBEeWlxxYXqx>kEfM5SuJf+w&-lpr^iLJQ%ImP%mR-2+#2-}=UXS+1D3g!L+?PZa?59P+lqxPEsZ79WpLJfT<5>uMO$slc{NOHG_>XNH4b;; zHq!<3pSg*B3@=@MLkMyDc{;fd3K!HNVpy&O%)F`xr+xf=2lA zj9dejYu*jNW32XnaF!;Ruv1kc4BnRm_m6-tDZ+9Up($Gg!*?&zeYfG8uW>@c@Z=yw zf+uGu4A0-<7D9bFJRfv;3XtHbHRj!^6*$EzEeS0BmR ze87M>n^Muo8e+F!j)zcE8MC3nZZ=d9@?KMIj-0_(o^9MojuE@=5%y38MJYf|rX48? ziMVk>QW(c2w44UD981>HVuX$wLr(?@UzGyazw-OG4E z_acCp?(Kk5y1SA~5MwkQAJj_p0vR%R6cnNix~`N`OuNx9jT5)F`dO+}4&#trhS2atGUZYQ_6u z)!311{4(_=gc8}cyPDzx zAW4&5&ZhBsoX7E*z>DvLzx?k&CaE$oskf!vO@>&Hr5;;CuH>UN zQeeChhrK&}y)$~{4$4O;Z*Vfmu_hZls*h9j!II&3MG38^ z$ucdY2juMvXh*|XiNknzJ;U%-ycYduRjv<+ce|I-?mx&IET%qtSNu88V$a=q>Vhsi zcFYkLJ}o{mK17V3Z${mJezbB}L(=^h{Sl@9VM5gQAPSS8V^=U-$a#bM^smNaf_%6r zs}Oudh)6|rgVJ~VK`H}Ai)wqy9qi-T#vzr*DD3b?r5ehkz2FVX9ql**Ol++~@kr^T zN>cY}>g;r;5D_-l;=S^eSFi?HVJK5}(9z1_X?YCm(GEde^j0KdQ4-NGGmIDpUPnT1 za+!il{>OlJ?G=qB*kR1=!S7Ul*|EfBeBZ=R^BCzn#D5xN9|TNu%}jd~3G)8+O4+TS zz5)L$t-kld3*zpBLw%oA^na?VxPhRp-PfQh3WNC8|q1*3D`YJa?62kOV2g(`T zo2UA!$5pqNQg|W^ZfySvLP_G{x$>FRbPK9W+YGJ{R%h!+KV*aLp^Hz#rZ47 zF8LbArEvXy7#7qxz{h(>jnj~fXY}R9Gv9+=jJpKzUrj)byCes$BVT$c{C?V4mvmo=~;_0o+g<0;E1qZl*~q9x16w z)9EU|rrJR~qrCNskTcXO6$czGoUE>71D%HdF^$T!>Y+3D@tTu1T^&A+wIh|5!>7^n zzYjhmCvlHCP$bBp+zb;MGL1H7lH!Kwk@UU=i3dy7Qe*CT8aTTFQwoj;OmY9K_AVP! z=kv?7chM*5e{Uq6i*MqQ^uKf(ebl$Qo!)^@%lk8%@Q%4{$O}J95HI{3&){w~>6>}W zW32QRMb%ii8ywzeymK7c6ZQlgWXf8v7%o70r*<;mUZr*l&WhWt(hL#`umNRId50(Q z3~p5}CfUcZfl?M5Z~_*xAJ0>4@B^{It(KxZ#0GLRY@m1v8#Fn&uAFLmxU6lU=XUg2 zFcrLYWVPoRcAZBV*6srxRXnd;v&U`-5Bf(}2p1vRN;fnOJw{Qfm`}lxn2+>5X663$ za&CUK7NtUEWObIVr{M)%&%lZ3%GA1{wuW!$x)vv*t3g5mpzE3P4$tDbX}T(9(e-S( zgQxQpU4NL;RUV?N+zee6Z!BGvQ%w(-bv<1LcXSnY&{d9SsCuE$PU-3j;UYwIH8c&q zI=ZIdN$9FVW$4ww%P(dhq%d$ju(YLWbByw&=NLyva?qVvPXo=VsMD?+8GAMvLzmoO?u@_DVqpTy0W zK2HeJ=MBgid?Qcwc|TI^phk=ElLvjCoQ$|ptf^J-}GFjD@nZq{bI939avg z^QJ@VdYs>+SY9YZAgUbq;V?ulAL{x$;k!cXE&nOovHHD5nfe_^KQZ2lw;C~2yX%ej z+Dp~*wG}un^n~0uZ*q#Y1!O9DjuIta-X7r_eueT1SWIdexy-?|Tq5S+qHqpZgWqP=G${BncPxWw5 zNpKt>L_&Gc!^z3W4aJIkIL<5O;$H1tz_Y!YzSCYUMT%Z+B81euHjR+$)uu$q6+6?b z84}}qH9;rt)#MZRY9hRPHMvQzrjNK+Gjxq`b-h{&c1#toE0iGC_0-@^xMTY?PN3wz z%WrI-_A_9A;+Nq;RaAxt8*@9;r+vWsw0GkL4_<*2^=ZE)zZ2lm(DiAT;}d+5iJ>;; zI=nFXb{*aK)X}|{FbK={$qDt*hu$YQ)9^s}m~SZ04YjLy#(kdNqdrfs>z_*dJZ0jA zSK9ME3igGl&$EC}r+wbIfOl-F&r?Cw=e=L<;Q#PcpZBy_x6ArGd8p5mo8eu>OZz;- z+4XtCE^dWCgkA_9`Fd8;xX*JWNeScnybMKxJCi=o3suzW4)lGGTi-Xfa8civ&G-)w=4P4)sjk+aK$Mt2`=c!rTRjk+E$1;<0~I$ePmXgww5Nk-nN zbw%i}FE}HU)d~ zODkRde=FzCTj1Zpx?5$mL3YI zBOjEsv3Q+Z7}P$m_G4L}DCYx2LUX6tDPOd`&QeK%|BEb@xpU~fgtI$J>ceq~H?`uQ zt&Qe6g*f627qPZQYN<=vA|)wnO>W8dP`Z!h6 z%-#aS7dBXO{#+*F99#m*c`19|XwRE?2IY99qU%&_j^oy!m55iYeOk`oCwR8a@O%N*>xblbc~~#Umv#xAk8`+#j}y zY&5i#-SbDNPI8+qKXzBNWfYIkS_r-1vu$~+{K4&t1QNRLT*{(@OLeYVwqmH{|Fkv z>n|W)YpL&IQY`t>2(DgOWJ;}2E(w>ae_saLa78 zdsu2rUMLR@Zso!evDUcak&pPU?l+4KF;`=7P8piw2*np zXd!=yZmKERjab!%QS4_>i*_LYqqKUvdb%mtd%~RVVT6$Jn>r_~IHSDX#x6MWrWzys z9ZM$h`zd~Q!1*KO-`>>5;cA+=|2e7QIfSj4QXCI{kCf|K#E~ykRp;zQ6+$K6Wf#Gb zH!9SrFhCD_xT*+8CI2)))stMjz!d#jQ1okYihk6YI1oiT`mbi3RMD@cUeT|mUeQmn zoI-n3&`-H(eWu`RjAjgmrgysYm4c)BYt;5W1NTVB?rGe3UzJa5hkpUaF|cgg6XRy) zsSUXwGp_uIwY_`rqV0VRhqiYus-0Y(4ylKDqswSuW!Xnu7k5$;pyx|0Y7 zv6BcbI-ozUfS-Z_1e7a=TSxz^&FO zWp{KSD&=}>p6yN5)#aw(WHkVeOvs*uVf^C$KvTQF6+* zoK|w$wnQzHSsY^pWG1{z-09!4cb=e8uYW7BJMh(3ZbSdJ&FSBkGy1pXayhERO`=%s z{txhrv|4AgT{7E^JjUy}Mx+>bg2f1wIlD01JDgc)X*n!#ZdG z>#Dc8Tr;wg>t!?K_SYgY%5$M0;tqSwM(pxjyPVW-for1T*%6p_NB&Zk1tO~yJB4!F zn-Ox-Dvpx1BPw+vl5;9e)q|Tdy2=$qSjCAjcu6U?bvhB&nGs=?dJ$Hs7h#H}W$dJu z+vZ1SROV;SsLX4d7wZei7KOx&SDsh9U+&;nlrcvCe*y(Yj`Tu7+vj#9MIsrE zt2(7Zv_K3MH$>k7h3x^ za4*!ey2`nM3Atv8o_?6CXImdr9o=@Y12LF}w^hrzLpNz4@M#`i_$^ZD8HiGsQGgyw zq(ZiNjx|cbH^vpp&Ehs$sF7p5aOx5nT7EBrG&+`H=^1sh$1+lA)Q?7c3!2ZZg?Q2* z$;{_O+)RI&&vg`XxofOWzk^qE;nmHG$WQYEU2dg?;djGG9Waj$?1@q4H0E-b@pE$i z&&c_{ONruzkCKMCohx-`vh__JfK+7J^|<4{ z(z81m)HJQxG-}U4jA@|eg~FmPTcgE;6VO5neVfj3&2%&T-uRLVG)YP4Pnz+csrqS@ zluEz~T2cvatkPKfK3SI=``-RvR>FcwQ9E*asCl8V2<~E1DeHIosKiI_^f9h_{D&r} zo`sX5@-Pi$8dUPa|GauOn>6D?r=M#7zd2i)*8UbCL-C-)ANi9ccK^ zTju7I5=8cxrd1O{BoYNG(=0h0dcl-{&Y3q{^a)@!~VM{tfiCT#)e#-iOx_Ap+ZI zW^V0&0mn#b23h;10HL0Jdsyq!t4)Tg6#^z-f#yUmx&wX-v7&?IE&(g{tE?;fF$riQ zRq6JwT*KN+_$+|xOsV4QjpinxqA}n3HmSIe^`Et_uCeb1V?mV#CAteWO`D6bbH(sN zW#omTEhF@kSV(Xl!5bLp_=^?VObck~B(qMWTGYznujCFs$x|zbNN-)JNctsKhD ztP?37DcL$vYfRNG7+l2Y2u;h|?k}-Y`RnR&4n7NNEB}_1Dk7?IkB;mpkqG)e7EPD* zEL<9WzL!rey^K~4g*w5(OidgKe5MzL=xCMI(azA`KO6sQQYRu(@URg$lY;_A(#j%! zhX7R?U-A(=0;IjvUBS%Uqk2Wf%4(y@FH$m~-v!$9vyrXsq-1Hda$KsDZXq4hXR6JS z;A1AttUa*N$FQck?@v&L^`6H_FxXOS4lQ;WYq=%ZN?$riuLT^NO9xN$w(?`dh@t1O znB>fr%y%e83q8J8mrX)<55!@c6?Q(-zdE-rtdXMopdtFahG1XT*{j>ydw&n@JdXTt znFer+NOlf2cpca!$&6iM0((=VST5y2XHTSs32sZgv~E1J9Vk|#HXG=}cHLZQs6kg@ zR)g-SoLW_NJLloTYa4E1V7qk7Fq)(o{ikgVnMtM5AZaPnm@h8c%VcL0Gr&(WKfg(1a zu)G@7Pm(t_3t;nUlsDqNU2H-!LZ&@^{bwQ#`!C_)T3%0N=LxwZ9&{>E!zcjvUqcvM z^Bg#fZto(;ga2X0X_7EWL9hrky@D8SRd7%t;-Q0UImUjPItRPxF}4|NR6Yp?yH6W~ z|DqZ-K%XSS~Nt^CXj{nkP3=&C^F5K(bx|<62T8Ey)jN0!NCe(BNi`Ji)&19E#pXG8e0z2TKIT4T1+){-J&%|6y+FrnQPOQm{&CA5wFNictszq{-@7IDc2aMAPl+)aC8(`i1GIK{wCNgu! zqS*<%*5;0Xz$?<{;kYvu_9pZabk`x*!SW`?vy0gyO{(q%hvrDra-k_8|k8- z(%C!ca5j~omG7~Vq-DS;63MvfkCjRLTdt^9yeQAb&(n~xB8dqLIdV2u zn(&;ogd_82x-t6@C1?u1Z=7ufg)Pm}gUI2iS9dNp1;=_s?BD9|A%36acMeF42PE%s zj0fJr+dKGWctF*XS&weW^}$G3;bS2GJYLO(dCRf%^$%XNGmU(2sp4!A<$k{!7meLR9!6t^B47({-yoq7hx?IvRawZpz#y6ddPBTp- zmyxnW>kDLytW}XEVdYAgz1a)pW4%;Ver>6^S4ZNsD@ZWg&C}q0lbDGUr!M?l!)c_< z)EFHERaU1Nrg=8zL`&ZYTgQnhIO0UstPT>#ac?ibpYuBw%9L@%i;`2P^ZNj>e@AdW z?N4$_mY`bsWq4F|nc>mK+zt4%4FZq8j2AXaK2AiqrV1SMM8H_y@xokduE8$VtO*1_ zj=v=hxz>nRWRB4MLIHy18c;C;v%GjGoZds@VFv1W`?kI<1)PeEY^NBNRc z&o9M;e>U!rhm?BcW)^D{FIDQf-GT~(WNwmtWaipCdZ94W)Y@T~1afv+A&)DCd~J@L zZNdhWNmj2LwRr`Xv6$0>6~kixBgiS6>SK5jHnA+VO4PG=oSWzrtq#c-?E=&$ zTxB>>s{sBF)R8;;Itpc5mXSVzFmoX-b%Z9d)!+Ew#EsAt^X*3z_}E zH^QIm>Umo{lHu)!9F{M0*Bft_$QRyz1m5<-WC{G8<_E|7YA&GXaY}>j1jB`vt_Mvs&P|7|^^grl4a9 zWm<(xX7*j8`mL5rnCqSZce=JsqprodNl@21$FxxYt8v}QAXTk6eEXMk=%wfjn$AX^PjogxCQH?G6q0v~MHf3sWj6~?C z$qX~dCO=I~ZcPyCf3+9tjq9Mazqu8!evKqt-AHFTb9_NX@XE#7HgX5KpsJy*==r~s zlzfyjc%eKX|DfEAlvF%YlA2w-4x>CJBIPFQF#1?=q)|ggWUZx0T&{MKXi6L<{3gM1 zyJ_M$`~^dBTCWOoM9GD=$EvW%_v(78=pMhcDxt$UpY8lduFegpiPpLGefT*dSMRJJpZXm&v>Xe`2p^@;@xIJ!osFE-e z-a*dbwmdZw{=Hhxzbrp_Fc_9I+HnHg(Pl4Cu}J3`$%5_+#$e!(n7aPOx*qvAV|75T?1a=j?u%T^*RZw6I6DxxbigQ`EM(00H)l!pdYax>z>N*&)C z<#M%*(k1sXz4;^=ZLpe~Mn-X!t6*!7Hl`Wruq}Z8*Y6eY(t9H-M;Ew|m9@Knje}6e zZjLE}HShtA%*=cmN>*lcK+;B*f}=*JvrhV>spWKHM>dM1bDGo-{Q^JP>;59YOq&r0 zW!g+bPJ>Sr%$e+S+g~&N%rFl9jJW%LemZ~sEWc++$EJiKN@oyXW>e4M;lZ5JdI zpgx;($i}gb)Lk+?jS3-km!HWUe2%BoUH&N65hd7*0Hn=sxf#|`JW^6mGYR@9DhY=V zhtY+W`*4VI7=5)f#3Hnr1BxR4GfAhIK~*hm5>#8JiK@R)Do>V=!@3e2$~{2NK%4sD z$WEWS4VPW9_6uR{C_^9oCs9Uv;p~Fop*~n{#*mm%rWo1jD>nHkl6KerS0!sF^N`_o z#0`7aaf3p*Tdt;Hi54=iV~M*WmOv%4o+Y#_Jt0e^c}>U{8n;hEYGMt-FgkC`!4CJGb)+eJ!apZ5-Hw6b8OqVR9Y?9_GEh zftyph@abtSp$PY7ff~El@Q%8dUD?e&C-(pienWZ8gzRs5iSEi#am<9Q+`-*=s)hfR z0?D>KTUw^eB6qaol(;`sB%1f{lpcnkg2U#KJ11Qn#*PU7eem-|an)EhmVDh{Ck4lH zI8!g&HDv2=nR*d^8F`z}$!HG8aj2KygADcZ2OMk$9*-F+$x%DPQ2Qgm7@(c9+MhCj z^$5S(pAEoH7OwvzWK8X^yty=%1PZd4YTI+|Nx=oYGhSb%?I;EQ8>9;U#+ybO&*MfT z4dKH`m1Qm51lwBAAR)&1=l3xD~@zi#8 z7t%%K&-96UKNyxE${{$kN8uaSv~2Fw4g($otm+TX0IcedFaTCcab49P$y;63zw)(L zURishqpg)8W{Jfd4sk3|7ak;HR*Cu)CGLV``V{S5T9@L+rYZ@eyw}Sad>v0MUH(HH zH1evzlki)KDj$?Mz*&Fbp&W^^R&NR)7tH|o?Sl}_hs_3{BkjhLu z5L!E4Ug0r3{Snx`)e+f3^>^#i2U|tSR@yWw(<-eruD;a5GxeoX(85oUGk6qFweWwc zzAjdYLV3`_QM<@^+bEnmak=4xAT{RCy=E&IHq}Grp*fD zO#S3-Ef_=f)X#}{vDfh~E5^yfNlc8*n=YMDFkxxqW=o@ z&^_P{3g(Xzu^4<D_!FDL+lXlA`@6=3#_;Q8p{bvC#%DUu#_fUSfn!NWc9GKL z&msBXc)$gpQ)Y$WM7`#NHFC1y-Y7KoBZU7GMlSKF3v;Z%H~LHpS+u{KkTbia5=MNTU`A23WQbX_?xNEle-O>(T%!JF;%WtPE$kXPNxaDm)gTv)EP zxdJ|NG5Da%Yu;p>n6Z{~b88I*jC&F+o&!1r)MelezC~rZnDlzuU_qh5tyq}+1T0#Z zx3EhR_^KDaRq?&>ZRQMKlBB@a>)WGv29!mLcuexu#+=R!BP%W?2u%AfoM^A@*YKzG zA@sYLxrTm^u_(aw_cB8HO|*%1%-v?x-pwc1?Ar64Jk4B4&}?lc1N{ZV*q~)Bv`O_d zf~kz5AM&V6#w=YuITkuwY|0s%x!sL+C?sf2k_=|@S_x(uK$!SkfK-scHhUvjArLxz z%J4@pI}OIYLj_62x?p)1Y)%p^C@I?iQVh5Hv4_of+Y3Wwf|LtRpJ^MHN$?Z!)^3s! zL=g$lr159~8Yd#ppq)g5xjgLbUk5MIRUE2vuUx8KA$RZ{Jljg1k7>8=VeT_#G$0SAse^Jy zJI;xPzv6KcrlKT^Eb2Rx?aIrr0X=)a5`dQA_hEJWjZuL*C&EQbA(P;;`G0~-?LC(3 zyk0tAVS#-`o?L0>W|ht9iBPlC60I9)b;M!NRC}*tIchX{{)?im7ya;3wWV^wc_DQ)LQ$1;<^%X2ir?3(YM7$p*(aAo7~ZkbL;B2)nBM2 zTfB11I%ZEZYVWtK7xeDORL!sn1qnU@=ecz_*}aMAsm;bo==mDUefsoNMk1GGxCHU_ zEOgSxNIMp4$}?;4;~iZ%QAfIPay7~C-1Bob9F+IEKSM?io^XTQy|m11nHKi$Gi90F z4&$cFG=ir6{|^PCTtb$?lU;9T`B}}?U2m6y<8k3$AD})d>tj6Lj4RvZ@&1Y6NAs8i z)z^%H`^fY2@W<9w5}wc8&4kmOnQKiMHRf_6p3>nSxZE3Y*U)do>GNs(GnW8+AHU3a zT{0yzHf_kggG6qz{^o;tA?>lBruh_B&=D28zSkJz!@#`oYM#MYsj5g7ECbz49Pd=W zGSJNhy%Y%>#odDM%GzaYxMTte7@c3X3>N8I61}xDvwPQ4(*|A9eLXzQvXpe&dbW;I zQ$S#n;4%)RBqjaL)Jaq4Q8SxLtYv?V_126e&*Zz9=mdR{4TNo|np(S0p84<2{q+}wzz*?FU z;mXS)=7skDQ2-L*N4Rf?lWh*SHAND&DI-x!^a_y#kW6>Tm1@_LN`xH!%czihD?HY*idhhG-V$OBG7hccX`g3SF96`{X4t91;Krg(3r|pio zQ0}y-1DnmK+C~eeXU}GlQlsKT!P{ZNmf>?$!2>TcE~tGRKNk2p;V`{=p zK+GKFWGYv&NJrZ&QTlT!LEJG47uB=eq@MNR3Kq=JiAXD5L_{gv4>Y2pxFkbWGrkx6 z6_T`!9O(3_R1zg@C9*EW!9^~?<+=>rwABh{rDEE89aDcdZB4;NcNrKZjrY3m=3RWP zHH(;s#9LZBML{d~{xR@DVA})xYz7X<_U*m`>>Kt3k|6E3~ zx!G4)EFn9O9HVkC7NbU;uD*vbh6zc8S99defGUQM*oWIt9m~J+TG)Bqi(N*Fdr6;KqO27tl=#kMPU1GgV~7OYxkY zYi#cn6dQ~4_f&Mf~(QHrk~4Neh`UmJ>fhC(Bs+j>M1R zjAN`cA?()?AZ4tST2B0InpzS+QnYo}~7PBzv&CK2G-B4G%oT zFC%+Yi(_~W)vbqsR?!WY3-5hP1vME|;cmZ%ocQbxNH3$LfLcrD9o>nQKP$eu@6r2$n?u7KV~@z3!5{aJ1D^0g&=dj3+LwQc3I zkdyrj!HIoi`hNLhC+p?jhC=5~&AAb#;69*dyKGO(L&?JhQ z3Y8fI+X3gIW$x4P>C(LsyO0k1;}MM(jqWth3q?R9Dq?5(L^Mt7LIK9q#d1KKsEf;zx==joqC{P+h8zPF+Vb+kUGQ-g zv4S@dQy$$_?&Fq^RfI_2$5(Bof^=GlnDmy63u~l*$n%8}q*r`L`dxX0^u{lu{m@WK z`!v32Z+XVFS8f^F>(eyu654;sXs;9;?M1Vc_Lj2IemCHv{qDFm71(IMikGA@uEt6R z%_bilgh&W(m0XC&$ETn^MNo9F?70`uU~k3k9cWohbNhX^xt*I2_GbN}r<{MB<83qi zKH9DSP4?swGb{5!$Y*6ku%7!xy7qJ1uWkc(J~Mq1+=p~8-dBmoxgXPi4*P+5|4ODz z{pV?~mqnM<`wT?cUqOJg^!9w7XMh>ALf3>o>Qg56(WGi(AB}esbfDAUmBq)PP~JzO zy}K(0-H?K=N<_;)gjIj>OWt`6{Vm%@*w_9EvX=lzm{SJjdZ+hK%THfOCGi7 zxg>f?zV>%H4YhyZj22GBYk+;ZX8+Y96MM}Kxf9?iG~mmAf#}lQYnw6JfwJ1dVt1pD zC4ho1bHV0wb9Kw{c{bpODPNS+F#xf&Yk~kWPlnG#_&$fvgdQhL()VW*>(@;pR!X0{ zUkhC;J^yoaSqaV8{v~Qio*YOySd%X6PVJW{t?tx*!Q6)0i{`q!wf}AJ9kqYq7D9co ztU)n~6ra1b1#ow3zdp(1->Qd(+6&6c?z~Z6Uykx((ZTW}4cvyBXRgaDXYU=gS1d1m zxxCo(Q(gkNym|+gsx`c*9Af5WOZjH0EA$R*C%>1oeq05;TICKl@@#AId^Re&hu2u5@?axxQ0{2Q zMe#PD;*rv7uIx##0Z2)E#*-A`Md zb~8Rlme$%##dTz1_p=$Y$f~=b+WM56nY0*9T5WaOth(F%7nYKxfQ7kBleOR!99wmF zb}O{zD@%>L^3zpTtXJBf;4ky5^3!>;7%oq(Md?04onOk#2UVGMXV3qP|Gn1sX5mGR z%)yDy1YSiN50mbWgyFaz>%~y6jDNsZDLXucrTu>^qB!#-s2_yCcI^_(`=BfRF7O~;(!YGsn`vGz?T&P&2 z^hP}uXA|sar-#|EZH@A@*8xCCeQJbrXLnm|Gx7MN8N)3y# z4J-ClD~JiAA_oUk9v5U#ar`flQcrTtlj8alUGsFZ65=3!?9YjNUTvx2K2jLMnLl z!O_J|*|j>Xe&+7ymuV;Bwz~V9&ZCd|shH(wK{sxdBvS5RxGJ3+Wy*rP4zfIiQNRXD6g3uSMTZAL{7SGCeBI4 zaXE32`g44gb<#aHSy<^mU}5e&d$6o9Oe1n_-A0zu%lA1@+}+;9VH-Ut!xgZFF~fwc*jF)PEyvgPa&2^Qc>g6l{y)=(^$oOWWC0-F=8opbsY zwb}nI!P~i1hif4Br&`L*=@pQ^i6$4)XHHURZ!Nd>7kAZFCJDLC>ImSPBD>pe=p+Z8 zLHI4{3|@x-z&S)txm8D|nroZG4jdEb=^w_oY09?CQmCoQI%5ywCa*lF#;Fz>>jIu_ zb3A{h8ml&?yigwPbG$*h8GTvBBPHp}E_HbXAA;Qd*WQG2-I>A7l%2z=?*Ug=xbn>P zk0R5Sw9l#@jmFAH=ycl4ZDps*?fN%|O1ZX(q$5HAJ~TeX_L%JKGCtjgNVNTJaasxs_R)dP!oppp^Wud|0UGmgQl5o*c-^@HR&=?6 zaC7>kxgtnI385~ma1yNW>;%;FOf0}sUg7LWZDPjAv95^Wl^bhSxr0l1wqeEyMab@9oh0LsE+APllAGyg6tB%$GFow_ zH{ai?fWLGr^d~ZBh#vi)~fnu zflj#?wWd<_xN^z0Chq&no{e-EG}n5;IHC^gOmjpXP9Z`ad9-sZN^a(8gi)v2H7Mk8 z)S#MZP))8u0qlFX)u>29FQ<0JXxu8;v0=F-rIA=IGUKlCY-Gk=+I$Yf*4p+dhKy&+ z!thojxjZzal}r7_*ZmoWt!Bo3>2SY=RJ9}*XXwLW;}m-mR!UU@tn-c(d!*XuP??aG zSW}o5E5!;Q%3aG^aubCQeZ;DLT|%$ZT8Q)()Kc1Km1lMCd8rXq-s^OFr+s#|wY-5= z;5Z^8@$BHJ@eRW%^=-N|BN#562ItMK2@6E!9O)iea@M}eb27R|DLC1GJPlG&h~4;g z@jHWGJSPzRR7klSFCU|I&f`1&`#dj9)N=RnlWv|$FF(y8PDQrqp1h3ARZEZ7`nCSt zVAlcNXYz3eydcvu9M%C&WneT!O2zOPWYzkgYNp*2CjtbQYpU)123}Gx>fk0r zV5IiS@ z#dC7G+po~M=i4kDc{`pfW=r9C&I)T3;|OcQa|xzypL>&-%DCB-XtL5F6ks?zLTrgy zdF#%prr?O-VtWDWDTL;ybE)gG{Bs8|*_6rfj|ds@Pw&9q>Wlk;Bz-Z9LyMzDs!W%@ zD?x%I5M|LBiTHHHF;usBU3{oL_pcit?nY?%a1R{uVWc#%N@+w&6T1_ZwFQA#Wwz&D zJbh+_W7SPuZ>J=+Yq_`F!QFXk*Am4!?9h{z7s^AsmU1)Ppm@oyr80_lE$^|a7XtOW zmWJh+-SJta{`a3DYpmKmW0dR=FRj1VqxYPnW6vFRg^6}2y^*8GYwNh;F1`w+Bb^*! z)ql)g97=I2u==i;p-ni#bY!gXR_MCT!xS8gphQRJaZ0y}pL$ESf094RlvThE;+NqG z(KF$R1H}{j07-aazx?A2hu9I(B6NdR@>%A5S0~Gy3wJ2lJqY((z3)e)=E8#IJ2Trq zfOjuEkY{@Gy!ILc%FB+F&`$`0f*aQH7|Xr7k*D_6;-4|$+TruQ>+x_&x}1}9>&5K3b%$G^bL(k8ojIMZah9DL%9y7eb4R=6ZU~d5 zvGeskc+uaDg`RQtA~Y&=JgUB!iZoJfvJKH!~)(k~n)2I%4K%8|64d zIUX;Ql4gMbi<}Fa{KWvP?M;DP7p@dMLwCb&?rP<2%uz~-pBW@c&3 zO+rC!mU8A?1elV7MuNFUype5KPhaHN*y%6MjKthbZiboZMt!moJWInT%iox-JS#JN zO2Mh@V*I4PQ~9leA7#@w?$3D5adgMVS7^g0GEMNk`00ETCK_|w@E-q3h_I}YW6+iUn0MNzo=113+k$cDh(6Ejm16%865Kyl!=LMz zN(K!q0W4+9%lSs1y#vQ7!#89z+>f)nv)Ji8?ogItuLAydEs#? zL+}^!>DkE(k59iC7M@^VoCj_WK2E8sSoS_qApbD%u8huLqqmbmz(V$^{!M=0pfAV= z1tyg}ZTZKsl90)&%JIh{K67S7SXF0q#hGK$M~f*ZS#HOJDTJY~sh0A7pWMayU`tNO z^~}i!ZG88X^16Op{#Gt+v!rNMx!>kwQVQNlP|k)MzU|-}(2XR3`2w6kR&4*Xn|LB` z^hp-)MUpOBd37;Z2BhsR!k#2jerIG>TW+*cV>!mLy~aY)xA1be<@$bWL-^d@UOqTN zJ?E)ZpUBng<)?lhSgXoD6TFjp-6HRwOs-we44i_)(N?Z_LBYLSEf?+G?+|rLyt8Ad8Bx8liyAc{=b4vglJgdp zX9?@qb4(id${yIE6S?pBEoOCemDU@-7~ZbUO$3X>pW=mYvhYH|W$R9S#{r0Zp#pf} zn{oU_kbs7FvFhR?07+d?Ak1PIMZj3ED&r@ujCmD8ue4_o7HP{EJw3?PL3xyQf7U`*GV$gPVzaFd~y#U8wYNIo0<#x+I3d8Yj_q$ z3%3Fs=p&ksF0rYYd=w9tvMbtE9G5bX@s7yu#BsC3PSsMU*mrFj-_bQgJLe}dINIrG zTqZWnM92kLMBr$4erW}DI_sL^s(Hal4KMtdf(aMbl()%1B4wX){3=CGK@s&~@gmARH(X9McC5o+)pf zI_3TZVZx0(I77rU@4r@T_n&*Dx`v-pVoulaCSFa~a2dS7IuAXIe9>=v>FCbo1(shs zcix<9IA7}Jz1JHl=SH|~?LJuJSWzO5$>6Cd`3GC={?+bTm%$+wQ zm;0v8$CP$U(dJAV4E>bfd^}N2JQxR!I72P`G{Jg`K-~d^&+^HEBA%{d4~76b?py zE?{Z799+bCam3x?f)PpxL`9Pp$;u8{e6uQW(9sSllQ?C+dsQ)oF71^t)U-d@8PZQ= z*WVd2v5i_8O%ybyB5FEpwRUQyLt2QlLzOL735-8ozk4j{KA6-eRj zDDg*(-EXlZVWY{xNDMRio_a(CqQ`Slj6kV(7yZIFl#4cV^R|)evl`djQ?MP@uKv$c z;x5Sl0D=1N;v?^~RM#AQR|v1=pat;o1+DaAy^0h>c8Tfhq9~6OB^&C;3gu&wB}yWu zMC`Wj(3ER~_x0z6-&X1m>5=AhCn@wSjr<bd8f58WG z=heX#R!08o^XhN?VD7wlhkC4MHd#fl_&q3c$>G3jQC#qyHodp5_0zaH}yxioa1b@226gSM0X4);TZX z>z@-k{FxpJhC$5N=J!)27xQ%rN%=a3)$?@D3P+0=Un8n%SHe?i!UFW}Q@u(YxA()^;6{CmXI zG>Li4_BuyB@%h=B31;|x|Ec&LK7SJY`Y#lpJ8AC}v^A3Z3)rDU&NFZ1sb_QO{Wp1y zVPglIfQ_Fg@Z@Za9E|z(TjJOGkVxbIe;FQs=Lx?q09enj|G=aF-NvtLkq%B?$IJ-7 zD*9CXs`Y>Uaorc8!x!}Uryg@?Q3=1A-@lby%&#dV<<}He&#x)m`1QcCd5z&K3!Wen z1-8tMUl$syF5-z4ei57;tJcSwB1uJySk+#QRTrlT_YN!)m%dD}|1&P#Z)hPTb|TY8 zzLLTJ1>d3$bK5)PmBG07VdBE>f$W4*< zjAgsQ6WLz%^VWs=D1&rcgNzcx=umSCq~A&hdbFR}!fH(Waj*&6&m18)X*WPQ;`Z}x zwVxGH`pEf)uYd?xU{q{4D&|yUn26_$QR@wGreyogoSo`*C%CR>Z?YJJvU*o+I39lArT(-9uZ0h#5Z=Mx%uT#R`Wa{+C=VAF2L! z_iXJJwW{+oi(89Mvg^7lqYZ9ZqLbr5!4pKR&US7v%!gZ8`H*WN{aby6a9mqt$wvCBkqwlBt6okY@nf$?(kks@(d9PHU^mYfNi% zunAgQ4}qs>ZE;(BSZ(bMQCr*5u;}GUTRUo8TiYIw$;MWSKK-_~Goizs^w>dtL}ziw-nMQttHvi2lfYgx*Fv~X71vgG4hR$WtMkv1D) zO&UQy|4CCkW@s;KN}8|uYsC0RX{(wq#ifW={C<*JJP)8)?1=Ns z`{IXj&2zQ9vdxouzJrZvp6NW_c~3CUe+_9(-g@H^LhM@KSu#BkRWC-$Ng_O0kAw8s zJKMI*kM+*9ZKaU3ZKbgKww1!;wq=kcuQ3gw-ZMhXGPkyMku`x(b%TlpIJve}A8U#v z6)kF8_G)cQNpAEl;ogBat8E=huw)#_cwkszAPP0a5!r5MZm z6q52}3ajVI6mC2Tbq$i_HHLxeJ)^*ux$)!&U>*PC#y=l)jClr#ImWDyIz_sQ7BQy1 z8e=NSZ0fxOSBX2%B5cB)(_qDTnmnz!^ac3%<&xlqDY%?GmF}AnyO-hvG32If!<#ytW)tU&7nkYYLgpENQEJ$LI_V*=VfX zlO3r|#3GO85`vHy4)VcxTv8z0?>$PteE^pH#O*dZGGQYRtm$bzclD5SZR^Jv= zxV1&rYYmd*HKxtfdq#mRb49QCUr;-&_;c+nat^vQml6R zAeartzkZR7bD~!R3_r-j3qNGf5A)3X4~X0`?_A)q3lF&e@H_?^`VWBZq)yme6A-nD zZ;Nsp^d84x&cnSj1&l?Qm3DVM#`)UtPPcehv(K%(f^W^CNaxtnUo;&;+3H&5cLX`* zg9q`q^KQXcskWs_CI{2wT}Lo>lz9ek%%%_{vYIeA$oE28hATY#9iIRaUT;x1+VkTI zaxMu3_X(LmNo_J54LcjIci=pNU;H+p32F#u>2+vSfi;BvdBqySO=QBpuKHt~++`S; z$s0S z-LJBwwP$rPx-oYp+E;*I5?$IGR%!@QTz`#yHLkS74(o5XufocLC9uX0#1;D}LvFDK*y^y~ zJh~SS?QZr8Zv!0Y{HpD74m`!1E&ywlDyrpeby#lAsG_D|r-~Y%dDPzhIWW-xzl^TD zc%bh5O$lN@YJB|#yqejj#^G%8d#yZoCJ0s0#A_{<{QVJt=t*x5L&y_TllHtz0e2zH z@Qp+y+<;}QKKAlFmRP8mK7FKSif8D;2k`ru)aAgJ8~+PBKelKy4(!E zDpGVRaHPvLHsQwt$GLkD*5si;7PdULwVH7Ndn!J?yjvG8l{KgUM`ZnTjuQ1JLQKRUi| z5^~-32%FlsdEwH6Ui0x*4eeOr)`n{g+{$uFC9Lx?v^xx2+ z!_Ep5Y%S(hFY1`rK}+j7$-~`ksP;Pm`Z)Jebd$~4PpLgbRP3j?yV!0kimeQ-@LNiA zwKIwPUNA5E++kU$B8BDezU)YMF-)Ub3kr@R76nzf+M_(&Ysr6(1l$1wY3oN9Qi}6L zLtQ}eUAcn~@YDqq=+ATyyFd3lrw;MR!3P=FlGjf>Mq= zvS_l&E{{;&!9j_o+RViT5~vQVrrKi)>#*V?h^>XyRa7Zf{P5645OOn3!mx4|LAZ?K zqeBN;EUPS&G}j=?(R~uYUCLJUS9jzJO(#XyvN^8^&4ck7M?A^kNr?A5SO`OfLUVHB zK?|$z3*jM7iKxeoSkHN2r|)&j-z0N}Op?r#km+p8e;Q<(Yc(~p4BZalvG}_*q3D#8 zzN1r3?ev#)sSg7|YfH^W2QlQzKtSi7GNK9J$$y;=L)ISW&DDF*p;~@~N6-3tPEeR& zfBD+s`V4346vQONy;8YNgSbmq_zo{?58op@a8#*kPq=qA!P@tEOcycTaX$%Se}{O} zL9D$<9UDHOVG;@ljxLLI?j8Wq#{X<$SSP9YRo-R^3KO*tROzPEIOf(Y_qmP`bBzYH zR^^JLYK(heE3Gxbx*j+M$A>}oI*7vaC!1Xbn%nF6E#e(x%Tz)NKNom>Mnv#g{0>K^ zpUf}QXG;{-_1SyE(cFE66#M~R&4qc(J3Rk499QapH8+3ZLl2*@+~p+SjQ) z^kncrPll(H!AH=fxDz0V&N<4v6zrFS{uI%KdRRA{`FKP6F!}teTZ<68$Uja7qfY2Tf%j>D5T){7KQlkzpFlyi~)sCROVDS`Z<7+ZuBpB z<$RS}^V$|Ve$VKk5X=>6=Q(JYJA&VB{3=~&)LLvVU?xcIH%h5e`z_82nXZ7L4HOEp zq4qm@d*QF-g!-_yQ2V*QJ1wEkBt`R2Oxg50V?HfK%mVeE!_^7DSDZ@i4>;Ycxb#<_ zp}sb>Mmdx+iO(C8xC_d)(u(0eTpCE-r;8c!s&bb7)fcB&_AbTmETR~TYTPx#mP*F-Gdf2nuT*j5G_w_-lu zJ5a*8_>TaSvA8x$qGcMF?*j5g)Rb9i`7;6iedBnLc&*%N6@cKYaL;qXy!4U4yKM7*1)(SgXXd~Ld?plz( zSU&!?MCdwZ=pPt+;{1}^Y& z=YzN6vbM}~VQ`6HkwH`Q$R-g{Yqb}?0xDjZn+-zPgH2apsK17sy29^Me|i7!qF|wC z-VjFk$U@sbUO0nT0S2I(yXWOGQ2GR69MIn$e`~+%K8saJ4timRp*eWFP>N}Gf){$k z&+E=TyK&QfQ^AWx-#mUvSho{4Q}~Uk>qf)z2jDoclxQ$et(BPIQB>kySi%V|CF5F) z;G>0YRSn$TR6zDN11c6m`K65NP{2ze5Q_<1OQ}9zLA0WM*wH?@hXcMK5l| ztPU`zf2%_z^{ zbsEjstRbO+>z6l8gORsPivVGgm788+uRMjkfzGaVWGhDq8Lu)UbC#!-7xO!5=bVBg z<5kpayq2SJA;#Ip-oc|ftLuk#$H$M1S32>6S5U3fT8_KUU_KvSxPWJLb-2AsYB2qi zXOoGEXcjJRbn}(3LcMBRkp&+Gva8&Ej6fBNO#zn4XeOD2xtEMpAK1$AAyfO!h*NH? zo`umn#kN`yCm1KXB_AQntzWgxpRE^1ma zUbr>TzE*OHsgX%L9i(O&q}D%#uc~2*+(C3$ts1)3Ab$;#7?ua5nvk1mkcvl5*!qVx zNEM+zV`U#TNGo5u+MyfdBB3Oq;BY9`mJ%Vt0V5C4r+fG`!$BT0@*p?E4TeK8;)WzQ z*CvZ|TZh|;98oJ`+6+a+v|MK7Ox!i}9Yw9cGd2;=kVvZ>laT0}#F`F?W_nHQui^03 zlJ-(|~Ks0lO>RE)f2^&(lFjubeA41Bn`xvOZWQ@tGYl~%Kh?p|I8ZBRBsHWwMNvQT7 zEBbU8tGl7xqzRW5!4Q_+i*n;ehrKPzFxFH_93;kjk4}v>Ene$zi{+>0QC%a6wrRw* zyfF#lj(XEVJP+RG#@1mjWQO3D_ZgGr?bbCmo%hJ`)8VuBMhtIS#&kR_+CZ=rtzBao zB<*-o@PsmN2-$Qwzl_Y2XozH9JQ8#B9?UW1p3*pKSu~E?fsm->^vY>icP>Mdp#twV zqSfeZw6L{?QnxbHTXL~{eD-0wYuhV)sAq5+UOk1ORS3Z@2dV_O17qaXWucUIF;Ek3 zE!m<`bygu1u;OE1xKQdUl%l?jF#V2$?w!8Rp@_rd;YOH7f&@>|q6yzu$@g87FDt#w_*6O? zZ-yX8A@oqxC2*Az$?ZZp7pI}2$^=a{Y30QBAg_5V<~pIG8^A?a8lnYva>P{y5f!?@ z%E1WL1)yaa-f;#Sx^5qrv!Zz^3%CRKhy}tP9k1C?>Gc0q_(aqH<-FST-*DQ6c7Wvw z=&2yAhcsc#P79(o@3&~!al>oT+<>umbFEJ)Rcb47Ry;>IFEmIfz=oEAox#7g80^6+ z$I3hLF50~m%;@*D&9>|<6*HTHBS~@Pl>}>g{4VMzV<}~@RCGhU%QRpY4TjzgLzJwf zrl8uhxBGCHT$p`}9bA~v!ty#QGLMsu;nHYfmpVAM4T`m$RUYmg!LfyjsK_b~GFpyj zWpm|ZJ)p&{2dLDx9-ss=>jC!Z=H<;Mwa-FkqipRNa3X0{%%63nz7umb;@=xvj( zJ%J`n1TXxWO}c!iiGU@QhK<1$qQochZL?^nM%gSo`xFTxpC zo%ZQpMy6Hl;#hz;fOY>rST=R04ED`}54tA?_hiAhB;ZN}mO4rQXbje|n7scW*~@*v zx$c4p3iLj{ok^C=eEN*KD^svXrJA8zND0d3=xYHo6+RdzxwS3}v)ja`8!oN{$+5$s z*R$|Oo`b|_b}Z?czZC6TZ--3>(+Uaj*ODl&HB_F(3EHzuY zEfrk{bA$m^p=Lt~CSM~aKN4_KoUVLuEdiX~Vy5!pV!_4YDM!SWGA8q5Cd&NSahdlk z^W(CalgXc1$?aM>d&X!5(KaJESb9ifKI2?3pssdgvB=r%Jc)!{>$_Z4o)l;~EO@f~ z+J%1aK&V_#$>xey{vXLTRr5*|zjmI3666@guj}%`p9t-Rr;ysAcMd*SH= z%;a%9J{t}8Xli}=x>$#EZ! zO7v%sasvV3jAltmR2Ri?XUkz*As#*#&lRfcP+sJt%I=3;8=PA2 zUOgt!qm=@&^k@f_)M%v-#&O{!%B4-a^ed)Kn@z%bE$Dw#UZz~zf7ZR+HSl3Fxd=W{ zX3?0rsdhCV<)*&Ntd8^%z-yR?N5@hhAK?+b+R{#@PBfpNq)v9R`TW#%0z%5kEiwwV zI(i!Q9LoL%!^N=wtnpDp-xWf;9Bss3Gd8jp3KV=)51a0fF~jY!Z>}NWVveHOu&CWV zjOqj&B@e03$<3^Y7)LoX+-zaHTrO%I)>SCQa1|BRcYteZdaqrl)T5@xwSgpSkf^E2 zj$?4Dn%c({E^2CekD8iZ*FRw1u8oJ-^J#-?-3s zOw_=%1~Exxt~I=;uFSZB8U7PBu$f9|t}E+=4NSD5fj#LOn4^>m**g3L1;lD&c~x) z(f0`+S{t5g$TCGYYu%Qoi7u>lr&IJ4oJ`TpRxV{T`*pME3cC2s;#+zXg6sW7<~j&HVtvfPc)?%?;$ZjqdI9c2sk^3T(Yl9@6fUn`uspM@m{?)XIUwD4U~M7X_`E zbvQRU^$|l{l67g5mVeD8v0-8u)NPQb;FQj>KH$^8O7?<<`Iz+&274G_g;K3_pTuP@@hN?7g*x+%dXZl9O}wmQozt_gPbXgrbR{Db3w?!N zNcS^}#oYSsZnP3!DwlgWY675=ZQomYo&IMPa4WCkUTki9DwJN1j<$aaBdBIC_+KU# zEtS^pR~JhgW)^}^0dd)eDIp=uIvSviYoYVTfZ`J8DX9?_Sre7Pjz*5b#--jb!H&G z1xwZ&VEc)A4?5f5j522K_Lv@o`Psht~u`H3R0_fr2FVI+Alt>rL<*o`( zq=kmJKO(CuYyP0Krl=`Vq-!Y@BkAFWKU~-uk#oz|GK03q$zb@4;&$#WrM|? zUI98CCo99UK%Uv3b}whfv0s-o&A_kZys}6Y^P#xyE-LPlL~?KxBLrzDortxQhT$dgkL5%T0zzTz@pam?-aCni z^K%6we>z{;dC1`W8F1286K{fg%zL;T+ai)VY7AI4UGk0Xof_F6{ zOkr)z7(h?!xjYncCsgb^sV_G(?1Zt=4U^tAaF!OO*KO9kC~aITKo#;9bS zN7^8?JCzQGq^6`A%bmoTvBa4zP-dJ7$o%-S26!=<_xgxBG95~iM$rsZqpY~sP^Z`Q zhN9-C;(n>2Yx`a-&Nb7gq<9@9-!|@P&Ag9TKWpT(7*+ad@NUG2e*vv*C~j&j zpru;=UwAm4c9bv`N&s$MC7UZI02d>d4&N3*nC~(3ICSG<>SB&uHlw$7Eo4Hy$R3V* zJ=K^=W==uRqDCsfriMf^^I>0Yxi)7|@Ah_26;@(6s&fkqSj!b5rD1>W5 zIDWb;gx>Xh9D+x_m=qE@zT6G4J~UqnSJb@@Wa>(qk55mx+QNJ&O%&zJ#Qz5PL*J&e zE=m*^P08aFWQ+`c8Eq=k!rvT?HbgTYB1WlDYFc_kGfVh&E@BnWXun;(@9R=%8rrMFG;!V5xIT{rE*4qNLvkRfi|~Rh zr=mLr7k1g<>DIHK9A89pH0kCc+pw>9GxB};v~s4K6d~4&`D&YwC&fAxV&&8tp^zzG zA(=9WFH?;=xcOaEE+mCkIOPSXT^cOsYtuSEXF-s5a?ma98R*fclJ-mBg|uIW7uIp0 z(dB)C4!o1@2}mt&X`4Pea%dLEl%waKTL3g1{EDX)47ZpmTyD4JVc z;jrE<6dU`)!TL%1M-1q;w^NX`CqG>ocpii{=RB3MIagSN4u6i4hwIQJ(6p#V>?} zK)2mL1+dMa@Olr<<7|#!sQ<)dFSi$n?S0(r0zB-kQM)?xC8~>P?ms}59WuU?n`3+@ zSHHPSSe4PF#wH;svUd)asf_rMnVh-&fq=lHTr)eJsIpNMhpK|CdkQj8Ps&_9k$GIO z3-A@N=Y+9;DPRkH1#Fm31=_1UNKS;dz*oRNBaA(cKd^vj#Q4*iOf;JQ%C^= zn?EVAKByP92f=H>>rp=>Wrrj8VLIkA$oVrV8`l6C;=BPbSUJNsK@P4Gblau5pD`=Y|vOE3w*b@9^I?GPU&NdKgJ9#cHYu40z^$U@y* z^2KiM&3w0AizmCe!&pu}6;kwIH<#~FL1DO{o6Fm#gbgl(BpYRRUj|ty4lOkgI@wxc zRvkN6QU86^rFL;SWy8hge1{j8O9YavZhhwhxX^dD>&wR?*_FsQmJ!;M_K#x}`vR85 zFI2`Tvd|bs!u*0!*QJu@x4;W|ej8r?nyMsdgnt`iSn*Z-w&O@`I)67X{W0>(fVnDV7-NK~3R1q$v#NYYGPN7-2E? z6Z`wkV)=Ujz`&9);%|#nZkQzOp~N$^-z->+w`r6kw#ri?e;;v`CzPAvltHk0U46xv!Ak_d-A|3V^rOYHwZB0VKjWNR5?3vVsscd)fA8O46Vy8waZPu1nt zGQO*^prmHhgV0>48U1x@+5K>7)A1biw|R!Yheu^f&(QMQkW4we`4=*s%V_?AOzVep zqeEEl;bwC358weewLkwL9{-RpuDSXPzJ5Rf{wI845vZ1mXigZ(kp(PCrKzc7f+Dx; zSS*)ckIF4&tIlw4Df>sc&9a9gDAD&65#Wol;>GNPSyIe3SrV0$vdXaCSO8nI#BA#C zDH{$UoC3AuozvkxWfsl?vHYI02T++jhhM0UWo5GxJ0@nf0e$|t7h)g?r-K8}yA=kZ z|NSt(Z{v4=G)$ZZdIS*nc0h2DH=H1=FY0&*c z-0**q)bCHh3+rVDXKoTZ;u!|-gmEkOPl>3}ORw0=+>pzHuorY6t@t?X!UR5cs><_u zc@n|hn8sDN?v-vhVr=LKyuer6(|EEUFoMQqJGL(38~p&jLe(6D`2B#+-nwxu(|!kU z*LxKPvobWRvl3$-sBy?hjogLD3#D)eKv!O(l(?`5X&(gXtnLoB86JVQ@;1&HH=Ev6 z+$h|qJ;R|x{w2-pi-PfJavthG#LfGtaz7V&z6dXH^$K2SFEO1g_bQq>6qS zNFI$%50ibV_8(!cd2hkhoPnU}8O^;a&;R1--f2tEa$Q!&2${adSKCW?Ql=x>e2kY^ z=mD|v6%s2$`C?sEMZ9$W4S<3xeJ6qA#rPcsP2ph}s9eZV{w+KL?u4&GV;fq9%7#rC z!}8|05ya;V4cms~>^7;!>A{AL?@(hatoh5EAp*u&8N;S^zqyU)-z34F%8K9IhNVUC zLUS9E7F)JeORJyo^taN|Jh6Mb-=JtjGAnIsl`UbY(AI{;#MbUF#56~!|Gk(v4MR;S zc6X+Y+^yhkB6Dl2PPXh)&i#F|dy3d`E1tBNuQLm3L}l1wQgyV&yaGCd4Wanf>A&Jo zYl-POde~+`ze3Y?wJAK|xr-G3!Y6ZaT|>VB5Wcj zF@tj!%rdF7K0r{^Ss&wtI;#k2!^pY$7(Xshc>+J27-SaWw+_kPlt4AWmugX%~f7kuY}JcYOe6V8;)i*yfxxveklm~5o2usUyQg| zBBlqoKJeYu>m=OT7VQPalZcbHN3&hQt^qn)`~L<5BMHa6$oG=#4EmvP!lvvicogZOicF$m+%{`gcgd zpa(`)`3hMk3>A#57Udan_c*@>L>XGy7D%mjBx;PXeotJD8_C^-agUI=>A^u(zC-n$ zL>}|&J4R$}kgr9nnP@qOC)2eKj<}>9IpS2&K=I-5r&^d8=tzkyn>~oIz;VHLs17!5 zZYqZ<`~}A+O5A_X@uIB-k@+^_M&XLWn|UmfLZ-1-|_qph{~5VT9#3i^otTFJ=n7F4N2SKY>{+ahqL{K zGRt!pioVy1(d&AqRY%XE^nVaHim7a16+)sZ*gIM1!W6)^n0DL0Is|2KRQGa9MGuwJ zm|XAnrIgbj;e~!682cHn)0#_U2T;i(_5la81vEU>UksH|A_2*n$F7xOSVhN+Az zl?9jv-iedJHq?-Ji+M7ItVa@-g;liK3(=By_M{nD04Lr107ZA%pFc{Pk3SFke@vp| z-meI>rM`f6ee%-zA^(i2c>6^lE2)q`Qgeq7$-XQq%5bPNCFtL-;D*)1H+JQ*X5&;#8< zzCu~TP=2?tu}!(*s#wM+(*z1i>nnULVPKqZB7>T%j-6B3IKklWV%IpU9G#CS_Fh8I zy?Zh@lDcV?5q0kVk7KdsHk3n#41}i0tlN-50ld=kb}PjC5PqR{kz!xY?&sW9RPLbu z8v0UYqIo=GRmRCz$=e-+iaK8*?q2yGoG8!ntE7szM_V zi2gYhEXO0TtIuTLM8BW}b$lGKJnq0|lbN6!)4_Bn>5kH!6G)D3QOo+IxNQq_Jg6xo zolbTo-U8k1eDp!wOI9(?LoT3vMSQiz@TBr>2Ie`pO(-;vuaM?3h#lwA8D1eGp~E9} z1*o43I=7uP4?h*m?=nVT?uE@`#Q^%7$4cOo&10P3;$r)6MRvsS_l~`Q6wBT*36=eV zYqZKqAg9k#xVauZTu396^Dn`!&9~)UPL(`YBGagbG&fE$*zSj=A3e z4;!Gr#S6XZo_TB(;b^YVcmTDG0Du`+%(%tO5fQ_1>3jtojYAPeg68-+Kc6C*nmm&r zo5Cb5;)nY=v5cNrQTf(zSV?%lja?J;9XLw=YYi-$Ny~aXtW+{hN16(bkI|B=UZ8F) z7Gz|h4P^2uy1oGf^j#od-9N?*DC{2-zGVN{yU;A|A1i~u2vWMn9|Edp!g9UG_d=@@ z7^r8f@#?+uVuOcW??DgfDqkU8Whh@) zley)hTIG6=RYt`!@wf5#>pg^sFd8ls1!%W2QEo!(J(xJZOyKBUNVFpjNHD7Kf}_S` zeFF?EZk%cAkK2&S&7qmdLp(frOAH%i8sXHV$XD0OXEoe$$Ems>Bu{#SAo65&ypSi8 zF~^H7R4g2Q0nvRhwQ%WoX4st|_8ivX%*5)_NL^{uT1DQx3dC|NV)d3m^O~xPyfd&8 zum96fp_cd}-1v@}`Vp*+qB&CXaHMgn{~1t8IiIH9gDjB!fP${cF1pCS zji2sA@X&}g9-O2Bu(vf%RaWzq;}5=h$`+d9;_Op@zT5iXS%vY3EvS4olv|D-9Dm>& z+GovEh65$8w!li9x7cS;1|9|jBRv$>&NPO@D;3(6J~_B<-iP!eq;n8YHtsIPb)#K< zZFb!WK~@&ITl`ihWAG$Y@%TEf8y)a{bkOjn@x z^n{2HjxQ>fK9J<)42T=!Id@Y%aC-AT$Y(jAwO9^lt!qxyXST=10oBFmpg)4N^UP!t z?dhUSCNjq$|74A(cLVe}Gq2lc@3}bNB~q8}x5-6yHT~)@^40!ENW+!XYGMBN93VL-qhbE4e>G|b9Dm+T(b$KlRmUoZE#5}pVa z+SIsPK~P+SKN3M5Z=D{9_;CHoPVS9G57I1n@`VOT)^z_X;BO~M zLfm@+k+r`_Zm=<>T{(OSpFW55S)RjiHtq&8-c8|b;Cn^ z6_LD>sFQ?p@8Ri=?SmTc`fy3Wr7^eQJDPi6us#T|&a4TQ7w8h#&QHMmC$U#P1YY|` zcu1~%3`bYu6Fjqv3G1MbI{^}KC*nbINgSU7+*6oHWWNH$>lVpa444DKxpD+IhJFSo zO2|^YI!Hgrk-f5?e3-3gZ&&&oeHr%WfA4Znw zN~H11;@+i{HvnZ6w>JB2?bK+l2422Mdc!&AI#@)3KiKR8AWVNe1L#Ot+zb`-Ru6;s zg9Ssd6h_sGxK|s-*f^T&hwoT<%~RQe1A2r>0%tAav}Eh>>ZlLn zW5$(D90qDQPIxC|gte7uZ`TGA#u~Q7IazSw04+Rmp?w2h?j%Ur`wRnK98_D1ceAdZ zVHk8)8~JK$!jqjPqs2C;hrTksTe-IR&?O!prf#g?dW7xSNJfsal4?D@a(t3bw@f+@Bq8cY@YwIQ(${ z53!^^@5V4I{E_eyJ0zOh5Kiy8u#ljV8v(eYF~X4lVn`Yz(cH!i`FuDeWf8XZHW4yn zlZ=8>YPC(_=t_*n)3-_Jv%F2xk{ttR2XTYct0iZPFXX)%#y6+o{Tt-&csGC%oozz3 zu^9q-hojL?HM$9JOKgmpxeYAXl4Mh#WC63OG^ydd8xc6+VL^JT`K3;j7JSs<<6Xyl z6h1z^&B+boqi#lF*{?TV_lsJVsCQccNA;?k-2j%hgilznh`klDMWwo7Q>|O!ax#~yFPhmJQ9AC5Ot zp7h9WF9f|&aL?Ql8P6`T<86UYw;wk>x!j8!v^MT!pu>*c0WWZs+mUbDvEl$=CkqgV zs{+mh2Ruc8ov?4w8p@_Hm#!G$=YRVFu_ff?&FmLM*$p#O!#x`0ri$ z)?JCp+n``|mf zF9RVJ`{CWw-Jf5meE8*f2jJ;VqlcWgC8H|cBe)@mV5*HEc_HF_9qGzWCozydkQChY zsW>3bFULCwPoK1hgOQZ9pP-iP{Y>l4-P5`!(^~6fPxaq#^4&MPQm_>^ZH(1W&b7aK z7YJgdHl9Hx<$b(dS-6LhVhI%)xHrsz*v?}?i+@i0LikA~NF;Q4fuB7XX{zg>k2@LF zYWscNah@a2A%a66cL(6065`wr=YMdH8|pp}{t(ZhcqP1h(cDVI8$J!2_3{qD|DATz zi=fH#^d161oSuhjGXEf)4y>h@7~Nr@`^w!koncZ-@`NX=qB;UlRO9Z%WTO@pJ|%TJ zfH6ct+WEIEpwpNInWm~}ZU)}^<=w0W5X$S@Qiy)_tXXv&G9)=Zog=}YDZ-Vqu ze`8KTYbo*e=S1M>U64Rm;(f}z4e``<&?i8yad#$jLmZKHckyD-XaN$y3m#M0lPJ$C z@boUgBj8E(08Of2j;?|y?`=eotL1qOovE1JW*hEqOmSV# zE=Y6dRNQ9@C>G`L6&guo5D?LIfQ-T$4MuqKh)m`RMInW8&12xLGyMf{k$Wtlb}xRp z`S&%!JUt@TV@gv|D1tijR*#!;cbktGhAECqW78*WkewAAE0kt{rH0V@i8DlSxfQk zxvvRc+zs3d>u;lGGz5i1CZRJ+;mcXi&++!|MkbeZ;@k!BxdZ^Ld&RRT#AX4S^i@}E zU-rv-q=SALL;1Yf`e>=sln_BQ;0h6v&V7NW_X%RO1Ge2f7Q@3Izy+_C=cw@fHA0f- zZ%E;z5YJzdaNAdS7P%*&+o{E^08P5H0Y$-~y}lgJ4CS~d(%L{T-bz zqr&ul!qJcc5-MTb8(I)NzJFNm`^V+Je+qw(#S$TWJKm-kgUt5i;U6}B3@rT;ctvx+ z!kxVo1DVL#6H#(HaB)fjc}=IMdn(EdO;6fv4U3(b$mU2>r89$X?^w{Ec`7EJ8l0J{ z;YAO=y<g~nUGWP2vQCH8<3|=M?e29>1oNHO58c!aD6*@V@G-d81kw_nJ?EvI)%}BuZ@|=vPHyn>3=@{-Bf^Ww=JuGtR&llS8 zoq)mfqCsbhJa@*k(1wq|SD4^1eB(q?5-hBaITN4$>X@_W!}CU>rWfRl`7_9w{^)`8 zxTIcre#oi8XA`w=b`Zu2l zj9hzlp1gSjMk;^4xO?RJz`jaRnOpX)pP7$RN&p}X=wk@aKOXeU!||I9)K81 zl;C~dF@In%Zgl%1T_~I-FBe3uPD*bV|Zvk=&2_+Gs zYym9FodVn08^BKc7DP(tx8$oRcQWA@A=C3)5zy}sVQu(-z;(2ZAopT;R$FFycQa%0 zo&|katLc0zgW>dF^c_?Au|nf_q0u-3Lytt=7(Q6@RHISW_#qPcQADm0+?v#)bs?i@ zKMm>!l#$hYH3PBmPl)Hpeoa>dH7FdrH)H9BaCr&1966Q;Xh}vZw5!+sT$Pk#TANlY za&H3DA)$L%^PC!f9g|w*a>&-Zl!CyDC!VJ4W`I%-)m(ZwR<6Kf;<*$b*cdqfz`O=h&Z#%D)3Z9}sZ>)~3|_P+Jd8%~`E4TjV6*8zsf+w0jTz?P8D9KXC92(o#0IC5b( zL?S(U-^qzA5BDeG#&b7^L3*6tPlIN(e8>T%*;)cD4g1D4>r_cW3}NfhDxJ>f@6 zdJHn(In^2pT&9;@0Q~%(#G|e{rYB@uC3Yo&7!30|pl8i;zTp-)B_2S%hPIw7Rx}LH z;AEH>ZUHc>$slucQOw-~+1FU2z!_XBn9}f0!aGlN*Kz-Y&Q-$$E)Jhbc|TxXY5M@= zwG8<7hodWT435srZUo=D4*Ixzf@F~P!!;oew!~y|`(Z`s38>R%!2sGzlOySA1#iXB zx$Ln#g%5MzYl05e6#)f&DcSYazb-y zQlxvL(9NQaOXcgrv`=E_n@D>fgiGY;>59}Cz6s$=82)Bpkgr?tPQ>!J;uWxW8$Jpo zkgK-?&~XPIfe_a05#jj*?6yl?gFb=TBZ6`-D}8Wc?iEl3%3+Gh&&%9#`NVe9uvRE<@p3L4qP7NN%4D1o=+3wpye^1 z5x-~U`5ZA0ULNCl@q0m@FB0RBFveKNi}j_6aWX`wV+k$Urt6gQX} zAbT&XJ3;p=>Q2%9D%?SkfbyIW<>yIxZkX~Gj_72z6l&^~fl9;w5LZj~WfD9iOz$X@?4$~#& zq`lX}8H(#{u4FVvqrSkpAZZI)vY(O0f5J3cj_z3ufvv|vjrN!ITf&@)y5usP*&TJ? z0L|!24H!3)dw?>Zrx4%HXaZ7+mvSKOLh({FP>)62Q{k$aizTaAR*rGgLy>jvVSHrp zs9zP4E&mrHTK^{G{@nj#{t7~k=B`;$aNkgH*MsJi&BZJ%!4zfl2Ys`)I z*YWh;z@uSBi1bfs%a*ZS$lihKG5;1bL7JNO>By|y!Fb?6V^~=3X~>EKFzUSx)J_~< zoJhFX7lLEN{dFO=rtffF7sC0PjX=Mg^m8N~BBcQDo#m)R+uj8vjng^sau?xI-@x(f zs3|tRYL#wFwiED<_weAs^E8~%+TF(V!*1p~`zIuVv46+hjQD#Xe&O8v4TUtsLjmZ$ z4`SiesMjCB$4SaX;pBS+dLLN)B29fkGG*zK;xN9*u)PV^f*3*=*@7W-7LADyL8GpN zKHf)`T(K`qo{<#A5$t{H?V0TVGJSTi?t{(nE7e^{|Lsh_%#n>onkz)+ge{+F91Ulo zPF2+V7%?{|#olR*6qSW#P>e#LvM)F8FpZBgy$bXzLEjPkki(y}6BF{K!%>lj_D?`J zw-^s>%fm#rs871AaZJIZ*jtL6bF(P3Ixbvr%FdPM>JYBuEun~p6xZxjR$PF4pMk`X z>k0tJ`y7zY6wbO&cGt^wO!mS;8n#9ns*r~4XCO;^Z7JRbG9ji5Kp2>x11q}>5AO>+ z>Q@#|UsFG-5YGXK2dAu8VvIHO29|xOQ5(Zo>k&BJR!v;Z5$aV)IsJShl=<`};%kog ztj0k)MVL(#GrqnUpP?dH8S~3ZgBiSwmCIp-bM9p%oT7%{a6Lj|gJ$EM_ zSP&#U)}tj35HK^akO+4Xq3vEg-Q!?iz`7@GYf2z}_c5&d5qq5Yy1($%l3g7YW5)x4 z1o%21x(4znO&!h}M2Vi2cO6=_lJHtZobqq$E0`F-!l$%x3|k{%e+47|d)VF*7Gog) zL)ft~C-Vu)d;6iZd48h+2>NbCP~?$rSQBFLaLC^oQecIk1y~`hz^sTdNbw+r>fHqW z7Yh|j$TB?;Q8$mdt7H8jwuEw&yn%9mC@gna9U;R5;dxmE4nhnFXZrARieAX!Ag}gw zJgmn^^+Wl140!Hr#Nc6F#Y!M-=(RPTSUy8nAIb{xW(M-SNXifBl;WH+L$ zo&%3Tx?8dv6ZU)AjZn(K&84?Z>yeQ*i^-vOq~Mfe2|l6YkmlCU{_7LKC> ziZ>S;&kII^568P4BN(Js(_oQK4P${M*(jnEFca*!xoMg#XB?ZD7zT*{~>6I*+r{h z)}pjzcO=vAhnbdoBx&y8en#jN774*Og>&5S!n&+2vHu!VCtQpJz)YB&5nQ;#yV=nn z!AwAZy<}!FJcEx<<)cDYl;vx;3Z>+#Fzflo>X@b~`1G zoZ+Ui&-iZp5YH-1E**h3V$of)S(+ZWjI53C(CRSC1eCZs3@JYnsKwr&EW+*V1XdPRCi|NrOp>pTa>RfX zr~mSC6vmh+UHI|k`>7;ye?T-!-ouo8s;Q*?S3umeA(mMm3ocIjlvDXZc~U?uPrF{9Dq~+-Eoc!aFl5`M#O8`8<+aJsU&j;QN%v% z*WY~`adG!G&h5dGu&I@B69)n8mQLV>BgQyths6CBBrcSoO4zaMLB+C3#(5+%);$W3 zWG;z>*ERR9PvYc}Aw(zwLS1!_JUuFVxU+y&SzI$e;79e%!<=ENy$ffml0Vu0-wlh< z>JoyIxdbSACt$ZZZvLBrtHi2HD@%L&H;QInMv8HN`*hUzdKy4wsap&dG#Wkjvv#^3 zuN{sWx7Z?6sSp0y11tr~)lcF@Jy^l(2l1k&iC5{O$5Dc+V>Q+BPV{bSM$N{jf4w4h zRZGdzNHix^iz+MHf1!-qRxC}rWt*j9<)w*d*8h{D)Hw*VX;OFe%uB6-1N%VK?&X#U zq?lqaci~>W0=WB`^+=SNf*%ijdC)0o~55hfH}O#^H&Dfk2Q`sk}c~ z>0OUHJ~)O-mlKl`cFcXpSKHTka>ra7q{=f_2*r*$zCsdZ5dUl!e{-A=kR4SQh?ngMiJh-e63=~c?{6q{nE*AZV zxLJaE=+#ADKf?p^`W-LaS%YOZCc8%+hKR6S5uj-9HwN@C?!inPw26?+Uj1>x1yAU3 z_d?xPR-E|-HJx60Qk>cHQMmU797jR@3kxw8rfmXuY+y3(+abt?Sb;>=J7 z49XQOJ`c^{p{_Yr-?K69_JzBtra0u|5!4NT9RS>R2+~WT!mdsXzXLjkvtUa2l`PKe z%|uEBl}RrNcmApES zRh&6ji3IQ-khdQFffXSB1v8*r#yHCvJ6$#t78Ur@ZEzzu;pr|F5LQWLqA7`_uuuGM zNC;LutCL`N@epJwe-}_LDwew=^VBX?jC4&=S7J{n&~j&dRTozk+jBp7eht+wT3MX` zgYULq@T@A1x<|8gO~UbQ_{M=OZG4A{7XyI|D=f4Xa`v*&k?`G4AuWKrpZk$P9&V4{ z6Zm01SpJ~YrV;haQ+R)eH-=_|KeivJ!R7qoQ2j%Gmn)krWL*GjA!8Za2yM|CQpWxS z9Ayks)huJLfnIhWEn_&B4T6i}Y0DT6az_~>B{}`GlB`Qs^5dO)(nab zKUY;sD&e=XQWC&dQA(;Aj#}6Q3^a`_&TI|_P-X&n1sTJg(p~9N+*u&ww{o&gW^W*N zFR8sqtE8&LeFCc3v|e%MXr&dvp9H+Rw5n9D7@<(4j6x^4lUFBiYu zK8Y**R#t8Ux!ZEvp9EQM10RndOZmZovMsk%SXDMDxBIT7+?G|9h085fIa*nk$7&dq zTa=+#Raw+M#xJ*oR%5pa-=T8LKp^9n+j80hLPx?^mWR&kDS%fjx9g)Ua-2R~Zh1E5 zDExRs(DLOrg7Vh`zfid)zkazrFX~nyTQJKK2M}vv67q`gluzn+5ndR|mB0dFx-2y;- zIu^e(<{TrQG8p!G=yO_y6HgD~($}1@D@bxnr2-rbkn$4Dk|b{a#kxe&NKW4=&v#=f z0Hh^fNx2J>d-?dMnCd+w+G|zh z8^1FA8gW%6#q8{qYQz~{i(JmOrC?5GLSXESSAo@7fiAoId zxQ7F^X|MK&ab8$+AGeWlt^<(VK;X^;#~t))e`uxt^XX4736J*UL>Mhq37ITvDidk| z;#df9-n>KmdX8mQIB=UVCg|cGl2mn3`<@d%93}R)1($j_Y5#K|9j_+% zt}OC;<6{wa-C)$`Ui3>;65cwozclqB)+2 z6wi5=O9AFH?K}ffB~|R*4uC8Qaqod_n#O8qU&NasIx(~r+JBH`GxW`7tt-7Pa#>p~ zVf^U?GDB}b7UY)`3TNO~f@43lbpaTOkQ|F2cKgAfFNBS0i;# zC2)I;nl+^bq1e3*xW4E4@T@Eu`7sjg)90;(?&$zmRqB3Yj3hKslI-Ud&Y;ta-B_HW zl@XQ`XLS|M7+kg^2A8=mr>UQNCQ@40TwO0oh9P`1)V0n%3()GS#tnfy3Eee|eD+F_ z&r#&^Fp26aO;=_t6d7m#QE3%YS#{d9>E89of>6pUtNu>fyvyP*q_7S~Y5q^7%>&&3 zBA$n#|Nlcg*CLsVW+99g`mb3pVq${IpTR2gLo=u1A;Ky4_5*Hpsb2>cp;pRlI0~Lz zlvLd#6n?$R9!-NPdsLQI;kZV37KabZD@$=}_TZ$vFd8ipRF)CWwY7=HlJxZIGV2?X zd%hZ+M2mU-VJhDXZjS^s!#^z z5#O!2~wzhLGa#PLs< z(bRj@klyg$1BSZkyf2`XyBhdVafbxQVc!)?JTLh83-12)zj3$HN`=>X{6!RROJe>> z<;CpxdO`r5y)iscty;lt2h0r}CcucTWKB;=e&=@HE?5lR|9NQH&}io#U45&orG3rx zdLnwLul_UvGV9{IvRbc&eorONV9HcKvl6ttZXQ*#b z0Q-FdXgBoD3`8TcAska-g3!{me@%ex48Pfcvu|(&8ejTZ_<4Yj!M7V4D}ElZckm1K z8F*g$a((@=5Dcb)96iseFPyY}xsGUU#L!=CH0}UI<#;Y$7>68-`Lu<=!RRB_q+!`4 zz+SLJo?G&dLzV4s$!Ab($zKC9iOQBiZpp{8gT_VAf&`8wg9kcUe4#bs9va>(#89Ba zlYOzZsB{sA+YsG&MAsavDeXL3-K&gR?-gHV)Vy`#Z{rQlO%O7|I?hcv0V&gs+y!uv zzmZ$_ahIFVe+kY_;2ueTA2($hGrT~1fXI})FCaW_%)mIx8Ir(>=v(SOj=^gu3p+_< zH}C^Cnykg32RAVO0?qm*qhfxLvGkm`2ML;-Bi6tMDo^0h!-WFR<4paVVlj{blI zod?YEPk@mSd~=*?O(1xSxOTiHdjdmnGeLmSeaE!+=^7#HHIWC7S4*wT)gyr2yK*u| z4I(JdP(s2J?tjtMV>hb~Us!aFYM?L}&4s-EghqcnY1#6;l)2<$oiG>JA3_*b?H4#} z$(~6V*Bb`hB7IRT$v|{=)#RF>+c3JFYbj;rrQ08U02EM`eqK%^r(5J+4jw-(-s z9G}f{{LKj9B^xBLEblB$mtljpt`sFj0b;hX4k5DBv18AjjTB(fPH_|V0LrRSF51yG zSxu&Xl3laon0bhMEyi6hac57(wvGJSaN~eg%H%wYRDJ7l%9O-pw?hVoK?z{Irj5)gaId^V&^HtmjuIqqUD$8QCQlQyuptNLsQGyYN9$ zHyjkSbSPk4D#o|B9v;)|m*cHZzp?7)c*F1|Syn*UfCzqI#~aQs8*>Kd1>jp^cHEOK z6B@lmLOmslSMc{ngo$)#pLx7Oc*%_A!<*6DjUDYbvm%hg*J~NnGIY?;!6;V-huomk zZI&EZWCpfl9R8ppbM<3UGjO{ZnQ4dYpC!icgG$UEPXIP~JG1LgWzudB+;Vd3X7D=* z-$&jUF#|^*5}^03x7M4xIX1`Dr7Ik|G6F&n@h zKq}?lunrgs#Dk8>o9U$&Tsq4RiYYJjh*h!!=Oya#{7wdX9@SOqIz(X0w@$glyUc~0*&Wi{;Xo_-`Fx&h5 zCCsG=K~589&r2gd-WJ$C{Pp2X<@@hPOdQjIyPF4j);|6crfUz2cibe!^FqEwJ}hB| zZ)<#dukEa^lz9e=>6P+{*!!Sd#V)b*UV(3q&B)7LCq{hNAZ#aByxp#hn6D3FI(i3T zk9o|7tqCaKg)Pn+M>V9aVKbnjl;guJZ2x!FRc?O$Ibxo^BZAcf-m-}K0E2M}^Xr<{ z_eMGzNHc?oW=^IFB3g-DWj(w4X>N;x=%X7(dHs2=W*eA`w4PR1Mm060bqHA#z zW|i3hmWsNbyve#o+-zOr0@t~LYwG~-ARp$LUyxq@^@tR5>v~wt%2l5rr-uc+44!Ox zzWfBMCB;ZTL!``c(3hi6rOSi9(3LQAgIt~G*$^&#HI6Pnw^HWSUJ_ZsGhoDE@O_>9(hzga2nGQ`m%p~YXP+4rElHWpkeB2jVb-s+zN?)8-4Go*^gP8YH@7}(^L*HpsIMhY zVCf<8QsxK9^ca|)DRaTqQL`;_3*29>>FsM~ql8x9Ma}7lG^pmxAEdtJX2#g4`Lct) zSI<@%^fe!##4|*~JOd3oeh1RqI2jceB!se{R2~TQZ#rs9g-!HjUu)(h6tCReGSPYSuIdLwA{5^=50nz zD`j38VD=wd*XOo|+XsUgq>NlxDf z%C8(4F?A@74QOGbX4GwTEry1v>z#N+T;*nc_-bswA8BLzBS_I5TPlAI=9!z+x4~4b zrg7j_&boaOmu=!W|4nYCr%B6Qicjx8T% zx!Mg~bLB6(NK@HjMz0YuJEIL4Vg`Wno@jB)&7Ng8-v6KmQ7UghrW*E(z7eyz)EobW zHfcT7@|e0B%x-^1%pjDvVdmm{Bj&&i&m}3jKWe6k>n6-D&{b|mqg-m*7M_e+c@w65 z1lISfYoE6?j&gH3mIo-_%m*#^XJGVNd6_m|Q(kV~^3#iQjth~s?YSOhf&A5)ZT&ni zH!mR$ts~A|7?pICn}t|?ru4r5&bmGc^6fG|-^$H*UCQ$iv(`pYUsjvn7xin=GagkL zyc)F5E~smh?-f>Vj>;&fwdV8_EMA`g z?`*X38lod`Vd0;^&~BZn8qr{`-dm|8%rdk`v=maN{{=R^)hKx?gBsseZbqRVe@(2k zx9-yRBVi7M)R+t9W{+QONx2<*%K8P?4RlQ16rB{cpKiH-7}KP5fG=+DW~~9%_es>Os@XekZteDuj?p#%Q-FKH1$(I8T!#{%ZR0VBSKIEjg1Y#k zO3(vd!lW++J#l?I-?|R+>!F1CXkVq*V9xRNrNLbAALRgc*d~_KlXq3Tgt=stbq%{% z={1<*pKXXA#;Yq~+I`=I`P7diVJ`Q>)|;JBj>vt3S<_E>x%q0(h;NVYfI5N}K$RJZ zoYDOF!M9#fXTPViuQwa^*Ib3}qTXPB)SIs3l`=*M7TDa{2sy2~_I*I*h|yZBB+NcX zTHlABu&zO{^jQ|F%)cjCyXjLu&l4sCDtn;*OPD_fYKSWH)tV9EwB8Ij%t~!IG?8s+ zm8tX7QE!f$sJ>NZt((!ZNKbCS$=V;RH+>PC)@HRMwQmY7M#D z{1EkK?=3WJxq0+M+lRgOR9ni%uVt&;Vs*aqWmqg3k6{-_01!?r@o z$yKe{6~j?<)teM_O*uUdx}nm2(U%5BY|gXs-sG3Tgt@oH)*zdIV0(txyW#f{uX^9Y zb{S$*{{CR=dU;3ddJ`i++N<0i?XS9e_Of9oqs^nl*EF|pXIu7-AT_3=-rNkBy52z_ zOw;iPS};w=F7+yBl;pb=R%^ELp=GW55U%7bVtShqKryTJi_K=mevmX5hlYmSAF;yr~D zr8;yCS{#~%WWg{MWr@+ zZ|iy-wTh0M?CH0wwPp-pig(|>>cV*YBpuyC`GqfesWmxhvEq$?LS5zN0zc1d%{sF! zl~4UV8e%4(eqnE-);t{O{SO~n3;rkQ6>a%i6Z7lwwD}gkwBSdY?S0<_%D!sdNHZ9< zB}1gm4EQSE1}J6PBZ%Ctu8qwj&~{q?8yg4x6m`v7W?hd${|HN&+dxly!hN>2x?2{w zjyY3deN7Q`Lq{MFg0^efe|Kl=nzx6#%FVu8SrZ?Bo8amTE4-25m@#2`L$WC89d(R zrRV2I!c6fs8`e778SN2l;A?imc&Pt$BxX&tA9U54!~Ax&!3^_V<>se_+M8%F)BS!$ zgV`Uot(K!PsF9TNguwMK>Sx00#cCm5%Jf67(%wy(GXmG@$SH*_-rV*?#=oQW74+aR ztrP3b;YcNG%m(ut^o8`&<^c2&*F*0iWtJfK)xO^o9O$gVNyuO3WxY8FC52(j%@+T* z{r$y$tx|8^9%AWz@j=9FGKZY*0IgGc=YpQjE-gIMwrXekZ9vLg^dfY(2RZm~ZR=VO zV={!L%^8o_esUM6us88(ye}y8FJ*3o3>Zh+MNYtgb-}sT1@f#+TLP%zHLVq zpF@dak7bBydPn;%L(Ds<*9b!i^{tV#se$FeJ= zp{}RW*46048qEF3Uk&>M7E=+g!Q_K7*cW9`!+ti^G_VKJ{U%Gw)uKcd{1o4MeWAPA?^a_WZw3&D`;>u`*v8_-xkmz!)dNTp^TmX09zcq@G7XS@0!WGJ zCy-eIq|DR_#ynfPHYdKE_j(@?1gyyDgB$Sq4P`IMr8KI+p{|0Xfe= zS<+BfnLYxUy{EP>t>$Xe5@FiUL+lyU{;lR3+&F$2c-+T_80=<#I07WI{{a}D1kQlS zUFH#ibWSfoo)E|d*qUN-o)J1DQ%ae1UJ%HFW1@mX$SVRl3-vWa5%Q|gsXz@$$P|V2 zuP_%t%L%#6Ec9`Dp{-Dyh30ih#f*oQa;tgRhx`Y&6>+Y|o+(r=kVeVP7UxOxvBdrf zY#HJh^NjgSAVpBM?vPzjvbsaIJ*5CyDxqG$K4Ocbkg*}0&xOOGduZJ>$9cvqiyQ;V zuj|_}yGCCy<E}~^-@IXlM48Kr7ijI#3dnj<>c-No3y@KQ^MKzLpW(b=Mhhf6M&oKVZ<$HL z;Y{DQX*FM(Ho^Je28;8RIa(lZ`w$aZE%Jec+7|5rQ_*T_BTED_)VDICk@3$JWYvci;{BJ*0 zDlH!@WqRWDkcxslxk@)T@(4RuCjKY^TtdQ2f_M-CRqFRd1G ze&le0oLZ)kWzI#B0>ZG!WB zP$%3Hd0cRw-OSRtCGw;|CRNzjZ;Lz^qt4HP709^Il0{y?O128~jSp!B@3m|t# z-juk?1D+Q~-V@4?1oi5|$Oi)HIooRQ!pKJgdHMtkc`&j}AXoUQxZQa+l8iH#UwGc~ z{A{FHAdl{@kU7o^k%~BTc~p?nmm|Fe^1g4gwVIbBjS}j*%`BalBZCF<;71C1DDiG& zxIj+*(c*j(86}XLFrTiH|1`3hK>F^bka^M1B3lV$Qy((NSsK|o9_e3UF8CBBU8AfZO@Y3Y0w*-Id2_fW_(=ZDBNfovb}{6pj*p>u7JQYYFjIL$ttIgS%O zT5zrk(jJeVAUNmvqsOf#9-R|sJ+{{+R`SW{S%PyltY}T?w{EW8Qn%8+XbPniEf`H<*fn^Z;0+GIKzz6xeTW%Oc$Ib zfrj55Jx_3syWhrjcXR=8jCm!{x`(3I3FMPNK95F!PDX&!JVMho#XK3UDq`&0pjV_R zeFhMw>&`$kpN+0v#8B^?X+wPw%}S`9gSeLZkRg7LsMRcu&M3MJB_``j)d12ikY_`X zdj)bidZ}8zmPQu}~~KMV}I$Z@a-tB3_+F%PwgT7|iASEcj4neX%wNX*Z#@6Ep*S0J|r zI2SsDQq-|m{E>}TbCEM5MGm(JIK0T&P#{AB4li*w6FPSV{9NXY7s!>LS*hOc93hZ< z0?3_CULb!2HUFJXhd{hHHB_s)%Q;>k;{%+#of8GJ^fASG)49i)lVYj-%!e5Bq;sv{ zy#KtV^Q7~*K#rba^XpZoQ$kJjA=p3QtWm|8>L9lw>0{Rig|33bOq3c1Yu^QYic=i>R3N7XT9=A_E|4AeRDR|-J!8KLWY7O9q}9~KVx^SNsPipk^;nNm>iqm0 zmGTrbAl6rK=Fhb_>-dnbg1DMv0|n>uwJpxj*bsr7yRXuT$JUFD5XdIJ)~q**12MKo$p~wu?O=kUJME&Q{6Eu}1}RaRAvl_G~FN zYL1_-d9kUnmrJRurv`1o0kI{e)Ry=5Qu*Lcu-KPEr!J7#0kN+n)Fy#G9}tT`4i)D4 zK=KE~9Dy9@m+tS)^jMide%)Ltqi=;%cNl6K+5)ZxCL}G84@xY=i`5F`B2ZSGLu38R z$n*ZtI)!9nYYXH!aA+Zo0_o^)LuF!3Lgx$g>=Y*(YZ1sfu#wyuSnnCl#s&$b_Lqo2 zTFv3H4Fxh2E9r>SYL19)ERcEQEzX6pGs~!%Vb9EeV^0a>tbUk@0SAP^h$j#isbE~h zIaDA=oLhh#CXlruLyMCU$hugIVj)?9d~#d?GD9G<&=a>fGX=8uwFNqd3*?gx0AoISop?-`#FOc0K=O2!yGz$C=*9uS0-yD^k*mJ1UYrm>2s3Mj=)D#Zl9Y zl(d>P<1K>Ig|`^N7RNCWCRLQabBAAeRLZ=kLtWYhQo@fU@%32+XGzbuf+K4eaOTKqME3_MFi zwVG-1HwBUoLV5Ae1Ts1VS=NK)bifoF%8P#`IO`v1Av5E&PcRd4kcG^O7o+vBFjYZZ z?eR*1R0p9>jt>&ZQGQD2#OKC0tYBO}pohqG-44hmf^(0L^D!W!1@grXin9ce%>;6K zh|V~nQ|iY~I@<`&t06ku353U+GA`1YEReURE981Wb`v`5`Ej+H)8cznFn6Y)6fo3Q z$#dd|2;{{r6w+$Wjc0_;7k*qP#V?G{709>HF@|b27sk)1FsRV(UQ;1c%q8*jD>?v~ zv$n;#91zNIUC5R*W3A?j`1}f%xJ&O*2qpA@K!zbM;t=wLgqng;eGPSc{Aq!V@^M7@~l6%-fEtRzbBAOPS)A>R`X>1BcVM0YfJg*_;&)Ch_M2V>*@IS5^8Zk=jr$l z0{IZND{%%To{M)0jEgFVo$>lgN_84!sF20+A(br46K=PVFXCHO zGVOa^9yL8rXG*{IAx9041dvtJA;*~6HTNwEB{xNqYe)zoWN08oj+q9L zS()c4_dZTH^?jb__y0fl^~&qr`?H6&*Is+=c^~d8 zTl-!^I#}^|%)?CB)4}&PGjB#Q)0oK}#mr*njm9?CJZ7#$F^iaaI*M7!%;qR&CF}XX z1xW|H!M-)jgs=grBvj0MEOTy`NdxmfGml~{p~6h`b@Z)c<{qqPO1ZlEwlY)XK}k7{ zM)`tRF%Hr^j1wfxJHCp{IAwLLslIB=bk3)lg}w&am2Iqo&y-k;eUEaO)kSqWOMFc@ zOy3onS>bELVfz1UnGPIg47`@4v&lD_!^}KknK8_Cbz?R0?DZ{W=5#Kd`##@3W*$2u zvHHe+?)#FN#;@pfzVLmYUDfGfqvy-MP!3g!73irY_shO~IaHXQ(}f9puJ{Tv(?5zS z%uMeYHcWA5o{M5ikL^HYh{K5hgvozb5vrf*!QxN$j^gwx%0uu2m*C8w&L-Y!Gb zE$&^8H5L}7V%-PzK? zy_>k*%rt?1G_!}9ydP_3VO+IbN{6S7HkQQQlS`H28#iT)3*+w3H2_S{2P9U#xTSGv z9P0`6L@MP`aVz6mGIPm|6#>(VnJ!Ub+AxzHt0F4aaD-`#l!J8L&Al&}_8g|7TlRWj z`ZJT$NVqy~5Ho{}ezwF-XJ$`6})hGv~4LKcSln zb0RKVNNJ;W6ys+msk;tyIxab+WPTYwv(HLphiBrlbC|O(^DO-wSB;sqKY83RKgU%M zDKGH{dNhf3F794tmY{FaOhaaNM=_0<`EamK=Um)aX4+zXL&q8)Qr_k@yW1qyx$fng_9+xVo>(&rUrBQzvDXXUQfcLQOJLe(|OwHIpqI^ zW4&aU+x_0$$`UGN^U?<7x8GmbAD>(4u%OG}^shfhZdE%wc6c~Ub1)&yI_q#LbjtekaG1r=p<)*M%lZp)%Jrv67~Hz^m*gaWU-`WYa_U{BnC4>P;nSZQ>ZzaHnc%VpGy9xXV`f-JhE_xM|KnE5V)^$LG$ z4)cyrhf$2u#&DOx{Knso!<;thXl9aOYWq8KmjQ zQ^CZl=O4hi7jzl)n*L$TEHd&u=pVtcikRFV^p9nxpv#Q%H}KD3CN7GZ#msqEKPt>z zPWhP8SOfn84%5#_*ucMtnM7BfGKjU5>-~T$4|WjzD>=+0qr-;&O`P&XBl9EvZ5(F2 zky$f44fB|PAIJL8W$;dn|1*xYJ1Wd)9Ok{KF#9>oJhv44{g3(gbC{8)TuuB3Smwh< zX2mFbo-Ew{Z^r5L zKIdU3jb8M(~H&zbC}$yK?(D= z{{)xf`ZqYY8d9U&Y5t$NPG8I+Od6PT9H!549cG6A7iQwzF!=po|CKz`5xZ3s^Lw5M ztmUhMI-ME*-#O*31%&AlKhy8QY7G3dn{pb>@@HWt&E!7MpNu1NnXFMv1!l%aNm!AYNK}~0%&dxHsxnhJimA@b z{-|{R!_3Jj=5DT?1*Uf9`|sf}Qw+1fUz@`$-YT^`gBJShGE>QfS?I6F%pERsGJc8w z5oQ(=ZlJ*q(`bpmF*CVLtY!Wd%;dq?=A~2>X1Tu=Gb7u0n8}-MrN2Eh7w?ig(f+_H ze@A8xyG$Cb@;{wdjS~hpkrxKSo(%sp9Og%i3e-*NG|KSz%&UCVR-6qN=6(MlW|DBq zLNkLo)*8%(H8Yf%N_BOZwfA5@ftZo^H zJzx5B=Tq(d($~U_4SeapEuU)Lm9Sf?!bAc;`0wQ~Re}=cY?jmh+RWsSV(w$6mr3We zzivKNUu97Wl@89G`kQl@Z7DjPpZ!m;JUM1)d4Be{Mi`=!$u>;8e5x+4KBvod!~Y7W zbEhj|8r|>@WTr?IGmM%0jz~Ibcm{kVr<28Ha4J21JWH4pGY*k3Yy8A~15oyBZYk0b zW)i1!&nz7#6u+Hgy^ggniB%weKZjXZ}WGp&p^3dNsb=CP(aR+0D%%uF|7 zip1mCEpor%rc*iLj`(CSL{kk@AwEBc*=m?-@uhE5`iaL*mXZgr*2P!hFcn<}W7_z8 zI81Ig7SVn24>D6MifPQuuak5-_rg9ymd6IB#*aiSq65Z$=ETp+ zuY5vN;}aIgFXeO&ySZcEGkzuK^(j^qMZzWVt2x%br-f-wE8@3uthK9knAKpWBd@J) zIz+4Ex8*04;&YSo>iF$k_J*(9SRZj-+1>j346$}IGYVrQ$$fSFUS{@S{H&Nx3Gc=K z!puIGIY95lUuNcU<89uHzs5Cq>4@Y-v_3wrfU3a~y>;&EO|s_r~}jGYg}b z931OGx0Wj>Y>dyz%odZ^rue+ftaL3rjW)&K#>`vTTbELNAK!_Y7mMlK69XBX*Km_p zuE0)azA^QlEASa&VK@1x#HyT-D{zX_DQx5^5V*q3vlVn+;efZGiuJ7tQzQ@vCP+K- z;?7>gi`}=9fgm%z(KB{ms62LQJPNA9{Mi6^o|vf_Xw1wRlvFWiv(yf>C`d@UXb&Wh zKb(RKv@VzpjGD!(Kit*{v?-V+9Hcw2a;yH*=s_?E&~xw6!er1xfp!H4f%ydOOZ}xW zlLbuO>Y8~t@Kiy?ykM9HfsV|~HcZ37)68`KkB;?7pbIkx)U_h~;RJi&8DE%;5L-_z$<60t1 znB9hXI`A5Y>Cr}q=@J;pVTK!~YhYAN*}DbCaICXN&(8-YGc(C(tXJS2W^76O1g0`m zBd5;m<-l}ie!;~-^_NEd0yCM(YP1>&%weXz(Z+zlJZ9c9ci#pE7BKU(VFm>jF|)v= zGdQq>nJp%rp@F5$tTfsf9$3yyvo5n(d&T>W*Xuyl`ta%Yna)A zyHvuA3cQaWEDF-ESgRD~t-!h%9gYcXVCFSrnd1YSnHg)CiGgj*%rng7z=zCKHOxDK zU7Y*&+?*98oEq56OkLdMQhymVE$~UfERg48%;VG_=5c{fIZRih`FVjaB$lbu1%WS_ zX>9UZ6gb3;wZnGF$J6i+inHg3kK)858DM zARmWm@R)?jpyPpp%xqUzDDjs;KLiRf)9gvj{1hn6OuyQixfCeM%*x`LxfUoMlNTl6 zp?Ju1EtiDBDU^iLF=4VKl;tqCRc1@5z)XBO9m}6kDJE8YLKO~k+DMp?P@S2bxU;PO zGSn}0#Kg*%aCZ!IdqQoFHK2=*RXw34Gk15>Os#}g%Hjs50F9a6S^@o%;eQIp$9XS zOkKQ?@GLVIAJ^#&NO+!^%|<`3CiG$^UOfhlzcd=3@M4TMCM3MXVQzm~!er2_gkj7y z!#<|^OQVGeBbd40^+*}CDB(3`Y8oA`N_c~rPmE7km+&St`@2gz8MHNFG&7alR**rv z6UHzz*Y#`}bRc0IGi^*dKP60H=CVoWQo^JrP zVB!*HY8hK?khqi?^;_fWFN2yUE@vji=%;n!N@k9jcKTFeMobMpow$a>?2VIjuy&fb zmYKt)HPbV3Ju~mr(adv+8)DMwowzwBoqmZsnF$&n{z~F5W^yL#bOt2uVdiyHt|5sZ zGjr8g%ecgS%#1L#JT>t%X6|ky>15En#Qn_VF|poFJiv_YcQO(W#)Mguc$k?n*|a_3pxCkMwb(FW6lfzjFlYqhm$;s`IzZ`#=}g#xGRZaW`4uovHHV_@x&rAx&NM6 zEQa|b@ea=G9b?Z~lTw*kZ|XfcsS-2iO%IYcsR}dJ#tJ1>i%B`0bSH-yYFc;Eq#Ddr zyn_Wq+o_OLGbYxZNwqjkyy=DSO1h7kLZ*G)om4j_R-L4J9A<}+ux`>rU@*VHj8*-G zJ<Z#KdZx^k^Z~cZZ5dm^4aHO6PR2Fu;F`X%-W!Y0~2{OpBz}9Lu(^mPu`6!gNe} zn#0(U)eA{4GGj~HJLzR+Y%ly`QoopVUP|gO=@{#skTiuE+nOdOO_P+3Cz+fyo0&I_ z2Y5Sa9y2FR-#sO15i?cp*JYoY^e!{j!lxxIW5&*0rYEgr#*XJ_BxNu&A&*XHX3`pF z-l(LRSxN6P!%I;h(`atedSOi8y((!3Ghg_1tc;|c%vc?+PTCctpEXGza~P}DO-Tot zxwE29XLHhFX7FpB{D+edNk^C|ld72=Nhg@;URN_alTOCuwJYg+4rB8=kn{^PHm`$8 zmzmjQyz!x=-PxNlpy& zOHvMI@|V}?TuI8y%m7o%SCejI=7P!V_oVzWdHs=8ki*zHT4HiJX6$G=Ik^He);3a- zD@v>~I`^E()tT94dbC{0|6wMF$vt=ST`{@mO|Bv77@troxgj$)uQJJvB#g-`HMuD> zHm{1w&6%-zRZeaZlULQ`mXeOit6p+rYC>OOjpyEXC!|Xlh>T& z1Nf;gtZN<8o_~JwVU86xGrI-J$CH4J3Yk%_Z%rr5%A4&d$nVcC!`c-W(3}OP=9HZlyV0%ZOvRbC8ZQI&zNyb?vygj ztTCgDf+^*gvDQ*5r2;b#n_jPUN=0V2<3$3=D>bDGGm}ecreaEUW{$a|i!`d7@*igG z_~)*a+RWH7z}+eL#gx59N?i_apQj)raZyS=SCZiQra+M zN4bqto{GtgqTxOhSaLQX8 zrU%YHOMMMZnZ#jUeNvB&N2E+EoDJ#xjy(Zr4$~GlgETXjbAQ~}&)Ae@%)De~ z^pjFn#4yuRRxx9H{JANsnW-V-U`)Fpf&h1&KTyKlsz14zmf3Ulzq%p zHud#m%4f{1HvZ?=l>N+QG>r&JT=4Zz4Xw(T7WXA4j+#f8& z%*$q0`#`WT=k>VRFQ^wR%3=C8&?!F{EWwQ3iFhbjl9`1jod&_uoX%X6PQzeX4ij&} zGzwN=X0u@$2P<-{?IzY^!O9%w(}#5K>A`Buv@@}q2k+!qRSnZ3co&Cx!mQ-94Bo@c z>xO9+ytl|qB)YVbq>LB7gSCq&Z?nv0(!kW=Sc6;W+}j4zn6bM#?Sl20sbDnUKKL** zy$$nJupu)W4bvgmh?#6gs~v-lnR&=Coq|ocTm#Hn!PCK}9A>v!v+5FT!OU8tpPs>% z%vei!HrR@pdM5Yhf^C?2(=g8m+cIOVrC0DNW~{Zm80^H1wS+#w&dk_ds+WUZnX$If zFW8M4Tko#~doVN8$Q%hi%O!ozFav_ma~NCigMz)8$zx<59PGnPYr_l)zRZl>{~8v2 zg_)mBnBl<)GnI{=UkwgoW{hE84-RD}&S?IP;Bc1kjA2FwUoGN=e|pp1QwV!T1>fK> zc8_CJa5T5&OV4Zj8511GDchDiE;uo_#pTRGi}YD%a-8hoX!-Z zu^qt!9LARGqu}9~ymkeTa2TtfkAvSbWBa&IgD04&_>5>ZgZ2l%i%I9J;3*EX)AUwH zgJ)vGoD80gVZINZ<5+XM>y&>8UM!+&`Rhi~6@@)#gO@mr?Lp24uQ1c1wvP34@ES9= zFSr=I&W!B~E(QN&#*Vcv2dSv)Q|uV>*PxdfyHE66Fe@`wKUac2X6)$VYS3Tw=KkXM zU?3))8^M&AbjWd-u^zzVJWARR* z7zqPTVGd)pk?0g-#*T7xI3<~}d4-(P%-FngJ7t-%dF6A;Gt=FjC8g1APAW5YovomA zCo{HA!_HmI*ik_dr$&s-#hjWP#(K8mPHkpvJ1ybd$4oiXPVaE)GGqIul1@ElY~NJM zd5{^q6H(fEh?z>JeU)(S?7_Ws{bmxQjZ+UIgfG}Yd;m7^q5klI?XtYUCF8B zJkE@re^qv#h>2CrY0XS?)92ppJjJoDr)XbykJE{nIqoPfjcPibnMpLe9uGOan3+{t z$7<;GW~NQNW*&3;#pK@1iEx;gj5b<0gShO)%v$c_&JYe`ThkNHFb?zX&mvG7wQ@#q z80*^V` z$*YqyFGl7r&LU>=o04{QmM~*Iz%$NLW~_(o?ks0!vx(KyS;@?K!#w9?Fmt={&o4M@ zn6cK|+j*ZEYrQWy>zJ|D+t1m+jJ4i~^8qu~dIve1nX%S8)Y;06op+CLw#R7WRp-N) zFt0niV#2)P?1^DUIs0OmG0uKY=UKC|G}if&8LPu_&LL*34ktQaF=PGe6z3>2w*Q*$ z9An0Mq?yjQF}crjPH-5z3Ngp|J|@gu=Lfcpdbnw#{&vv<=PWaoqL`mJ9qY9gI6udv zv(P!uVXQqbc7BNov&6Z~Dc>;lzRbDGjJgM^{_xU>bDf!)hFRs@U}ltIGMxBgs<*QK zd9{;+nIe@r8Km=`larYs#MB`nqV%!r=5{r7q zn=N~%Vro{~^i}Qs;-Y-TQg|heO zFt!whvk#03QzZLf4r5DEEc-BKtfwuJ{neOQC9}UC!<5QCGKMLgeH52{#9g9|G%A~Y z45wV*_}+5aCvliLCQSM4Z^y_}A^Qwwtc|5+pT&%|go@ecFk`(|rR?*Hg=zR(xKjv4 zhv@>)>x@p1*4!6{OEKZ<8m_J3Rv2!F;Z(|!p5>}!!j&GQ!%Z-8Z!_Fn!}$!SVu;Lr z-1P990|z~HH&%*$^kH!q`HuA@dIq%{aT|>` zVr@^jKA0B>x?tiSGI2Mw&?zSl)F`__g$`)0Aq19G=nu_Z8>G>hQ5qdJC}Wo9iW}*3 znUt%&rN5R!%aN4T>-B=#8L4XGjI3}E4b|xL{zjJ9bc|Id#tIi@q2y}vH4A-*bJMG{bOf4VUi)qRm*v%tAxvd1x;*j$c*S<)JSaRlZA7_R#n@aew_y zRc|HdOUgd{P6A0?M%AEt;r|fVTSlrzi=NYHCh}EZJ+!mDNQ&QTsp6$Mg%r2xHN01V zJUp}&F$6t=H$GJihnfMM#0tJc>k#88bN7M!p4039w#ee4Pc~>YaHcCC&4gagA)Jp^ z&-A+XR~+>rmN+M$E?fEjqAUF7-e4)Ehdx~`)`>7vwR|%Ts=HQm74~a1ew&uykU_V7 zr@#JkQlsX->u_sKxaUo71Kk)tN`a&;uv6iq0UhycE?kZV(DQXh6Cr)Ji>d|(xaIIr zoo{r>A0C3=;=)%Ctupz3a8>8)GhE7-nrpIKqXLMfG=wMDKh@lZT3*V_>FxanztP5M zA#VH^XH@+Pen*ATO5AuU$0&pwV$~QG1`-SVBFRhlGWYCf9;(Nv*i^iw#;5}ZU(Fdk z?ph)&ySCT0h*W%S%U@d|6_M|A*Rnm-`Egxu8+}rj9{K~iQZ2w2Wv6v|5Oqc>>5(Oa z@Ol-aAnIJu!?=B`5PtCqoh(ROq@<%uRx}uersB^UXq zX-x@-U$KM^SVJ@@qFaFW3=Yi=dTC5CyirfpMiLD{iBR*fh&LJa!jk@2pb%{+f_rLc z$qsD*HyfOTo6TNYnWSR8fH!9{I7Wvx8f`AX<{n#& z*Jl`Id0n@j<9`T>*0}m@3>70i(tU(R{f2m%iw^fC=F=*@^oWWfXg&Ouph~E(i#7^%k@(5jPL4J))M|@EBnOC9}1UB?O_pz+ABTZ?$I{>{wnzzrrMDC7~~7n zH^=dNUyO7N50!DX7NRA)J#-pht5V-&{N@i3Ui&vKe&er_o{tXB_0k{wb=U{^C6lm9 z`Fp$_>itEBFImFP*+Lv){@HNMKA zk7sGF!)%QvOw`C{xZZ|~815H?W*U?{N5}2%)&8`=`u)UQ4#R!6K!-bPO4NRj=9Wy?sEtXvwUM+K>`zjD({S^D)7+rT zM6J6j`KCAKbyLyqiK4>5P7;Qg@Uoz%YssasU?y)Pn zeRO$G*T(>SmA17K9$nCTNKa6gx!6rBrX-m4Ge-ZMN~^O(6B&*Em}oAe$_H@E56DMT z(C_bJlv3VHpEH__H%L{9eAEeO1k&?SRTo9;VCW9~rbr2u+aZkRyzn_5x(ia}WeJpb zR3lXn?LJIA67-P&93)t&xF%@7i-8;}4&N?u7tirh9H)|*c0c}sXbEem4&tw7bP;1X z(ONO1t8Xu9t(}5ij-o^!y0s>~@JOP+$A8i`ZtJ7kX<{AVH-!zd_4`*nJG9_7FCFK6 z-z|jOe?Vc%GnQyr5ru3itu=LlCZ+u5V7dxVJQ|(uzs)Kee=nbO-o5~gVKhf!v@B+7SDT}~53o%mZm1Hy( z|5jvVC|k<}m9HPYRXT^e)z|dMW_Na%9%+ZeJ)(^fE45x8hJ4CPWfm^XV_jc4 zm0M(<#0Zm)fj0OhJQqtf6#t4g^vDgr+WHB8qm92-xS>7znAJMmra44U^VhIxwWpSA zsp`$v=vH6TBR}IE8&#t8$lZ?a!TMl!B3irP_G)1YxnIN7;R*ev6sEAdK{1=5VcD6sG%ee_=4VFm?S%*Wlv@UBC#m zb{X|`173R^!QpCP<~5R2ISWrC68x3((37se@=!PERO<4^5<%&ak^=;VNzE|cL3-(t z{$|Ae8pcRcM;Y*6lE^qaDR@+`$x>BErRVbw*Woy5JrhW5@RfK zlNisL7{?dt82!&mj4=639=qKbVcKJ26ft@1ck>9-*N7{5JZoayYhtW3c`S1CzzaQJ z5shZ~dc%89X7ueiqFIb)fLqKch*UBd^}_gmBcllh)jf&#UzjUwP-mdS%w0w*KLBN+ zCm_`o=9+-Z_N(F^0GAAex4;aSYPj=zh;s7RJ@}fJ(bRKz>yOb>1~o@dBBOsgrRReW zVQ!$j0Nw^VKvYiR0##zv7uvlWC<_%p4c2F_Bt~;hnd=1Y-iAI2QbD^CZYiXaaMQ-? za9$H`BUVH@aVifika1Wgno$TX9$b24M1pROwO$hB@SI&@YbwP`$a|Co zwT|j>PNM_5Rg6X1*1==qca`Chq=mi)%T_wbLLo@1)+{}A%=I)LY7MKPQesC9bEjMg{9UPRAp$7%`wgOo*2RqFH5!UCNGdgr#@qj<>ti2kYX_HdUk+K3 z3sI&1M7zN`6igJm$GXplI))w{rqb8Yv$CrY)y&X+*)sSm>D6Ys$U}RkX}uKQq|x`E z5U*2XT>ztcX$!Sb3xf2x$z#S%_^nrz{O`w2YBnn~zJE7@3ehaLO^0Y{N!_~l{(wCO zF8LOqFBqvej)haN3oDdLeNGDsQSlnmpQoChvl1OBC+Vfqsyn4k+pi(|bAWi75Y;}b zk@sFf(d&*idczkZxAe%z6R@(#`Rd*|OhfT+xAA<4KRGbyhXQz&N`X%FCz( z)~*Ew8*5alkVbQ$N%uF>soIE?6vU`6daGX;)vt-3j?s3c_XndQ zh~Y(R!EcHm@=zR5m>$IHzFKPu(KCaQM@XSx`iUKcsK!8z)JxOyH3Oq6K`$)UsGhsK z8KS95W=^H;w;HvqsgZgMO1>^`r_ry-UAXUdYfk;Xr*P^uH$hvlTOerVyBcNbs?o%O zI+ZpC&2dMnA<7%p;SRj6!yO-{QQ%Si^;=k{36>AjDHnHF^FlO#g#Oy)4UN*`wJiBw)7%Y{ zO6dyv>!2kX^P}gEQkKdMQG_|+R zZLvXz4LWbovqqM!HMK1B4BBb*a>$^G1~oCL=!-hHE0Z-key5gYw?X%t+?I~ixn*_d zBq93Ir(?XiUr>7Ff~(2&$e&e&bEx%RqC{>-bKPzxQpoDlr?!MANo)kH>tU}a9?2MPW50u zx>8v0EZ0YGFQcV%@99xcMK@*4c+HB^VuSYnuG6zS%V~2o_r)%~V%-(~t2|2;n5e&I z7Ne=@YwiAY2xCXlPz5vY{M?jdgXuZ@AYWM@C&=uswTvaI&iQ7*w@cZ!dZcFXcGprZ z%bxjy!c^rrQ7yy>)1eo<^axOK+CCOL%bd!(eORMl)E~WgPev!9-B%dJW9;)5kdHQE z)j-Bv&U*Cr{Po|(#km5MO~nnFe$_{1PGCnH){`E|`yXv<$?ojkL%OD`^4j`bM=A}j88b$8Lny;$;=)P8YpJn)(9(fe)QqZSpmkN2vt^piG&1C#7rzODq`OCF+ zPBW;qK`$AU478ThYl?M-tvrT1gqoIlz-07H+xY7*m`%ve=xtwX^oE%w{CP^(s){T1 zn;G|S%h7k0wuthk_55nM0|pht7(~Xqd(ct@%{8do6`W0B>4zFLe=^bM%*{eQe#2-W z?D;&SX$DnaiB(SKzQxSOkN6(C@EK7KM$1lX?N&OgQO0>esg#Npb!GPsRT`uBKI5RP zLLArb;%Uw?78atpuVFv5l*;YTd%bQuYB*H4s0YydN!v<6kEncDm`XeX?}e7;p(3zE z`D)9Ncd;(ptxNRSaeY3*?w8GgPZU{NPt^5ccNy(Y;l2s_>m4TCL})`i+>_9_cw4&; z9Ct$dk{{8|l~;)#pN`w6$91-TZLMZjTO+pUQkH-(k-E%SqEP@fE!+xxEe#!_UAZ;r zqaiK4r1npI)ETG(quK^FG3XT+McaX`g_9k=dNyrbQa(`&fd%ey)__wg=HpD?!w-l7$d^;dW^5k66k6SLA$ ztX4FIO=4ZZc0(bZKNIT;#VFkBWB z?h?*7skk0`-^k)wtEHM~xNi)a`GszmPZ(s&JLv||Bu?+{2a5yP}^py(w`*6ST}dyOy! z+UXv#1;%=xamia8lp1tsFm@!4GB*L^`_qgz{ek&3quGe@2T+)%|0JiMqCK2iA&{Q4 zT!|og*gpt|wfoT9i~hD6 zYqFZ`w~wd{(!*KZ%3exkbheV0?qPIsribb?YIQ$OHUUL@WpxU(3Apr#I)$l_jQLvt zVeV1{>*hc>i->>Qp(FzSP~ODPw_CIxje7WNBfW5V_LQ`^B|Xtx*QIyBtvVH-sr@@rZC z<022K{W7tf^SdRGee`IXi>s-{6?dG@VmktfdtY5HbTe3Ejg;uhEoQe(Nwj_8N=(sZ^BELp+G@7x`s+RDYo%A~Z_qQCF9^5vh(>!2 zNHTDNdqC#rGhlV9F2kgLl|rme zooDFJ7FMp5m(O&dkH_lAV78om@T>}j=(lpRZV{qBj$Xe{F5{)q_?mfo-(#gi%4SoZ z3J<63H1j;hVhupWu(>((*mGjBsniH-+-eRHBAqY#-?Cbk<1Wfv7A*lr*RE8zmcXHd z9y#Cc%ECIBg41K`Vk9_#^o0AXEFn^FY{=J1#Wbo=T23*9sH3aN%w^V+;#ZGuSu<8^ zr4mI~A$rlE(FSo1ayhL2ZY_PYzsP6x_fJwio1kU+pOdftU*wbXIsctKYi<17TJX?s z7=gYEP2v~a(ehONdMH1Tx_NMGyUN_MJGqwaP#Cr$_EH4r;l$cc;?9q7TGGtyK12_o zHA=V_{;%rA?(%r39LfZ(MOLq@0h8>1-{Zg><)On_gHIdFvAd!6kLXpf@spj z7z7`&gSn3}YWbK^1N2N1cN)ee>fQ;)d1hWw+DK*3zO6w&BmLF{gB%y(#1TB9^uOD> ziPpkY4Ym3u=avM&tJZ_CW(oOZXW93MJ|$(xFIF42yjm|fFKR}cZnZlwDwXFMkTAGM+9mVS-wn<$Msr}l`l+xpoAiy z&28meeRfsN3nbqmSv@qFB`Bxnu&jG8)~RGQFCW%M1pPQvb6>c~=7tsPVIESee5kkX zUiXY)*7hEjG`f^OoWc1NNFSz^?rhe6wdsYaP72aPxM5u9~amXjWN>I;pUV%8ztr|u215ak}{rB;X= zqDEacQn$8*YcUjO%kb5qALq&q8Hak{Mx?qcpbG}QSw(-n4Kq23F<`V#rIJC-4Z2)Yhg$%tR4ILwfF8RYwC1C<6#cai zP*-rNba99tclI)ePq72 zFx-2F8*Nhg#{KG}9I%(3Y(pM{eySjT+($h-N}Kl4{!SXL#avvqZXZ=K+(;9yn9JdI zLl5oiY9-+oC-T5=UPampfHs}DoZ;nq*unmq*uYhq}QOrq}QNuqI<367ACz0 z6(+j|W!K!QU}W?%mvZZMy?SII>>}1DBU}!DjJw-g<3w6IS1(X7q}t=l@_u(?i1S=M1Van@YfRo#iRBN6R<{h4f*2!+cMm|Vsz;lt^1ayppSfOIHI)f;g zk#1#;BCY%qqfz9$FFlk4UmHbyandRpMM@kLE|q@4d1`g%yHTVxzDl?+G0stKHID$WOa7kua6(rN0iqN{obi7Wt}hVQTo6UL#ZEDDj;G44Uhru({z8 zCcF1E9Orn%Ta@`m`;Dc>!ZM~~UHLbaN4NcA5n*}+NMhKN5@X)h_EO%X^_O5!kLx(g z4ZYyLGuoE2M2Ctjz!@dhRW__TE19cO7L-!0pjD;3F0!NgMv)y0L|0)tjT2?+&PAA} zVFX%|Q~nZKs{(``Vi!*3FlsnOOS%KI&qtZdvEEBh0u`q;$kG7_=XYPhoE0dQdbw-O z@b}oW>BCZ zz-Uh0*9g<6`MmBu(#-m@ai&*W{~><6np0N0bFwO_cH-pL$2X|A+5B}i&=N+EZPWE( z&$`5+Rwb@I^|EuT=B!s4XS|A?Pb&!|?hJ!&mPNkW+bcI#hy)>WFgsqyb*|^^wgxMk zQzb>|C~Ea_^wU7IyxB@4zg0m zks?7>di5=BlVx#UK;7y0P&4$?>sVL%CV%vtsp9be_-itM4;{x^64`)}~du)W#Z z!ffB;o1|M*YuJmll#Xdg?~01?*B!Pn>7F=x2kSN1#x9m`7w(eDu3J5zu@nI)7klQ0JxZUgSe%(>bL;E?sWUR;?V)WO2u&gu?`6|z!mHHt!LDw-_ z7xb+8+R1!9=YGYxh3Po|%PFf{YA1kf9f>A?02hwxg{;=B%yw@~_Zo7lUG1xR=nVD@ zf8sn8QX@6t;!&T1LX7O~3wtA@hq3JZ80V;(!C0@K*S#%qah|Trl~`p``>U0Vb$V#M zsp)kk_4^zDE)Ne~T4z!=NcF#Wu%rd2>#w8#(CC%<8mU`lVnfg3l$0RbF73?{JD$`d zT92_S?3V1*aqVr1Ng0~6y+POYnzQ3XtG_pm^!p5&xJt(;VUX%IMbfecHNpr*xbHF6 z6IAqs=Iq#U{#wo1k&Hb#Z^t=yOryr9s!ze1{#cFFXj43rZK1ly#@&DTPLW_AJhh;6 z2HCSm-A&ERfc_+pUCVV0yEa_vE1laj=mR8N^GTY^>`vEFq*s<}zv%@Xqw^shql~dc zE4}s+Se-)LiijJcJo`MHN+mj89xuFrt3);NOSR?u5EU`KB<>7+BlaAoMbGIzv36OK0uck-1IJdPnOM^?3o@|NUN{x6osB?4rP%srm>}9fP)D zRxV@tdGIf)hfR-oS4g<@$Ql=UsOTR2n)S;{T748py;p739nfVS6^%NzzHEnbztKP;Z+M* z({QgsPotenZ(4i{=KHKa^;J%7T>l&|docGQRy3vLrwr24r$;)vox`goT*_XDvCA_;)%k0vBc=Ng<#gvCA*zcT3hKR)R62neeGtQ;qB!aK z3Zu&*dTA;+4{b~E(tJjFz$t_q>%H}EhIava=P@eW z@%d68(e;+@M%wvo5-ELx(Z;@z4;AJF|^a`R*L2b+8C46TOh0huXmI zf9k8gHr{}@slbKlGu&-?Z@l_C2KKiPvBESJvpcm0+9)!8nbcdD{y=>wI}OvqY9eWv zD!nNB3sdAA_NY+~+@|`ACh-Q{2N?77SM}zFpv*W2twLsjgKuc`A|yJ`aYq}}Gn=%n zXsNUWR;tWok@~p8>6OE4w|_8Non51KIDs=kTCJOhhe}*QO7K8oD*hAhhyi)XfqYva z5Bv*eC$~*jsPr7^Q?Mpuv~~>^mclX8ux2D>n`26OGzuY+HEM_M&oej;fFd7Rh&BW^txA}8izct6>C{At3+E+tr7Ri-_@RG zyg^!%SS7iL6|_VZ?l49f;-w0@<4){rd@B3DAv)%sNP%C=rEQ~oXS@W+rPN+ZYM}z` zDon3J2M+)_)X23utdbaH?Jqax>q^ovpPE!BukaSlNwKKe8fW3yzGLG+DfE$u{@+s?29$&a(HMB+Cm-vy3%c1*cnCZmUooyL%+2d zV-63!0Z&+;%b~5wp3Dr>miO_dQ+^e0H|qO|cqMZP7Pbpk7p9M3olBY92bA+|70yb! z3l=L<4XA-r?VQJBO=SEMCOvmX9p%C50!!L|u!p)ZT8Gh+cv1C!m^!5wCVjgmOec@P z;?W}tQsoF!9CoJExw$YctE_!Q!ID~&0q8(Z)jd2{>p)u=Ze148HS^p$FZEza)#=&3 zEK3?jmZG(nj}r|5mz5qu{f=Vv=mqGN!@UokinU+!VAmI1dSpSOq}(WyAAU`>!A6m( z^912MbwJj%5Y9yo{dt$xkb1*!8mFw#Y#^+DwDZscMw4KPDmV0CZvPgdd(Ufb_zqp7 zE(`SNRi6j8^Gm$_gz~QBJSs01jfbf`cJ?+hXZHQZGg(&V>jgC~+D|g-D zE#%d|kwD_%u3&B;X9Mm!rcvpS^)Bu8G1{(b@6f0VYU@KT@3DP&w}Mei%#&qbH|=`~ z=THRs%IN>LZ#;AW;X>y9#1LtjJ#^)eo|9xp+maboRiLjBBR$d_wyVmP9!W$hg23~7fc_16z=q&0R5*tUffJyj198>`4JmTh{2eDH0E0BjihF4baCt7<6QL%Aaf&?=LuD@RLuvC_?0nfDY&(O zK1oT)curj?aHb#gJPY@dl z(P@L$8?=19{`#)r-Z9)B!%a6R+eC?hJ`Xim-_+nEF*P{%I#CnmK3a%Al+i%+V`6oW zz;g+*?~va5c3ft!Y-aYh=Kt$2YIfMH>u89vk~qT+&VpAMIw%_&WH|c;#EG#;Xc5!@ufS8GGI52#9~O37My zReA<16T=V=uf_sRWHb_JArQ_i?a(#Y9NuChb6w&21qHzEX70{OI^3p>y5z@zr1qO( zv?(@z`3vp6Pn#C-DEbQ32YBe-%kb!&-W;@0c`<7$ctO9Royyx;_ifVmSKAx(1JDVM zTMRlCR1f1E(X;K!Txc_16^xWqg2Fz2|7Ik~_BW(c326b0*yEy|N#bN(s|EbQ$TTQYYjlBY>9B!8I=1 zYtWTw@|3kJepZPVlpeaoZpbqjlHE?;C)^4 z%--(J%s1J4z1B0==<46~2G}DuF>IfbSsnfN zx}O98Cl;|7V>8!EOr6`>zg5bawX*0DRA&C=eY9N3Z2@N6f;MdtWYf!hv^3m!xT7Yn zeo5QL{rA4E-aA@?mY4?=X0Kvjq#ucK-PS_N(=0To-+3LQ`ez#1Ii0=de`v4%YWGgI zBb5@I#~`!-NqIGTL_s^@`{Y*CK&+Jt8jl&dw3JGyEeWUIt&p$kwF*J%wF*J6p+}VY z)>4DiUD}r~sd5yYu1DPZR&6RBzt_T$GNR2kGC*^B;0Y%ZAuDW8Zf9I#?Sqb+fqxHjN z_07kp^dxS{^&V=<>Aiuk>eRT8cEw|bg*lr_d(8Y(64h6W)ZT=83&cko`pcV{qL;Y{ z7ow8*cO1vK`Ri5w`c5*=X=U=YInoQ!00*m4K$2b;$P%J{xrll&T96H|12Ve3G;W_U zn&#DCPoxly1m~j?GccP&K0bQ*9h}Qzr0@Smf9+IRR)BoGLZw#Ae56*W)OwhYe#N_1 zHkHYo^6N-%8lyLB%I`kN?^39BA0PMeSV2N#zp9 zn1@uvVs$wAdX>LsM}7Rss20*wHRz+mSc{ZaI~why+wDq!3p;uFMfxx`?JqCVODY!& zDM_bdl-e(>&=S<1LO$$AO8+L|rW96Rr)41;!{~ZRK|Y#=cBEdyFHX?D&Nl(+sXJX*QG%Znn`}{5ki{8Ws!6=OIklS(RfDpSHi2YjP^aCx#dlTlNfXO ztG^CjgJtv({G?cW%~BfOAE&=2*CkrT;ku+_-9l1+LZhQ?HS(if?&Pl-Xh-VB?hsYW zi&w80ZHH868J$KrNv|Ms6LhM!MqfUr(S(*7B_R(9ci}0G(w^36Qx}a|b|bpNd7w#C zR*#aPBU*b9DAv}9>rGj^I)Cb;Y6s+vOCO&q7W>n6gd5nfd&ObA^(fBkAw99gI=5^A zu_>!F;Nr9O?E&QG+7M(#Z&1vnEN#omXYIhYkIZZ`vlzPd_{jDZ)hpw*X_K2O2hMgs zB)y+l$s1@lA!?2qwEgc?=E|CWRlPo6gY{?gy;-VQJ==0vSyai(T-Mr^F}i9!nQ8a$ z(>uCP_k;gUdgAr0R908EL^n%X$!Ja0kyu1^aIqF9DeJi6eZ(UEnwy6P!@}g2%R}%; zqJv*sVdZ$M%0v4S^lfd(eYJfv`V7 z>$_@Hqq|0j;5Ss<%ynvg#I0Mht}P$wv%0bA)nh-keAH%v?n4i{2=|7O zaz`$CTWD8}Zm=KK8WN$`{d?&pH&t6oD%>~CB;UX0X2(rFy1WLbfv%}Mly8#uRuB?M zO}_#Ogj20s`WfB2vEPr8rsyT%869pMEVk=SHHbF?dg!lB(f#%0uiB$yx1^RX<>|)A zmwUg=EXS78>eRv60EyA7#=jfgXp6vFy&D6wEO)2c>P56+`&H}t|9)htJ%f*C=NDO` zt;x1fn{UpL%=mD72escTMr&F_u@)%X)1 z*tp%@b@|Lw`ESPPB8#nQ-Fh+`>EopUSgg9A7pp6guZx*4s9zUVci8YNxZ~w@N?Yex z>2Sm0_ch_`q~%pZ%5v*%9NL1lgUC%*9Gh=@?){Wb)mxKx|?M;o>kVL4EUviYzhc3o*my)U(z zW4tj~YfV|sI_8wu+r&uS(Gi{2#0Ysia~;3HDY&aDmAdfWpD|a$J@x0K*Iw3sXmdR; zzdMbUPx#m`5l&<|0u&-OqxzOnNzDAuGwS>_ZoV-31hbv2xWN~qbC}O4E?VYoSmT*f zNJ;Q+DV^I#Pia)!e7$wJ%>2FmrDx^q)C;U)bvYmlR`Jn}@-P~YT9w;V#bL41b1ID& z;IFFR5^f?!T7tA^l^#s&{tQN6(z=JE2P?sG`=MQy0m|HpRZpVwMeD}wNyUhkZwXpd ztSqX<-z-6F$})$j2LF`DwKQrRokX*`>?Bs1K=&x8KBJNyE)~%{>M_j_kS$q`~Npn{;P(h zg+7S%LbM$-4E6SQ^n6CG);7df3D=av#bNbBo%9S*VYKO%%yqyT)KfsX*VjUiHx7)_ zzkK{|MB9C%oOna=0hPx?E<(=t;s(G5)d$=hS9-927uQF&Y^yQaoX&Z44azSri;b%@ z(Nc~VSZ3vsWZma|>~Orq+{<-jElt8zK>H6-kz8o!K(b0AK4SV3y~_E#u{AA$eL*=) zzvI;i)uQA@w4ul&8f6{e<@bvvx7S#L?-65n(rULLoLw)8%|m8) zs(0DL>8al3Q;v}g|Dw(j;2a~;lR4dE@GtT!R0}Wy5bnv2dd#m{_pNgiZ>I7%z`3b> zzvA4cqRzfyr29sZS$bl%U-2Ejik{B^$x5oM!AG!?FKh7HCVgagOzgN=<#rBnqsPED zU*(J4@qH$vuLCHr@{?9752@ZDvl*!!(_G@*tOR;4j<-N+~Rja1Tu6(5W zP#FzpR^FSfG!3TsXg3>2K}>F*1p~PA-uefviXsojA&zZdJLMB zn-Qv})u=Qxo#OT_>`Kk#M7|`JPwlW}XQbBA^8;aDGKW6hruKx3^H;T(TAI;{^4N<8 zl2mFkr&3XSCq8=VRk}q+i&m`PCNKa53q$gk1yJ(+rDl?zfsq8}SA7KtddH3sY=&dAQ|C1VBKz&HK zVVz_zD@2z&>lgzATIQi;b&Mq_o21e%j}E6s>yk=)^he(#U!4ETsrS(IYs5Y}0ADB8 z^j;Obg2~~I71!KY%s%DotcZ@Ad!g42*R-aN@f6NmsMj-nR0(71>zqokrI$QeRlatd zT^Hp|Vouen+Qp0Qr}Q>loMQpU+4N1v=K*h{H^hQqE$R-IRJDMzjI4%~b}KTc#>!Hc zYW7qOoJfB+P>43BYm3d^SzFGit{N4_Y(iSadeYqIC3HEOVC_pvq)J(f(^IY6ZPO^F zAXQ3*eAJ<*wk9icKkO$`(isZFXG_r41=%W;)2Myeh^k$jwK8SMovp_2!Zf2PY+egC*T)Na#rlENenX>|x<)UQr`bYLvwGbp+%W! zXqnMa#{Xv;QhnL~ZCy#pGt-r_y0u*Lo4x1w2ws?1qrGg(i)m$yvk6>cbp}i=G9*1=9VHF`sd#C3~S?NJ2=PO&HnTf zIPs@fIbT)#QiC_wwCGCJwCGCJv~a7T4bfF~<2!BbH>#_(p=)1GQi>han;PvgMP}QZ z+OrVKvj1f1^$U|ex_Rw23r=$Rs7HTUrIQk=`)(l`3-6u8U%wiG7nB*LVoWG#2x?l;A=r?dI4XixCMX%LOrh8n5t+T~ za>!_@3Fm8T-_GO9r;+&L zPJ0H@Z&jSyEtPftn`=Q~Xq!~ZTlAF17f zIfYbQE4_}3o4i;%l$GdrBYIx(Q#W}#&__SG2(K?-Z(GXYbrI?dlAbKZQb9ghZ=ZqL zfTXvyjsB|ln8i9+p3^NwQ~sTGI0jMRFQ+HJuvOvA#KF*gWtH!}JGebjCsv7B!&Df#}y z%B|djC&k`I_S%2;epwBXyeZ3ZvW0!QaD2`{>#XoD#*15${Qx^VvgS zHF3--k0iONl~lJ~Lc58Xe07-9H7KiPVokOU+Vpf=@KD=&__flN+752LFDdEixb{4k z)eH8|{*qp7Yy9U_aGt-ToYlY$Mx>{-8*Qg{Z)X8!q#=|XdWVI{I};zHg(|D_(J*K? zKkH@8pZeT?NxX2SV)!WaLCx6`)kI$r=C8`{-ofaeGTM9RN6m<}tFLA8HFhqp&d^8C z#ci!Nb?aB!M@5dS+OJ5OXP`cRKd(2|uX<`5s*Z5t?`tqp{=NYt)t|R!G#CD_2csS+ z`Adu*?1*nQX_!XjMSRPCPr$m@hPLmWn=|BgcU!cqs*x@m1>0I zBWvw?y&bD0W({7=%B6=@`*GKl;|Jp>YN%dOZ1^)VxyGkc*=2y<`6nvVU@rz+_SrzFJJ@}dvY%qMvT%Q=~D-|69Z1p$UTcul{y*sPtx0U z6)U|y6JuLw^qq$AXuX&4Igs=Q+9Etu2`g06FX-_`RhoFe{013*LmC>BoshTJ=>905 z``#RO7>}bK;Yr~cu{I)Sl(L{_lD8}M=&MoWcl5RSP^*n19~q?HVO3mgdF?uX0si{W z=Kv&z?XmSZLVRLjq!K;ix!FJ4+)8k6e@(^eRK^yvH(_f**;N^itGv9NLAyB*@wRrH zW9?7HO=bD4k5wM&=26DqYe>b7KDlg5u5%M#Cl;%H9d-d=&%&v(fQ*dn7{vPa4`AbB zvC77!Ehrlo5B!O1B|hqA(4QECRAs4D+3xyB`Fu177IrU(yIE^eGupEMsgz3kzdti( zYgI{gKj)U2u5>E@UTgo0wEF_!FCLm2IVnjijpeUdS7(ki|2q@+My=U${XUWU^`!}xZx!mWIduF!I&d$!x@vdZB zY{lC&wO_oPRV~#RrKu6CE#wlthvPnt~ zT>NQiohQkhLs#Sfb`6HE^ZzYHDCguY3bo~1CVF+JjnQ}NNNc>LiQ(8o)8zV1#~xB` zZyQ&cYFoVS_|n?P$+iEVHJmy(67W}b=bSCuyRXY7RF{N~8|D0w%sKQPdkmha)b&fX zz;d~!bOfn33q3R8w^DlZOpo%LxLHwjKce@Xjh8(H<`8a;{78^tg|Pa<37Ut`+i-Md_( z=a1)d=@EKY^I*P7Tcj)FJ#|ca18vq1Xk9Y>hB^a&p6H(kq&%g0z?iC?!V4 z&Zcr{4!^rGv_wa>)g*6eOmJyuaOrArsq|zot_zmb7G;j5wJML}tInazg~M`*TKc!;61DUn$tC*! zBj0q2qwhZk$|d^#BS9|F6;O1BTr1Pdh0fEnu+US7jYkw+&L*kKohMV!o>XPbuPww< znEGpk+zuKGK{Km{33?~ePujm|36D}+iT;f#a*5tst(Hsl-fEv*qW4xRj^10HmPYTb z?#d;4Z)F6$_CZ!GsZlvJXKR?C{YNvkVn1Vx)Y4T4V-2L;FXGvDJbBSy)txgZa#8g- z&3bB!PP#6~lBg}pE6bo!0)^xfjS{FOmuL*Z+cNFzYX16oQW`G*O7F$T$R#?9X%#TC|_5o&)Z-h~1hzqqD)S7-R*NR$r zY9G8VXUgw{T<1_3p`5ACIfK83o;6g?S7gpKUXNyeRrdQUmi#F}Z3mV1N3zn$?kBTX z*Hn#>dtKaj1u>`HhqQOIVh_=LuXxLYHUm9P*uhzHU%zyGq*psG--h`uWDR$}6Gj7J zUDOsmm`CRUjfA-+m#7aQbvzl}r#oN?<1&J^S!l_dDOlywWj>{#9>|t*iTWL<%O&cI zq|pv4ZuNJR-;s{q+IPv})z1~UrdDxJ<$k8x=S6U@sVxt!0qv`=<=&ukm*xz{EC9jQ zQYwrlP_3m<8|l?^Qnjxrmq!VdmhP~l<8}%|(XV*X z-88p&_MMui7c=&*^`4_1zS7&{rl6XTj;cBjLM_#4mAtlvH`}i*=NqP3Xw^EWl4+?g zjpo`26DLul(_H9bqB!beYN3RQ+qPO#DOxNh+XtgK^l?ws@J-2E1o)Uj08V5p4H zu?)4$Lucnfj5Jp57pk+%$Xt%04AolyKj%X27m8E+r6SU*XA;$WPIGTldo8zo`}Orn zTDtj%*GAfd)`_Y`2affRC#)9Ar2zfDL062#S`$ubX`b2I_^T={?@~GnbSKV;CCvF7 zp{`X;?0w|TofUUoeL193G?Y104bn_5(HlxyLT@9!vRAFI*Da;Nyd-ZYi+i2XS*PwZ zpREg*hv<5{-;CHH#3w~2{2>Z2AoBW>+AHA|%WVo6!| zaPMvXUX&XeMfihELElHw-c|eHA}mbMh(R@af=1P;=PfS|^E`11|B`o%R4z1ISD2vj zX0(UYS6h`g(GrdJ|5h%oDubCVv7}O5LAh$_cew_8x}c_(OX+)iOXJ@6mJVZk>92UJ z6+AZ%MB~?dq|sCAxZJeYsIF5>p}%@5RB2CT8PqO*A(yDt{Kgx!59o^rB{Jc!D!*(p?$y?p>MstB0jE|$E*a+e+F)W#k?jf|1{6?Q!o2s=wBjf2G=6T@{V^F0QT=8VUWn`;1E40BO}y z)8JAonIE;~+hZwIbKyJTIMp)BEso>%`XlN!W$GO2gK^E{gQo5kp0z|>gtma28@)~+ zV+p?p$I=a>R{yX_dML?K6a93iEn5;&5=EQ3=#$P)a{(V@xs0|_1Ju=~c*v4=h=#9s zNT#Bept4dI#1l7`Ofi?`7`{!UvP`i^Nw6$aY?Bfy%NCDWys{ioG!NyRD7>;9aYzcb ztEMW;5yw~_<0*v7a>QvR!Ll52lk@SmDl?2O5A;P7EwkxIR!{U{dN-SaV%1R|l=2toQ$CW^3r4kic=m=6- zsYFdB!Lm|`4pKs8r4h?myt2}Yb1Yt2X+>YOE@>;gveJr3mVD@Ip|aA7QA&bkr4@6f zgvv@Ueq`~=${NojLo_U+%A!3+ z=SB|ElI0Z6Oe!mf=%6H6Rt^ye)6-&89f|M93 z8YH*)*e5+?jkQgsa#O|87kzjWAi5Nj`MB}87f`*CM+}n^BSw6J8E26yk2uCsYn_sO zA_wl>Ld1xzk@y7=#1s%ySr-4MVhV~qXpK-zPfk@>TrW=&E80P54T}gHwLTr4PH0n8 z=|w~)mVOZIFi0Vmg{TiHrl=SoB~;rK73)-tsJ#s1c(6W2#S0~JZ;XW$6WJ?LS!(}$ z04X6VDiLJ|>S6|@w5Y|Bzkrf5qNPt3Af~K{VCk7h6DuGU#2sJEW=JJ*0Bu~__L#}| zYG2AXEL|b{rCeb7pcd|dkjkQHb(N|FN| z9Wm8K-TEXkqG@LQJ}jh$xWLkG4qAiK)O;tXhD%OY$}?v&~;iUoTM$wH#6{_2dSEhE-dFDnWXe$`EIBtW15M9EKX%zq{SLG z6YG?SGg-Wtscn%MXXb@Ln&^hDZYEl`Q?d*BkTe&gq$G$n7$=bl`LqzLeex!xl{g_K zPUN_UcPfz9V$|D|Ph6JzxOb;3iLtg~Ax2tydxN&Ujacgwx|Z9D13tNd`+IxwlM*)r zS{k%}I*Q*|vOy@Hj^Ynb7OQ>ON&L-{2SPEO#D6T`6;Lsqh0z&*z%}?Igkn02lu}~E z+F1M+AGV^4$cN_>I-^bwP|{sol@c#b;oK;On0LjWJ}C={5LvoXs(2AT4c85%x0uQ@ zBN|WWkiMb|TK(SMs0ZmUhWLbPiGgB_lqBuV<(k;+l1xb!^S+q-KO|)j$~i{#s;#c& z_eEbRvBJw|keKL`rYJp9)b2^CV%_c&RgE-6G-eqLp&Dt3Xv4B5Or1YNMQ4^BkW7df zDk4~Fam+9=fTab;3=_jyB5@7U`8-^VV~K%KKEp*U%T}~EC}xD1&2j`nF(br6mTf!K zF&!zEu^ffaF&!z^v1CE7E}cK4#5R_q5Q-Tk_Oi6BqskgB4zs)up|VDcZ&|W&%ouT& zr5wkM5f@nw;u)XH8Y`}`oQ6k}oOv%E1u9gA_oia=rgjiHOVwOV&7* z&ooh2N{m|^LitP+%{a!bsq&dF+OcGYP(IT|HL-8KVz)tEe{E?W%G6izT#z;tULQ1T-hE#Kq zYN@!xF$-~K{)!ww7FGMJoXfV;F?%0pL~Lt^`hfI6?6Ft#x`~oVv`uC#BGQ7 zQ>5A~j&aPQ5o!&$h`aBrvL0X*>|Vs|5HEZ}>%3E>AEaUiq0L6JM-*bARJ0WbL`#-; zc)LCqJ$ypj^@Z4pzfrq|+J{uuVR2xn5^5ikd?}6%BZ(Eq`{GzYz7h{dlEjHh7cl>v zi7y?6IZDNRjqCJl#C#(Y9U5Tg)bpQVJYfZ z&>ihZQOYND?ffWe`oux13!lsu(Gh>K8HBCzR@nc%j4{ zxI$gs*M$86tzoQt4c};_LaJ+`0?T{oL!vhJHBp0QB!p_(YoZ~`1sp-DZLW*&YgT=Mbt7uZw;$vUKq-TCkdwQ7n_OT`f`ib+L^l##N>NE)KEe#F>x| z>zpLcvt&j8#+$fuZ;1OW*Kw|q+!TRHs;slv6IA*wQBg{Q=z#uDI-_oh`W$nVWBw4s zS?c3Tp|buE6MYf}xh-b09Nw*q9FV(Wk5BSI?uqNZRJ1;SicFK$`uxdj_?IZdvT!J7 zYDdi9qLEKd8$vt~ku1k;wLXu;9+om(Iy&8ARn8PcWjz)xS$^TNo`_{i++#Riv^SoL z9W0;5d2*0tZ!qQ*=W`xc3LUSf;xfwz&FN8Twl@+}fzb}rQUx+yc642&K2|a1Pp&gZyAXYBa zMOVbUp*>{jwp>X{E&D80*4v{{v*B4Im6ngC?RmUgM5;7e50)<2WBnj$wL2`de@HTD z=Vq&XcA`EU0twT$%~A4QPF+eCt?yhVnJ_EEXvAdG&ave9SQpdq^pR70$+B;rCJgN7 zaIGkw8EDU&*v}szRc`Gf%illZ4Iw12=F%yGm=}@Q$319n=eaBc(xU#!g89$1CoJ>u z1Wh>?((=TsRJ~XVYxKUGo&rYVOrV&zv^^X%88QcD717$ySE+8}Xj4paZHSc6b5jXz zrj&S*7WL{vq$;5u@X0nv8SRcwPC_bZITonWDb)=~6|JdHEWCfKp^agQdZ~#*kUH8d zmX@))IETAQU2Qo_t&ZpyMoc~J2@Cz6NlQp0YN*I9O^2(pvy{3%iG(!KW=e?@R8|zE znKqy0Q9q1}gf!RIu~0trhOmWplZCco2c(r2wvft-6GQOsd2b5*2A@`zrT8w4h( zEsABqZrqn39kp*+-ohD?1nHukV`+_Z<1VDD)_0N0c_LE1kwz2mXy;hUOu^L+>806= zRSa!=1xRnSt(8>AIjbZiOJ(F-O~x!?se^plL;7iVSO!9dKn7|pKa}|dpO*(|ky4Vh z25B*JsTF1#(?&~)braBrj7F+REt+K|WQvrTO2jeL1hXN7wRJvOEafQ6C_G86feg_e z`ed7w{2$T!#ER7%GgK?)6N(wCm1ntC1KX7ev-4;*StkFBbw5|Y%?6pF?U9nCok_&sAu~016~!cJ>8I;bW^3(Px^r1`wH{Jp-M{Cl{=+zJ zoswWrX`EJjwJghhco)C_jhy4O#w^x7{DzH`HY|HvYGN&9p4OS=TgWCU5lY00JNUJD zNW8XF%2921P>xDT)ILNix}U~t8Q03vMc@f?Ek}~mCuJIAtfp2~O0?*Vt7$KCPSCco z3_h%jZy<{__Y=w|T6BY4g?y+*vJ^dxs~fUJo6k}o`8_kd(zG1 zuy%!|IRqCIc^@%fYx>qu%or(e_++Y-j6PW`myvAcByEaM?n7>A3w-h%a#vg9lT;Zo20;6a#l(5opb);`)(-n5 z7h;}jCwx)}@}G9WCuJZnv?QO@gy{M|K4}4Qba#i^b}Fj}B$ZxJN|Hu(FKv59y(Gtw z(6(pPEBl1DJ(FI~C$#OE^;SNiZO^86_X%x#PJNJ1XxsDZ(JUHodtrTsPiWiU(i40_ z+g?;(=@Z)a68biu(6*P+5BY?)y`p~3C$#O=^#@WyZOD3hu}^9LM2oHU(MOAzdOH1o z^iZXm%=L49DF(l-_{he0M=Xh22E6epk`cc#7nIbHDCE;DC?;esr0xI62VF(@XP_RU zd^RDUw}V3YEJCWTL7{xMKzjX;e0m3CD4z;ArhS7#`RqojK|!H>PD0Q)kpB{`7nSk* zt*OzM8x-$7V@SOBj3M#fx`t#{ZS-v*=P`O^xmVRQT3wVfR`1~x$~{V-?vu2L8L!7n znH0PWPtZS-lB8wDs1Um6PS97ggm2Kq@5pDOzC}u+_BZ}cxAACwyOiIwo4j4o`d%q& zeKw|}m}636+$f}?M$HF$_MP~Th;gSuhMFXGr6dY3=NP@MiV^!cCPqIdB}vPTHN1!Q znWUeU5-a9DN4pNkVzQoM7v&r)GU0i5ae6H2Wu%1GFjlXkV&t~d{)yFxaw^)-FCbI( zC@G=$!qfEWQWE4Fa4QqqKzbs_ct;RZxX6ErmbZo>@%G`YV2rn)XX__b>29Eq>f4#4 z|G<(SLdR>4{wqtm2o*C|zrm6nLNRmoKUq59bSpa$&nJ4?-LyinZcj)WtaF^6lVvRa zAB|O*rx#$E4yl}*qy$UsSE{Udy#mV;2$dDD*HjWbf9C5AeM0@T^Yv~%2}AA)`YrGfjC?s&(d>@lJ)vTmMlv# zhN^-P8}$P$c=(Y0&l~llEcfGauRuPV^i}()tOU^+Pe0`$oAuo+N6>p&6S7r5%~F3S zdL1F#^-cR#s%z`hbROqM3PlwEpFmLYg{7=W1FdRvyCj^N1; z@|iw~WjuOvCP4P;^H^vM-W14weI?6qyjxFze6C-R61smK)bDXjBJSO}vkGxg|4$0W zSw*R%b5J)vr!|aqOF?MQAJkJy3GMkqdYDf(psXW$At^`2p7HoKGRRkYq?ANa2Yrq7 zoRX;jDkZc&iTX`nK6FeI^~XN>9CA!A{spa%DxJzYu2=WT*N~I?C@Dt;JriX@^jZCq zlxR0;km{NIUVp|hvp-SK4&Upe4pPq1qTVEojKC_M)8`%{39aFI{lpQH1hM!y+Nvn) zy#A+@(BAk#|JNt9h8J|}OG=fft-@7#5pq#aEhScv+<{!yGy7tUFtj}N+&;++xvCfS zNpVP$Uco2zAb;pJeKG)YS8wE#7|5S`YoDxwJkUG))uW^& zh!1I!fCf>)yJk&M4h@ljR=>ol&|`fW@4kdVme1I7=o7 z#TZ5fC9-}lj+{-Sp-u|97@(i$(M#EHs7(f^tqEny>fqDn>g+@6TZWVDtN zy61)&6Ir}FY-VGhlvwxha?EOtRGEz3CUu7&r$+1P0A&f)~HDm zAX$y;EWIJirQBt)hUsD>B%ASwB_m{)lou@CvB+-NU(WX{QD8y0;LRaORMk$v3XgJS<pYORppb%7{`(qLNR%aSe72> zprv)rYs_XD2cej}#zK~^`|vv|*sJ-BWh{dr$EB=eSTT#epc?>IxWBLqzw6xBJjU`It z^>q)a-ZDymD`P~tU(k~SDP}}SNz&+<+RlP+`;AM-DJDsq5sNX(kP=3R6C}|hcU}5T zR?L2F^pO%Tn&XnBe*RKMw3Gx<4rfa$q$+K!WJy&LPmqu@#%U>`y0@HhRZ6J-DQDnS zEdC`0dM#9SOF6@384jTupq!D8W%5MTmMCvzWtj<~nDRy*mO9ZYrh@SnOKS+lR4~f0 zlq;gjs%TVUsSlx;ibh?QqeWFrC8H_J83@HxGTKRrbW27UwD108FN`4@cL9U7E4JAlqjy&xw^4}r5c3R zr@FC$Wmz#5Q^VN7vI#;lHH`f%Z8@Ks#+NJ+oKH>TgcS77eWvR9TE;n+x)92zmT{R= z-I}4ws%`wv@&H0HwT*k6D)USgQ^)v+r4WQ->KHFs>i(o+>Ke{T`~l~DTL{I}HPW&S zZiP|teT1lIWMP>Asoa+&H_QDsYMtvFg;~T}wa)d8(k#ses+a~wWtNT*DyxA}hoy2G zb=(^oO;{R0D5jy&mgO>fCaK-q$mqh71fiHlMlY5|cymNCjg5gUZ6FlW*cid`73b5$ z7|(Ks^J!vCVX0qF<2fPnk8kblelu-G!GOn`-)EksfE8{N9 zKX~e;^=WN9VxebTifL`UU^!e$#k4W(Q}_eUjgt_HX=9{eS@?lE7Hy5pEL$KH)7A)= zk`(w5UxFkQ!CNz<5X(Bq-<3&9vCy*&#k4mnvCy*&#k4nSvos0Ey!>U+lVdbyX$RR@ zgQN}1q_!%igVC8~K7?XA7!gtu1EprE5v?7K0W9?(RL^%bhO^XKqwZgwjBzY2AQaQd zh-C@G6A@k_N8{VO8rxXHA=OKe z?3I!fh`Oxu>1G^enFXPIx*6ZHtR8^T5x6^aH_oygfE18&ktP3dyf+Rl|auloDzu#2AZ` z)dJ&LvQ!IW&DWNr7XjD}aT*HM%pJb^P8-tRi zT5OC+mTIvvI$5fZjA$vL{qvDQYlCwmm3LiyWXw{j+@;I#9E|6JkBkK@YayTEY6_;Z zylZEP@v)3a)K-6s5tNAe*!V<>>buZT#&TnulmtOBM-j8!821B}o*>E($J;{4N@F$4 zA-r`x2U%r2X8AP|PppN|J7-`BqD<8U&jnv?#*9YBRhFmdZz1`__=lwzeovQVy^->Q zN>ve0zP}*njYeOVmF>`D57`vl8}m=&+Y`vvp#0iEec2I`zIY{45;cEFs-vg<-&ayK z!0029)t}EGj2onP_ic|zwO8SOl;Twpj5(EP+13qk_x@VB!_~M3v)iu zQ9c}$k&|>$1Z9P!KF*&ikS~KVm$4PKUy-Nrx=5cN-_ZwSmf+~LK+IRh0eQS)UGL}| zGmf$>!SPCobv|Z%$KoBYZ;bOSf8hwyo%$Q&7nTPLRX^>wMiR?Q2;DuuHSQ}3_Shen z>*Igd=81YoHZB)_y^doNHF~$z73)l6BGr2|dbdUWe&>zHT-K!Fn8_G1KNv4rW>6`EigRjkGK?AXB7dW%2gL1tT|$w>K^rZ?UY{gEI=Lelkk4Y=kV5QibJL z^e`-g{A|==xdT}vrKytO-neMA<(QOjsx$ne(S;>9q%QXJMWYwXwQRcBgnTX;16lrs zd?sZCOHZ6FbQN4S#x2#u1jQ5Q_QDIL^|goO(NX)%c!eG=%yk zt{RtE_F-=CFR`W9jO#4NA*ZF>W$D~g7r#KR8;@89LGDUSFuTF8AP zoaJ~)UF?SZX|%mgF&IabN{G)Pe;H?4>XyJg3-Y(|8_U9aN*)+5q{IgAUk?rYcUhL} z-M=0hX;_MUj`1eQ=aG?_r8?w$DdC==?)@yE5dRp3SQvD{Dr%quu z<(S5}cOOAa3bP%@c=zr%%&r{M9(6C(Y;TyoImWx2r!?Q^m@&A&S4K=qb0o)j_xDuh z1dbVtJ3hsvGN(!jwZ~GMPgRWEhja5{PByd1P1-++0k2h%#;l@5^X{-|%qCJ|#Us2e zwGf@o?8q@*J0ZO}ip6V7WH3*%c=z{==07an{XLTzev3+v7JcX8t1_%}n0Z13#-)kQ;`KLvtP z2GSN%C@A!nd?zkL)@_HF8<5Iof0mw* zyHbYnI?oz`UowDHG0od@oi!4X19yFMzLd~aS`if-Zm^#6j z(i~IATq5^IQo!5xy5?#YZ`7H`|@o2OX3ZEs-y z$l`5#1M`ZMShrR$)ico0yvgz|BrWz&L-Q|Ai7I|xNR=Ix)xW(pQ> z|1>r;uz35YiJ6_n+doard{PnvUi+}AS(L?VA2v11Nr`p6)!P{&wv^EL-WKKn6(bf@z^^mmn6@y_NlDVYYp|tR^Db>^tSFB*Kyk#hHh21@ zHl&@I74#CqZYV{FjUti2ZDWiNc4`q!qmrF?$ z)JDpb4`bELby8I6ba#j{KT|Q9_iQyTxXxaxapqBuS%mvw9^^CL%=eJCG*R=Ozb2ZO z9x2H_40RY{qRl^8&SHRG3rLLl=07UNdq#^jE3$acXj9B1PgRUJVtjgVedw63!ghtE zF=P{DMlgns&SA(L^Qg=x)QXEUPq28cxH$7X%gX(#cXyt7nPnSw(l{YNl6gjTNtT=t=MBOH7Qkspria7WWTw^C(j@UP5RYDim8FOCt2S_KY)46 zC&eLOnc>KhVyIQn7V@oGlZ9FZBqz-tEE92E41k<9KamnIDkJA9kRMI@wJOSoV%9(| zni0s6L?5h+osi4s6Q3M{{9>MUC??k3*&pNCA-|eGvz&ySl5&k@;$L`nhg>mlv&2Jw zlk$+INinn&AitTO#+n=SnkU z3d$$+9CyuZE+y8T&2Lz)o9$Uv@EexvCe0g3TRNbSx^{jy`>;eo=(_mbq!}eCrtViN zCdnMd(iuWANoF+5l>`-Y!<@$Q075Z0Oq$z~^4avhdIq^^e#o*1LeC&K%~dSk-neCM zWbyXKEpsQ!7PPFWCG&@QfMq`$3ER zP(FW~%~)!2%mcF>OAC&9V0L54$}ta3np=s=D#kGn%|R?Td3_$4BUxVZ`aCixvK-@c z;~#S>%Q-$b{xRdEBn7-TYmd#vEZ&>7$L30vDtHw*{Ga)V z#T%3SpZS8t8f>4aGI!g)dAI+i}NKg|5 zy#1qD15~Qu8tT?C&S&X+s$SKtD3)~)s#kSuGE32u_$oXn`UM~3+=-ih_S3aEboufMZsbiU1ZVx1C%NnGDyld zQbJqmSZ7$gEp@D)RjS~Yy4F?B=jbqul|Wgp^#{u(NJ}XXm59QhVZ0wCV9iV`OAqFg z!kRB7K}1FCq8nmTSo9?wwF>fX!!gZ*o&oC^$1G@tZ$=T5#>$e8ViLq5{FfxHMPHMV zw8(|`qL6gfX_oZic#{JOv$|!Vn0Vm~L0=pst2IhWg7^Y4TOir39GO%;`?H{*1QKqQ z3{$dvF2*_HYRY5PVA(a3dX?}Mw$+Tq#`$v`sR~-7S)$irtQw@SMKcr88ipa}dq@%M z3`_N~m=gn1%=(38+e8&p+)!-JcpFA#;{!OjqS$vSFqMfiFL!U z59unXWbI{X)=-`Em8`=o9U*kiSF*lkS=?Qvs%)KQ*#M!K%GO1ehAS~22$ri@*I3#^ zXjEPm>kf-Ig1xHski{FpUe$Weav_V#riiRB4|VrpAGSlCMYuv5+cQP293MeI_2U-c~7Q?$ou|4=<&-@3^{`-kfJ`qp18-nKWep0aq`-oVlk zP5F4+-q1?H;%$3FD+9}l+^TKU$jZ*L9YSrJMi#9H<&)4&#Wc2xvaEwpOk=AYi?rn_0W0B#8gEV$Nyo)t1&Vmg@L_ z)$qSoRwnd0(>fr-N0GW4=YsJrL8uYAHpnPajA}>w8Y+mDR<%q9pibbQkLd$9Sc8 zv1~l`;7K}IdKW8=l%#-HdRHqm$9Sc8wZf%@_C`0W1*h^#?`F~OXHc8pd&=%+4Um!` zmSfKk!8&)d=*gPu)gK^ZA>FNCq=ddFddCXGo!7tTBdnZC++(BEagVSHNQrjOL+H3i zSS2{7WLNc0yq8shW2!EcDiu-UviKP)_xRhBe z1u=q@zBw9ZEnuk(p?BHCtdCimOi=aVaEtEpv^Tm!XuF16TUol7*2IR|=%KPcV;KaQ zjPqxNb%@0~rX#ImQes{2o-)!ZjY#i|y3q(T^;tE25{Ko{R!g5O!tz*arPqj|6 zc%@IZev}fra;I78bBFdbEzPvDNl6g>rwg$h`*Wt1-zS?Ov#nA-*$;`cYWd_V$ULjH zPcA^_TkrbhDrA8*l!a!upt2TP<9$M9Ew-lngvwfCedrS^YpJ!-CsfulYrjt(L6%!z z`GiVeY5l-LGigxitF7OBLZz>@?)rpEUvEA436;LVqEQ-DLsC9e`X(!iW1WJ ziFNyYjPFltVQiBX$I^O)>dpAdTFep&p;psZ)=DMv%X zds1TEF7K-r<8^BY%U}p?`*mxq61nYkt^IB-k`mg|BoXP>~P1b&r%jbb;}*A z1z{j8U!PDu_pBj4q5J85YpRq`z44dzCcdel<0Z$= zVUInuN=gZ}B_3JxRZOs~N7gzi3F0>HgC~&ck#)%@=OO=Ck9_hA5(zLPaOTaXCwNkPyZ3LeB|7a;hdb_cdSlJRTfmG@34n8Rl z$zX3$5{J_ZVXi z3A3-T9D)p!a*I>-8n4dG%=TX_BO!FwWw!rip=T^=hi9>Mv>51|r?HSUhkO=0CCi_) zRX$nmqAdCxl}}c?hLYfxX0u0030=$C>;tG_sn%MEEuDxp%x>2$OA;r}yg<)CB!|63 zN`m+tG9Qx5PFYUI1n23>Zx4}@AX1~v{t068+l!>cx__cyfu3Ot*vnZ=JWo??Q@~!& zQvSJ$DQItJX%3;7g7yI^p)0PCowdB&8^P@=V&{{RAaJ&Rcmq}0PKhPl9kl;&EN&yFik-5uTxU50#uG?&JA;(@at4eSQnE{l zb$6qWh`xNOVdrHz3ZXAwYS=|t8b|4}52U7DmZcMf`ao*h)mYx+m|Au{mJu9N%Wlpx zIkP(Mwe9vS^B}Z0YTMnVBn9Fzvaxm(^k&$7q(r;xAr{&Ub?it^HF&n#t99*}Qt$=D z7St_x`&QT9DMh{ErLWZM+Q=UN5-o2Illpd_>a>53YH_!5CLreqcBGUxlbY|Vv3*xcqW1AP zb>%j;pRs&{v4sVZb7Om39ZD4^5~t$(ODRvJBx*EcKxIf1+pJ45q4!Nq?UXFu`=+LL zCMijQ4OMhe3#ppfZ*t5&$N=osW_AINIWrXBy&)gb98B{AU5x6{ggM@qCCe@D$H)5?BNN>boSIbFPi zoLk#NI3J_DF8W9r%Q1D(TlhYtjXjm6e^Jz9Qs#21C`hc7#T>J*H~O(5ZS55ta~iTt z$_9?9h;e#5AnoiO9Mc@~wUqrF^9VXt4nCHm(GGgAg&v8r`QvE6A zGRLGIhk<=)&33SV=a{09Y*OyAJjKYFQjm`JKP;J%b9E^%IiGG3s;o}7Q%{{6qaajP zCp)c_q(G}ERaR#^3ri$~%Ia+A=2S5lD@$c{u?w@Tgiu*s?9!ZS0&iDWyE4ly&bg~y zn^ToT4CT|+Zp_k&*SV|RhEt{Db?#<&=9nU!PdB?K%VA!hZgzi`8@xW<>|vZw(*n9^ zin6-fQ5@3+(q77Bj_KJ0XB4D|J&R)|Li$Td;FuL?U5tRdV}HysUqU8I`GjMZBGnAY zyY^O&*$-JDWe>;vj#SGbJ?%pr<6^ruNco1PT5Wtc0Ew{Au(X04mGU#oV2{DQj!8~Yhs>Kr0Q)y;F$i9Yf_$ZOaYGRW1IEWxlxT{`q-(YBn3WzJV2_xb|#Kl z0@3r4?Cm)R0n>W72R;f4d>aa?Ef@ODXSi%uh)5He{gv9>+X_L`WIRQtdtT;6dKE$Fj75L`j*% zG7eWEp3dWyyI6bDSV1 z+Mdsn?I_w~`7z^`{fy=ImrADE74cSyT06^eyl94ynf4-<#3N{fr@-u0_7y2f0eV}S z0r||eZ%T=E>1`?9-{;zoIh8l#O`M$({f3nDohfP#oH)BL%cM!_{vKzaW7!duwk;`D zv?zk(PD^q2F&6p?fZ7R2)k@|32~yKj|2(^5YbBA3R3Br!ZMIQDy%{tw=zKdp3(ZEG z6;iikr@C?%Gx^D!*Rkx0 zRC6&U*qd0q`I;8lk68+L!DuL?`p^zxWzDokGk3y93L$ z8%jR6i*}@#qw>uNwamY;H%STgZydA_s2H)auWIEUwC_lX6WrL2}Bj)J3H_hMXzYS-U06Db!IEbKc%2Ws;b~sV>-QyQ);nP&%c$Xs>1| z&iVXeSL~)@9=wa!-vux-&EBrWO^IiROpxF0J5mz0=zY4#E~QgnztMybdeI8-{dB`)nrcY)~NNIoFxbTTYd;esyH`UMq!U_L@L**7@`r-NWe+mOUbcm zy7(ND!U<GWdx^e4<221(`2U^%`SBQ_zao#j61i#j~DbAzP- zdVp^rCXI8Sr39X8|AeG);!>;`?TO{&H?@VVog_=zi#Chhdl@jXj z&Ft)u5-kpi1unw}fU{rZFA+kFa`%vi#viBe- zVsbdmm53K!yy?tjsd@yx=+!Xmlrx{D4P?2Ll`QuPsqvz@oDD1~3#;*>xtvc~N}$z5 zJq+Q_ewHQ>>R||Xje;ghB+Ccl%GB}X$Ali$h8axRQ} z-kjVlS0R*70p~52KAF)@?|@UtDa|qhQl>3Q6_!ymR8M;$rw+?P2px+;PE(fR98=h7 z%hHBp3Oij{3Jp=){+82AO0-)ILfih9^FGHk#ka21KUTyU!SX(Y*13o?f#vJ`Dxadx z6wc=sgz_os%;lJ(xZde_6?5npkEoxdA*60@d|BtLV2Q;(q?qE)dX|qN6jR*U;iYP> zVoEssSo%UJriAk)OZy7=4QX5jC7t6eBO%44oMRbWU9EE|=Mu{#2(5D|=XaKz98=o4 z%TkJCN<06stXQP3i!#m&mTeF^7G)e~q}tLcV^mC8Ck@Lo2*s3jvan1WuVTtM;VjD` z6jRPA%u)+&3A#?pJEd4ULMW!ZQ<)_V$5e1?vlQZ(3QiN2J7{B9z}~3nwDD4*9;+s$ z3(K-Xs;o**1k0xoDyxz+kR?S`?0KZB>0D%)4WTwbP3JmG)-TnyT+6w`QU*fTMJ?wM3w};S zZdYyRIZHMO#ng7}QR>{dS5L*%aZ!|imT_+dIT?pk<*D1u(>Hu13 z*wT7V36>s^$x)xhb<(jImA zOyu0qd52{LWTBMzSgzwJuYxpkhOoSZY?d;XWpO67f+3Ba7?$0TFQv?6NsT>6=SCA} zJ_}tRwCzotr7Z8D*YOlmHFefV!I!^~pQLQzn2mULpnRG+yID>`D4%A|L6&q4RZMf| zYnDR^e(BDV~kek#`zX%+gm$tusnlMS*@LnEH`oG()zS)H=6y zim~*8P)u8=JWFM41?AJusm{`#x2v7gfaTb3RaSea1gCPSn@+C z=541ROKaR^sH_goV3xrUis|5tVQDf}<{71rjxUT zr8*z4&dzF}+OP$n|^|XO|Sb(cpT%i}MA??1vNz$BbJ}BFB6Op=+nBbBbd& z)luuy&H0h#3ka3f&AGyow~^Ye?#@k?vJi^t?)=5Fd%Vi0hx3#r5kfIN936KKx_e&6 zXmHwx?>H$~9ziJP9VY`z_y?+;@UD}cr7VQb!*`v0EJ?UKT*sBt(<#dGALI`y6NCUkdoli=&ZkxD#Gc{617Yh^lmG{86qWK{1}uO9OEv>R^Y8rg!3WG zUx-n%p5;Xi>@gX$Ns0XBnpE>C)gBh=T~TtBQ_&lZ$8vp6v(USe=Ta`Q(DR^yyIO>E zlZD<^&=(F7&O;XJp`sRbgoB^p!JbQS>D^5l8IzKQ-qd80l7)r7IXY2})-WH7Z2QTr zh-9Ibp4zV6Eb{G}j5*FiZ{OyXqI@nW5%g@H9l7^%l33_ToTQKQkcFPR^F#VM2HvF7 zyHR?kCK=$QSK?BiXKBbFCnpQ_a8{J^7E9J#xR**P#X@6u>q@C8C0?|`71vlwUlk*$ z&#Dz9(iz1u)N9loGT1rFF)25w<2BTI#zMVebOeVw`EdTxI#X|0AEX-U)McUGxnb!j zW-3eU0K7Fr%rIve3-yoDoZiEo%`DVEMl#ab&q94)B%_^gl(_Uw3>~kr&aW(gLt;vj z+~ibiQ>vIKX8>Aew1zI8yN9FnC}%8-aTFs7ArqXLEZ5K~Ac=AAur$TqSOA&ggilcU zkbDf8>QwW|Cy;4QTc2!$On1h!P(J{@*`MjmV4=Q?{fL?6EMm#N6yGvHW;;7r=-FJ! zA(rrkc+246ce$MG6KQ=ySNB|}pp?)X@VQP6DWRvxIH!RU_im!P>%}=OSe`KA*-r^c&A~#Xat%i(}Y|cxRM~k>g2DOZh5Us`<`oDWR>H z@05?Gd}7_oS=BvvzEhp0DTMC1^PL7P5i3>90;dJbXb8nDa5}Jj{19JKqVxo(2g@$V z4JrLt=0~c!ccC+wWe}ALV~Pu zy0H9!zJmOaPn<*+`lg0r);p(sLNObi3qC0e+3eh58GtRV3)$v8ml7|g_rsZxMTqTA zmdWy11h;*MliMe>e|9(}d_v=mKXvN+Bn-0Cq2Jc^dNb%(>~}l;e9{D^?{T7h(hhRK ziStPh$YE!>Px?WQI@w}FIS+*#b4vPTSbEHzzrlr#&w@{F0y#zy1#d>v3TRUzjyAi zc;mXyIS*O9aoy*f=Pcg1?(>c{h4y?>z#G?n-bu~kjqCow31jibb^qYxV)4dx|L7EC z@y2!k=#*sf#&utCDoTlUz3<~LI1QDE{do3VURH<;&M+yMXWK#DjQxDUiDtPz7rz`1 z`N^5hvTK4aFd19&IOLSk88RmMvz{1%&D|D z5(G&{$Q7rgPv)TXYfcxR&>iiD^8w2cyti76m|M;)mYU;*SOK~1Eb_%{gxqzuv7G-% z7oS4zJI{Rb7385aV47N=rO4+8$P?!qmgPuAWj%9lveb#g+X2W6r|)!16)$L%PP&r# z2Gc1yOCDwI&MnMtg_xJl>e(u1k{1xe-84tZXKU3jnVRmpxk|ErhhNru3uF4-hVw|` z#IW7S8REE6Qj)aFH&AOq-f+iD3Eizyy0I!%aHL#HcfOPa(Kk1G{*fxBdzxk25+$kK z_VKFpvuKYOMNC>Zg5?NHI`wub@8KwGUu-|D#_-~WO;H; zNp_dMTc*;#=bAr<+XLxI>fwG-2RY|-N3#?_T~4Lvb{DXe*rSVfkUZ{cmc&dLsR7CB zURk8_c^lGcEqY2_W3iHp2QhvDG5Ou9J{b%t;I5Vux_1|L3x23lRl#wmJ4j)-j+8iY z6(x|oxEO*DKn4<1EU(9&K6mwI4q;jS`MpE2u%0h2TNlLg8EOfj` zO1e8)x?p`sO1Xzwaurol+CAx$$%rZA-u9&;DeFFADS>?G+tPAwQJihG=O>{*fZhgH zbRV+(QdQlBE4$`W6>}KRDKn8zRktR~HuO}`v8e9O|5(M0W2xcRT&AQx@}d1x(>=Ca zNh+jX0IB7Q6-o|OQ89JhCo7e_gKKaNV(PgzYBXBIju6VHft!WpLE>SW$z4bfH_0cDA@90R zSsFLPd$uBY_H>vm!3UJ=(H zV*0u3SPFiq_ThW(QI;n^;hI29fA@Emr9JT$4>Hhw!ZIIH6Eeunxn8Z|ZSSVX!d zS^nsSUO>bQb{A}-n9$Wd)IBOCK^()?&D@=;n;PW2(OtxH2gmC=WV4%chlV1-0aEcfC(CLH4*hEs(~yFg62n*B!+&y*b)qkiXrwpQ)Tnb;H|a$OCsSiwmJM{Gt2ICv+7&a{KO4 zsVIidv47kPQbO0xWA~nvP}}CQ`@|98Xw2e0k!1+9X7QfCG6XtFiFLi+j0}NyS-jqi41xYE-Yf?h14CK7Sq?G= zqFB6H4l)HMv3Ro_WD3k;se(69G|NF)U;#@52#xR$3w+Gt&4iFSu$E;U>I90(9N5a@ z%?6Mq@EMCY8$g!8At^}#?@20a;24YdB$YLAhEwfsf;s`mD_bD&xjH&aAk-tBJ&=yY z`}M=@fvQRb)sS?Qa|9xMLf=8>49sAmI+J2@2NwB+V)6!VvQRBr9mljlAmbOZbV1S( z@>XCf3)PwQBwjM`os`g*+NA>LS-j`vQi01X-t%&)KoX1hyj(hPkHvdlE**Hx;yo{y z3A|+So|nr6+=H}+NdfP9xojXUi}$=-HjtIYdtNRV$j#zCFP96v#o|3Lmk*R?@t&8< z2dYR3eT!EiP>03)7Oz5}Da-SAs_&v=pe;*^_G*t+40M%}6!4zAD+PM7c+cIH0+C9B zUo=+^9Fr0)=u7stI2Kg{g$}80?}gR{of|a*J(OtgA*SFSl08ylMXrfx9~MMgG*IC% zrAiRzX5noH@~IW*%tCkbevmqWF)V!{Lm~A7@hq`;_8bdo5IDxt16RQ$NaH}pBb4+1 zMb>?QSxszl0M9Ng-1Owqt90oC(u)-7U1>{Gq$mm~O+i6qVOe^I6={zy(xeyZvaCo) zP>M)VTxlW#D$;!aGjrzViu--9`18ypnVCD8B$G*kmIqe@^#5Aut%U@0=UV7fgd}SX z^5eZ*q-vqxX32O0Z;^JvSX9rvPwwH-<5FJIbF)xP??QM&r?-lVA!()4_tELN=zYD_ z$hoz?hGjP7N3`%Z`T>@i*>T?wF>Up%DKb?eo>T9FbkO5jb{@ptDab3jwO__ish)y# z)v+P`rP}Ikoi~)ksrjpcsQIfsBQa_oY#?eL?3*gaRUl5s^4G%k2#DxWwt%e2qGgks)~h?-OSPDIq4(!NS;HHW-kMAU5XK-BvefvC4F0#WZ)1ft%g z2t>U%5r}%bArSR0Lm=v{gh13g2!W_K4gyi{7X+f-CJ02mVHAj(Lmr5FyDB1aoqNf7 zdV#3f#RF9t#;MuG?y90xi#Hl&bfvEYtgH?>J-V}I0BI-?nK-3!tA4Fo*8wY`? zw+V)*m^d{XJPmLliI|B`pl;x1^kh&`lP_apWG zqOZeOx_EyQ^$%ETLjJmjErJrEQh2tu? z602nB=ULQoCF!A5>U&dlbzDh$U6z74(kIxTB)u7nI?~a48FbZ)o5%(oLTi+N2JsnEZ^gprDr}WWiDcJBIXmlJIglY za}D{-(HkCv zTlBA3CUZVp^y4g#>d1Vy>StI?&S$HBnPvVR+(W`1Zqu)^tcT1Ma))IggjSaLLVv(A z7P3J|x^G2kgcfF#^|f6$S-yf$eQnn>ONl(a-Jy3A5K#P;c}`1MwVIFUC?GvIukN59{TGB!@cS-WAQjIigo#8AO8lHb?ZjGF9YA zkLsDer<{W$J*rn060C%9Os^*-XuaR)&7O++M(^-c%(r^ir((X<-+3zLj6Ue8m@|6f zQ!(G`6P}9sUjO8&m<#&Cr(!PXyPk@#}}?Wzt*n?YztSF_s|%Wxw&G z{te4MmY?)*qvS#ctY)L1iIVXP=&Ja8mb?9AK3DY%EZIMhzprchWtNh-=lMHo`I>$; zN*+V5>$inW)#hcy8zj%+DW_idJk{4!?Pc_oriV2&^%+8vwFfNjrdud&dxe#+;z{uWE$(QCJ^Z`bZXIi;TIWPmmHh zuDg2E3;%AtclGT;l0xamW2PMPxu@@Au_3grd-`FPm)FR9JAde>Sh_=~PxwRsfn~>3 zx&Hj0`p+!;A#_}S>bF>ybIf1*pDgP+<}dvpmhWfE^0}{PyeMiX^fQF=xvzUtBFFW& zo}FVdan671`B-vt&VTF0SdO7xP{}{g%d(t-P|gqZsw~CPSJAgtAL?~jDnsa7s}J=i zERWv9JJ(40NN>fW55kvKg>;e<*~7M=ZZVXn!8-V_4L2J<+GI zsN;H~f5M`U>mPj~i#o1<^c5_nQsuF0#(I_-5ZabzY-h=dd#6-BF~&ZY0uYLcF%Glj z&MVJEvBoKu(vVE~F#(0SLNV!$e^@$a zmHEUO8869}@D_w(;tY@FP8nHW8I0^K4nuYqcuy}4f41QqZ3ON2<@|B^k8}Q zb$MK-(TC+t2*sGjdo1~D${5QS#!?(YF_tk}N~De1#uO=HUR-tTvu(`1EJ{qfjkfwC z#4!f{BBdj)NZLbuqsvtxk$kckJ%uD|ai~)o*JUy0vV4VJ_6?-UYV^j_4mx*d#{K7h zknF~SC>aaMWn2-G6gp59Z>dA_8Z@^f`s|t42wj)^qs9r(7kZ-M}q~8 zrBXsi{=^%-$hn}gn&k>)r;yDo8Si1nCZv$Di{%-}IU!%Mti_$lYmmamF_!(1CqmA! zculbe6^_$_I1f-%-Wu%QF`b3xO)Nvs zb&c69E@YLEMJx$rMlY)I8UB%#|Bo1j(Tn1;r1mST_%*u#d#O(97dtth?&(#YugyC`{$ z=8w_;Yi!V0K=2#XG8Dx7-}!JC-MG!N2E7Ee-X=y!WttV^Wu)J*0 zomP@_qww8Hq-t#>;+IcS46QB=($+X3WUBVwY+P-8gLh91>kk=oJ3UdBq6{kTe^`SZPv z6qfZ6nnBUWD2X18a-PL8ZyODTOxNtOcutK}?-+YH=6)fZIs()LI-&}b!Oy7no?06idsj1Ey!3il-j8(mrIWWYUa z#Jq3xW$A{|>0rnZV+TvYk8uACGR(+vpY|tMlW>HQUr4Yf;RvHROTr)*@XnX#0;aSkR(l=PiGp7g-jLK-Sbd}vy445CbB=D7zd<8`npey z<1DJL`@}fQQu!Tu6)@Yl%ANY(uK zo|I9OrB6P&YW)JE0n0}aTD5+G(UN5t?f|dFwiX)kEK?w~QsqM9HI@b?Vzn<&9E*%M zS-L{rM?Q;;{wyDI%wppMmc<;i*chn<_erQD%Puw6d9xaf_zeuYORs}F>O6b$VtcsqrQ+ttyNvDkOtXgbQh8;BrBeT zZZ@W|{E%6W-nSSVgd}JWipbx^7Gsx?q!860jm*C=Qdy`5=_tN1j!B6e#dhOPl+aP^ zG_)tQhrvSL7GYcWAYU1|{-J!5wW*K^#c`f9 zN(z~(xk&XGF^7yDEPo+}@;PSY)G&V1WNCQiaGo1kuJlt^iuF;b(1O5>byN=Q%|-y7v)Xb+RLP#akq7mTe!Qe#M{PA?m` zg#`QalkrfdiquY;kuFx`6H>L4W>``p`}2$OT$IrMTr+A33HIl@u|P`9-u!ZZel;#d z3GL5qBYQg9RK_lyQYlC@I(F-Ha^|CiA|O7cSP8@+@CXRE)B0YZYa z)!)WY7IiLoU?j4rbHM{+q7-qY)Jh&2v!jI01rLo?LegUBo04?4dK5VqsI%2S#(5DV z&jt5e;=0?sCR0VuRhLK+Ln!g6(3tkxcq#mvLg7lEreonoAX%i z^^q}o%%v>W+cGAPxmHT#SCH4lTh~Y(oKN$b6+tB~NC!n5Wd zGA8m4%d=)ihf)RGde*d9RL;+uIbDhg@+oc>kP_-V5bFu!D2kiKS>A@+7gAn|xU=*R zq=dQoseDSByExUT;qrcFNi&sY0)&3KCCy_`r7C5f<`}j0QszY#we?cwRViZY8J@?u z-|X#)qYz?4o-=d$|30oVW&t5-`Zq)5%E@KS3M@ZDXyxQGW@DKuM6>e#%!xaF=F2SV zDS27*RZevjM?v?5%bLAqjA$Dbs*!vxV`6sKl_SP-=C7Pe{dS%=|6ozSo#)LbGM`YF zmhv}P-pmjdM-h4(LchWCrpuy!Ulq)3Eb8}F!OX{^eqR;MqAcq7RnaWVqJCeM%qlGE z_f^TPBP2~J(IfdmS?@w*>kr2E? zhaQRcr?y!p3#AI?^3^tH2?_2()HV@-zf^lRw~auSbK3|+wVyhXRI2?1qT0rbk(fbf z37d-H?Wu@#7%6`jfuxj_M;b`$(of6qgr`%X!x8t)gH)%`kDb6l2XX~MB_D|TUS!?K z{;2Oo2BPY{o{EW6?KvX0YR~mmjIG*pMB-FkG*B^ds@?-p_1-8FqgqsBC3dwM@+m_g zjUk!x<2)CMna?pzBC>{KnwWcKOVCvZ+DonzoRnP&T^lX;nC6NGx~PUdx%<#?JyBdgBl9hR*Sis@`VWU1Cl#=K&t%O;PsDTHEPF)fy{ zL$Ts9%RC6hylUoQ8Ql}35A={-%)%@)Aw`9hW>KT2*UXA6YSi?aS(8Pb9lDwg zSk&2}tJzXYWJJ`>?1S0K)YG;bDen?@GncW@dic~EcQco>^!Qfx&)v+mESV<8Xb;|? znCy6io$`5vaa1|%a}TqmkR;8nhr2Y8H_cZ$X3u!s2Y~c8hq6>l#5W=!@0gQWDwdM@ z3@{h5tX?B!khxVzqSg@4x0hZ}L=6pdWn12aL2&G4z z()S%Eng;Ht<2)G3453lVL^Gd|w3ula<W5og&o|^9`0knBPIN)Ev%o=|w5a%uiT~wUP3v zI)lWimbpA4s@1KCh-#~=Bcj^jx`?QDxG5s49d3(=YArh>qFT$Yh^X4x9T8PKfv9rc z8;MbE?8}I#_OmY{s{I6_+Ry$-jA}n$MMSlq0}-KfH~lUGQGLSKkr>q{1fu$cugwjj zF7VwY{8E0vwbR$;{wN8f1`nE-SY{r>yYE6qKT9nkS=)p@As^(Bxt!%Fq$uQw`2!2p zX<5iI^LG}i(<+b?W`?3NAF9(jkW*%E7OGQ{GiEs!s#B8lW-Beg(9E6 zEW7vMnUs(PEFZ6y>-XL;j|;)~<8T(G)%b6ir&-jD`WxmYPIc`~%qSE26v7>LDvk1} zuMI+43&9%NxRR#%v^UKkWsI&yL^sXboJ!5LzGXCjm6NLohmS4>YLXtIl zQ|SwA>sNDjl%zm@GY_+r8;_N+A$QDzr6}iQEz=0BI|8|DzQ{r=9$$pqGh4FcT8)+h z`NMpj@TS zjVx+Tdk*Vs7Byczm-Q2inw_4thzR(ou110ZSHJ z#+0y@vy_0){*<5rC)^Q=p z;#+>BAkSMDqhvayqIH{7HSLd41Ei`ou!3x3c?V(Em4kZ@)(#)2fX9pq5GB4NQU5vKk7J__)Y&Q`w(9vKBA(hmM)~|(HfF;tl*qQ|SxNee zSPwQLst<2w4dhxrJq2%#Bc{2vfaP9qtfL5NX>F`TEkV|M9Y`DNypYrwRj2K&pIKC$ z##_G%3BK(WZ{3qI;+#u$8gD&fQFR(`d6j8fsWGZF;;rf|sx;!QPEvGL8u8WyA!#vm zq;%}@*5)XoV{dPzL61=ezg{0}KMRl~Ua*S$G9j!c7<&mnk(b1~NqS{7BtF9DXwK{BzV^kZ%wm3$$ z!%kKz$EaHFWSwVGXX?&Y-D*LdQakKyH5HPq&BfgnT2H34)rBSB2s~GZykgB_$poR8 zF4i`d&MdE4sVoy%x>~1LhR&5Ul)72ftH)xS$=X6}t0`)yhZWDV4tKao-mr$V>_!Z& zMfs++i={GJOmEx-mR?rg8gg6HJIS@PdRygLN?{LaTYao4 zECX2Hv2L)`#QB}h-TkceFUWkn_OV(gr0Q?gWx0wOTs*T2iX5m#YSSV3lB@mM{@9L#)ay-y!F@kYQE=3$=}vkOXTA%YBUNHbF*O z8=_j1mNSSs zhg9RNYeIq%$OOx%L#bphL2vm@uyPAYi}@2r(G_o&O|%+D35`W3TRmAGBIXKmo@~7* z^9gnSB39djXRK4KVJz=J4hb2}62~!9t;sAoIcBOgi{%rJnPx3u*~l@|tj~l5PqL<4 z$Au(o|N9fij{TWo(Yr=egVZwrgnVq}e(~Qm_=#05N@$+&Y^xy)9Xr+O9P0|pT(l^y z5@zXG)$0Z&2GbT;b%g|_y1?o!V?wkt!;~TvGmwQ=W~iE<Z3gLdj32b(emCRBeLSvFe*8ikL?rSZ!K8+GuRdTWQWt7l*DNC)xLV~w`KDDyq zu8L|2bX+T}Vp2k>{0w@9RhH!hKZ9OjRb@$DFZXbzRflCUg!XWy)r3W@?6Jyf#iCaB zSY>r$xiuV56>;pVt?n#;LrMtg!!m55+}0ZFU6u(D+SVFt7>nAU&#fdDwLhO*lUdaM zthGL7QTwyjTENmDW9*99`Z{YlOA@5EkaaBdRpMrl_0~2P`YLg}kS|%(K5wuNvZ#ID zV4ai_slkob_Z*XMl04Fl)=w;XAatY~t(z>ba?B>{9?Sb2v&nkQ@;#T>W-G3~sO8Xa zTwX^pt$JbzVqvsLk8B4~eth z9_uHTHz2eE^B(JlkklAjLox~5+G`bU$ob5|83gjB^?{J!*- zaNU$@eJ4db_O5)lG}ZbwN@gO}SJvMw6-UUJuPm>TXbBn##T>A5v)mqu?@kJ#Io5RV zbV>pFUfThyEX&zEScxu#J6%>4mR7cGs|T%GESILq`@ILP1}wuO(wrq}jC}TY&}zey zAARo}Z2h3siKP|J%QTblpw*3K4&I8A@)k>SKP3ZM-YTtf{*>jzJxbQFOnYC>pg3r4 zVsTa|*}-x+lJh>6g}8f7^VJVp2U&KlME@=J`2QCq8_h{=n%cLsudG0~WW6^Mb;#0BD z`B^$gq^OVtt?_s0`9utTb%R<$<~4Zl7IMgH#PV$dzOn~7Y_(&lKSIh8s|U+tjH3=B z=BPD*MK6N;^N?fKCrZ{yIbrQ)X^6X*l=DgJEK5C<2FWSQYa;i@o*?C0t2oP7xQjzE z-&qw|HuT1meaLC62FvFi<=2GISdCcH6_#@^&sguX3~z&PX(81aYZOa^LMmn|%edn5 zJ5Xn=c`Ri%;!c=IwUOlm{BLqL%mK3YNQv|5+L-(fu*Od-#)e zhNT^Z_V6dmXeN)nNH;lS>WWoeN~Csvw$eAJn4stX*?Qc9WMt^K9C-V_8UCFW*HX$O z$h0OTo{%I>&ndV5ip1GCs5~WIsc@=N7kzBWWws~3(c6y4EfV~ zEF?iIM{g4%=fAB`JGrf-lDL0{mwgBBiR?9iK|2+1;K>rP;k%+Tm9~{d|l)kfkex+D451 zA&Xl3I@TV=k}x<{qdS4I_9Q8ht*5h-Ic8!u%ydGjrnBd>d<=O3$DYn!E=A1Fss~AL z|M65laW?g6(f4xW?8@zBiIw1fKF+SiQW-)e7H2nN8GcxnY6klymWdFG$zXSo64~dB zc6TXae_COGGTIx3OxHFh#cH$)YRHc1AhsS!W!Sn9IZt>PR^B#jU&e&gnrViegGH^G zX4nN-e#4a}{dP>dILi|V?V)KuFD0@q%dRd(?BSc(AIn~a9+q0~y~()ZhuHQzxRQrN zQaSb@A;EQ%V^5SZAscO$w(i(7S#m&V>yADDseD{}8OOBlE6;JRy@sU=gl1p6_7)b^ zT0DCj0ugYj_YMSrOIS)WSI)dxSM1rOXcynCyZmyZ0~2O1ED+ineC%2%jU>6 zB(vDxv220R8j@M;i&DgKeTY5GYG;3y_Aq##F}vMINK!~`E0_H)i`rH$dl-w_R&G0q zMQtm$Jz0v_)@W=ikG)(-u&rn8$3lXqcm?dZF0?;sx_atSz;=WLPYes%*;&**#)5WT z7IlxYpxs?a@a(UkJy^y>p8XZHm$Rs6e+BI`Eb4AyK|A!CC?8$jEi7nPW>I$w3)($d z)V;xi_5v1l|FEEaoJHO9ENE+8Mcarx`zvT?WKqxl3fi8K)X4qAf_7^uk!ODe?L;BL zv%f-i7-urnY2?{oAv>Rx$T~}f?DA3~>ns(v=L!j)%M`Yk3rW^K#udX<)L>ydUw6tG z_x*5=n+GXkKhN?DzpZ|wD1Go;UWP3uAwCk&5wI7kHlASwBD4(kKO_uu{ z^MZXpN+_nbz4djP<0eF@NFM3t;PA?L?OR zkdlz@_C=PO3uCn^*>TRWFSE=Vhp#n4dfPtJ;dEZ_hB{aw5 z13Ug5iV4nWL+mb5@)}YNv4=)UZ^$rvPm~OUB-j4-@6gv{7~oma&QQnbauzeIdc!gHiTE86(;Tod-wRYdPkhu9&BXttZ)5Ke_dk zyBNVj#@d-#&O_!4$-~k;m%P#(XBTD}2BAG1XO|HYw2krh9wDhQ&wh^8&qibIHQVd| z?-HA6KO+Qdaii6&#I`2dC8K0BWU{@M#mx|_708FZvmOd>)pNBkI-mWfr@n98s^fud@`b zAiwOq#=gVy0))QoyvC;0aA*W_Gz;#|)zP%i?E-_O%)s3z8hw3k7iXCZq0!gp_VX<2 z>qu+uYC@7iYAx=yc3qAc)J#4BUuQQJk`NjLX@%ojXSd;)wqxYDcfH-2^XU$uaqoKj zb&lDKYdyLq+F-xUF-IWu8{A+I;+T^eWoc}*KjN4lA(YQXdkn{X|E`>ezsa7$LTiJM zsEn20>{*lBSI2F4=OoTU)XB$UrCdkm+l453uJ?5P}6 z?}SXX+x~=OUWQQ2ZhH~OG}$6!_Sh>prZa?M_ShRZCXBa)Xeo`(yc(>P!1uj)|Kp^Vw(rz%jWYl+QjpjbnQ9KBw5XIA$R4bBg^J$E3}W z$G+eGhhu(+P(J(Z(EGB)N^O_*m1<`bk`$^7q54X-t8+|=Qu12wE4wboRD;kt?kl?) z$Ed6919lsZQCHaq>{mGE1g^WOe7?3{XX!OZUP*mzzs;$JKj0HNRDVS5700i=?0Mu_a6Y0l(f`?(=< zTWVhA5xbI*U>@2LyB5c!HIe<{QM)0>JcLkxc+`H0W9SKH9JYSU?!ZD%Ice_qal0#v zT3i0O-HS!7KYzj=z@qxq6ZQ}m)vung6NMy&W`2qpRqZwH8+!uFQphVUNM^FA-sYq| zkA+sNqh8{qy-Y}&PQBkH%uqUIuTl9xK19qZdy9;Txph{)|Mjh%%F^tdtijXvDV75e zdNOjxruVF9+)J}4sfC}lA4t*F74$hfcBm|Qb(T428!YN9bI#7hqWZD#?OZIXAN$@e zBqgS1OF0@mZ;-#|jEN~TT&`?((Z0Z`ZeSKA zwaiO)8q41h`n_MWe`D!4Nsf&#+kXj33Jr%)%w=2qP?n+U!+*3xQexQWFq8hMAAd%LVmR^k#kb$)*tv? zKyKNYS+qZK1tf&lilvr7YX#H1rr+!-EHuZ1Y>1)R z5%=uw9CH_YTC_S=O|;i?OouIaM*~OtmwhQpwnOgQ-f)?7jq+IK0P?qenC1BMn9Txt zU?(L|OfWKkXwMarthM?XYn>tHp}mo%0nSZ7K_1zwM#!8eqa|F2Jhm?i85tSnKCyoh zGCkDeN8BAp%o97)NJ=$5RKFhjd0f#yv2(J#4EamM6kw@=(L0sTKXzr7+4%QTnzOXR zn;%lTvkXIhO8J1LYB?p?H2zZK=xu^0$m<``qDa)+1c8h@g<7r_9WyK&t`s1eGezW_ z7NhdX;7n&x`DAcrvZ#DAIP+LkJ{g@QLW1^VJ6nVVbzwXEgd~SHOu^Tdv31)y$g&$! zS;#k1G}=~8h~r#jp>5TNxXxV`+Golqi}Mc)?K6E>F^gm3`Zl^HWO1?yk$XtJXcni4 zkW|g%9x1C+T1Z+<|9-NM%IZ{nDxa)Q10l)UYlGyBvaHU_oX?Pfvd7Nmyvm|hf6eX; zj}m%2IEOQhMXmLk%UKW=GkyWy(09HUlB~5v&V6vCd7VcbGwCh4_Uto`HHwZjRa5KJ z=5toDs5N8rIVEui2c@BX+6!x0A)kCsPnO!4f%AcolA~ozxy`tj0Lkw>Vp%y+{&EXB zTX7XZ`Q+-18D5Af>^NhkTznx`n+_@BG!>GBIp(q2Tu3ozu#jYJC+?0cg%o%82uan{ z8nz{z#Br356k5Z!q|;zLNzkH7IW3}O4e}}F^c0d7)1^1Y`;h0HDQHR5|KzC=tL=r9 zadrqvi`i2oRyztQ>l_v`66?+3ejTK|b47^U7Uf*Qc_c-nR5u`%ob>1~=-8jzhJVU~ zdr3}pmIa2Cs!mHGNm>ugj(mhv)tmz?DU~sjsg4=^&aydj4xR^DwhNi6eNi3j zOk632lTv;9RqSJ7` zO!Ym^DGecYoxUuTPYXyrXKR#ngw%H)v21x2tq#(_S&K6V>OxzIZM_F+=+s&$rCkc< zr9c`v3l;}55z@rzy@VuLyNn}EhBS2^vGmRzixisH%&D-HViL5==!|w?hFf#z9hQd~ zu__f(wQ$}Sk`y|#5bJeAS~>|V*C6YJjAO}yGN3WQOU^Wwf)F~tzvRqeSc04f8-jc z@)yZ#nKsVvEIA?6N40Stur$C}bUTi;trNRUlyj&xWWNwoNV4`A&j*h~+Bwx&HsO46 z7839DW?5APZ64Cz8UCrPorMKrwcj8eoH5I#w5f#iB&4HrfTd#QSS=P$?mIb&pUIeB z+3=lN$ScmJ6;ih2-2u9v`Kr@!rIfF$$7+Kt%oBEgVCjuBc6OwC&B?q<#x#2t?HSU| zskK_lSM#LwaQd#5Qnvzr$B22udB8$5(`hX6mJ?nlV^Yz7ko0oOvou*EV|qIaSl;d~ zrH`|pr6L0Otyehd$wL$a_w{O)^!x!MKkL8SKQfG^i4*O@a(@hO#{9D0BYM>Ah8^ zI#~kmh#_W}GlOLja{dZ3!tuVKnCV)}_b}fCGRk?0Whus)R6e7fE<%#E{AjE6EzvQ~ zuPnc#RHCR4;6BxhHwq`i{S-yu*%nawKlt@o9)A{Z{a^XLc_8+MT6dasDG&|08+-BSoZy-kUBBh(YnKPc{ zmLcnXg)^Ncohj>mg)^6BK7@LJmCh2DZ4mlhtaMhhH0GF9&L);uIA)czi=_>oWKuq> zom7@?5Xxt@bByK9oN`-hoYO4tLMUd9bBU!?COK2?bLT2cO$g1D``r1R#mFpU);fQ) zgS%m$|@??mQU>B(y}Ya=A! z4{0f+ixe?$=NFuFzi^7|rejag=-b?M2XDL6R7jGDxrLY=&V(rW3$oL>6eUj}yPWcS zL>Y=yaW7zopED*(EXW>bUzB8m>~(IkbjMjQC*(^f_ue3%LXZ@v@0W59MLWWO^P z<9Hh37uyo6m4~D{P4@><4f2(9HA?D04mgRa6f;$;gfUVh$k)zsA;CD|pmRpXMAm0J z=#2haGBVr${PSPGGXvd$A(LRKnbgG|`GTg%TGUSY7ofD;@&CQKx zh>-7{tKUmGhJJn}E$qZ< zUqgOz_6SMR-rFSQnsb$92<9hHTfN~}mt@Yv`o(I;km{z>m!`zG5`$I=(QT6`N z@ufuS{gIPfh^+UUD2>O?qg#}ZtoOemnmhCllB7s2r+1hCB}LV8Mt8>FQdBMLuKqv@ z)p7{`G2MJo;zBI9&_jxmwM;eWxYLEmS|)MbeJrX@JvaR$nX{_Xu)CE-)oEsT;u9Iu z_g%iP<*s5Ghmmph2CC_PECR;e<6%edmm;dW)oiIEjaPIoZNAJ0n3 z<$f$AsMFl;4jB{qo#t`(v8ejW;~rvB^_AEChDFs^UiTbJ3tYYB!9G9ZUS{bIDI(;W z6zxhQoGY=1`P`cpkl^=T(Cur}u_tJBRa*u*7j{>%P!CWIQp8Q4 zNygkRjg^-mCEP?INm?KL-n&7bb5C(h`IT719#Y0#kX5F76EYO?yjv>=iEL4$Ar;)* zxuvKURmBbEm7-cyHTOdn)uL*+Q(3;p9!^I-FSr|{WFDlpJM8rZeyqLQRZ67)>EQMh67)YE-R0$J>j~PlRLq(|UA*F+5;9dY=HRysdDYb_$QadD zySUX^sI5}3^_rWxsyHsuYf&5P;a;sSMYXXv-C8xJs5aKiUBjZ?3C(cfLgqT0qlw@V$FO0|vm+*Wm^sJ8LGJCH@SjSt*C z^(ZE&!6ELXh9p7T7~)Q4nH<7gevBoCy7O67Yx&UK!=lbj!`v~AWInew%=5&Ne&jBQ zl0A@-?t;eu-uf7KLvxa#_Z#CL5fY42#=56iRQnn0o@Y_*XPo;Ji)ugP+#4*a{fu|b z7IF_&KQ_Vjgaqwpq8o~*n4tYkamxz{+Rs$C3&*JTGtHgLqT0`NcS2`zT%!FP!Lfhr zj(JszYCm(`M+vo`g>HN|iV4noi`^AMg1%*md!9wLpQUc@ z?lNc9em-@Nv#9p-nY-_G8Kc_ID)$PDYCo&pGCe6KXg_P*?7c{W_Or&##iH8J=WbCJ z)qd8x4OvwCS?7AaWj?C?tapn>3ALZiZi)YL2?}&Yl^gr9(3POVRv%{^D=syJhCfn3=f$6ITnf5!_WQ>Z;_Hd*FXERR*N65c9j6 zd4ZIj$eHAh+eJuFr+3|+i)7BKPXBO!U{Q7YmwPWts7~*@)tAVe)!E^JyH-e&Ru|_c zih1b1yj13_YWcA{hDFu#6ZZg%s%6a^x=f~0wH)g;T`ooa-s8O9Eb8~3!5jUVjOoK8 z;f&sLmh3oo8VQHI>MJNFXf3+8e;rA(rg{L~JHLo1i zZ52~BRy>!ny@5i4Z8=_xO=1rtJ%HoADJ19tT(2*SYKN{jm_@Zi&-;i)wL{MvEhWpo`R)3dhc>9!gEQtfp^u@(V-1?9ad$3#9MHS4UrH;YBh zIxFujWLf#4ykA$r`;28Lgfgw*trrr!@l?^fDJACD#<*iN1J9tn3CC$$DKU%N#A-RP z^{QUo??_}_6oJ(6Zk~}b(-2b*QpO5D<1 za$60&+ae|<=7o(|aSAaFy=~_xpWv;Z7T(_f$TcBJAvLqQh4(v)npxe#dn6<{(w1Jn z^OSS4_9bRIb;Pz>dG&+@+iLAK6C(TGi->ORbrX^rQgzYR>nkKhQ%BL(8~6j|9Mow$ zZ=8@IRXcB*kRVk%Z>A8rEnLrQ@!mWsk?+XIdrMi=+h_6K8kRST$UCm>z0EBBAXLQd zz1=K-6qI)_J9uBQgbK;KmmR$0EaQD#A)+)odS_T>K>7%|%yRuxxmrRe?;1E^k3=Qb)hi?y%g z?k!3cO+`%h~6{EaVmL$k8LXNS#jrnya zaO>qw?=;Iu2(^|sy-PxZd!BE3tA6=+Iltv?jFJu5`di**DdKlQIltpwW7&aTi*kO) zyThWs8sFD@z!JvZQA}Si-Bq!z(E5>b5Bqs0%RUIj^z$;ae8@5Vz1%EQIHtc>m?de1 z%x8dCie(;z@)_V&l%jQQh5O|=ih*7qj(G#;!4$}Q-n&8)LL(qYg$$Q5qSc*+4Dxbc zlP$AcFWk9=4DlMVbS#Kf1_aphpn;s=vZ9H4|wz6cyoqt;6H_^*}U6uy@ znkwN=)+jF@3;mjE2r0%wtg{^gi`yuL(;X2+gA&?X_l6XOJ;oCl+-E z8RPX}QD=~`ULO{91{v$U$D)1(Q^w%8_lBn=keZT7S%tG_hzyDTuRp01aAS$ z9SGIe1n)DJba`aVL~k8SRtUvR^uAzehjR+G!%5zkEWIEUGs!!|QUvEFika-4WT^z9 zn91IGmdrR4xhT~s-W8StkSs!O3rW@A=5{#MyL5xX*-T2sBgH>DWu<+i4I8-JDZ zXpQXsrg`OWN$HBWHt1YA-Ak0B*J&$L&G6Q%bu%=BimsNcm*Z$3-2qMB9^sgk{AEb)+HLOy4?UR%a|>}_HB141z$ zdwW<~{tx#TA+x*#EFB>gg`AM0CG?iRolm^bZBZJLGwf{76B6{{v%Q8aYMd~~`&CF# z8jHL?{v+1!GG|p^i@ds0G*uUiycI%Hv`pv^YhVu-d+US*IWP9MaX#%z$l6)#?UAWM zQ{$C<#WE-&M_IOW-@DlRmSt8%&a)inT3+n^#Iimj*M&sy&mAGbS#PoTNT!O6NfvwM z@6fTQXsX1PcxQzK`KBVynDeEULs-dHaP#@6VAac@ed| z%DW;Z)SS;3>%E&SUHN>m-ur_^^>rJ($1JL^+u&umN9B_gq8a{l#^2~UEcBKZo$)t% z*;q>Q8Gn=a3`-S0<8ShcvYh2J{${TX%QXm{@i%)_SaR?ge~VX}r5K;_w|I?NnsOW4 z>b=a;8A5&CRcYG8ICb+2fUD>5WkV#q9OUvkc{N!d|Zi%MOfS zshq#`>am=HP&t3;HD~G1G5fr>EaN$5pZ6+DUGBqEyf;|dLuh|eyuK{iIcC2%n58tw z?C0`HwN(pG^%6u(imr1Hkm`+Lxy5yn>P=?p7>P+{c_AY6SXAGV>MdbWzm!x}JGT0z z1fqT^fv8_fAnKQr>a7wvCuu)m4_`+Orh4iBmUT+f4|2fkBqV4phrCV?DJH1pLtb|w zL63CE>n$Yc!w-2=g#^FK!`>%SLRSaLS+9q^g)EODH0$-Sw}PcR?pb|^{W;>TXBh;k zhIgrsc-w^}XchmG*PchcGeUxWKIWZ&B#tZ6!jE}>3rP;q70?*ue9RM*7qzJ&x&oRe zB=ne41y^>*y~;w8LMhYbHPLae7RyNpy;*kLYs3=%6Dtbz#C$&QC6+>virq*$uvEN@ znW2dJ#_P(`2vQd@-*~-PPRy5Y6rS`3u-t?Ucu~_%dP7+%RhDy-PkEDBW^$@;y^mQo zaH?;;1uRuwi`C}gNWb%zv()b?=Q(`mtz~Hoq2v0_+a@GUU%DON)UKdur@g%_1@Lt8 zSB%L{dxvGJNI9SO@;{+6OpB>{4Yh-9o%Tvb$u7tluTqp8hn(~3M#){sd2g$bMD2CV z49ZpqZ@YQ-IHm>eoP=J-`&M4>f8@4adtcrIx$Gsf^xrT0mdoCP7(9BRc`09D?mY6j z?ClXURjlz}5AvgTg=6Xs#&srY=O=G#tV~5;t|9r^J4}yokPp2l)f}mQ@eZe#LSLz9 z{RY0Q>XnZpk?+FL73*~`K7$nXF3fc=eMS;|V+Ct#$e4UWg4GhPdxwPt?eKb}|G7O? zw!=V<NLh*FJp97hB5vQA+paLhONi=*&WI! zL2Gvq^A7MUX zWbs?E#PSF~tKWg;?G<>F6sMxBe$ObOuWM!V2eXVu%(VuXm*S_esM5&ko#ydN3rW(B*qF74RC)Z09HWjRk6&3xa1?p`=0Zk>a^PHWNTh1Z zQW$bV$g4tvJ(3LCpf$mIGPH{9GyYN`sUdZi$?vb0sY0c8$kNE~f5FmV zH{LWsUF7$_WO)UWRmdS0bsj9>pJY+z!22+fAjS+Ah~E602> zR>l|Ar&-+Z$TAv2ql@BxcPXOJJcIfw;rA7irc+N#eL^XJu#kk%G{|uwiBYMhpskkn zy-cDV>etK5b5l7#x0IOjc!Q5pmGhgj{MZfa$v~d>x3Z|7t)hQVNP_nDFPLSCoGbc0 zGmD&KQgY+m38~_b5t5{l)I>hj{4?2PjB3v{{M$l;_FTiykey*60o=o(p&Nt-P|t zn!YXXI(G9j3kmw??tX3|K|bC6mO}8=9^A*Ke7gJRpUS6)f90usUiWWusv}=v%<>|x zE&Y7Y{Cn#?{Zm2`w0B+kyx>iLN}MYaW+9(m{@hYh^45{^u0N#$ z$MBQKkNlDqrR>GKu5^EOxZkCcl-qb4jwHb!Tv^IlmJ$BODpGE6s*(OFmJuw8ez~eL zW^O;3&nUkI3(dQvoRj?CEWhAw9g@-h9F}@`r-o#Vzm?@Pma+cvYBJ{x&&!x`{;w=c zD@Ymd8`WjZ^Bgn5FUnGXs@(cSzg7(y(}!h}AO8Z$RPAK;Sgj7qaI!yCNP^Z2rP>%W z)j!U%3PNu;%=W9-l=V~KHt+L7zxs<(c5=)je@R^_6FKL_zExj}J5!d=62CV~rvg%z`iEI= z;4Od&*!nX69G!Zj-acFA-xm_J`DOl%CKMCgJy_-jrb41)KL1b5Rv~FI>KC`n z_nJ{Y$ymQb&La5KZzv=|o4NwO6#To-{5{PnCP6E{Rraf&`KMlzvTl(aU99k5eOXHF zB-tCU@CUNYPf#)2SjI1uBajvT*DS9uz&ISGvC{uXNYDeU@^iP6dzc%~YClHID*q)R zNug20<(rAC{q`&qAavok+V9G;wuU^vukqhv*#oJIm^Jc`Rv=jY5{ObnF(Z?SQQJ*RZ?;*(YR+kYueC zuITBe#RmT%OLhqLb({RtEUD{d%x3?(%qMb2+ba6!=+#=3$kkeC4ec*DMy}R!2wUG7 z5n8R~4CKrIFZ)0 zp@>jEn1rI8`%gaKM`9?SbcOM5c0^P@mm@;?WJk`w{3oBQkr>Kn4)*7IL@1y9NcC$( zC?8tQ=FWfexf_Y0eC`&)lh=r-eC|ht@+pU$AO9zxCy^M+=LN)QVKhc99nSBRPXkCy zL@1xukn}?6I*wA&`l50Fl9!*yb#C}hRBOoyF~c#f>Gzc;R`Q`#RyeB^U9H0BhV!zh zwes9>5f-&(nj0?7qE<+A!xdT7dT4I=1s1jXnH#RpqSiWd!_9>RJ%AhT%rR=+CpX-K zMXmefhToQ{LVw~dzs@KPFZ>=$EUu~Py4wqX#HrNEihg*skc7~r+47p&4^QD3wbo)d zJd5+W*$D3+R6|vS7jleR=`mAyJ;$h(9y5ivOA)`yZrGp9;lokV3z9XQ(ngfLuAWL~ z4{L3usHf7|!@88nN{>0hKF6q)@p6Q72*G;P7)Md>mm^$2il)}r${8-hspzQ?t=*R^ zT$xj;wfk~~YjccRSuuCGk&uLtT3Io7_+^e!>mTL`ci?=~`iFVK-8e?AnwU4-i({_5 zEBoiX;ei~Z)|q@JJd{PPGxewTw1;UqE)C!FS!`Fl)MOJ7m7{0@jiu(j7a2vKz_yNl~ z2-QWQaJqJ~PSx6mg~O(hq|n6?GNy1iGsmb^_=<#cbBtPruSmEs$Ea2Ko(-2`QS0eF z8?L~q)Ovc)hF{j9O>1M0fXGn>xAz3PXgk#hilBL4m z3P}p7H6%-gFK~=n4YG7Njbqemkfp=Fag16G^11L|9HUl)d@iiT%lc9)E0zhnLV}eQ z%Y@5wj9OW-Y`8kdsFfAVhU;-muQ_s!#B$+g9HZ7qEEjIeF=~y(=fizvjFvncb9PWW z&xbF_n8-?o<-@mG)Jlfs!?EqxeMXhaE zIozK`t$$cKJcLE9ZCE8dl0~h5SS37xMfCtx!=JFISwmIBpGt|WKv*rjnMJKYSR;IZ zMfH#`gnwpHD-hNUUzHMBfv{HC?jXxqor!9Nv#_W$QLS)3AxT>24)WJsJ6xAzRGY68 zZpxzCe4TI`DUme^UkndpQEL*u7#`1})+DSOp3b7yB&-{r$)eUItQ(#yC9>XNz3>tt zNs;vi>xEZyDz)BV{qX0UO0758AiRY|tvA>pyoW`tH`p+IKuECOV8ieUj#1~GM&YwE zMzkneOSw__st~+Ui2Jk?(8d~v8+H`s95ctm+Rk6%ORwS9LXtF+*@$Tt-Yg`zN@^MY zQb=+r*F&tejF^_;uUV=?Rth=6;y%I{9P(253`;r4Rw0*!r0GB5d`iE9m%~@3#QcMS zC|xhV91eAod#K;XSZfGYObT~m$&7#6f&a7(Z)JH4_oL`s&_3L*Go?b?!2ayUwmO7+ zv9!U~zk+lM4;PZG4ZyaJL0$=;5t0^@S_yZXi)-3z;aRW9t!KolZtp_6g}c8h`aXMauR zoPa(23(_}Si=`TJ{vF%v7oH&`7_;>cAMQq}g4*dHezUvSx~O+r$+>@c@c+rW6L1}> zKMvsY-pG4HG0Qv4`&I~%y_6-gM1%? z6ADqG#sB*|=XYi%|NA^WPtV8ioH;XdX3m*&&de($H!>eHeYyDZ>rPpVq^IZQ7g1mml` zqGOnDaZJzBvNa#B-^npUAan+Y>m@lx-LXgLE&sF8Xtj#2lh zk$OXpQLV!$y(!12)?t+1Mv6FM^dz39cNCJT9bJg8$6;PGO+UhtNR#rKp6E(@nyDR( z;@fLD8l&}oEGH1t5~K#~ybIdZm z8_Rr-S*G_D60G1_u8$ES??2UXZ&|J{7m^eC_z+g};>fSi|7K~Ach+9VI`a?o=X=o+ zOV=iRg0HP2W{uvlx0L-D_oJ^bZqUaGNoqEpg&#-EM|z$<6q6I_RwG4Q`T@R>uh$lm zsXg{2zG%`O-?!0U5fZd$oAf?HWC>d%pH2FEQlj<7p)Ku+FWc)Mur!0bfSAqt1|d1o zA#cfVm2c5^v8bn;E&A6i>OQtbKh2^>V7BO&Shft6t<@I&Ul#Qgxkb<4SL~Pn%XC|G zhlSd&2KdJi5>S=(SmL{cSzL(tLp>Qs6oLQDa z3gI1uE&4&0Ufc0&xro`SpJW+?xe1zs-m3q?LTy1RzQnRszs_<9?*Y;8DQwmAy(*8h zdOF^!n=D7M&RoV6Wl>MrTlMlR&)%i-sUbwxsLrS@TlJYjTi6i?-!D( z9T<+MQEcl|{qK;Bg=Fhyf7({2He(N3MabuRMF=;) zL*5gzm_?1r?ABMZs4EE+7hS1he>1SE!cfjfXb4ve>g?v=;*CYaHX_bB>J0VQ&lsspwjF=ULK_2>b~;|tAt-~m}nHQJA+ zt!HX2%i>uOYZz`bhOrFCTsBETqiVX0Sy4htA*0F|lAt^W=Nyzri7d~T{c&FXtGu|1Y0}A4Bsp5B1fwyL_R1-atM@eNp+8{J(te^Q%knT}4`LoM8naX{Anz@;jHg-JKW9<9V^PCwOxx}Sn%*gaYGv?<+(fLobRJXx{%Qt zjqTiyRP~G_p%@EN-?;cXrOMPEuPnbO+`uUEhRo;8BPn9;xS>&ef|R0Y2k%Cz$BhCL zrKqd2k5kfh4GO}6vV8n=W z?qVd~4pMbPdAb>kL(&)0!>a*`jGUPDdq4#n1e>nBaAE|ncAO_)yQXr zVa}o${1yqyQx2&{7`11U1Y3X2Xc&?Yk?J+$&N(6`+7<6)eF_Bd7GlMA7kbfXr>eEcP5(II1u1{|{=az;o~jv0unsS5hWNuxE#jDx&`6*x(w z1IN6L_b(`BtkI2Q7C|UxtkIWa?kg>0#u-C6rUry!#u=kI=Eausm*vMBlci|1HvS6A zGv4SiPwczj#!WDevDAuVWl>|iv1^olSH|Q#hjy?b*4!9VS%$8~w+4l5Vkv=hYCV?#(Df=o5Gv3xyQ)9OJojnfNdKJ#=Y6?xh@~g$b2?&{8y8vfW#T+Q-Zu&@rF`%e*^=lnLRK36mPz>m zN1mS6R~u)9B(-)pU-J;N#yGTGZk|PO!WOsfUtnGtRJ-*&WeNqCB4%7g?%9a)n%DDTumC_2*L~vQq36I0+{Qw`#Qh6WZ8vll`Xz3EN|mYfw!>rY@;+wUaS)Q6REO|N-RYo5v+d5 zHmb8^K7h53kk5>|ENdV!A&pt?UoD@Ta*U^0o`6u_ILCONg+`xfFFrRqve4)g?ZxLt zPZs)y2gU3#`m>aVP|OZv1j~XJGM}ABl4TQwVs;vDvcy-(e0CYrSRRB>%r0ZD6n~_B zx3QRGR881ztYlI11-p%pSU$v*A z8#X#u1A2c49B62Q@ z+H%NfFGV|#`(bIwVMALjuhRuAM~t~bGPUicF;;+#jv8lJe%_BhCQ^NCTwFt`GBq1B z5%nR*jHYX)v_f0Z9P*v9ils8vX1oA7Zd?gT56CH_^*TzGq18dmK*(t$TS%sM_M?b4 z3i6Y2lI8a0DMHQ|S6PbQCVy4rXTw=9w?1%${GQcWqZvzudiXVA-79p*vw?1K2i(x z_6&0Y3-u~@HNaa@W}c5_nb#xdF38z6mkW`7(JxS*g!u`}plujMM$Fx2HcP`H_y!E5 zm|1+IJgS3nhoo(lFekIn8zR&{EM@Kz5*&>(CU*QkPqj+qQ{-`My&T8Lr`jJO<$Y04 zTb0a{BIjf@5BB0W#N2P5VTnQh5pqe095cVm!dekC-zF+^jQ;5wxq z?1SdV97FF8RL7P3pm~5}NKzZ2H*B6^p=W#xQpLP=Gv%DFQOw_~<4_(B+@rumGJv}i8RR@5{Ham=Lm-W^N^72$j?~aNBPt@&j<%Zr+|l zM7PS(!xf%al=B!qtHaDBHsFkSA&2cPh zMOkz62#Z=j*4!+(L*}FAFPfV*S=8FF=4KNXH5b|3?8lqEzCVEYQ<&?v(ipkW;LJE!mQ1r<|bO0Jy_I?MhkNR zi(1{+!raB8W^-DYM_AM>RSQ$!CAX#4g0?U{A$T^QCD+olFdK4=n(b<7wv;hZHFwj} z?7^buZd#iCIhC3xYGtMi$<$uQJV?!fSb<|^bE=lpF}i@-`;57Vr7PqWAzyJmY9&T% z^EVbXliu3=hege#w>C@c7W?I|QEX#2kdmrahO{wTu&DK!ZA^0yrOMD6V(SC2^)_a2 zmWLrDATdLQL8MSJU_%(qJ3)s5(E$oGQg%Ju=uV^pz~LT0Jt@ypu((6&YfdU{PyDhL}xR)LM}t z=4>hc8pWaJLLtFgk)h`MoJy@x9AHjRZbD>v&LQRvvkwcE=bDfqQbc*8jWKp(F6Mkxc_x{+9-*9NJ`Q3s%-dNg zpE5#hDI%X*khjc+LW1&4HD`xn=z5=KuH<~i@=Akg<_4B`AoP?y&HRLAUY6`NWtlr! zRzfHy%lwjMN@*E0-8{;&3_>x}%^z3_oRu*%%yTSvLnvm3c|}N2=9y;8Z^TiJ*1ktR z`OYz0OY!Ha=a|n4k@u(;*!MYRx|HZj-0NucV4gXF<#PyaYo7Tw%R_B3zf%*dkIdOD zPeJAiSu7-&xt?$SBP5t5UubGa|9jpSnr(&TrhZgTZhf)YNk}rf6GB^GZ1$3=B5JmM zi8)J1c4Run{b;s*iJA9X$~jFdv|s+(`*O32kerCB8}FO#S=1c;DszC4saoT#6zv5Z zjkV_BkaUKuGlvN|6{(9lUkX)Wy}5zq8%PDnhi0i`wDnVwZV((a?PIg5kemo@t0(f= zXl|2|s?N?PGh0ZyMo)kA*4QSq*msmqu=;45*;Yt!cJ`Q! zS=6<&$85o(uARN+^DOGx*=u%UQP<8svnPwXcJ`SASk$%ig*k#nT{~Zx&+MIKW${dvNsJTc=^h3-j(zSfle4phL z2$k@t`60^#@5uE4-6OC$dv!2^RG}+9|URILovjK~G2kHm2DT{i#Ic>IP z$wl9o%5&Q6z|t6N)o5hM<~e=#qye2L>j`TSyDXR#o3-hVYy zevoyeBFFq{=4W|)s;q|>OoOEpgz~vyCRoxq=Av1gWiH2DG|RE<;5v56e30ch*Rf0H zBP_MH$!+~+KE~1lLfiVye2V2sJ(9?RUB3Pwk?qi|1^NgY-U$fBjJH`BEo?xN3^C;#o z^9&1(UC`{n-{wUYdasRU2mUs%v8d6Wf6T~fSvS;Z&p+mEENXn?UsGpM;~W2)aTXen zqT_tSyoZIxqv$x_Fw3%Rs32oBt1`+Qec*s60{YGnOux zH>Y!&YVBni4555dt-~xeyQgS&D-ZVM0<_O1>iBt}191W~m6FG8eQwmNj?FdU(54jAcKB%6z+3Mv8cv zh~TK+VLiYx-KxnWe~0xj%U}o{`8%w7EUNYvvYN1{+FQtK$)Z}K!d6=r)e;r9I!p1l zu3NqSPsVbpkFf8fvG2O|Cd*F9cp+Irg5HH;RX#&UEK|FC1C9@RDKV=jOQF8#rC`0W zZ4G1j2Kh`zJ`Oc&_zQZcu9CcJMQb4Y2BG~&zc(Jl;5l#YdVKTU+VCrFJ?Qrqu^L{G zXRtM9cw=6CwS|sYUF)ilY^~Z1JY^%* zqn37sat?Zx^{hfdg1S-9dN~wB`82Tl2?_FPXblU+&~@>+HQ}aw9=Co9#ZW#?tUrX{ zTwu1VPIAy|SPrrbu#T{lz7yXJLCioa`Zwj1uKj=> z{$j{rt1=7i`)bHgYqF53+M^3nv^@{vtwU>rkPLBr=&5A5wS(pEvbeKBMp%h|DCeX$ zyM`QBA8EZHM1GB*?tY`JaWY2K!xNA+D=Q=!cjG=~Efx~gx-r&2LNcTDmAQ{m!f{rf ze`#BpQToc7hkbH+!uUi8`avJi6HAYJG6rR5tU?UT(i7Xc( z)N7hxWeUlNM#kYyCcOPR(VETTLe3$diPl1vMuV}+6vuFqwVb6Lgl6$3S!-FkyoxVD zy@%giur{)cgtU4H>%Oe*EV~Y2d>%2Atz9g+5Q>>>eaW)CrHsk2zG2x7p_mNol#pa} zxs5g5DB)Yy&n%lDSA|>=lBpHMz4-=YidEwV9p~U&WLi^&WM~85!(8nXxVKt)#8Ju6 zzGazVbrcfZjb~b2gk)-k(DST_EN5DiIaLL$w=s~fsZ7gbh{yj@)QRDOPS#cKi?6BA>#iE{$7h5l~s9CecR(B!6tl45K zi(}O6+Y)Obi<;M4Vy$LTW8F)vy)3F{zQp>OMfJ>=Sl3w8%;Qokl85#*n0Z`k6%dk} zs%90JSx#PgG}Ij8GOHfTeDquB9jIkiZx%I&xXhZ#qMpc>S&LcJ^YSvQ>#Z_pHNvpW zn#H2#e3w~=Sk#>FGOJ`hnM%$1F0-CvQFFe_tjR2D&Ucx$gGJ5xF0=AQWj<=ocbQd# zMa}sxvwE4PfTxO-QsIiM>)&wC*f3AO-RW_Bjm5kmfCws8VtZFQ3HfNbt zhegfiEVCL3$xT%=n9Hp$ENV7qxz(3N&E_n(W=Qd8FjrWcI7U5vnPe^dLSz(3vV@J|V$O-v`$HENZ6j1FO1_;C=HCtVcOU&Hb&knzE?5zm--y7B%;` z%6gea&Hb&i2D7MZd9{^fQR4ust*KJ{xxY2md=@qLx6WG6qUQeATRU0Q+~0@R*Fu7M zy$#k07F82ASZ8D^|6THrtQ#zZYpZnWvO%xK${cX0gIF*|F+hU#M zRBG;Tt96D&&HZh)F0rV&zirkP7Ii<|X8p~gX8N{SdG3&POwIIdvkD2x_1_c!#Hz=l zX8Jz0TC>nQBeyzOg=~E&^U-#p54rheP1|m5lj1)!=2$y~q(z5e1ektzD#zN-G7dud z&Pa9$vDh3kmA#C2L+t{>8puvQ`So)CR3h(QbPZeQ|3u zOW`&n$nuf^iGT6)TTNWlj_C=9Ch0MMzTn2{qvXAvNL@Badn=$nVzULV~0E zyVXocruKXVyy+!ko@c3x5r__uKdpCIisH$44CK1CJS2-Ce_K03LaA<81roINOpQ|Q zgrvl3vrx{zLGs3?vK&WD0X#)VV=F^a0+K&=B_#DAx5uj98RXmvQaIK+Bxw*UwwC2D zob&k*H@4?4naa8sD~BP8*p9oU{8SX9E0DWmU5iM`mp4Vb1SuMu5E2991^2|hU}=MT z_z=?`QEG1*-S&rf@eu}v_W)_t>f5%cPR-I+oD2yi{rgZG_kh};f8+$P%>5vMs z-XWO|sT3Q{vfIH3736_f2Ft>cxFc~PBoxy%Hk4%# z=hHnlDI^rrBesBr%Ci>ID|Rd-UqgDw%o0JFZ$SFSnuMe*TBClkbQUTz_lut5N z=w7)k63S;>tVT#E)$6gYA)%Zn#HO-Po7)cmO^WRa$xui}?C+3FgiMWPm6F?{c6lBo zD|RF#+aWV!X6Yd2C}d7-GRx=q{_|zXyRl6yXQ+;~z_)2)h3}K8a&deN$l}<2At?u0 z7JHQCPmXy%_IyYvW>u^|OP476EvV0HW3RE)m@Dr;>tfScsKsxFRO@5QS*U&Q1KAMU z%0gwH2KhL4l!eN?7_vEbmE}Vdt5hJ{V#UkIz4)On-i(2K8f(fzcWi1evSSlMatSdx zv11{*9pgf72;`Un{(;ef_CEnJwggrw@TC_i8a}LRT86%D=U2%8Xt3t8{TffWxBqWrohvR7iUCAbO{B#*>T|k{10AQVGu>#q0?}WNjh2 z$DSo5C!*?narsrI<0-D`IhlGG^G9+bJ1 zeVV21Xgpg%O52Y=D05a`5Xfc>XG5X9~%TzWzPlCPYjb zdp64)$R9%1vMj>2{12q8y^&?z<`nIgXGlI}IRLp`$S*91ui^O}QqI1@asg6SNP&lF zFEXP8IHtU9uuS5Z@^)Dv8Cvu@dcjCl!EVR02r(r0+x=L^mdCZ#3U9jE=c~w^pDcp; zmV5CvWBW2o7m`XOe+vnoJ*(Iqt5T|D^z@b#tqF3jV)tN)ZcWji5t7C7Bw}8IRJG@_ z^oP76WDmufGdYmj{&}aEMUXm53a-k*d-jk=?NZfg>$$0!wNN)u>mIc$3Q3DDh1@-p zq#DO`fYAM?o?VAy`a$UaQ}6$BuJ4P=IS`dkeY=s!M_x_qQJ(sCFCp1lON{^Qg*;}D z7m^blfv-T(9jT!`L5Ms)#}L!demf*TKpwZ>2?^aL8rzG7Wcx>~370TCkJ{D~_KzYa z*w$0_86o(#e0BNG{!{ivmW}8ep2N1Dvaho2gj^Al=i%U-{tIbpHwa1I*620bZH44$ z)aIIyr|k(WqJ4+7u(t_G)BYZZ`UPoae^i5VPSbj#*VG2m#y%}1sJ+knN4_U!1F4tt ztbIeo;CrXM7th-HYEnMIo<3_A5F*b7mHAow(U4G?pR?P@RDPM;+DR5w=63d4A+pTv zk*d9YPR2y&9!0+v{E}VZ5!!mXRvzueC`d=Uk&s|7I@_Iu$nww{hR*gNA;B5!Y}csu z-@WK!*ApUBjm6rgE_R=gyaVZK&y}hCz365iVo`h1-7a05at^lD!>%YKO*@I|l#AcA z>uI-Vxg8@^_GG*>Y%dTZxBfcztFOI9iZ%`Xd75p1)jkyxs+s+5tqyG~DPrjNl?T|a zkkQen%gc6fpj}kPL}^5=$P7&zXqRU>hkG5J<$?CYEG>L#$f94xlNNFwXt!kf9j*Bs zAuqBV#R$v-A>Dp8uE(Oz*GPN1kYu#=8oA;( z&7Q^iEINiS3LsUQy@X{82eGRNaKW z59TyS`&XPghUrT3s+e^9j7SyK=P`EvNB>*L#@P1@$xZ$JeR)okb~Pa~72Ro*cJrH3 zjkPBWNz>9kmgN~|f5<{_-cbq1+xtTK)WZ>f-9B?uK5y7f>QQ+zv~uXDA4GkgU~7*_ z*;qA2yN;tV$?h#AD9>bjd`ME-;HlqU5|Y~>Q|z4~u_15U7lj1ZSC(D60c}gRUt_U` zW4hf~NN%cXt!CIyvZyv?hTTf0@>{DJ_6r=NTA7)47miV_)l9p$kaX=^v|oQ=PiNVi zgvkB67bToy|H1j_?_kUiGS~i>^NB;M2+7xw%AA|p2O}pGGta(5NLq9dgkt8|j*wta z-?b+Rk=vq}`S!e!&=Ff;uM?6ZS}SV17uh?dMAgw)Z0`xBqI?$HCqhE`EU_=&l+Q9d z&*M~P{3<&40an=ggarG(!mcAEH&yNX2lnGa@KnP4{(;?`W7NK{w4db|weKtKjzWTc zU!|^#f-2|LzNmZxQFj|(#4{}20RmBXfHi(T>Uv-2i@M$eQP=x=KSo{efvCIIhklH@ zYXze2S{wWrb=TTpALZk-`#rge=_C7lK0XH_bPhhU&v8r@wA8fH>0|pc$JByQ%*XcM zLhwrs12ydtoYReVo<{U9$>>%{10e-jzUP=tw#D)*$856ik|OTdHS6NL#CEHYG($dH z?EykYiF0Kj#-cnT75(21dsIlMggfo2A)%OE_TrFG%x?Rb zkRazhc9|ys&3Ug~Dh^2*=9&6pTl-3AwfPz>}pc{e2&^RgamEnQM(q4s&z;0 zIx>~t3V&Vv!`>;_hQZ4aFqFkJ(u%Q zSJMf5K8w1VPS^`s)YWv-UcsWSrjz!1A;FX8DSL~MpanT)e=Q_9gWucclXO&r7VQW7 zVHVY*owl0`k@?VZ{?YCm5*zZ9Jv}7UdY-jchlE`NJ+DB9E9 ztFfr_e$}qSqR#tOyOEIK8SR?gH6-+mcHN#566y*6ZNC?iDJb(l_C_JWb@8vgokd+2 z|Jp}|$k~5t9d6ipn$e!h*?+3x8dk^BUv^&gyqw}R6*1Wn_4Id(Gn?hy4a|5TRbD5X zWe((Bl;>7wLUUO+`Xq42+J%um=W`)J4>sz2!J@9gsPmJMWK{LKQ=JPkpJ={?c$Wb= zr#e?TM)mM-bF`<$wxVaz=kJTLrrVrUA<3xf^XGR8bIjl9^V2cR?|2+zp?#<4f&xx4 z7WG_EzIquxjit-8i z&j~*7IR#aZI^pCOF|vfz4knxuQlefl*;3!-lw&Clp&ajW9%9+GRL0!xJi>AWLNRwc z4On_Tht;aBG3w|%#gc?P(1N73kf6*(o#-=^I!%1BmdaDid0$9|wi)lje2+aX?rdUt z0&i)Zg_Lm0w5C)UT6vW4GNhzaLr9ud3vwNDuQQBe=3wg-Q_9)HF~6hC6jNFqpS*8o ztsIBiDR%f16M&sXS0yBXci=s%m7N=*n6*e%*(vm_JUcTm-m(fgKj;i&xu-;m zb{H`aIofj+lN(V-;~}Rbi#i%roXtXl>!PZY6OyVpV%3~8QnV5%GtDy8aOyoTj-eL8 zQ6;JA%o38OCDArfi}r|fjpa;1^yyH-T2A4%vdp`10g}{q$_mNUrqe1WY^#pbG$j2Y z^_^iX>k*R$dEA*BlC_X0oINc6MlkyZY33YiN88HKZow$lc}NRKdx0cVi2fW#sGRyN z9`>R%ijDt_+9CK&aEBjILo7YKaOEP#}$$pEqe`LfUkuSA*TpST}VkGrKD)BA@s(| zV5gnTC#v4c9O86lQEz1qaRv(s#s-Hvi-hE)s&DTPb=Gq#nmNkEz7KV_NbzgJQ0G8M zXjW*bllr3A3x7^(m{XWV%}EV&JSifd*Kn5@?vxdhslA9g{|4?zqn)lovb9ziqn?MY zk8vu#L^)?`TQKIi5i;I!I+A2+M{p$eLMAv(gy5|W$TyHTog*AGHHo#Lkhh$_S#BGf zqFsPYb&7PNeDJmK7tuSdhVKA7_Y0Bdg6jNqr@D+uRrA!-ow_V)o_e~|IFzax=JIDa zgFAClEbHQV`HiWp5jkf~{NoI;(&QPt?#yy`Sfd&emu1S_<8 zCVie$QHmJTqgnEK&L$S|M2}SOI=#D4K51GuM!$=fxr zse;Y`2%M|NNzw@IR}MgYM*_8 z7XNvCh1faG^1wIf4MEmAg}Tw!Gc^(mvd-xvBty%_Z*7!@tarw7jDZ#GbQOH)B)U_o zDO!nfDcb#r+2C|!p|yqgp^x;Dvs_4~mVcn8)kn-m=d+MJ1KH#p4@pX*u`b5G(9hiN^b;{jEfc-UP0djI zoe3d1hE$(9SEcw@<>!vmLzZVGTD{)W@zq~vmXP2K?)0~%>ikY;wTO{*{tVv#+T(m8 zC2DZHyw}+yB)C%cI{A9aZPjU!qMbu|_B$n59)jF}9B>{HlA-m-S=QTP4UE%KNN{}} zbke10SKmm{?m^5!XDZ9x=qHqceC52$QWO2>`yq#&l`0kP&($DbJ4b}%L>k5AdWj=W zi(XX1Wb`E8)xU9`XZe!v;omqNg=9zap$||8`F!I{5R$I-!@I8Z+my$g9GS{L&fhsl zLqh8czH|y!!x@^C` zcN+GloP+k_2WO%Xydm2Sy$0m`gEN<}MH&M9xnB=p13m zGYIWuSA56AIVmJ9YC-C~MDjDoP@lgwww3E#;+QSkztgjFaG0@8T-xgq(kNinFYQ^b%5zr5V}+nqfKXJSZeB+8IJK zEN7iZIA&jSInQ{`d5mLDL1@JOobwdNsMS8_o#$E9YM=AYI3dBE_7`WejPcvAU!1Xh zX-{SQH3%iV?5qsQ1jrTV)>p;R&^Dr{MuAl7Bj<>F zQAl<~weNY{JcB4EJEGe6s9Rh}&^G0F&$Fnusi3=duqdH87nhLp9qune))jaA3BfP-y@RK9l&82mEEMw*=1)twYlYzV3s&M^xk}*+rx4GB7 zWjK{EEjsmxTnllpTR=!s%N>cgByPpm30#k5SXzpf2U6NCEhJrgx?YO*GVYmW+!{i1 zgwT9kS+_fj`gNpo?m!`#(PHT-+G}`fE9Z_3NlQFwmPh}E{&MoZhqkf<_N#(BR>a7* z>19YIcdn4!$g_RX>qeb_zqS`=W(}v&`;GI@^f}b^3v81pbzkniV;HPsj8%)Do-_ERCxkX-`=n0wiRX0iO?uJ zJ;zmZdk9I2dA8x$_lMndj@iFPwkb8-1wuw^ar`0}J+0StR|yG5q-(m_G9OWYs70&k z9+dg`zX9=xdn^<~b?gyW8zqmbI%1EwQ5JQ?9&rn^s3TU(by?IAtK}9GlGI*wWC?4# z6OXntgam!0hVF++Do;3On~-qK z{;@a591#+Z`Fz~XG5dvtW44aJIcA5DaLnGc>)GeJl=CS&T&Fo*;tea!z3JJ#y zo_=%8C?VmPHZyLHX)h!kQ*S24NTG4;hHeWX!S(gHJ6Vc+k((LHhx$K_ z+{HKL)7U+8Q$9`Hb2sJF#Qimt58c_CxPOMEpNfY(YUWRbJK-n zYVFZ~o&;&(o)Z%6S1b3b6o0>-akbf$b8f2IuV>t-kn9LrUD19$<4$9_fw#2YMb2&9 zcZJAfNacCXT`prZ71P$eC`6X$eWZH9Z9GTpMYI!gUR(pK&fKS2`a)I-d7ed;r-R#( zC5d*B`q&-Zo-C?udeQCAqDI4BbVo?>`x`I0$&k=-e#w1XNN{{Qy0fMD$ETA!mqnGQ zlRH0@54AF#+|41`iaqV*el1gp)pWErzO#E#2wFxwP0;$@&TirzIvP^wU4|}h4Iyb7 z#q32sUEL`{f;EBN+?g^aTC2J|8r|FlGDhqv9iQ&*nvl?*zU+Q3BuAqbpPu7-xcg;H zwC2NTiLkAn?h%$okX#|Bh2%!4AC-I%9V^X3+lIY)DUkk18!-1}HAKxi)pxeu@mUW0F{Ak|>^VU~%IJA~Ae zB92B3GQ@paNV=H2AsOm+6_OJYy(cC=qDHXm*UlQ-RpuaKB?aD%1FNK`Py9-!o z-$~wZcL@pZkQ3c6Ic8`-*>9QXo?zL|GRZw3l7DW&H+kIaA*qO*Gu-F`S)R*%WIj_| zizNg3(6?)*y2V&FV(gvdZMQnhdx)Vg=VZDKSq>wHWSTpRrSL(_$zWSq?u3Q3tza** z+^HckisH-C?iwLEnmVV`-EE;5s?XEiy&R*?;B?jR%}eKk>c$LTR85%ai#iuG-NT`r z>!O6S-QPn(^?8na$0AW?Z5OV%Mu>UGy)z_Dg;ZjBs0P-wL*}~mS!&-UQ_XXq4hf~2 z=k{btl)$=X$h&S@NM3@>cQZorGGw8)o9!*Kp+yn2q0&ck?Zl<)QOF8uF1_l7&*GA=Srj9Tv)& zWV8D`3vHcbn>#R+>TTq+-F+*RiX_Kf5lTg})7`=H0k$qiLEWENvLRIK_PSSC=yz(Q zM3%@h-?~fQ{r0-WS<>*^%2a>$xeZuii1`g;gI~BkSiZw}<}LWOy!~#LkYscLQqg$J z0e7yDH0=O3Gz{nKfV-B(#3siWLu$0Gt z?im(U!~by26|#h?hF^87uuv+hW7pjmSSS_AKkjRxR3w_WJd}#+^DW-7P%4sJy*%#+ z+agKzDzT`#TEMH#qOPU_UKWeG;tF~fg=Ai@;0%k z`drw%C?u)9iF{7ssOsK=m6T6XE1!^~mxgy$NNz;cdBf|mieiGhmg&7FM79oRk&o#u z6cW@8%R9uP>W1YNSS`z}&T`DF&7#h!?Tunl=hXGKv8Zzz_p~)KA9YUe^lG!Hb9%Qo zibb8%qF#0=6`jH2UUaR@hfosAaRCK=X^Cq*Bs(s~emObRlE!-mt3b(`3xU-guVg5Q=%&dyC~S zv?-KN4Q~cZe#{C{Obu^7%af1Do@Y&O8OyT}imBF3g;|TCQ zl8cyM#nxMRBUv^>b_*HD;-St{tJl(-%u*UctzJuSI?L}L%a*Z~H;<+8M%gm9@|LnJ zT7^D8j?XjRYL<^6_Xyd@^4A}jUxu{ywzKGe;`=2+_OKLOC(GQ%JH%2FLS=5_eaF(Q zp?qKXS?@=dE)Xj7v)->#{ImR=7u_Igl#m{c@%vU@aUt0e`rUSt=e>C!QA|!`I?7Dv zy{)%XiblVHTn8m=@10>O*BtMXLtgT_ZlqMX5f3u52%d$#BAZCEBXpN|4l!N59zt>= zuR}UPx_jq^B(*(|S0FvSLR%;m`XsAmEAxt1M2P$bS0&6a_4c%_qJ-LlRakw5RDHeL zLXw(+=eRc@{k_MwQB2TY4D^Nzk?lnmVg`B>gyd*huVYl(!O9u$yo}LGW6i)jh#Be~ z`GoQboK_nBiW1$pr zTO8F0o#p+=XN=cEil)wT(#xAeG1*$lPw>m&CGqU(MTMkkWAIe+HB!Cq4HAOY8fo|i zSI9(fmXM%syy+!Ar+k95li^hsl7>+$^jUDkGQ5Q>by~_h|6AS~A(>hVuH0Xd^AvAe zNdAOO_4bEE>wq@Zb9T_SGPNkajgSh-^y&#oYTjJbF~~IUS1JCLlJ$T0LnZQlXd~4O z|L%7?o~w#LX8S_-!&w;3dDr_xZauns6Mi=bG4s8DSoT1w3(31vlrXBz!+W=o1zrJ` zJ0MMjm@JLHli$=`=*5L(L|=l?H+2_!_i)V2IWlIEcOS>Bf>6vN?|zQSgC}45Ht&00 zH6c@?7KCEn^XhQS@3*CBPh;zgy@nifNB$J8osgzNf-|_p8z)m~XWL;FE@GB=Ct32E zxJDsMz2dv%xtM$$SDTQDEc+lMAk@{ND=iK_N-) zvo`20BW8tHg@t;0vmoz#wOQ!AlYHQ1@1uN@qK40htn?0jA#&1DeUX!|$1X6S&W*xCw>?1#>);z32K@H#H%b$oThL}&hb|UATh{|WX z*Pcb?ljFU}qVn18b!1Wb?DIMc3GQ0^yt7<;kbdqYa}8@zk63~kB*Z;Ft#=+BUK zLS_lc^~>|6cZ@}q=PR%50Xjap5mla}UJn*kp6|Q`LXy#crpo@<32!+|;kRXf?1Z;Y zihop3dOL*VL@vCFV~aAM^bWC9o`SFMK)(0Rd`Vl+)Sg-|+l$j)i-RONk*J`jda;RnCE^R6l##A(`_zZ2ep0bIvO$BpGe{F;;cr`26ZwEU!SQUH;X(OGs|& z=eXhypm%z~E6MT|q!3DW!K=XX^S3hQqF06G4+zCv^lG!bkK;r6T=E*SY~dqz$!jJg z8FjN{%x_*BmeLT)=Qr;~mI3d}e#>RAJIiB!@LL%(YcK9vkbLp4giO_n z;HbU{xefEa^p}%Y^_mL!qT16t;suY%t*f4l9&aiH`<{k&3Hey@wL-EZ*#lFwB@j1$ zmE|H!B3}JFS)P_S@9PnBcf6jEoJe7;BA`@7!EL8+6DB|^041}JN9*jT1vUOXE_FiRtgDl>Xi+JT9DOHejt9T^j3vM<^y-kfDCgzhb^;?GI(kKr@%!6Bim`k)T)b2+ zZ9VAIwu`rBQCD1t_~$~>#a@g+s*dq*gk(o29WL&&`NcKWrkLUSS#>~d^2gOW`7Y_;T*PHRaEbE$U z+BcB5;wxE>HNu)x$dvf~7eqe(SO6EHQk8i+V&k@fj@lLMSFDKA)v8W=rY#d>&uMG8{tt z{&{>YOWjP_YuXXt#PS@3^4SsJAtboh?TmN4@!zAdCq7q-e>C>Ti$`#AqK>JfaWH;T zNSYWdPQ^^;SMfY46qAhBMemgM;&8kGOG^lC{czk8k{(ri@pb%87PS{&$4kjn{uw+H z-ykF?^EdH}d1+h089Wv*d#ez?%qQdZ^8L5WKg72P32N_;e!pcTYC<9GMIhJFKlC7H z{g_UO*@QdN1z#2+=8jsZL%!U_F_(RL6ESr6``woxSpM+kF_u4l>GXw6bv3?AlsPw| z%5yD#kwumH-*}TK?P;bq46X1zDDy3eJwkFLs?4d0vZ)l48&PG>pXkq`%3Lrpheeh7 zj>HBQRl-7v=xs6|Rl>rF)+}nj^u%x>L7QtN#t8|Iyn**m=r58L_JMdevEpW@FlP68^=^kUUg4!d{KScxRQe2`}lGxj_O^$l!rXl`9Fu`3AR7HHmuSK{NwW^dY;re1Tqdnef3Iy%$xO7v_;GCcCat>wABkGe888LNHrNT z5BgH19L69aReYhGhago|U#NeW2C4QRc>_|zm+nY43sT3I=OBw9kN!tiL+blN<)N)N z^kp!F>e%DHP|jPCs*x{)v8SK?N3x1y^x!{o4XrszV?R~FlJdUVBoK^#)1CH7Uy382 zuaK&#FU44%R#LDNp7rP&Y~@RT2$eaIF{5NF{EQ!?X6OP@Gjy%}nC5tvp?m^)u#DVR z8$aeT2*m`FT~@|C>&F~`P)s1|`w7qaG4!qw#RO6TLi_c+A5)WK0(l3ug<{(JG0P#8 zPar?PA!FM4F_$3}6Uc%dDfoH;RzLbNn;<3sBQr1)L9>eO{g}lNnpF&>$2hb{i0RB|nCGgA@};CBC{l`Z4wS>JFsNLV0y}@?)NY z(A6CX-L>c#cJ^cFu0_WukQn!Ey7)0AxNj54U_7T#K3)BoB!u$uB`?+aN;sA75y!lExhR`$A)tQy4~3Ms$%wy$~-1xp_SZ6LI**Aq{$RDW8Yi#HN2SsFkn=8Z%spnWrXxWzjIcLHSHg{K@i%DP!JF++fLT$(Xkj(SowJ zd{RlqWF`u+?1NA~nF*KWU)=p@ThkInS#HOZ3&l)J+{e;}`>R=r`&nM${%Tg@VV2no zWIodqkFvZEp?sz%ny^&B3<9k%nUQG0@)(5b;fzFEmNnQqm1kz66H7LiXJ(=o%QP;} zti%A8_qjZ?5+hmY7r1E5b9Q1ZOF@W%G0)kF$wJbjeefP)F8UI45?L%mAXkLUWBC^2 zkhgTg8rQ@UmRv|-A*+Q1Pd9TDKMDz+Zsw|cUEUwYr)WixDiHMsRv`J)Fn+jS3&pIh zjn?WxeD}f6XD-GH=zX+zeHlMcj+o8&<$VafleN&78ITh=7mIzl3)>=D>dW$iXx~x7 z<-SZQEWbw-$TDnwGAb)1%cqFBhEyLUE`^TRJ&=_N?RHUD zBkK69N|-F_`23H(_W-k^==yzoW(Y%&oY`He$vH_71e6>ElqgxUWCa1qxB)>B$w`nX zB0)d}L85>oN{}Q$$yp^TAPVAHt7_Hs-aW5x_|Es;bMAevK0e$1oBvvsS5;Sa_g)uj zq{-O$w_u+QSLW+NEr@&q1n2H`p_dFvT$z6ydO3pN4$Q}){+cA{JL-{q61uL*l^A=y z^J(a8dd$yQX9%2Rm4w<@AG#Jn@U3m@Lx(dM&5!THnit51(76cG2FRw+=!`~_3^e_K zYzRY73~5cgy+`OsC?^qnkI<2jBC`4(?2Cfc(NG~GyMf%%q%@IbcZ}w{ zP(>o!fS~5PP<0}u!OH0ZZ#f9nC-NMSjG8nhvL044Sck_$ZHVjvf_>w7s0)!ybY6KP z)SE~iI2I!a_B5M0xq3Y{kM35+K6b2@aH$W|I(r$aZ1)LRF?CJZa; zGokxLngh972gzSVDzrAE@@(h{TuMUU7zi2<>hN4h7!p5saIAxGWIG=!Kx7S&GMbbm ztKC2<1Gx~YPGr_vxSt=$#ZYsydL78q67Gx%wIebPNNr6f6S+Of)X(M679z3lnEJUK zx@L&;%^KtRO6VbJJ_3TCuZH57>4#f@py#Whv_!U(=WC(zL=FPMn!gt6MCADEu}%}P z`Z3g#$W0(^HF?btCpna~1(fTj&^Xe}UJR@9!tl0)&}1Sjfwa(M4v}r7xgJ_XvD|7Cj7E%w znFUA&_gY~jQ=BWXhCB!)i(9)068~<)Y;Mn@#_BlS4RsDQIouM(v{jCpa5q%O5{{G8 z9aJ32C}$>oU~S}d$7wRt`EeQSx)p+5a`$&l%!=qL_{r^NDWUy1S0Vc0y;vc)6Oqt& zmP{w|usVzYunM`WN*b%v5I68CE$$v5lBx#W^#DY=4~RIU;LZrJ^4!{`&}yvn9pndl zZyvXP8AHk@lC@=#%yeFYQ_f`YoKGHiUj)enq>$UGywOY@04W10>6WU1#9!Av>GsrQ zrqdLzmGLb5N!NKwr<+50@c7>p^4u*jof{j_@{4;+)_`Q)K|S>=F{ihr-*C=g0sW(ZZ#q} z%ix^*f?JOW&N8TZ!EHk14DItbc3TsLHAuL9}eifZV2X8ad0 zng#>u>Eb#d+caT%Q3M>Q*H(7Oa*58SY*qqCm3-$S5~$O>LDJ*+#oX zG@0pq^#Z&v4K$;59YR|qKLYiG^*r94tu=SA*pO%h`4*~C(}XI<1> ziNUi8Jc(H5POs+^JgxZ9Em9vzLX15bS?TuGWR!!X4tQSW?jVgl8TrU{o-=-s;K|53 zw~;0ZG4||cgF94{Q4W%M;Af+|k*w^g$LDVA2Iyy$gC`@H)@FC2CRbwYS;q#G4}bUz3w?8_W7p0ZhxkGhpl{u;h}birZ{5?H_@m%k_kkv(oMFk#6IkE6b(>*Yk(xo8L~0JUFeN?T z!>mBQb;XN@yp`XOgYF^C`N=mX){#Iixs^1z5@XZ4 z>h>kgRt@T*lnSS zd2XUI*p^wwI&Iv#*Bm~#-IoP5eUwMf4RAd*mDPmc|`2FgTsmt zvHScntPBym&mY5{CXyY_N-&1UvKmAR0Kpg@%Nh`|X901n84-IH5XagPvF8`bSXUzU z{303aOT?aEBxi$&*z=3zY!nfDR+55^Ct}Y^Qn0B+>={Q&HkXJ!<4DPt5V26s#8&nD8d!bI%Z zLD&bt3j`A|rc_h&`Lg#F`SZXA_xNTO#&sA~Wkk#GXxLW_^g* zvxzKhAQ5{uk%f&UV$UYBvT;Q0*+f=0g@`?y$j0Unv1b$6*kU4CAlhJ`&(2m5ae-i; z&(1y}QVOCCYI3m6M5+NnO%Ar3$a07_sL9Fp5&0bB4`_0-?}*ql=v?eH5qk!mi(MgN z&!BU&n?&pxbZ+(=5&NWVi2X&xK4}|b@h_X+a-)%X8rNkRh&%>@XW}l)Nn|<97Z_U@ zlSIA%g0Y3MLPXZhFy|?pl_HV=1b2Hlt4JjM^JYg#uxdmY5Yz}(pU6G9I>!2utO=2n zADH@)tPK(S#I9nUi6k3kp4e5aHxc{9uEz!tu}|!JYy=Ve#BLt;CK3C@ZXPyS6Mqem zmwiMU8)@^h4Mc3D&C9kEsRsGM8q3GNBJu(dtg(FTAQ5|-oS&T_Vo#Ivv-3pkX>tMf zBazOqrp4Y;fc-+mM)iX14$=TG1UHg;`!A zHewfHMTyvmU4)e-Vk34@R+)&6*hN__A~qTqV-1PeXk3i7AYx~t;;cOpI};UWFIy`* zaW27LA!28l5^OLL8`Vp)H;CA%UXo29VxxK~HjRjl>ZRB`A~vd*W=o0Ks9u__CSs#{ z8MdB?jp}9CHX=5vKgkk^*r@&_`<94}>Sft+A~vd*W#@?4s9ug;BVwa^Id+GLjq2su z??h}=FVA9on7&~nb_JH2h>h44SY{$NVn4-l6R{EdDVB$bjo1}g5h6BXS7c8Tu@Sox zdzy%i*p*mKA~s?_%^DD~5&LP@oQRFsm03F?Hey$1-H6yz;3}*y5qk<;g}qM1o&r~8 zqlnm3;HvB`BK8#c88(%OJq3P-y-UQN0zb=^5V5Dg&$3lS>?v?H_9+p23S5nCC1Ov& ztFteO*c0&T>;Msa0$zh1BVtd$Yp}CKY~-)Wt`f14zb3m)#76#F>;VxQ`D?M5o~Ccu zNL!nwB4Q(LZI+3MjkI-GE+RJ4)?pqI8)@sZ!bEJOt;@=2;z!zgtQKi(q^-vq60woC z9&16wM%wzUJrNse>$8`MRLyJVl;_whMCt&+DEb^5OyrZbM$>@3L1ZTo)HGldh}c?f z$fgmowc3!)BVuc{5nD>c)@mcRnux8{=h=E9wpO2K+lbg&eSswqv9CH{p3BAkEpSzJ}m4ysdz=WR+eq zeSoxKr--}=cS&NZ|;9Z?tfV|2k62ZGVk@ROf zh~RT}dw~pKDMuMA-0?UCEJRY@hP^K!^Vy&X(izBm?2ab>)#yT& zC5(PdkHYKRg=~T$@pd135t~ND?qe@v^N3V{-Ai28EoMuJ)B=LzYcX3*B&L)ZgG<uA=>sW0~{Q6nXJ~SlpDVq&!9TEGK z%?9>45&M+QXKW`C`;^URY%h_?GfdexvLi$m0Ku|vWT!OoOS*|Ynxu1>Sc)yI)8yz< zY-g#bAc1!TQO$qBG7*_XHU9<6O~kH$b~2BMUH|N4MGQ&Y|JlXLXyW&uU93rj2K&!0 z_96MP{bx5@N5uA@-RyHBIa8Ukf5~=AI~VS<(3;{z!u8-yvv9R_kX0g*lfwxWoK7BOb%>094c@k{Ni!lPtH9IT znsg-c8mxpHY0{U7eTw!V8%AUSya8hoJXd>=y+!0l7$vJUnMK6jw|tN-H6*6YNAL?U zTJtfHxo~&ZyIEmBlWo^zcT8@GtFM8tL+l7?b^wWi);Yq?5vdG2g=lqz-5^pwoh5$| zSuq+;RH1&3uO8Z%xL=f0hpJP|Am7 z0FeYBPe~*rhyEKSM7sQGddqS4A(4SV zP;;DpOaxac=;s9coCvN`P;-LqA~KRRC)r*ilSp%t9VIdzPAkyQ_v{pr89>m__w2Iu zv(IRLU^j@o4Fokmu=_+7rH^$+LwlWKkBNK;WV|LR=VHynFSCp^@5MUJ(i6D>1nclL z%R!{!Xrnp91d&!iP;-VAB(kRg%-by-=PWBpmB6#?DI&*THoqizjy+4{3J}zs zWA%tEKWgp(JkJ^vSqB8Ksn4_4M9xWgVg=g$0_#NNMnoH~*B0WiSnav_HnlzW$LLw=a#OOCyTw%+tA0YVViYsg#k%pwX z$~F<{M4GE?ry+?k>Kgkd2{}zxP5Q<d+i1dc{&gCx(?`&i#-!(m96p%ieWFRv9BD}k$B)pk|pB-+nQ_D~@&1nxiW-Gz!2FvmR5?^zZ2~GSp?M+rdld$tj8n}NG ztZuSrjFqF_gt)pEcJ*1~fS=o}UBJ(6)|LERcMUYH22v9(u^R@eb(v2 z=u-T~dTJ7OibE+dhrhAmNi<_gQv)>5!h3>$V>^;)_K;?bg4cAWMa{W@<^j7F&^%zy zis=0O&f+x*J6m8(d=2^eojn!M{K1|j%}8j$P2k`U)=(3_Rv)rf0jr0sBU!bA+^vKE z9>oa2Q#A2CKW6g-R*%{HWVI|Eyvyqe$9c@Q1vG!L1k#}ATAATg zh#k?y_Z-X52CQQFRkB);5uOtQ&#~NDi8bb1#qqS7_@gq8XVE0=oX%?MFpfV>1Yb~f z5Nb6UuSKMCVVEa@B*$(p?)_e*+jL41jFrNTP$wzA9rxnk~k>(rd8$+P{@%)2; zCKX>pnp(=~hMepR_!O zCSj)<_`&?7<$Z~aD+lcfR!{Kl0jqTUE7CLvt8!4+>G;WjCOtn-nqH(y&wmVPGVnX3 znFnd1pA7tQK$DTDSdDoOJ55>|O-7zh6Ten7@oc2o!Qh??P-o%=lW0mtXqsk2O^tvi zGk-2ZGXgZ3d53@|EAJkmSqGY|d}KhAgO7{QTn9}KzA&H(@#PVk;@RQuKE5-ck^Gwo z&0x?-el0?S?Vg{f{s`;Gf2(Z)o?R2a&lljHCVq_-;Dt2_JNIBF+5#<9fHx;Hq?jQE z`O5)6h4^a$KZW=(vf2)#?OiyPF2u(LtP1n#0jt7%9$9?=%RICy%s&WN72%%*tcvi> zWEFyVfL29#LcpphKOC?s%D*S8(lD0Mswlr4&=li0NRtbm{J`0v7=NV6`Iw7~%v!xT zpS>3A`FzZ5ST(@qAj|;EG%>Y`>$(zrpCL|(u@E7;!`+X($vU(e3%~tot}jaQzMA;$ zRf=yhn#A=+DZX2iF!UQU=a%AElW1;}CL{EDTmzKi8$Z@*CHg7NcW4sU*Js#UO7kqA zL~F|MkS1ZLYAzVZkmoYIgeHF3pXA-vN0k8(e!|XbnDt76pQm^ZP5k^+ z&WOV}a^C^s`ioAG0Q;C-&P35{~6jb6bXySW*nzs#DJ&6dCU%l;+MS# z|3(wP>^=BlO~TG5s6dPWJ$U?A=*QRe=?-B5gA(AamGU_Ugt}QoUCOuuk&?8K5uR`L-0g1n$+7?6X^4K z;HgANYX;AADB90Ve*JK?pPBp*P5eGKi>Ek(8sGCQo=%gn(+S!OYit(Jsflkjo97K! z&E`ePsyy^ew3^M!2Q+hdRnoM9nD7F${T$w26Tg1u@#ROO^E{7lBx37lK6j2qYv%I| zM6BjLKJrAg<~=@{h}A6M2Tw(77VvXKtY#r^ayDACkar?tHH-M}i_w}z{IDi|tuE%L zGzmKcq3oBTy%zJHm(a?u)g^q8Ccf1YK2npgb2StE+CxovgEwD5Voa&SSuhL0mFTk~uA z$e*J9tmTu5Sj{^A=ti_=9Z!4H5Ucr^xA-+$^D*y6#A-g_MeapwKH-&!Sk0$==)-8u zr+gw2t69%Crh+gW5dqfoJw&W#1K*M+TC;)gBVsk5@%HJWHJ|amM66~buaq%bvys;) zVl|uiyiC!WO?(v*tNENi${elvoTtrVh}CT7$#O<(HuEe*tY!-@ABxs&;kAia%~sx% zM{Bn7p+u}^8?Wv~Yqs$wM66~zKb0q1vz=cjVl_K>|9sJ!9sCVV{C@ZapQuR~e$NAT zuqs3J=aA zpC*1JN#Lb4@k^1wpVB1kw1*CQ6XH(-Zx+z(;cZEi7uMnU`(Jzbn1JSM{&o^FgRFjl zHQNL5{59W2M8WF)dpJ}1hTkPp2iE+5fo3o7UJOg&=XoC=poyR7eSEkkVP_dgQ}lqR zQu$aSrMkc#8<72c1(AL*cjp9hfPYNn1grrBkZ<`JA`f6TN6kTgMH4@*L;NObo`-$W zt<&Lzl0OP)4)bKiG0$NqGt9X~z|Ud+v?jivBfLh02CrO>@IjjR(eEff@nm!h9_81F z*jE0IuPq;~`Ht@(Vl~Hjo{G_$W4sIzt2xfAR*Kdf=Z%P1%?UoSa*squy=t_d@A+a)d_O<%6`F*dTAuOq1K&oZVOc{?@uTF&dOpqL zt3`W0&9iCZdp^UNCSj*FCrsw4bwlxF)`zb9}5OVP`Dm@El(n(46P1 zNK=$F=lKpIPf{r^@S~deJ^Ug+7w~hDUn8q;VSX)-^njOWT`4&yir(%<1ou9zb&wRHbG3DWX zxyH|4(o6@<67A;%X}nZ$Z^l-%%3T{hpO2XjWRuo-nwa{*9RAF!lE&unIv+&D=I}ZX z)rrpGbzWYR^Ql@v>hFP{>%6KVi8;K^Ymvt0@H%fonhubkHQH(x5u3y7e1Rr@3ts0R zXaYNm(1N%NdYykB(A?lVNwZOyU85WP2TlA|zQwNwtZwmJWYrIfhu3cD)!n+G(%@^++2o)>m$ z;2x=8`Rhco!VK~}q<)uABeEA}htsgTeUGmuk_l#q7NEJ$ztY4{{WtzCX^KE?U=;n0 zUm&s>_Suj;;P)b|@OMIg=eg=(*{`H}I1lbVdI5F=d1)fa;91~5y264}Q{!Fam69hjD#^b zA4=+qyPEhpWMb`0(Wx`BO%p$LF22#kPo0aynuMJRV2rVai%UelPXp(|VOU*>>zep! zNinZWbXrnCqdSprOHf42+Y&y2Jm*Oy__l<#K=LLMd|Sd+AO*wY(pTpuJzb1YTi;Lo9wG(o99{dy+&k)%HyXe<|ln^ZfeoBf?0Y4>0PqOL= zesG_^q_g$y@HrcWKk)j zc}grKvJCd4(5j+XPNZc)i0BpJZf|jf$QURT_SL7w86w3~8&X+ZCz1v{C$9=8Vj@d- zQ}!~o45=zOk$t3jMpP#9CTP-v)w7}|kqQtCF+bHr10wC99k33oi%y#OWv?N6lBNLE zD%N}rF_Or-GKSO?(*stu#5~fBWiaDG{nQfc1De`mD`_%$j$S`W^iMSr7#u_#?n))IQk%F+!M9p(T z5$OjzuIQ(MC`05on9lHgr=h4sq+K83=a+VeEZgv?j8znCam!h+ah88b;Gt z3?s4(@`F}Q#0(^pKxs;v*ufUN)&W7aNEi?QL?{LVQ64B--jl zaezqdGsdc=I7TG%ONO)(XNWw4ae*amEiMt6+RdCdwGr2eI6aK#w&E_4iO^TE4%>;p zh)kxoXfIOsG&TPjv<24cOCmjyVbBk;TpdJqBI%(fF!hc?5$Rpnak7D?lPIK#-!nUl zQlvRaajdg=CZOpe>X7Cd^fC0@MYJI@3F0BH^1?PW+W(Sk^*fbra0 z3=8<_BgT*>brblds>X0GCFT$r)5=)&6`KQAuZUfw*#v1}uX{zD3TR#xmq@eGHSyFdiGMvfSPUhCtDUK!87#8Af>!?Z z;9yaVNE4`I2m+v~r^)$LFHMSdhC>`5EE*eOh4v?Pta{u(Sgk*0M@cq1b8sKH_{ z5qteLSRB#Buhqfg2Tj7xELiVjc7HjuRnGd_Utw9@5~i0^o=nFUk`+ z1@j=*;aj3Fkq+>8jNuc+3?gUXehKWE6UAyGX`r5QG`%hM5V_dZXeNom5-@lSn_MGzmLTratW>`kjxPuY2ue_uGl~t1u^Prh>3H>!GPvnae_46AxdEXc~{&H zXy%Crq_M3$Poy1ywHkJ8E6*2si43DweoxdTG6d=nJueWQh|GktBUvbB5E%gR8GFJa zv04+q6pO`r($sm$w9aC&C!kp(4kjTd$f{Il(-W46M*}g>eot5;;s+t|(^?`jXcBf_ zYie3>iO4~uA*?{KO_vHmWDcx|u-)Gmg^Bd&Vl>M{X(A<|w_q!OASx2s1Zxr;1bd7kAG`4T75uXJ#YsGfb*mhqlju5f!zD`^xVn_GKBFpQhZ#)4rHMa66 zq6QHhmDtLkiZ+_~`B^VIlLmVNMu7EVP(ZUmj7&ntkrnn09Pb;%;=$3ayg_`ViJ#U6 zu|X3U@6^g0#5N)msg*wy2}C}nR^BKM5m`>Hyh)rSasZZ<*gBt!^F-=HyJIVF7C#fY z5ABYvyhYq6@;1~2w(?f-m`FZ~3EM=9A*K%VXEJrTUF0BAFpFvT9YPRkT+6ik7orl8 zrI0e-AGK37AX4}VQ>(i~D^2{`*eyDe#`c8WVrW3~r5H_`4{4S1rT8tNNf3XL#`cy3 zk$I>oh3ze0i6TU7Z`mW75V5`GYcYn1?JeJk`I`87-YecGjqNRa#m0bUpV*Ov>>(@L zTlR?y!=ii3K5Y91yl;|ALoEE)EV|&YKF^Y)oEoa1BBDS}j6+4L7-f~XdA!2*Wd68-)mcq}^ z1(8vcuw#461(7G9xhRSxA!W$Q_LhsH!6@|X&mb2?OHKT=E{YDC_`T(#=uX7;mP_JQ zBDS|&7Q=|x-f~5ZA!2*WRq-|v+gq-QSww7a`B5w;VtdO^Vg(V~TYeUw60yDIx~TPr zX?NROZiu!-j=<^^`_E1B8WG!nZi#n^*#2`{tR`an&mFOzi0wbWh_8s){`0H2sEJ>P zcg4@7vHj<+NEVK6(|aPVCUA~VE6;mE5V8H|zGy)NSCtrze-pz3ejbQ1Nyucf!ajy` z$^)@tbacBv5F0e{^ZY<;(**AAfms;muLoi;k(RKk#MFNm2Z(HkSq8};;t-MB6eS*t zlSE=@<@rdQCo%$}1g#IF5P$mK-r+ApO% zNhBxioZzY;Uf$QlPd$}WQAhKbtrk0(E%xG&!8rhRbyN;$U(#nBEDs(lPC*%ks7oojyRgg};Nu(3B z7q)wPIfY0ZGz_i^GRS#E9_BZ3KBHVp;?n zkq=>%V6V$92WjHhYDkVGja^-YUg=zVb-;>{K66xoHCSeE1JJyCL zZxFF#Igh+Y1jjP=vApt6A~=?Dbmx=t6HK{qETbmB%s}Le{H8}0kU5A{d&ZE0QV_A@ zy^t(Gq*YDRf`w&uB0Fik7m@XeBxE(3qOz?fez}UtE~K$7SWJ!#Xo|~mq_J0##pS|) zri5Hhn*MprenJVkIiM*icai41vSvS_q`VN&l#)M@W;U!vF>aKS@e`w4r?kwXiC>D+ zGNeh^c@NglO`%px%klwD8CjJyDle>dKvPCG4rrc~tw{5mFq$Xj>j6z!If^tz^1&`K z_$e!A1T^L3{3PUkviby4$Np1JZY0v89JCIUw7fh=B(A<86=eL|(Pe*1X3@ki`%^Nc zN!aNNqZ=PpzUAc440QRa`ZI`k}@!pQQPT#2bM2=+Ffgq57^9YGd=rm`Gn ztQ^!h5KXGccS+NG1^ikH^r~m%hY{qDuJD|*+(_h2(EL~n&P(KWBK8d!HRKnX_@$^J zzt$w|Y=#*h>!*f170}d_mq>#xxDs+$Q~sujKXPlyxJg)JzUNvpjVAECIgItb&|bA< z7ESz<(Ax6UWVG_nyKBqqMC`e69hqTjw5E<^n)qqemH9LYJL7V}HEu^PH?k znh!ve9wNnavbiRHDH_U-0jq|x2U&H5YsRfGr#6(Y6RBU)kQd||MBb@sNK-k1$VG@+ z_`E|4Ih#mPnDvmflnaUEfLRYoYq?w#zkb@v$+M%&-c~LoV(X`!6z@iB+Q||`tfsxp zGA~-wUMfvY9pWf>Nme3_y+^2ntV+c0T6d8B=4(Hxa=&BVbJ9T$F(h$Ex`TX!G(CQA$RCK<9qA78q9%S@bda|+@mslr{7nguaS*R(F(zH1Yj(l4VF!8zKN|I>}C&_^Ef6eFIjV>EQkiC`D&EmdHrB zFqj6Ui~N{KNoe=lumjvxeof@#8t~>S&~%fRiQI%RyAH_9@&=IvSVQ7HrQPLSBE_Lc zZ3ImZ`6rQi;CUC2UNYkXQ_>jdQTu`PmIXBNOWH@4AWbU;PtAj-kF1tNQ=c@sAp+pL zbo$7p0Zm`IiZn%FmZ@Al#_20}YvR|~EAn8#>J@o{tj?u|_o+bYugD*W+=nY@UJIUG zk{5{-EM}gM>nE=S{PdT%Nz)Zdaria3zem(#)ITUP5cq}x?H{(J^K;qb-9s<9ZiE}k)_d^!Lkw&s~IB2htZlLvX~}*o`=fv znuMKSAU~Mrq4L^_=yDC0w>1enSL(nUJD?7S%hy(-ChYv$0#5dUjFgKt@jZ`{t4OmP z+6$xlD0z{{jk1QkAs+^;!ZL1^@w^1iFVHG1r6$HRMv2j~q9*>?))-lph>a3sWO%hM zd#W}NB|b|JzX~cR7?Kzz#>lCpu~A}-oJX3r5GCSz!I_IZOTD$4_zC_4}t3~{~+khf)bB2Bu&)4D(=$ybSV?ha42 z0(nOcCh{0&s*XS=%h5z8!<7O)B|1f>TZ1JHJ9(h3`haGt%tmB0Tn`NcGEFifZHk!t z;-<@dM0&)*2m;LvS(?ZhIAg>sshP5@CVoB7l9fp_5qcCpDLG5F2xw-@_M|zI+w`B= zvOkfp;oJ&))EqgENb|ae%$4(qRE4t=)VwR#YT~CpPi`blYhhNf^JMn5rtIIsc*naw z=F4X^@vYvIbx1P`*0fvl!J8>$Ya(gD3a<+m$o@n=g!~{`C}$FBOlLQXL&^!wOSnL!iZ&r+E~ldzKv>IbcsN{`4=m$DCtoA0 zbZ})i2IBKNIgH3=So^I4^06GJi9dsUB2R6^9QrfJC-OQGJ3D+T#pltQPh~Mp{Bo_A zWi<&q8KCFlJ2BSFI))^^Ut)uNo;2O^K;MB{-5^^TKhDm*@SMjkSUt$@M2^F6Je`E` z^||av1n=fu1y-Bos0i{2kS+2ZL*ns1VI*7S>hCCL%3?;GD8uer<@e1o8t{JkAbzn8?aRa!Qi~C&R1eZFM_jz0J`* zVTWw2Nm$p<=a9o4@^zz$e+KS=!##&DV%h-dEB2IU`4Y9qs3goJ_=~byi+F5Un{Y zf6>HG>zsU~Nf_RnVD98OCtG}rR*{Pjbh} z=(7JL4-&EU^Rw)BI$HCy97M!wuFJJ&qBYm$4kA`_L!LMnt+^quXyVuNO?g`rzn*W( zs^^WB^>a%$x)AN>mTaqu@q_X3wj4wndnJBH4kdzqaGc(eyDw@#iC5xxUC zAW%(G{4E@KV#})CuLpOw@H9?q|8jDCalLY4};SsSyB@}KflWgq*(!@ zd%xB+3TXb2Eh04ehr^ka>>JQLl7mRo1@bcyG>_zVP5fH@Q|=8|{V9)-Rl&mWbmvzv zHsmED1z?4bPLdZpvN>W(KU)7?oZVzoaoL2Wc>e z_aTQd>ZO1tnR=Nt%^;4w1htV&4Gd_Ks}ZER2{neAmrE#(zR})FkXIgvf?(rg}p4 zB{B;Z5_naTPK_b5p#;cCM2j1YR(%p(K zMQ)W%6TcL>Rq=o(q{@?KDwQInrUW#unnRi~ltWjo(!|dpyz(kw#nle7Y5->em_x2k z1~fulB8^R5sHbm7mqMxRj7@l*Fy_kfkBUL~vBkoqT(x~C=tGNWtHd~)pg$Ka|xevYj z{hIJRk*XBXJgKTjXvU0&Uu0H|1Df)xRfJ|2Xv(YC0-B0y7-`Bt^!pVw71i4TO%*jG zpsAvk1vJ&vM-iHSW8nE6^^GQeyVp|30#>!u8M3Mhu?}aMTI!l6{+g|}+VU&bp?`H; zTYaO6-+$_;!Z*qUO+6KN7t;zmc6`-Sxi#_As;|5V zO};nb&3LLTk)L1}=BmYgESF!37OK4_ zaJRf`G%ZxWfaXOtBtnBN_@bIbY%!k)x+$to`q6$&`~tK%^Y(4Wge{)r&;FhHK#zZ^5%m z>Lns)AnKO~(qHuf)__Z-ioefwGQ&-9Ase-1Y z!_+Mz?>!6qqL82A>X(3@k?L{4&q$TxcQY=s!Wq%*7I2cKo*=R&t>g57HXW&Q6G;YV ztOJ3JQl*GAtpTwe$Q!B=k&{i~`EDR#)t1QoHt?Q*Afwe#B42hee#WS2L^gGS6IIZR zRV#^{eHq@v0OU=ziAWnbg}Du6oH|aV7wl*n)o#~Uj3wr-xlN5FJx6UBkYSd zL#yA3%!E-8*B435AEq|CKr178OQj-$mo#WKL1iHFdtsxQpmGq|T+NV)N@(Jz{NCTeVRt=MAnv(`kig6|LwrZz|U#>~2N5E>5>Q7d6puMty=SgZGkkADNneAN-_#$8lz;nVR@zpQ#pW;@9d- zwSufRLz`xUnw_au6UhV-;3M!nOKk{P%~9J(W9xa2O3=hlYpyyRu$rsBC#&snfi@n> zK382Maw!=+fdpipD*dM^#U_XeYk|C{s%qlrd4Z};nqOf4!fU++s!I}0-v|x9k8*)p zs)@gfTcBn?#s6TcJ-)yJCnsV`KYYZ7*5gIBDvg=z=+u{%PG)J6vujuD<0 zsRT`Y&x_SzO?=Ob)%Tjfjw@s<7ew~O>U6+riTW{MwM5+sSS?X^HStTjR5gi-&d*Ys z2Tkhlrhqj)5i@(@%KU>wg0tr~Xp0qz1ZU4b;Xcnbs)P3ImtrlvkQ>tqJ2(pVgVkEK zoKm;-vrfgwM(1ap%BG3$=VQe*fhT_<)g|EZV^uMUrdkqBy(F5(5t<3J(NC*@<`dO1 zp!r1g2xvZ4{Q{a#)sTQ@y$T03>($JFW`lY!pxK~4)5Px^pQ&8|tIyP4vRa!8_QoJe ze5Q^PxeYsJIi|rGnL0&eR~pCZ1Z0!S7Kioh*XrkrX%co0!(6!)G@q-g0nKJrn>4?W zX0z%Z&}>n!lBQHWvjek5jnu?1#a1;jV6|0ECo2c`tGZ5y9H@Cj+QG~?6Ua8Tlt>2H zHNxj%x2si}_?~yDjhgu7+M#wNA$!PAUs(5INq49d0nHcc9BG!qwG3*$P`?H=JJmzd z;Pnn_cB*vAuvY#2>{7Wj@$<7wDNVu-p1PvdE>$3)*{w>DW)F;%?;y_aR!52ChNzBv zxe4k5k(MxD;9T&Px)t#AmHLe|7!QpmYx3xJ|4O-uZs?xudNhDK;$(s%Z$nVR@_*X&obiC_f4o&Wu6lOd@-g1c*$!U|-+`hqm} zyjpOh&~B(XdH`&D{P{I=MyvTI@@(&L$ERXLzJplXul zf-q72fa(;`e5-nrW)ElvK>d8HHfiGbgoEnKfYm{@pR5`}MsdD4s161+htvtuWQLxA z?^i#hZU;1n)q@BP`Z=u9q>OImBPz2d@ZLi3gE>5+@&ztea#_8riC;gL)siG+r6y)QkFoc%+DHUf?>}kJA|2*A?0nnRMD;7G z7!h3a{|cI`sy>l#+L_pUO-<3nPyL#jN1C5ubmQ6IHT5HrVK6)3eDS0DO%uPBe^PPj zF?HY1Pb!TjVP_bux-r`Pq|ya6KdWq{sST}+S5iN#ViB5!bKzWERoBFSzt&CFJVJvj z^P8$2`8f+C?hh#GO*M?H@V=eZkhNRtEh3fS4xHbhB)8SO0YA6Zk|boMCa}Mn*F5WS zTYavHU-mmHAz*b!9U!X-PKd^6P0iB8Z;Rj5f(Y^~+~e|_+7a;cK;_67o%-*p1reM2?`pCpe%T+Y zd7AiXJyc6I2|I;g$D_!6IH6Q)BQ(ihiE$pOOGXo)2VN1<9{THJb)85lAWwBe@_@+I zx6J)ff2m5DFo)szjGf?~LHNJFRCOY`fnZesOZ6bKqpG>z#_{@TGAjNUkjk+BbG)IN z_@#*P#%bc0BF39+{5X4XC0rEV(&)`5@*P~mB8l}D2CU+|<)k?b{cyno*k$lG1T@LK zZKQb?dQ=tAB=hzKG|9cAq*(%*Oi*LVy=wtY3hy>)rjaIvmn<{Zk6((EURq7U&S03k zFh40h5zxeY1xQmL{GcY@s}#_r@~V^O30R$?CY9GBph@kuCyh-jwKq7RN#ngi8k<%c zZ(cx?)>}#%n^szHTR`)Kmp~eu))U^jfF_-HjWjl`bY5(h==w?TrPd_u*tF7nc>>gMk2 zY+fNv{QPA1%4*{GvFu)DvRacKPUJhniJ(^_iRL-d?9XG~SexDJ6VT-F29jnp^wk^i zd&W7uDFIDRZw_f@ktV0NJ)p_ueMOoWXfO1W%R3*?#NC?n6t;tJ9P_sdo=OWD(D^6#I)ChgV682i)3|ie5@ln!zsCU zJK(2~cQmJ8hiFyEyQImLm^7o{N)t$7uX--jT#5O#s(Dtih!>yRkcFe+`GU4^w(j*M zG9G@17w;)8=G`Uo5s<4;`z5^5A!9Wc2=5g13u^&GS>qg9q)GYIyBQGY77K zP*cMj9?;bE#*(HZ)OrTUM@?@!k-4xoL{iIJtcl-$YI`3A{M7a~lGV6Ous_xf-j?aX zuLpxQ?18|}Hj=tt32w-HH4Uln^(68O>^{|p)@k64AX2HVA&tDLMDlkub<h&)cou8rJ8=CljhIwyk;`lqizDD| z0dV#Ark9mSo0jlql#1|HNiSqb{7vwTyG9c{PUK1OV~8Ts46F>vYc=2*pX`|6l_B!X zHcP4zX#fOMpWt;eB=OmtiQZ{V{5qWIUDL#``H5cp%F#78(d(^=Z}qk}KofX}0PMEn zUgg`~M6$9qKgl~-CECvYas~@nM>NO#&25_B%(PpaGGN75}bs`P!()5I}I?a2R zNI6)&W3-v>tq54n@IEFDULm5@3@=h4amU!hzvkvwT zG0#i9h5^k|uQ_RKxt4l;0-E=|fuvbLe%^;!E5>PF1tU+a(;*XF%)$3wUGO{HJ)R#v zfbYu~&GS|@{9!7iv-*#U8$Y+H;pr3-v zqq#U{`1vQJxv`IR%9e=s-{geR|B%mco3B0#4bL|K%LjLl{lo8n$Ke`<>}-9UyJ-Ad zKXcysN8jU|vhXA#rq@>2Q}8p^IWiN=73UQE!02k|bYh*J`Am6jx@Vp>-z_)alj_F8 zGY6QSv5R%8>+f++#~hIye$|%z+s~kXo33dO$mbMr3x0$3{q-!9FZ*fA31?5O3^(lu zSNgggV-o!se^9S;OunMO$2qqBY<&kmZM~a(#yJ}noAiQw2XULP#@S4IwqO0L?= z{MdeCK8+6B_kTBErXR#QoW}9L`fmG~t;ZjlnfwL6uY*+#=I>KjyWpqokM=V-?rplJ zUE*k*B}*J<|LX74so$7S*dYmHzT%wlNRz(Jx9M;23x9eX#L_tbSLywy`lSB;QGdgJ z8H^{A;)&GO{TdwH8TR%1q`Fh*Gm+1C{d9Z`&Z??SA{@`sHR1fyk*u^ID zFIyXX%kB4|AJZ<-Z*{zfd5+?}^=s{}q%ierKPO$naqIW@dAp+XYwc}(4aUEt%TS*z zaej{eyC0Wrd;F_*id|sRkN%8Jj2o6mw?~}Q>Vhd(klXS^kDuW92!4;F@#v3d>({1l z7KmN&7Sa9+Cs?px0g=k$3WKa)9XgQ>Uw z(|@0^+q6T2H%)%NP7QB3$Pi2UjC1P3DL>}7;1;7RJqXs{^miPmg*IY&j2^#Rf8|;l ze?k4fS6+AnMWEjPuD+sqv>nDLtZ(e^(K^!}_V1DHf#tz+d;`B;i0x+VAzo1VEq`0* z&-ZWtJ|C_|(C&G-mj?Z`E@M7zoU!Yr;AalF8bbY(#Z0}~b?T~=$YT@zSf2Y0qhEN# z{N38y@A(%Yk8{krIGNLp@^K&D3xfWPpE&0^c)tgxTS4n%o%Cgm-9+LxJ@Xms%&K7Y zmQUOsncrCFpMOufp0N2g^%3g?zgvG#e`4x&`xhoX{Eq+H?~7=CVg3Bo&*U@uJ3RIB z+CS#kt3WkCKRNmWe%f_ytYiGdInjSl?%Z$rpXgFJAGH6k=umXGcFW=~fxP!yBK-pWWZG>Hn_h%UI_; z&6kPxl#Wf;rt_~pZQQWB9nB()`@Pvv)WtcrysNZ-c*_^94=lIePjrpeTORZi zjg=b$}a2iScF z+uw{o^LJby{xf?VU;o(dzl;C#{6*&9*26m5w+em_j+f8%bpiZl<~dW3=6h`7cU!LD z__I8HyXbmF9bWIgOV<&jW~1L&s-HN=_(_)d_f(rqy1_UT%;*0t->+=J^1}5JlpD)g zV}vPx%Cn{%!Eu~@h5375xKkVZ$*HH?I;`(lXVgJc z?@#OVA^*FH=dsSpwfOfqr)LJEo1MZ(@yNy>cv@cXulna#|8M_p>+L@+M>SeM1V8^% zKLaY5@oe^c;612%9*J{KzX{b3=>L%T3HJ<9KaKvh=csW`PFlyu)Q)YRt`ynuk3taKmXnG+4Z{ZZ*9k!cC`DAf9IzIt>@l)fN>(uX-@et{Q~wAx?%o&{;&M~ zT{@QAb!4!=*?woogXy<$T@vW0HeWrco`d5g`2D+oF%JH2{QMoiQQnM`MS8r#FWcz; z3@4|x&3upj8rNIP>AcFU$72)6)Bm*I*0V{+=I{T$^@FL$7$;bt|5==X`{f&%_Nb)q zn~0bI!<4=#W~;V@9;jGzu{*5#5(po)O-fx zrysxVc(ZZb>X*~~2A12n(Tvuk_PZIUaqy5*7oeylkx9w=l^}pDA7kI6v{C|Ay z{XFM%b;%?mrV^FXg+ine85)@pVIr4IE|E**64Av$<+wyH5xR-UC6h~|jHnsW%!tg0 z2GJlBBj08)GV^=C_h-G&-p@Mc>70|y<^P}8^V+ZVUZ4G0pS9L!eb#;L^;rGLyTADT zALENF@+-S7=GIiM;#EJR_zLOLPpUVjkMlU|H%ojvOI?eO);=q|y-)W~EWIVZe@*3@ zyquS(e3w*`XXAjJk1t=%`^dK|sor!>%JzM774rw#&y?#}Zn?z1vh7lJ?^SPp+Stln z{=24_yv5C}ox5Qg-4fU7u|hrV>FZ-S?vNgfy;nR|k8-Y9JgWD6&-_{ZdB^myKP{A_ zb|Q6)*_r6--{t?GYkDoF2dz7G#|dHJ>%Ce=H0~jal#_$|I>6F z>d$pa&OLrT&g?RFdT;(Hv1iIT+mHLiXZx5rx3eGDgmkm(e3AFxUH`uD8q-U$a<3`f z$~E@uJLx)Y`=wT1dN04^4o%J_rt6?8Z@rhR^%B{S&aLUaTzjv1FUGfCzTywpu@p}3 z&BHCd=BD;g=+C+4iT&Wz{he$dkaS#Ur^okD>HF zyPx%^+KCL`E#!Q zS=L@C|Jy=GEMNI;KPl&03@@aIe(gI|)gD)8CycLHekD(?^j1?><#VPVk18Ifm-gE8 zSB3iCDmg!tb7ST(zj^m!vd>kL?5oj^3;8Rzi;^Gq8^28K5$Az@eu}G^83%-t-Q2;sC1cq3g-eR_`!h^y663 zO%BH8?HNDD(KUQ8I}GcG!mB(7`tM)Z-m(2q{a5?<=jmqO;XZe`?{4W$_gTXCwhtaT zxf-XKt9?k^W#QNLEd8nf3jcjkC*QtmJx_erPpA9*)8<;b)gSC~oRy!}iPf)!{x8;% zFLvR3@u{6KJ;m;8KaL)r>^H>~-|>X{(Ehs0MfsOs^QXdcmpdS$NjmL_k4d% zI@?dV77q6B>zBE4MSrY)1h(t!&pO_3;T0eE0ZG?7i1rERj7Bt>e%I(Z7t&Ywbw26) z)V5}?@|zxWe%;mjan@J9mz%~@H9gB`<$zmGd_SjnG;UpTn#KS23abwq@912I+$pQ< zz4oP~KeaFab4`!`)5E6eLG?@h>Bjx(`bHsNT5r_9sb5n&Zv6P}5_O98sO1o=-|Y7| zk5ag>Ukm*zXT@*fHc!9K`ui8ZekE7wR(wjo=v<#+xUSfbV?Mt2=Up^@ReI$rpYj)T z6<+N|*sj}pQss7C?Y`EVwB9z_uLn^M(^)wFk6oK!y-4elioa&>a~12EI`2~v4(&S2 zy>XMQo6hHq9y`tVtiO&uf6mkM74yHU-m@R#{E+kYBVH(s$K>WJ!WYJ8bcPSZ$#3m* zT=BkGxos}G`h)6R_FF8^b#>_C`<9`w}iLJZDetwYdw+->9vi=D=$^6%`=r-bn-Ju0WY@Ndv8Py6mG)ra06-XW_;y~jPlyH}>uzLozl9(@P- z%^0gk4ZZ#f`EWl$qR-gv>A#=7WY=sy@jc!-=9k;npDP+L!|3dvm=2q_TEDe1{|}OJ zY#~4ELrX6=?C+#cwF8B2><;twN&Um)zWpfVOV`6xFVsKDwQ+~tgTQtm^8JJ8T2CtG zm%cS0P`ZuZ+AFqq@84tPC^;YPO@FR}uJo9T`$CfW0oJnyS-9HK)BRe7)BHpJLiu@j z;0Tsyi7OphReZ{a+_<8jl^toHZSHsrzq#m2ul8e#`R#j_oI52MKjqyUejFwKs@^B- z>Nr1`w%@V;E(YhQG5=)0q4Vh~H>*cD*N*RJs(a7%97|70k{+&mhVqoI-)vwy@@@{+ zW3uTA)Bo3}jL+<>#LF-B^6ON{ZZJFe`SzIC19I?)KAifkJX8PX8V`nYtUXQd9VqnYD%z1ky3Xe+Trobav*e4&$tCR->kHc})|Xcf zq+9BK^MvVH?R}W;P4$QS%_@iUlJ-*fa+n>kd{xh7C-wYziZ0(D<=3a=5AE*OJ;-P0 zJUGAOe2L*cnqYM91F~Lme#880zI38rXDXB@`%K*f{kThfE#EY|>N(2ps~L-XGI(Fj zPRaRbg^L~O?6-`bcjTv?pY84PZ;6}Um!kU_HugT--f3MrT(4HSX`MD)zYYE3)A+#b zA?LL2Rct+3>(^QbR=jext`M#ZgzM*8#}3!mG@p{Z>Rj<_T+=35KgUhd{yr>?H$qqC zs`XjT$7Gjl{QXc_H*2>w376&9dO_80TycI*`)JDdpo`4zET8E*itZm0-^VwZoyo8B zm*TU1_So%y4f)dg7}D?a?eKMpomSp=l>F*k<&*PQw#PP4OZOj7xX9X}CjR@6nS(7| zx>u`^9=Sq)djD1-9phQQjuEC$>5;u_y+-Buucm9iL;ILEK8#$U8&}jvqlbRYgVKIl z_9M66>4kO?>Lv6`Pa*xk)n8ceaW10_<_PIPoU?U_e8v1x<9+RaXx&Wb znHMGNJ88SwU^mK*T}YQ+tE&&y>3Ky`Z}6X4SO;RiBDre+stX^!m)%=?sC`!1ReJxO z#=}$nzHa;X3*)!(rS|D0r}BQS^sMow&5tn-_xny^`s7zW>1Tg`MsF)Wom*7DSXkca z`iJtV^A5&``(u)QW%21;dFt0bocQIpa}DXaxANrtM(odtrsqf-`17a5-rM=q5?72* z=R>7m%_F6kLb}SWxLZs=Azk_k#|7#)rAKqM&Yg~f`n_lE`PiveP8JU9jv0D(eyIG& z)%U+jM@`#ng_paja%6Acw!SJIo9Z@w-t?#RsJt~#lU#ity@PMpDT<} zcfQ5KZ*Kh-i&y$6mJZvm!goS`-9YJ*TdcmR-3aAs9Hj7aHbh zoUX&lZnSQ!bwUeQoKN{vJ1)Om(dCM+a%pym)i2Sjb1!K~ezg03ylwu-h4e!^**HP% zzxmU7Om*>u=_)3_IywI>@5B7X zr^Ax*Zy`M^&+dIF{(jn+ji=|dHJlCls$!h(YM1nDbCxUJ;3TimY&U*r4#?em7J?e^DDZ^FaEw*IHN~S z_i_|-Lpv!}-pXe&`}wZzLFJ=z3H2*Isl1e4={@up(sh4)QnLePbT-4SAIX;-;1pE0Db>1SMAxfBtPkQ61QG$ zcCY;D{H^xk3jG!@^Q&_+a@9|WpW_AAQ=RVsL8d_x(iAEvz5a_Yfh!>_P6y$-Y%wale)PIu|Uz&S4DL(%L)G2VBYca&BBe zui#JK=PTZe@6$4?UtKRTJ2W}5JHMaFZ}q6j1J3m7mH-uJrrBJC?3flkbDEUgrH@p3QXS+@BLS@3uZ2r~LL#&O=20yTx>Vt#ufM-(_E>FLH03Y5J0TIR3|qazp;m zFFA@|^Md)KO`iPZWBu2--@?Vo_v4IT;aLxp-Y+Ek*0@!! z(j$KRE>`K%x)khYjOj&kLN^?zYdp?!Rz8_O=1YF2n{w$dmQR&yb@B6_L5?$Y{!ja= z@++U&bTR%gAOC6oLcONx)joypeR#{;vHUt$J^UYLk8&rsG{5#S^&Mf&T#VOtv+&yg zu=}_0uUP)R$m(3h`(5i(r5By4cQ0zUqO>cLny>d453mm=xBB^!^g#Q@si4VfgU5xC{Z}i>gq)}G?&-dTc+rCij8tupUa_*Hea8O^WqaQqna#DWjv%WvK z_?y;duj~D|RQ-ndR*q5S_p z_}PxCUHi8AwSGQr57h6=)x0_z598-K61lX0z1Mjl`Q_^TX?TBOnXdC5g)Z*bJlo1Q_UG%L zzJdP8>3as_kDczD7T*;AeX{hec1QCrTMv%iuIHN`)xI2lugRyMh4X!Kt3NuFGlYi(W0 zlWXUX(sYZi^3wYu$@!*~ukk%r9y-4y{Z{8U`DuCm9`~=%P9E9a+*kd0Tj$uq{OLOY zrAuyy-7P)l;ybU_^yl0nKOYi(FCS01POo?h>FNImZJm5a5xcstF`YSg*?2hUzof5I zUMJo1#rH~&{r?co>yEbciC=nH?b9c^((ymn?BUz$LG6X=J?%8xPDsAm`3C-6lKi!E zaXtj{Y0nB5`bC$k_x#^LwgW#IYwI%lpET7grBkl{*GlzG^7Q|MW=}bH^-!}@vq#;} z7`c#7^MjE7+@)r>qU(QRWxq-f>o3#)YyaJj-oJ_agQ)K;J><*!H7-$n=lgqg<=@Be z56a&o@#oyj$@dUgFRWqvQB1GOPu2R(xe09x^%3fMbLf%wlht497dL@ zaA`Wtuls3H{>NIm6w=dpRZhm2ceSzWw10|S_XbRN&e5(@dYZ1P%Pp?p5A`iO-dyFV z@{_B6ySnnMy8KdmS3euNO2720_NG`p*i`*jt=ClVO2>DlM~yoakMe8xfal#6Kd8E0 z(EA@J>ro{YeE%usVf6s_8J)%Sm$=9MI*9VQvGzV~m;QbB{jVyQs_RGP_N6-eSG%L} zqS}Lhx4sLxWoRQ4$()pyF3s3pgFWPrv>H2jT-v-~lhT&~}H1GCL&Lft%TX$r7 zO5I`D&*FOMU32NC^{`le>Yi%-kbOUj`_!&5zv7iEz0}mzc}~*<{?E>zi{B-g4@XXN z<}+%^9t1?@oB!)%db~0I+yy%yT2!H zRH3hlcabjrVZGYxzZhNV7oYT{c)u%GFJ05`}peO4eeu7?Nafo{J*Un z>C?)um_6WsFKcNRp*{-hQRKg?!aO#Sn{(S-N`2xx+gSO? zU#~U9V?H6e^cTvTQm=OQABLBI#uSrdF8+@)`G4)m$=}S+qYM4HqI_yUwcpz^nGdGt zs;ly|UjAc>wM+IM=dS(wbXENPQaLL>_2YjQ13Aj)doW+~3SohYw%0`de!G0g}-A63{*?h6R*_gj7y@}skv{%?~n;?vTWbd%L`yN^T)N=MJ9A^yS_9 zTP*$3ugabIq#oA#eyYkdfVdTz_at?!OcT%~Js%ah!Hy=(uIk?!Z3o-oew z`Z7J?KK8_4;`LPO^;E~}sjk;ky$U^<9NgcLgv0-bdHtDQ@qY~7FTI-nBd7AUc(L#A z!;3EWbH6@9m+ja~$@warJM{gU{>M%3$f1SpPgq}y`R)I;V|S+SPvmMmA%D0}ZR3~9 z-}zTfFTPJ5$}RWb)#_Z5_BE@f*IaJlxJBoRD}S$CIRDW568}GerIr3CFiiiyIv(4{ zNZV({Ur4XLo(jXK^Rq&FZRMtN?ElwumGo)*PwD@+=v-GZ`tDDg-4}ab%1RNZVJ^lMWoAy5EdY@5syQq1b=KXhkO}?DFJ-K%*^7l!_u4;PtKJ_cS z>`~_d_5FMyJ^j8@=UNNj=aT>Rp?M`=oZDn5+B#^d9Aq%#(0``DB(;dXBYNJk`-_Yqwc>vRAn^ zv0H_gzB=AvdKUfLxJ-xc4Uqk4zG8Nf-Xm&umj3_D#^0Ct`%$6_SNCw}e`{p7vcE7N zx*t>Lm25r8%9Zm{*>iT>fZfarI?p?1`D8y~Jj!=r|DD>8eRmZ4b8g{bRu1Yn^?j1j zao-pE1(vVgZ?1JJJI9ItB|X>Vhi;u@Ju0qvZ{K0X75Bdt`t7?dp5veY6#K6dcYJ5M zrLKExlOO6!e(C)*e~w@J&C*#OCnoCw_#bJ{r}UeP`Db$eH0OQ`Tcp0!{)giueQ#Fr zU0Jd3%@TU?@kQzojSd^!-SwpWlY|QJufAJaf*@N#px@zfV;7K5|F<^NY&2_~lo7 zr}n*KT$t=%NbfoK&|_9k;?ur`{Dtz;eGv5*;xqZ0f1=+`)_p4TYyPe97N7Vc*ZXCr z2j{f?x)JLE=PNd!kKDkCh5mz*eoW)V^c;xNrF|+p{~5bwyU`wUPWz?iPs7X4cAn$L zUony5A;s5UG|MY&}!OFwN@991D z_C9voCExu=&iGQl_HQ1$+QKV6mT%mz?bD}rNBR&wbd?^t`d=}nzc78dWc`MAr}s5= zHC`2ehc~VM$uC#)c)9&=H$IJn?R$;L&3}vZxZ=A7%{L40%g{I(?e_I1NB70k<-F%w zzrXm(Na{0oZ;UcNeQ%<4(Vp3U$?ilCU8O^Gbcl@jlyf*E5Fw5 zWC!8AZBzJ|fAyC&ky{&nr6+V%kF7mP`*p3ul z3jaUX^!J~xhhla%*MCPL*Z9(LL0Dha?uPO-&X6ATUUd1Z3oky^XN6yRzV)*<{!Gu; zXY#f%Zs}<6tigr`>Ztq1;$NdVYbl7-P|4Wh16SaS*e$x2kivM%`UN^Ik6YnxN zlq>z#mhU!yZou5w*?MEnJ?PJMD8B0W6yEfPa!<|~+WrvRb4zdfzqUI6VC53KFCSvQ z()*=fNdBiJm1FIGt{evVu`HFD57ifHTnYGv`~zA;ztYwKQ+ z+?#@Xp_6pwT<5V!&PLk(9{!#cxwj?X@5WAk-5)Mj>ESpvJKm`6xK-mb$t&j44r($E zRQP}Ocu?a&%}dMue!sOlsr@Q_;w!8VmH%g4dqs)~aw)N{oibv}? zT7T7j7<#XJHy-I|a^x>-K>NkHz*Uv$tS?zUwtKf6VEGT}Rfn(4|5&nan{zw2EsW3p zSE(|;=(qdxnTodQhJNMzaY6c4)-S|<(+ev*>e6@`@?ejZ}V@ezN~)fo`_t< zJ(D5*xt**YX6dvm-k;0;RNVuVeb0KQ`z=HIrpRM_RmGE~%RcQMkDRmh{Is5I9=hbo zP5UFouYMxTcU9@9o+n?NkoyHT9WK z`oqmnmtK^PLxcWvY>rvyxHl`-!pv-KF|Dr_x(t(-x*!~ez9?m=>h*_ z=JgQzi;aUMx7hn^eA#i5_9-SWvh->kD_8H$o}!9=@wRs?KN`=N8@oLoAU)?!L;YmC zs&vV%Ex*ELU9NBLk9e35%2Rv5_zLA$j$iXY%@@y0z7xj%HG!-6_CDG2QA|JA`*CHR z$oQnMazDP1oMNu=$8H1m2dOu;|HbGBtSGdjVsechyAF+we`0d~FYeh)!s9*{PtV## zT3%S!_WfcgU;S@5K9{_bWITxZS~5PwcR0-~{=#_D@w?<7ADjM0CU%AM&R&1T!YTd< ziQduPUTfi{KiR9TpTYkA}SFZ8v2cnys=2LXrf5kbBF?+Tlmi|3_U6@R3jN}ftMr8F)O)$v_JsDKaNl$*EZ4r+ ze@N{oau4oP_}={KIaHG$SMbT+%#AC?lf9C5Np>5#LVr5$RJ!CU{c?YDn(0I7wEj4* z=%>XeH_N4q&r@z|riC^(or_bu_dap}i=BQ`S`u4HVpL6H=d63y#&A2K@)(i-+#HWEhzp^~Z(YQwWxBf4^_aYn@sa@B3Ai0`1m>m6|Z{>NG z-p{|i>Uo&nGe1?$)AYW&@EQk%>9YLflkp|b(`p_gK9ifyZ=^rD1C#R;_+Hr0J3ijg z%2)K~`xp8L_;HNh@3XDFSO0vnFYiKs&K;h7M_aj`s+?=;RxLO0G{2IZ&~NEYFs@l)SqT%WEBDF3x}HLh*z`wPu$G%wNj)3PU}t5~`0 zwX3DG*n6$l$d$Ze`yaCRE&V!nt7AL+MdGnpde``s(i{@0x4Qev%^oZ3>7Ki-+?QN~W)b~(6JP&A zS9YNLP|Z!}IpP0UPW0!h<=T2!T(OVx@+XWJ^Jl+LqIOF0$fZ4V{p0OJES=)hxihsV za%KNo*O45#p*-=e-r3S);nV-8l03!xC%-;c%&&Bq8@nT3uylv{FZ8GTSyoSReh&F& zc_^Mj{>atVulg@Ngs#%9_%3|L;#Yg9b-iV$T7DFs>kV9|nzY*J(x=|*9EZ`<|Emtq zi=I8q!kb(Dc~Qz|ynXzAj&c>hT$P{vaz&Rby1C)~*{Pi?ofcnuPf_TX+(Ngq+$G6; zJ^cUm$bI3*QwmQ%^Q-^)Q+oB@+%%p4*q`+#Efk^*ZN1Oa4bNa#hod ze@D5w(fbp<-?lf2N{btql&107w zR}A#!A@_s%RzJ4#`-n>K#@*P?`zbmRN8tIgh4-Du^psdf2Gr#c}Q@zp#3^ zL(;y+?gHFr#{B%%?`svKQ{S|MpV#GgaXI(mB^Hn9V^5;ooSXR=-MqVM3f&Sny^-;$ zf6nTW{IXBwL;ZyGRm{#qdHUaP=7-||*%$SdEw5tnhjf#dPxM21RlhGrSGW>4@pem3 z)#0n>v+_>s={B!ZUhED&$Mk(?qHo;GZ zU(Qy(v77z_L=Sxw`g1s!Q%F}i?AgiE`=M{A2K(}{@c194|FT^-O$cWZdz|byHYytpJ{eito>#`mbU8{fBErq7=P#w<5T?& z>6@Ak(^uv7TBR?HXLH9t>~YpB{7>FhR=-S-_}`Z?oaN(xAIoT$xUXd+e6-syuQI-V ziHrXU@a3__@86t;wWO>Zy_frIA6|aBHH~*;e6`63`xD+{w1fX2qfO0^(l1x}3++q( z>c%fBchxi6Teh8-oSM2}z5LO1E1!!-TRGNLPRN%{AIsb7UF0M;tcRih8-ISx`dR#c z^d44k*}k$L7G3SJ^}jja|KdJ+^uH``@n!pWrpNmI*cmshyMqg zW9<G_&MI{K$X9=@~j`-qbF zzTeji{q}#%X}`w)jPqjkYie(-9kTIjwqE?Yx78Q5Q*2k*-dTOhJH6NX(O%Q6-ihDn z_+M;K-!|Fz#QB&RqnUxv|h?n{5qKsm;3Ovfu;e`?P@`I7Q;ZgXWeU3}HO7vHyWE7^y?r%d_}`@67xkiJ#^ znpZvI&y$EQzub^6|0Nd{+F!_T<(leQez}rEd!pSuot(SKyGee1R(7F!7_OIo==a&Q zZfNq-^*G(5y(&3xlXEX6^U=tU<6?Ih#&0Z-waI)bc8~qg>WBC=Uv7P$rO){D{ywh~ z_h}+G9S4QuD+`zR@s#**r9NDpit&@;nV;NmfcuM*_!JKJsQLAMYZof7?^I3Cy9YZk z-6ih4WPGsc^{Te^Rm|=R=N)M~SFFAllOsDWl$Wlvh2y1go!I7~vFn3q!PFDZ zwcJd5C~*yLgaf;%86WJ5{WEG2X&)aXJnzq(@HU zbIFze+m6$-^^ob2U*q^NKl01fJR{@}>x1)_o%=&Nrm9pAr4aq~F1Pz9UIb z`SgBc@@f-LvG|o=yKf_Ma=Vq=`09m{Gx&KcO|CxHQ?-kPh z`IBy9Jx=cr;W*G{b*dV-n4Ol&e{4#4!F+s2dq-!;ycZ@t>;Gwqt|2|Q0my3!w} z>%Yyfd}#g_j_;qk&&IRWxmR6l?Xz6{zm!~!qfCC}M4yrD%b|Vq`*2m$bMBMltsL}T z^5l;5-}TF1jL*JniQJB3EWP5Ft8m3!{jcy^pYG*8-G%;~`f&$fzGC%H_kA3#BF8=Dqr2#D|zBSdn@CYtM{AgUX-jK z;hx)Nl#6rzem&{IGp&C(E}3`fd@lBR{e2Oe8lS>-_V@SCnP&N}&aZHCue_M)josHJ zrVr6;>gwL_n(~WJ#hWFV&?ZwBxWGrv@w=W zt(Tjd&V#D<>pXqr?A}=IFUC&y$?D!${f|L@w6)uX_K@DQ9j323e>g4@zsf0e^*(f~ zrqt(xvYRYbt-0-94IG zYRX?sUkd+S+vn!eo6=ide#G~m?tYe>Kft{R-VM{MdoSL7#QGQQm$q!j@ke^!h`tjL zUH&aDv2Z;OxA96SU*jgZ8V_ncLHFV7{t)>K=c~B4)t_(pcJ#{g;6i!nxL@g&8}^?X zr^}W7ZPVJu*IH+jU+*=3GB^DmUVL&TSL4f2ukst8)@Se?d~)6;T{oz1-lp(>_2UaG z7u?em*o)?C`ac}G(u~bnrT4pb^*?U4jYs8E+i?Fbe%Ym5rNi3U*tPNV zRyz+7yS5KlxrA=vJTR)@(>l83?UmeXmvcQQv!3I8aB^Ox#OYqYk2_lZ?|C5YKX$tw zO*e9d{+zqBckTG>{J74$Z}5A6|AXjCm%g7B{lnyZQ{?1U zy^dS?ep01Za*DZiyI6VXzE#E2nBuW;%6s^zBdRi3ij@n=~&L%oYHr0ZUtkS>21PJY>K7@yuNyj<0T zVt&yTUi(+!I*`iE+~W7~NRC{!ulu#M@{*m(6`x$)OI7IVUOm}C>K5{$4E+2kq!;>A zdD;&MUDZFi)xFn!lsEbN&qKe~PxU|b19vlf(f!*YUFVWD&XOxV+4=gk-;;bRZ=C1y z?PKUydnUV8IQdonazzjALH9!2eWj{Dx`#aW_n3-a{GNfK{(A$(qx{v@)xChV4X690 zi@B!9be+4fzfpf7dz3%D_fY-YmC5~*;@kYL?$^`3UK$su9Hp0HdXl}!6~EFiy7Di( z3F!)_af7wzxF5=|_o{!=xJ>+XdG0~yi1fbLdcDqP6yuXzYiHt$dwtaIgl>cJ);|5K zU8S?we7qQ4;i_}hj%dDR{OP!@YWeB=Lis6O^ESDw{63Ie`wl3o^c_(6y-=Y)J$GG5 zul!xnACmnZ(Z9QR^nIt?LVal8sJi{7&GjDNZ}@RwVZErHu5vEsDqpe_xuXBOTsxnU zwwIw_{YL19{aom`^%mH(|DIX%JbednkEd&Ya~i%E;CySt1J-Y={Sd$8h+prOF6mEx zxuP!{Rw!5NL3$s$s%PQ%bfI72ULI@hTlhZoi@z$jiL0Ay?&i7XZULT!cow_X?he<^ zJ&k7~o<(?G#Iw}3cU$6_i05fMi}1XNhxBb+2hcl!)&aB*pml`5BltRk))BOh32htK z3G~j%^CH}(ZcpI7@bqwt;vQ~ke4zWR{(){Sp8KMnZhifpzzx$G{!q=0szF$AWh}p6l@30G^xN6Y))MUVJnBx8b?n zJ%DF{yB)f_-Id{4?Cu2pF1Ne83-R6!e6M>L&z$I9$h+6wjpx?fR5vv@6SSG2%|v`N z-5U58y9XibVfR@42=F6tA9Zu_JQhFZy5=5pU*(>0qwy?&cE8EJ2-z>=c@58-c;3SE zM?7!idEcFwdmrgsjr6XD`zO#oz_Zp3%&m2UbDy}=@C?p<3fku=xzCZ-^=^4?J@m64 zasL(WU*Ue?-pzdh_e(rqyKmyJ-C8`Ob6+D3UxW6I>z4ZlY5N9gi=)LZAJxt0;ns-; z=Icg_;w|xP6y#scehQ{Hr_5e$ZZF=Y4k(a6za40 z9d)YL2L2Aw0@pDb9e0d+M;#MT4mPP$@Wzjh$Wx!WQopVM#^q9gK;M+@^mk1nk< zH+netOtiRULG)Sauc9^aucOo5ucKupFCmVXAp0fAeknR6{}N=sjPNfb{4#`lHCk8l zYIIKYYSgFB>gcPI)zLR4YY=7)!mL46>JTjFUIPr*}O zw+)_lc-qHv@s!uy15XEp>j1Z7{2ZS0x}ETJj$g!6UUyGCd&RHdDX-fFPggwqAntwO z?u(~;{GjU*udVyTxKq7DTv{L=zdC^bf zGwb~{9#Ze5cu>8QfiK2$N%9P-HyrK=JXb&$SHvIH85JLr8x#L29uv2zKPGNf|5`lb z@mz=J#<)>@W4zei7#~o2W8AZJ0^A9pO#p2I{5J#N3_KCmbX&Z%{%!Fq@tts|#3SlY z#WO7~uYX^>sQv?>J%s16cz*rI;eR?_S$}@Kw*CS<&&Cf&&&KDJJ{RX3JP%no?$}@v z@Z$KD`b!XI31lvdkIB6rAKBm!@w@f^fUs}CeIs%64c>_R0I#n9$N2mP@5O!d??Kjk zNYDH6iKXvD_WSU^5C5Oze13=AV%H)!IBE&EHQbK5CTJN3NBiN~A5V8Y2jJ<2=MX%H z;pvU%a6CW3b0nU=c#gtzG@gEVj>FR*&+&Lpz%u~PiFi)Jb26S&@C?LrDxRO=8HDFF zJg4J11J9Xw2IDy!&k#K4;5ir1C3r5yGaS!lcrM3t1)h<3M&r3Qx3{}CHxKTfa2MlQ z5RJ|CaAQFmo7)fWVmu3?8*``SCxZW0Jh$PQgy&8?cjLJi&ouBomHRQCdC^n3AHk)6 zLG(qgbM6b^FLD=^d=0)0cwByP6yb^S%^S^Mfg7#|uNw|ygEQsEK`)0mX{Xgd0;AvI=Z9MM)zXP|VB;TMEpRAU`ty5AL z&tg{>Ze6(FFBu#)$I}8&D?Gd5X^W>Fp7waUmi*T3gQp%wcL(Cme~!W$d0YawX@=gy zgRu*ciN9h#vJ&*0G+JkH|??o^L=fIBNgUzWjh zz^FWS#&A%0pvSv`ceuv~0MGNd7w|IR_wkK9<08JJGroNU?wL#F49?(gd84029*?Q3 z!5&l21UwJn`#$2PrN&R5rgc)8y)$@TU86HS;}GahoDF8!;fR-MyBT;8o}b@@`zJj8 zIE>@PL;7^khv1oCFLsZ@9g48T^MHrpQP>d~o;5yRrmc6qG;LEoeh2hf8T!PGoXHtE zvorL$8T$MTeNl$K0($;>GWNQVfmIEh`x`K~p@^>m?hY)yod!GrkJ69p!7K8}DWm9| zW+?ByfUiF&apl%Dfw%H$ zBmSYMuLeHV(}^GV^tHgh@^oV6i+Nd}p%ZuY^bHw0al2cLKaViCdpX2AdOEj2W_mht zsi!vvW>}`5c(|886?#4x>xI)`o6SIHc|8K$3Rva15IT9L6#GG-3or6Kstc5J6V6$` zL>}nv_6sBTipOI{#Fz~jebEc}QW*7;Jfzq4_=jb&+sfnH@SSj?e;;oX(C1{*Nvycq zBc0!C8M)RzY-40lW!Lig*md&suK4EoP>+WUh~1IE%D3SXCY)hd>Fph1Ew6N;abx1e1QK@VSamMmj8Wg#Y!Nai3Zys$YY8r%AqYCh;qSeHz*S}q5J-Eh^I5Z!!kT0GMGFnFY*YJN4PA*Uk?0}eW637fpnGK zM9*`Vr+32r2UC4Iv-ZO_VK(TK!B5+pM;@f_1Pqg&%izTxFYSuB_a-v>SMbaSkMvJ0`y`eP5X;V~H8O9MX-vvRst(7V#P&%+6Ma? zV%6&vi0iBS@g0DdFTK&0KEk)gtS`*F@<=TG5KBMgfAUHEFEGXqvcoPJydUst@JokX zGMIG9CzcM$BOR^nifyv& z{9&ILwv)fk&eFNkxzr+teiF+M9{r&GdR|jLLJo+T^u)a6+7||z~ z{0D%Cbn!RN@DP*dMDP%k=XBs^o`*79W%!B7|0sBf$v+RceTKhFhM$=H{{#=Q_`7F# zh=2bA{x=De1mdRnE@mf>TjRfa*=O|vo#n{!XMe9}rmYX?_m0CD6Z{xnyT9Dvk}+*R z(AlQ34w9dkI#FE1!9O6wGYD8ZYyrlfUK+cZ;28q?^%##)&N|rn#TYcr1D!mreO$wQ zSjs16e%}KR@!hz??L&|6Z0@l7>f8v=&-7EybhN7u<5S{~pN(82kB{>5ze2oQ93Q(D zo<1J=#jwYfL5|w(axarUok+C-G}2-`602KCtvjdMlJK+uKFJvUB1=&tM$Y(CAmUbZ!UW zrJjd+Tb|)37C*80c^qu-R*^dxVTn68id`Szl^HpWwsh{KDX|*>`a%63DB zKM!4uZiKNc=)~mj@A18$p9$O$bm^Jtob(Xx(gvM*+@db*)8hqa$8HgD;|xFZyX!fT zTMl}&fPOLToO)OWImhCgG};*P#2y&uFdpEyyBeLi1IDHGJ$(?)26Oz@3NqQ|vrOB2 z`CxSs-rf3HD2k@TcOPX))=EFWYzmV`ghO=fKEGMd&PJUz!-i8=)~`04Ezu<^;sWf^pvOXbUpf0 z;6VtZ^pIz}fah)S49V~?F4@2m@NgmsAE{rPs)ON{1o+zW4xZ=AwTEiwC86} zja?IXhGpb1ovmlaZXeJ`fG$0h0jrLy9^DF_a?q7#@=HI&(hvL7F(YF4Tk!Wsyh_7F z&(HE@yyf`DnEIKVkvYTjAnA^n_jGkc9Uwk#H|O>Np6z)kXCUO)T^hOGpbrK<^oz(1 z0-g&V_2Z;}1$!61ZF?D9`UXQW;@Jz4Y9^EYk{Bf>0x=%Hds$v zKu6O5dhif4{j}k&VZ*()N%cTGXS}ij+0QWWQ2w^p!qz+wtgyri+t`Oa^m}L!~$exFTrw8oqF7S}v;wD>5nSk=+n$lEHKgZWE)~RU=B6mON zgEDexS2tY{yI*+vt(a>p^my_2}{hgqFlov?uUChSeJ()uJ5;x z+#kVDd;8lCh3y!}BUuSnSke`im|;gE?8Hpi$(gXk3QMf8#0)zJVP|-L#yi_%#!IZQ#0pEy zuxk-^uIFdi`5rSYvBDB7EHT4&+zw+c&(E++J!V*9g(X&4Vurm8VV8S;hHZs%m%R~l zuEg=chzxxK1fT5fkn@LGheYmP$XN+Fvh(36Z_c^qdb(_ebhfecJY8)s!@jWr_hNv) z8klv2>ocUQts_>QTI=boFSLKIopQdm9`s`|7Wxcwh#8h`JMlSK`{KBWm}^S+08fG) zkKfkTe~2e9#(hMfv;Y0;VNtSnhvhkU!~RAm{sS=OkpI&ak$VT2edR+KCwzf;ha>EG z%nQB&o&}zxF0;DO7jta3`SrIqo{vzWw+5!n-;FUI;!)@am%$~z>`vd;5Z@fRoxwj8 za*jZKArJ9V^by32>)FeV&h&J`dMVSh0a*RoRPdbA+Uh>_OZ~9i8{*L%tue6X2prel zg+5{^;+=!A{ax%X1#SkOCov8k>oLc=H+%d`(C-3n1s=(74}1d@OMYVV&-3_x(8=Eg z^taJ3k%yQ(FL~SyZ9I86KK$yI*u4ha9XxNMY{^ed{`DU3g*=PD?NeC$1-%z|H1{73 zIj6mk^Yl&8{{#O9_o=o3UV=QHdUWJEc>FTTw2Q}_PaOoz^6k~b#zkwu&pg5m-8$e8 z&NJKS>*>@j>3^CLyJHY`0>WPf6AHY8pnDc>(bvERQ z0zKuGt3h(mTvH>Sfy12$*?fThRw; zWnP4-E80lEfKEH%`t1PFX(wF29R#d(TH=beTwvKA`8Cd&fONif5ysSTDPLoi7Kog4 z>ZM4(@S7R@Dew^RlcyA$f1HzsxHag*JP+{*V74b*!{oe`^VxGiFN0tCCFb2k*MQyv zJj~Yw&olQv{7705DB2PA9rWL#jjaQ`1ak+CIa&Arh&>MW zr*puw^jho>fu}RpFE~zU0!$ua?oE)c_Hzc(raC)2gPE6o@4@&4VdrM(^MOCaH}RK( zzR1&QKg6=1UK#q*3|{Ur>&Qxvxqm^ddP>as;M0)58kptCc6%PuGXrJf?xKz9#}R>EL$ayY?688dP3c1)>bIq4d9VZmVoDD^#kjj#r9Le4$UU-Vpv#u}!@uUO zwEgE=7RBa?v(_cecY88v#}2%gA?BL%I*%85`Z%O>#!HdgVJEcn2&;aXSp727NuJ%n(>=pOES^=K zXHW2S20o!1#?`=Ufa_tcqlc$A^K{DR*nsv!Im{Qw2DGI*s8h#)pFE9PTq3->oUHXx76eI4|`ymS1+G%M^xVA;Ur44#p}tUG(4pDjcCI6qS_ zzVb4uE8=aizCrmB=BN$k;(uVkPkcdZ>_Y)J0`7*gdl#5x+5-0T3Gh7F%uRJ7_Z9GL z#LKd1hP9-Hpudi~up96sL=x>4x%R-_Am_-}BeyqjXW)~{Vzw!0b{*M=(o8s{|e{$|VkAM3S*5W-r7}|f*FJPP0CzYp9HbdFa)_xLrW<7HX9#Wh~`O-$!* z{J(M75HY{4tmEa;D%W#fpKhJad z@Dv}rb?kb9-Yg@NxD;~@jyG5b@7~GsNcwv8$;=nak!#K@$KlWe$JjrE9O~g7guBAy z2Y|Wfm`569Crril@@u|9*a z9<>955LW!u?UCEq+^rXQI-stxd`Bb9Ion&mKMwc~l+l%t*#|uLqR!mnG41Vck7t4Y z0B}F>NYAYAYM&W)1ME;?OLsSZ^2nCvBW=p>5MZ@M0}xhqa2V*Uv+QR{SDV1}tF2%g zvLzOjUPgLIe{`Hbj{(fE9JdbvmL7V*8;>}veek)Ec&b2DLyX+Lc9iB$(F|3~QOcLjeh*bn34ScvrFyBeK%*^g3u zV}G121OI%`#lHmU=XkZ7Ps7@ijc1YPp`9!RzU9o=jRX(zlW3^Md3@X1vAYF$67+T( z(tkTJ!^++ULjInoMsAAdpYs50*W-0F4Wk=Q(({_9k2xIk6pt6f9@YU%4%>mI(8Z(o zV(n`;?1SXeewk^Tz9YtFpeN}BZV$}5{~`8&IZs>;o+pqgwvEKB?>_+#@!ojPc9OUO z>hbeW!r2k4#(KzZ{QyQ+fbW8oeajD zYXj(Ofj=vW-1l2sSk)2Ie}?fS`%Ut*O>PAq#wGhF&!Jc|KLPYP$m2B3-?@Iywt5eY zf4CRJdNdMqlT*O64D)Wb;b#JK9x;BX(J7zl8A&?$TkeAO8DOSad0Y=3<#7YB@<^Ob zGwpc=!jfO4+A;PKxezb@?D60bwk@S5cHwQ`}KFA9RqF!9?j_}N9`)< zn!8aZ*Q`b}Z64nSJQ(SG1Y?O=z)K*1hihZ^BJe=e1+J4!N4)F@TOs|l8O}ARACMBP z{-{0T5}jCd@~fZf0=nAp;Yh>bdtg7JE#`)vpY0NPr1M_Dl*u~M$79CZFM~%T%&Eu3 zZctm4HRy_K5U}DJ2Oh4`T?wB4z;B}+C1FL_Z0K4gQ zBFX||zP2bYt_iShS%z{{S@Z>+>kk}HO!V?OHXxlm-}iLc4|!xW}=!!#=r3z;=vlr}u*1Dv0-D?3>>Y`WmFO57tW`24-AO z9*Fx`yqwFowfzOk|J6QNj{7R9hbE1zx{|Y>pJ!I=MqoGI2S>*Xy_m={z z9xcz%S7zw6f3}&7Yc=Sad#?5TOj|v#H|nYz_+P`gegF1mpIUdS2OGP36!MKSZRGix zhNi$1rei+>{7u0_-5v_Oiue*cw@LhEEBvPn=xu?on-;rsf$KFunRZUg^fk;Mhk?$t zsa{iN{QbyH0-bvMJx+JkYp{%$JU>QU?C;isPF;~-aS>~8y&KZ@^1c{*kRM@3Bc0~~ z(}qVavbiV6D&@czlLui-x3GAdBHqWbpEVYA?w`H|dzcQlA@rv9wkPDTx&dp&lnK4` z-QU8JemLp~>BNJ87XULX)6e$2H|U(pECRi;r*kc|na8w$@~fSvoVADHYz+8YWq8I> zC&*W62V2*@^n8rLfXPGq$)he%rfi@+u-aJis68QF_Rs~G>0~|X4lFxlS-grlJKGb6 zrA&@RdjV7C65u|-8mAF!oJJnWXI);~)#`GDFx%i91?`Gsr2Pk=twve*MSj^PPe5K~ zF^@>k9l%q8&%O)$>7M>;6ee+h@IQjK{XSsTuSbE0Z;A2eaI>E|2>bUk=YHw=_kJRF zi-DQ1(=h>{-rAz>EAR7sywpQKq+hyX-}(;rB0mKG0MNxhD8oY=I|t)r)&@mj}y@8{K823J9x*g`@rCqUoW}1mvzQSxzghyoPWf@$a!4orhat6=H;Mo~GH-qPA z@S+S}n!(F6cx4u6(z!ZAUmIZA|N0EQdnPRB9UU<@Y}5&51p8s$;kXUp*IL$K5N2U7 zyAybZ0&m$ocHMyU89QkRta?gJIjrN2Gd$em(^_t`44wH>pF*s7ha)b^xg2qg27U%@ z-BrLWJMnbS@U!ehACaN2%+RST@vt0)S&qW&zgj*Wxf>A|$H_b!a2GJ^>|fCTJ`7BK zD$T4r5B|#bhS-1Ii+aI5dg5^&Ghb>$DDx%s`y8vc3iP1ybNdXP=P_=3+-#WjS7kJA zYmD3cxTOpDHGU)3_>EZOxBdvLet~7A@dNvat+0OEy|d*@>16%=2iA}e2AzFGL(I8) z6O$k9_K_a{c|6v&SdSo+X=7W_D}y<{)xPHnq=6VBk~#13oby7?BoMa1T!6SwCTzb9 z=6QF?p9+3{n@PK+4L^(Z2hN>|KLI9vP=7yLb}>& z+O7CUWcZ22!#wJHnF##%`+k{cnKAUS^%Wa7F_8Qok_Q(`f_qJ!TtAd;ret9sqt~o;N$f;}ct8 z&jWZ-CM@MhC+xr671n>TUs#5Hv}JJTp-fxN#{JF+yAWyP-0c!z+Qw-a+u--kw1ftdxI|d-GE7N3wnRx_s8KJ zxW`)n_X3^-z1@d>$sYmF0ngnl(Eb1q1%4UdahwU<7JAzrV*uI)F~5c6oM;?)IM2EU zJpEBF)D`C)13^FJQnWdsulHrmK5GK#J#WI;0X)R|W@kf2KVNNu@fqeU4E!oF#M?p-q#uRvO11`nQ|R!w581lJ z3Z(N~tkG=;`e@Mm!YG=1dESac|RUd`?E973ampqfB7KRje$8fIOPVcDL}Vhfxh2S7_WlP zF~+KKwocU@CMUfj1I(a0Mcqr0*Gs=s&(7?l<*^%*PI}?||4Q zPil(qK*2Kv@v2Q`yT|z&<&bAQ+D5KbQqF`-AEa}V)We?7p&f>t!I1wV+63y2xD<3@ z^01#Jo$D?0eA=dCF3GZ{J&ect(r-W~eg$K#H$2bn=nKd*9AUM_I1A|+I2?1{ZrGzl z`Z<>4dFEEYEDO#_M*wS1S_Z5+DY53H!v>w1)n=p^Uc0_<`+SPvC3YTKcKO7rWt{Ez&s)x|I$&CfV!W^nCKp9lZWQ&z@%< zI@H#&S=V?j@u$c;%c$r6#?SS%4woAb@u7%o1bE2LGiG;q%rkHI0#Ed5ru|S(JFM+L zfiXGj;3?fL&6B}Hee!#p8Nk#hzsDh#-k7gjE<}F~nR8I~_n~f<>}PUHPsJHOV9M7y zTk>;%ig!&AAL{WW-N+e%Z~fG6G125 zW}cNJ=MME}r)#9UqKxv$EA?42*S_Chf%tSTx*O6q^DbK_;kv;|XcLn060q96Ss5N;(HYk53VVRF z3jC}W^N`<3h)Xib!}Uz^(BAls`77WV4IQ=I!Nz99Y;)cPeK_!R3_L&Zcvp|v{!l*0 zCu|39d&c?;(htQt^XFdXB=CO)EPkGArOcO`TN-8|@8_Y6cy9^u$_zf$W2Rqqhjut@ zZ|n!{k8vZyoOpcXwgm2v44pjOxt)RMAdjcvTLYF6@dB(hbp?GMFxQ>#=zzWtVOw5~ zwIa|tPB;-|dIm7pD);_B{MV?*y@4nw;%9StcyY?I)vs~?rEynlD@gBpiPsNgR*XMEA3xIiIPzSS!S{H~@haElxQ;goJiEhI z>vuOB`0;?)ZSOJ19^VI+jkWRgdxvAp49v1qypz#Cs$U>ocSEf~UX*@f^>@UBQ7>3G ziT8)Sv0oW^xIVL3i=U6|aJ&^t!u;`aR;N^gR4KT9gxc;F2g;@Hh?fo>< z9=4l;bM?#%=xh(~0OlPF#4oo59r3bEDRVf=`sWYfJ6!NALOaGgg1GO@{C3AW;S*jb z|0sjK5oFz;Rym0PJso&N=LH9`iqN z_4aACoJ}2yJXBG0$gX#sb12l_JLGVI@d2wV^R%41vLKVO%gQ(c9+zfE)41Ng^7 zpLKqK@&(UYjH7k}?uoj?^RfJPqciAR3^jXhnvvNpz`J4YNt+~H`ykzsPT2#o%AHu{ z&NWHtsu$=?Gxf=F2-ny-_G<)x-@dj-N&IK@xt!bb+q#K|pkKq7O8wpGNI!Y<7uh^W z_mhbJd(?$wye=(aV-!;-`LUa)?L%17o~B5HHg9!`E%ib2#b-(>xk7 ziRU#iJrI8nHhizApMdd|@Jy@~2w#u&goiv&^Tvibe&AgP&w)<6Jr84hj#*j&>$}v2 z;NiL772xTHaVpb5{d1o6=@#f0K<|fqY0rHCuX z*8$WP^@c62-O1KlCTHZ3uC}@-@?MJdXMR`9zW(S(ZGVb9FC*+$JyEAKVW|h%8`Ge% z-%y0T>j`}02L9O@{<#^}Bw$82jc#^d;k{pRzi`*(D}SQm1* zC&IY~&%NBXGIGBM|8T_B?#{@)1x)${??i4j@MzHg>FFHnGi}r-vDz78wKL<8-~3mR zYjH62fI8a_WwD3H`=TuN24)&Gwq)Ag$Jn0xed7>UeoNf<0-i~ba}>U*g!w0Urwsl@ z20x4TP&^OeKgG`QVMjJcIz2AS@SoZ)cEde=y2spm(mFr;;t4Qz%4Gd*im?H|A!Yl( zJ>nM-mghROZY+A^UI>Tu?{NY8G=yyke(H*CPEX*$<6}1jJRF}(KJizl`#b_`{xTm} z^-=Zf0)*`jI%V>#cw@+9xpO?zEQ4G5c$tRw9y1N3t8W^I@W)KGK4=#7dwm%nR|8 zPepDD_=)+ylUPznFvsD%pJXZM-Vp+JE4oX!l+M56_g|Q;zR1 zJm$Ut+hNk@fxZUxb#=ghDbnZhT!f7eGx}uU9XwtL+zOa;OqK6y#6`?9Wm~cLgJ|=? zvldvkw;ot_vH@7@HqFrY$(Hh{kK!SgEopD=6Ub!$I}YbA@{mFN6UV;YcLQz=9;I_dUBvZB?9K+g5p+5YZ8C9xq-We4*xLeb27cLLs|;?R!Cf-A zJFw*U%HTd3+%JPyAq|bNfBGTfnhJb)^K|b?-xQNx*3am((B`nu+WALlhe6kwWMZBr z-V1cfi0H>73dDcT6D-Qu?CyDV}~e#y?0WdA2*p z;w9$!pJ%=NE4txsG+@pdR(8a>EZ||#zxHZL@74)+1^N=?@ru*1ehWMTJhF$f3@*>$ zZm=KiGfvFV+hcsCws*3p(`II5aD=dwPdagXe4}yD;kJjUew_4M)<&)m=*zsFh~FKK zZ^J>K4Vh}s$$!8( z?8Bz`o(??2K$lKnlOccM- z;~fHw>tMuH=f}w7_b_KcU%4%CJz%E4IdCK3{-@&`SkfV9$uz4wTub@eQ?dIQ=uLs^ zLC$^6k$2C34(M%xAMYQ#3xMY!Z(IwV2+Z?T|Lkt()z>3EjEg$&4Z6y!ugA}WpIG07 zZUDc^ZYjbD_k|9ReAmi?dk_a>tjq5yhI-x79*A#*&F}vc!|gB^I~2G-=)5zKJOe%d zNuJ&jJUjt64LW0Naf$tx| zGaNiz3%b=~oh4v;81KEH_u0bAlxqt;p?{t8?}jw&i@Dou@NnIr>=MjzJihZ1d_x30 z0(DL22QVFSJ=)thwv&+2Es)Nencpp8Lzru?0{=?*)&AsRjB0;)hoj1GtcaE=FB-~Zk^NhoYeYB zJ-V^#=heCF{hb`@>Nk&seSoRu#r*WqmnyFg-x28Aq4A=+l~47h_akc!kLz@AVIgbd zmH5>CzV7kgf@QBV%6=!V%gRF<7ys8YMl>f(gRf+a{0;lpDTDZPxEViIhpK>3G=cT)Lf?F1Gnxeq^IM7h9cAgw6kC*nCcn_8M!_&8OIWDz5nyn@{ZvE0inCI55jw|{#loVz|Bwr{2u!-~5C8}XT%GvP-1@R`qW@BFR64|AY9@)`O#Y{qjx{$=F)X(dV7DXalvo>kr%u&uqv!TK&k z@54_Z?trIxPK~|#=iJyo#d=13D7x~wYqVKSx_h3=ZycacLDzVBmU`$zAB)Xt=wjRF zl)cJ$0s1=l({uP%1-^#3D%W&)1Ntn+p!$s1;^wijd1e~?-zPac9sAkvV|>3LdyQp% z_mM}Ri>^AkDe~U)IC~bJk3O6=&mC|ld^&ZtAoBLq)&1~HS66c!tDavxmvt;Q3yEvb z-7?HA4-eygD)b?+p3P}}J`mP=N%y~EmGN)U=0w)LX`b<^XUh7G^l6Mid;dW!`)$$Z zvW}9?4)9{ql|C%8)yaIy|JM`3`}VqzFrN!uT@p;M(N| z*DgDAy)!=}VYC0!kfQ!S*z|k1E|zz{_`ayhew2IGvsGodXP15*d$W3{RD2t3&x0z+ zv+32a>2*#&+UcdtduG22Z1yL)`fPRe`4xRe-}5Tn<6WN5hOLeM9JCqr$mZ3$V9!OE+xm z7TH{TXs}VbHgD9TZ@e&k^R91=txm*tPKfw+>X2yZ_sb90hyC^m`So>sI2EmTdkE9~AYIJHnhG{VZ6zz85&DAD#UKtsnN~ zTB-BFWTQ<**@$-~|Hj|rJw4-(_%3@iHmZmBs0W=xCHwc7$J9^6v-jay5;lumy)A)N zc3n@U4`BUyMog>p5YBasT=zn#H~Ak=x--zHxO&!mv-U2BbgM(Luftu4J1hG9pgQz7 zEzDkj#;3-e_#S*3 zuiLjIc?kQZvAi@-YV$ezucB^!TWxpHYTnI2U+(Hhacxbdet0x(r#2E#*fX%&@d3v5 zM&hn?aaY0CSJyawt>g91W-j@+J}I{PTtVKnhAGE(ql>!6wjrft51rx z2eRN))__Bb?OyI!`Lw+w*-yZa?4@fw>UnV`_BI|z(7x90;$2vKW18C7z3MRMzsB(p z>g}Y5OVa0}ifiQ+TX{8CyvKF$bMheF#@aOE-hX6x)-3&2)>=we{CD=5H7>+gF;^Jd zSd+d_oLAMK|IQxrSJD4t@Rp~AxHjG!E5dW_K~cA{FbY3oZVqEyKF@%amh?r;W3O|a zmA)r=P~N2971xB)4fZ^{}q*(hq$wyniVD3|RW> z^bPGF&g9-`E`II&O!ZHl&#(6YWq;yRVcxL&l#!Hc6nV9F6f6JQtGBY(VKauf)<$A$ zqbc->pOdcUI_XPb)r0gec<(6v<{G{9&msTPt=?pB^`>#B^SF*DEw#&^nM=pRBV(W8 zpVKjG*DsB6J5xe)yXkeVkJUR?e_Q@A_1O@vn>TUqe+&NQ=OofnKX1m~t~+C4-_LD5 zKZ3L@-SN@C@+P*k(8YGfzSzdT%3|}(MA+uu@mx=B+)YNeXGYR(&Y9}$buBjg=}w;k z_qDNyb2|0m^f`{@)9#zpH?rKr&cGRck;!h4brxAU#NnEGnqxx+z@^;?13LaK4B7>H*A+GqG8TPg~0= z4?oy9%q^?Xt*+LT#|f-|Mkv(BW%|Z*=)u2ddQjK zSxg5T1G*pFgpKl}{Z-jmeJWk)+IuNu&a}R*@nY$Uf6g2`5uf5N)=oM%#^xx!N2=?f z^^IZdqk zx3b8;-W}RN{wrM>hdEZAe9C;A`oUiBlDr@{uJ;*!cscX`(9k!u$9VTyVXo7C zaVxeXN!R8Ltt*;X+h~2LJk&RYxZz&4|Y^#&L>eBN0OGE z1FZbm`zm#@t~76mZEmTLy2ha94a;XUx{bB5u=NM6$E=@>ce>d6gT~PrHS{;GiF)VF z@~<(d-vK-RmgY+}qHTqq5T|PEmizkz=`oG@&nCf^PdAQQr%$1-SG=4_-&O7;&p)o`om*^{ zVk7_ROKNu;Q#t(ToAJHQC&oSgpYk2WTH?nq&ao=)W^24IOb2noU8>Oppr)NEBd1v#i;k>~0&-08j z@@uTkbgvQ~(^4~twLHpFqHF<8K-%5nyA zmtbS%lFgw%=6gBxrRew5&u2tF^1nRm-Y4jzej3JzY*x)L@`HaY@)yqLy@JTy9lYBgdBq2rbz- zSfAgxfO-CF_GkZ^XB_B?`$N`jnv=!T;HOyYivP?W>F{WyHa!Yng>LKTKI*XQ2aNA% zW8+kDub;#7IoeOP~D} z-^%SrUm`!V7{51Que|-Moo7;!@82bp+yg5=w`21fye5`KV}Et*Cu^h48|2y2I+nWn z2fFG|WtaUr{9nqw&zI;*OYcA?7lw9`jn2eST0f;M^0O8`f^Q8pcgg;^C%F(|zaCwE zKz&vG4D*cUVa2_JYo*#k`g7c0>e-h1zvf%51NDqvakZ9HJ^Xnld)fG0M_F#_;Wss4 zrM1OO?&DzjY^R>BT<4Rw!_haQFL;ePI`ZMaXB`>Y#)51<{4(@yvC`GGUTl3;Y<*RH zM(mSfyVi>z49pBR|q@J{Q~Cqte+7gYDk42DWSNYU+7h?0f2mbv$!aAFC~8O+A!% zET;sv-vr-4T+N@)k~i5%*Y~F*V_M3y*zS+Swm!_T-`F&U*+LooijeqoB=k z#g;eO=o_drE~0$ss^=;Aurkg<|AP8S&jqC|hme-})H#ZJ?_GH=4CGr0?&VdMot#Y_ zdEVz4#t44uVH;}&e9DjNZ86vB&#+mEO*1yOPqiAq_FJwQ{Ob2cKgMP(Hul?{<6&Ee zh~-o7If$*#OoXk!nT^ub+P;>xz3y`-JNv1Qr^B{yBOBxK+Q@ss%7fV} z&&IO%{;iFamaP>P*L2O?kXue9tuYJJZu8@+q8j(%nPkkY@)wLoJ;y8kZNzDbw9`CDM@H-8I^ zzWLi>^v&N6qi_C37~Q@R9>-YIa~8dCCO(M0pmWIoIP(AS{bB5|R83C!W#An8FE8eL ziH+{}FJNy+->^&9yD>jTXIe?irTf7-v3_)Y(LA7Y%b&w$Uer}TBdC+_F`utQuZ2$< z5!PlZqw1#*eH6OY^908HTHe=Phc12%{v_I{p7ovn0@p6xu#Gk8C6mM6h1ljU@jqCr z=zd`!`LwjebJ|#k9}x5#4rGml|5Sg9XNda-{_~chy`;Z?Ly>P;S>(r=57nl!x$3_~ z{f>VG)||6D`&4^h5^U-xh2IL1{V93&s$$%2#uW9XybGc4CS+spqU+s~8(#?RCEd;s z5#Q?k4C21t;@

    Ml86M*ZCwm%;xdu3H?*~z8WaVhMrMcFnn8{pA@TYM< ziiu!+oqphC8f%rmR6n5hkm?8gj7s54)(`B07jrPw;JpqTmpS;_?k@Y8FEgKw_5eWl ze=gguyJJo5O)`a2=yE&LCs}Nh61!sXP^R6B;JRRAlTy>>RJX6B8D*k9WsdBsSezc+ zSGD94^5)g#!JKSFW~!Db9++IWuf%#+gx_NTbSVc2^cr^>Q;9EV!U zhuQaVzNCKyhD%?zjimo?#ZA&@vi)XD?MVB+g|8npCfl#!onX1bt1Ywm%lXzEs-q^M zg2y^{uKC72)>e)t0Co7S7@Rvlo#9Jon)AU?n(F8HR8IQ_d(4O?i>oy7wKLm2mcZpg z!RaS$RBU_p{k!4byjgqyiol)5!S&~q{CQbApcKOS&Sgtth&={~9;AF{Hzx!1q zGw z2uPh-fkBkw15&rCW^T@e) zxWi_78rzZsi0C<>nnh(f!h-r;$HpOx`lg6$2}*=cf2E9(bNH&$2i4HpK=^9%px>8~ zVwqym@2e%S?hqkfjR{OP-~y@>ex;Jp^m4<=e3SfaLNe)`o%tF$bDLrtOj3>MHM5lz zv|%yEG!=9MoD_6gmaj8w7x9;BGh%J3oU@rnneW|e<-7{7Vs2mdTczAqo1+=7Q)Jk8 zgE8mhSs5e4=oJuyCCjBtyioSXVgJfc(6dIXaSl|j6JI<#Vp zkJNqjVvnM@0O9|FXP|ORI(ELy(b-0jfnjf6KKzM=yZ<%A{nWyJzY(t7JIdi_>T&~P z_ymC}Pb-Wc97ugz!d5Q%RfzCs_zh2Yj>`8nh=|14^U1X5wGZMcx;$pF7FXUXlU!5- zRSaAUFdXO8C7JBcvBdWu#CypCBbg)T@s%u){qLc*I~xDxAz7fziJsMoAX@Rj^psHA zjCce9E4cY@V=4dch$gMG|E0 zZsCCtWJKmf&qxz9T7zeVvY^XfZ^u8An>oKkO_e?T6<(1j5%hqVMI)-)lX~+scXT{v zBiwQ8#{UEEBE-&4>f8H#E5>&Kjr$Z*a(xOzZsi4QjjsRL!W&UAH@?_puKaX7nY(#QdX=H} zR=Xc@X0V)=9le{dUM2TO`Y9JrCx63HHs|d?lvjJFkiAIIf-bY=qW9pAr;0PxrPT!B zob$8PlqENkXJnbb#%}Ly1iYnCTym*{J_mHwx0s9$bRpu5lhcS-%5@gv_ErdR{wd1EJ2L z7|!USBNXUy)cj_;7GQ!yR^_~4ZsYHib{a*WllC|++5b+vy|PnuRN2XN^c4kZaIDWM z{TV+%nf~toDlRS?e-A%YG%A1Vk8p-PQ6wcY<0sgi%f|irWuvxio}E8B1O4KeBYjim z$aG|m09rEd>2O3`_=Wa#3fQV8H`RMOG$d!B_LV{fac;-+!0(5@2TpuA1&XLDQtmh)%mpqy)N*IG@by z85Apq!p_t*Cvwvy0S$#@IyFu5hmd$()*24o)J#aL=p{3W3c+xrB2+s^|Zh zPr`<4tDx3@{&hl2t#8RO*0)Q^$X*0W>)S49B3H-a$|o?^w`4dS&mu3FWUJ#@C<%3c zC=mO&e1Rxu3FNq#3hH?^!i{f7;Oq`OH%; zZ#mYtltjD(K@RMjO@nX`khmE~FdeW*m+>1pNwJIW0%iP<$UWj$SNx3M38;Oj)6o4c z*57gjhQ4zpWxx_M2z)Cptay0g9xBa0N?*_qW<`0qWhUIiBxW!+iOQp0t%8q?K>+GX z2Ra&z=gh=Ly$A0`DYv-lL{762Tn4SRqwuDIayXQHb9kD8y#21_9`+p5(X@NwhQ=d$p^kE59Bt8|#;jsTg zM-d9x_9j;7d?_6R!FOtc-b3Z~w| zCui98SWiawT2R{ch^HK-;jR@hwmisix(7yH5C}cLWW~7vOTlmLcwPr{0DxbhhQ7#JvhKE08r~F5>Qz>ZNpGeQc%eEW-_wh1*Lpa1#Ft8v_wxQ;_){Ve>l!0Ty4ei=5J;$wY5h`1ky%spOZEk z!JeJA%Lo(q#t_7F)23qaHnd(IBj%j9jGxx-#>|0D5AM(Lfy01ngr6CyTXLXe+vat>@W#y-Y{{CL_H^VFtpae>B$K z10Df$Ab@?WB|hctK4kNq_+at;dp&r#vgF)vP=$BuH(bQ)IMjsi8Q2Zm1`*oWb{N=e z^+FhR@wXX&)e%0Od$J-doI4kFP}?s(@plI|303XGMBLS)?8BWJ5I9h$Y!qwUqaYcE#DvNajkgGM8;vYvz zQFiNiFx0?7ZAj1OsSR-o(1t!KNCMhWA|;^+CxHaihRAg4Z#WI=YjNE`&NIhJw+Nma zCpCoU#JSjovi;w2s%&N0Fwn;=K*{SknPF|uI-oLms^aNl6(`}TiVx-#{I}xkmZ4}_ z`!NA31ymBc0LYrL8zkm0r4a|?zfwmxs-B%X{FvGcRg1b4xbjh%MD>4efzXYr=M;!L zNBG|b5?SnNHPOia2-U{wiUwl1;-bh7LU~A3PCjh9$(Yenb(8svYLXh6)?j4Pt%sI( z>RBinsW5hM(dK}g;f9cNK1Eoi1MH_kS!2g-98{jHo397!?nMQt2GlT zsMia8UzZUpAf;WZ5h`^!4%!G(!^R2sfQNrI8@l@S9F2WR@x4G5u1h^A5`Yd832=>} zM7v_vHHH!wLNeEk8nDx`%fLvF%p){MeivPPOrEMzRJcm%hKa*Bqk4(0AHA_wm1Hrgl0x*_vfc!IRbhiz0E=Pp|_Q+H#}rS z+Q3sZHbfddn$99Nh0Qu2L?;Ui0ZLZJ=BFmhc;395LH z0&|__63hu8j`MgOIb1i>7c0`nMrqIICYQ6G1X~YH;b3x7xyACuJ3{fME4MXvr$BKw{SU;G{YP2u(IS5*49aD*hF;gL+I;gS65!&G$xISHzn zyF}UOjXP@N(XXJnP;%&uFQ?)u%|?BHdQK|BUo;i7peQ%pXe==kfN=C(HJVX$2;QmD zaH7z7C{a&qG)?(J<8u;4iwxWfg!kvG26qN23Ouof6_3`IaZ>h)&)!PM-@8^1Z2qM(m zBQUV1f#1f!&{YD9swh`iuPdo==4$2Lh-Mh5qRVJd@H)kI3~)TEshhX1*3PIDQN5JO zM>F&-89IL-$a@H`)~;}adgXLWhHfT}y@vNu3tg8v{^F@~~%DuVYwEa3hQZuE5>fy<*nUq|1DPpA|^ZF~vBqhOWrDW(ot z@hjXMf?Gx_gy3q!wFNV}>5UYsTSi?tfy)>e(I<4Mu8#tvoI>Sk%t$@wn@;2YVN3-0 z(}C^|T`b5X!{v-*IGw{rD5Z6NA2t&djX&kuj}4|P&} zjlXhaM}2kX)7jNJ;A8dS-~)2Ips5nA>zvvJsTaQv#!=$T8MeGJi`&EP;uu6|7bjp~ zFC>lkLg>4ot2LGK$a^7t@e>YkU6$!7Q0pWTKe2G8PM8A3;_NgT*~dX?ah62oIv0sD zY$U+qj0~qPn0(oHL=wrJ+7bBzY{!lWU8H#je^}|+=bhcqI_x_lC*c;IG&cct@ zAV#rd(jc~_ksK0GS52nVMhUCXu~EV?7Tzc!R^g2j=GZq%&OuBYC7la4N|YManLyUy zvvy0KtwGvRcmWOC2NOyJ4JKqdHb4jz8cg)aLq$!F$#gg-VBam_WN{@dv|CcZwojDo z?Jx}ro{SWK2h%=JLT$vvM+jVq7t>(c$06d=KB+$}c)rBJ2aDU`G4Sa8fm1uA=HN6w zxd`-|;sCe9^AMpOUW9>m*n;k%A{@hZ0gQr$F>Qo6UHBkRXls|r$o>+P+FAu_M$ZZN$GYMo-w>k~V^6d-hdi;V2AK}qMRH})N052x|=eSvqM9XZ(>I5>S6erc-~$Ds%K_9An}Bj97*HGv?U) zv)d3q*`Ki*Re#1Bd{%$FA;e*d0*uk^?dw4hY!$Fir|r zv_gGY0sF~5EDlPgKI}`F&V86fo1i|-2J^{2>^|J$nOX-Q&bSYwdt;yCci0(5F? zu6XJ|h|jnW`yL{+wVz<<^R?)Uct4r?O~dvh1iVWU6`{KG%!%CBIQRwoMs;r>1=>e# zv_yTKm2Qn#qAF?M?-%$cHyI>!3PKG%9C$5=qdI7BR|>olzu?+$=6y)eEV?(JyXxgDmY}~xP`CQyPPh3&HNQ!bi(j8vkxWgE*ByR=z}Ji zPF*6WOx^yjOKVU)&92PzHP)RUCaipZ(I1w;YD1lqg*hE3t6($0kt}u4;n~T$ijU&| zohDVj`tywb;L2gL?hCD63)qgf==2T=o|q9=3b!FDJ*PJ0CW?FGTL`zI-ylL8`W=R+ zC8YUcl$E7a{U1D0!rA`=Q$6|?c8SJltoYPI5_>LWH*Dl0qaKPg=RRYi^=^@Jl?&@k z$m*TpVqxD@Jx9EXz$3h)LftdkprYzf=xTYC=hz0=!}PlH5z06Dq6O2skdplmIl>R}!ib`K{%{gp;A9aw zd0gNGKT2yO_!Os$$te<#C@HY$Xyr0G!mtrH8uuV6r(DPx9?%ae`z-k3t7y3YMEV?o z+buXR>K@e>Pqmep z)i+crpD}|mQ80{b$_EcEIc~6FiLA~$G)5yTg+@eQl?u7SM=eqnRY_dW_5i9IM{aB+ zupg_ncP6T#lB31k=1_)C4OsE1-OU(iZ(B~SfogxuZB`N~2KCIL^HqWVK9M*C^VGn6 zeHN>tIfg%UU&grBGy^yX?iqIElmAhg&o+txdLf2wgfyM}@%0X>^frqhCfYg{pPg~Z?R z_0Q2YN3|jX&aH~-f`5SF8=xx{9t;Adxb&n}3k2nk<%q5cP(o zi)pY5_6?4q^@fucv{RZ_`UV$FEDakgr(h=Oq#XK^{v73Cv_-=ITRD;Ce1oD&s~nA> z97RMUv6R0t)&LY?Mj%LL%RgxP#GN*-I;k~-%2F04hIn$T7^{q@%U)Nw-*O)HJTU5c z{A<*sZ}Tb#PaXAQI0yfyQLmVq7!*@Of3Y0yvx})wz8H_-SN;8q8@|PJ9#C%{#B&lV zV49n#0*>U~)JF2*A3}vW-cSWJLI$68v<{&1)RWyHD91XG7}jB+QFuz<;c$$r^=0t< zOZj1woxTucM4^RSgW(0=P=c&O!O}Iy;m4`^l<+MPom0#oKhDO|9`LIk{P!;%Rou69 zX37;@Tq~o_f4lpZ;rq@0p}wKfsCR=9bVRgQc^z*h_$3kFd5*R^&5M2Q!M}`B&CqL+NJicSX-o>S53roszV zbRXXmh0DjOLi>mKhGgFS3VY+tp@_oHxbpjk@H*M4cpVj=t5PvF%jH4W-bvB`tcKyj zo#dzYsFS3bQd9|L@)W!>reDMyOOxpuZmJ-zmQ_spQW8ctz*rMJtMCnTdYqwv?dEuc zqG>iXgMQ|JW+CdKF-2qcVc*99TXX{-O+NA=2f@Za1Bds;V8#1lOp7xu0h;01_Vx6W zYHFyC&QlopY4(z2WCw!!Nj&t3ar!DQZ4wv1FF}UWtdP7QkmZ=(Uk&o28o+_DZ#Sna zfCXIpl3Li`=NLE1amJV8bXrHdhBCHNVVPM}k0bO2cSPfelP<|p89JarQ z&c(2W5qk^uYK1;&seDpc*zzq)Ms_Js+VXu#=aaZt#*pEZPx7Mod-Y*v4upL>|E^sD z_lbNK5xFxQ`J_0XkY$$_wM=X@4$pO;UHQ|GgC)<4ubDuLr@9hEajW8ijv`??ug z_z^DeC^&>3s=&~Dk2EKtOF(>739o!Xl2aW7%c2@E>f)R#&3%|n&`u6sj{*yubYwVb zk$hp3j#|YPd^UkQM;dU&;u11#orEC^?|c-uu0Tuo!jh4aG&T~1UnM3zJ+eH4%Jd7~ zBq?~on}09a>9@`}nb?!Z$A5b|u_uog)$DtAB%pmjGI0eIpZEFM9Zo2E3nVm(Ue$gf zz0iu~*?O6PVtN6+;74kUsq(>dV@MQc?PMsRN)Z$GD4a`yJ1SHA{yE3YMNw$~ynt=5 zkk0Q7xT0PK;LoZ5r^0kXVs`lN@~HVhFWw zT>T<0owp#;Wq0E}bLd2=MbL1=qR@ z*mji*ddoxLm!jwVC`zkwxrlh=C5w|CcQ`1Gj{d;xh5n!cIFA0Hm5I}kS@Av^NC_y@ zA;FKt26KPc2=3LxmzA^JDS*b#0aP-Lz~E}o@7KcGufU3|F}K;+l2k?^M2139^bU(M z^{>%B@tkH$ijK$PX9{Q%P~glyHRy4%&IL2+K6WpNfbcTU*S+tYtYMqFr#+*aNaJ5c`m2ZgEn_7Uw!K8i{AGz_W zg?3aHOx&`IwDPSz8n$<#taOz_MNhiK?e1<>8V$$Wkcgs4(UANm(dWf&Mu5 z6lo5^58UvvvGts!;qac(9BOmrn5~#oV*SKid};%C9Hpc*g-u6q2IB94K83Lw$<88gJN$OW#q*bo!i6o)8Ru&ZlWLKkdc=aR4|rh#!E` z2apQbZq~BkR&wt1T0r-7z{IJ~qZF8|<;bPFBe=%QZ!nk1Ldts4wI-r~J5{@p2b zlmaJVSOK`x>5W#s( zkcHzck4XISW1@l8%lNvY=caV|dM7$1iyv%HOr*?WXTJj6bAFL=OXeAzTle!+%kc7i zirv?f)5nL|qeC*U!$BdIJ5F=I2jxWiWeq{|i12mGYD|-(p#c7PpOR1g`};;l`}y*b zetm@AFDe8-|3e>>)LD7zccR>}k1&bCa))C&oE?2spE2}xK9%iiTY^#1-#^g5n6E$f z4x3Ud$C;5_cy(@sD9Bfdg*GsTO*iW(Ha)Ck$qcf-Mut{RDAMAZVI_5BgMHNp*ULP8 zi{X7ue``y`aM{($H&`;ck0NUZbyU#<6+fe(RR{P5s8+2$kg9qekduJwr|WfqVI4;G zx(C9-OK}ijm7PtdQ^V$Z9iYzX)TN`-x=*4Dv(fFHx;6hmzd-H`W6&cC-T!d{pVkSo zYwiUrBCj#4Ibe3})RPhBfHG8fRv=e>8e{I*Dj|@l^k?fpeT{v#4z6~8AqDW^${<=W za!}ko_y#%kZ3S$5-$sKtGFKgcSVs#S=5_2BFdw8Ictc=1pRJq2X{CpAdSI2R+2on*0-ltJdVbAiVM}F7Y{QmDLi+s=!yP zm@Pns58Ww;ec_?73Q=GBQP}K&e>jhS7(-9U;PG$vh_MhBU}k+o61y)))ad%2NHavZ z=ZWmROrm!&QXxF+2;|r>ufM{GGWC~i#d`ZO2WjLim{d)cvwpRQ`u|@s^KB7 z;(478$kF9WyeDG7mEq4%8u1nM7FW0Cdu0i#&au9(YSGK}10yyHV zHVDZZZ+&IKRSqT3aI@V;_v&W-5t+-l4&rXh06!u+xV*djBTFniWZ`3l2VOqNApv?` z?5IU%L?SymXdO7r_Ya31X*FzwGms^WvNW@Kg~UND4f41eZFi~N1;AbOF_k+kYe9##2$S?5Cervabiqgx0l78}J@sYKQ*NbDFp#QUa(XpS&WI&@U} zQ4RcXH|d^Bp@t{62)Ix@BK-ri+9GZb6dkEChY0M$$xa&M((eoxj#_Y1)u^Z-WtOgD z4Mp^LcMh(D606|HYE?}b1*~d9U?rr0Tc~Sn>psbyL)>~#a^ECw z1L9WB8bey03x*?S(4-6HbeCa`#E=>h9Z}w}MzO6VZ1|C6@O)vzPffw*3R@M}RNbk8 zdh9$H+)U zH4V&21FaD}wkCwpo<>G3n7IU)1LxQ)$C#Cd_)a0dtlAKvapcs2X|XZQt_!<$F!Jf? z8r2{x2FT0Jl2Z?++t~V`u5LC0k1P#9vl@bAGy=(K4C404(uBA=asJ2vEd)~=(UbD9&^Ml|Ma_)yl27R+U*1^KJ&?IevZJGQ06YsPm_pXHII6*yU~ zLFh!3MG%ayo)UxN;HXbb|enB@Wb{!BC~* zN@KG+gPTh!$?8Hj3OB1O*+^vtwFLW*&bSqJpMb6LAQ|19CB5-hIWX!dDceSclF{AS z0iJ+iy-*R;m_y~-0p=Ib^(i{H#a|XO>(J)PXsCtyKvFO3DB~A!c*sVdOI+8C9-u*a zsEINn(6Y*kX>w#n0)=gF@@Uqi48ulh$Vennv#xEMN%c8K;B$+3wPxk2m1|V3Q7r~Q zxQHR3ZO%$jZYf@VmJ$(ME9TAwKQ<%Os1q({J=p zix_<9?pTXB5ON9&%?E*G-*Yu$r$sagxjVL#cnjxYE#hUCE@GM!OfGjbJsL{xOTwi^ z>iQhJtXk7QTgDs*p^WQy9_W8$%UvoIw<2i)(1BmncWQsi{ z_3qdr;$Xk7!~MjB{#9%i(RlXF$wkD1{#}P7OxP_V)UW0hB7%p-Lswn$$jt?W87SUn4GbPfoZvX34LGiQJ;}Z$k}1*| zD3T{os(Nq=FTPIpKiGa~2-)MAvz=*GrY(|*f8)f}9e(1AVGmY@iits#>&4Jd5g~(a zjPVn>dmbM06aF1WPeM8;jh<9Q6iMqkyok8a_jY~}aU-1UE4J)LDQ`wPi-@@kiBsn- z;*3M8{KV0(8sz(lO~V@GTf~P!UwmK@?~f$9Xga05BXm+k)UFVPax@2%e##{ie`+tX z_gqYLZ7!8v21{QbOPY-6LvG3sCpvEy`#_&50Aruj#;~Ind+-MwLRy;Vqdk$(;#@(@H#elwKe`^%kv*O5pYA(gN zV;0eRZxB6kg=)p>dFgA)i<4+I<;7{PpPjg*4#rce8lH>T87ltl-F0{;kv;|2CJa@> zBNs*N3>4jhK1ayCVYi6(TpuR)yE`^i{L*XTm!YEVA)QWD!wZw_`6;>}%gR6%i^1rBFCK7Z5$jwCEcPzl8R< z6!w>)QvT&^6tq<5Wh%8JJ1MRo-yr_?eTnlS+J!~zo%Iz;v(-!r`6}mhB-cQ{y~MfS zm)sxbS`o#moyH|H7j>+NC=o=hAnJPj&`M%%ySy2d#D{Z`A^W~QM7PEh?PMc*`TeaZkqzi=Dv2hOiL>fDx&LA*(Vg>% z<}m$kao!AzXg+DfO^evtXA^2~_&TZ&rMW(2qCN+T&(R_*Vi32xH7lq_g`!3UiVY)( zrn23G+f*pGpmE&dK0CrLnSY7hj9^;jF!4RvWi(6c4JFPdZjXnV?10Ls?$i@ovg$^*JthEK=C-9YLS0;syXA}rU-hl+h}Efjivs| zwLkU4-@QrFl^;)`_?HuDV?kCTM zk;}y5M5mV~`YP9u%JbughKdv0C~dynJLSAW(qDpnY@uQ~^A|6^IXP66TtIH#P9yue zvs7=tx>9bhpJ=?6dKKR(M3Ir2stkgvB+%m@`3Z*2qh=(7zaSTvk+ z6dq45r(dI*c?>D^6H{+eTWGX`dYd{^h_0SPbU_;RJcHJg%anPP!f9v8{U19?x)x(i zsOYwq;tJ(lx8}ZOQAO7CPKxVg@XLy?d+eT5RxDpgw8){|b1I8NNq=Ws#1-xzdS_A3 zP?r0LMCb?o16qMa{O<(W_p^TbbH036kv3{AqLBBqmU6fhX2Wk0(J*fX%3{b|a?_Xl zlO)hk(PuD~-Nd(umbpSw+hQuUId4(Q>+~Vc`#Y&$y*Q2ZJoGy0XMYchedcV+`zJ_M zCn3=nSw!>}N?SXOm42e*$tt!=;)ey)j+V1~-tgaKn2Pug8Z} zj>XXP6cN$Aso%IUD-81myp~jsD9xM3W8-Df4k2P4Xz=!~!wGq@tlJKSiZQB<5J?uw z=r8TE45Qbz%W{zWh`2?{WdzIOFyh2w?o^Rw+u9K_iD*Vv4$~DoX_S_0D92bV&6_dW z$T7Hz7K|2X)P~U>%-^)BMe0Xk_L!F-@d0>T)A8^MaUxeO;1y_lV5AjJf$(MrBzx zTfENbyY3`gB$hFX9+AIsiLpey&FD>y)-wuuRmt9CbRV)|a*5c&=sS(JGCHKuHb%8a zDwo?C?HjJp4n}bZlS0|aC{VlngwaVY+r?Okox(+QGo7sVO< z%JF?9!YtGp|J+6{^F=hvDzj{-sL!Y=hxw^!W1*CtT23k3Bf2q?EAls9mV2;1CfOy( z2=!vL2k075GKccjxcrT`fznhAV+idPeHnFOv`@UmNaT`izZk+O1Sz{M@!Tq-nv6aZ z!x=>|Iw(dlYQpG{$Y!*7FvWgYA1!sv&?eUAP$#a*vtkRQ4X8`kQ;c5UOQ^B@ll^VHKqyTCjQ$~%ifb;GAb2Jvd!`$qn_6ZZIzc8bsk3O19_EW2)TZ2 zaxC5s^>!x>exI}}yp-H4ecVZdAq#hf)BRWC5JKEc70cPjOhzGl2Ki(mt(~_IfYSoth8dqc{zfEVZK3H8+1?`;C~l$67K>Z@U07ye*?rlS(Q=KtGn$}L zqDLKKM+L8|K+W>3n|7IxXtaAUND<7;AgGWvi~Q^T9ln}{J_HZzJcQZcl_jav$3 zEB3o%MXcfP6hm7hzzMZCg4yMA)@OI4oRcigsO*IL7}cFnf1@`0+r@bpWYl+(4K^CF zY!Pl{VD)0OVYJ4b&wk?w@{8-1Ky9x?hk z$&MK>aXJI=86j4jF$OX6W^~pV!l)Lmw4h%yGMqv=Z)9>PJE7}*DNV~5?c(zDG_7Ft zD|&}m5olV)2D@+WE4KX#*qgFhWtLjg0&` z@AXZa7)@i;%(R8kT}G`2u%57iMUY0FJ+sv0QnGP~qSB6lA=`f=_*2D<#bd3?Z7|4#9ZZJB@Wpv(ji%|fFdDZkSqjMbJ_omy7`g4wcGyTBmB0@oL zWB!TJUkDUC66Rl=wB&34jb$}CWdY_t7=?3MLd<_M`jKNOXMW)1uafy8%hq$=qs)&P zC9%IcX6aSXqckv^yr?he%`L8x+2SN?Y<6Rr3E#o9TIz3Z;FQh*=0+^r%DEkEZq7*cd_&Ex7~zKnkoT9(Z5XveImC)# z=C)2QN1D4bQn8OQcW0z@W-})+3gI3z+uYMB_8fB(%SLfJCz|^(qT6nm#hUvuYRUb? zB=Z19138q*=7Ee<{-&A-GgA4RW**8&s%p(|` z;`rV)k911sT=QtJi3lZ@$IbcXY<5|WQ@z+ck&&t|Z<$|bw3U0XrRK?u)M&WeJeAQQ zmaQ~T_X-rTo!WM+COlW}ZXm^ys(0|Tt6!~-9i>>@0v3*qSL9l<)k~qs667_6K^j>qKT@|MZ*`qk*znPO>k2qTou?94=I`LnrL-Y)5 zqgnI@@GI0N8r+)bLFPI7gpG zUIOReX&6$IVr*NFXq`qxhsF|hcB$;2)E$Hn%5xgBYfu^#|MP0({&6+p)TvHXrMV1i zPvz9B2DwqWv(>!`H(g`NWeDe5UqKICf6%eEcs$#!Q#G;Yq7UeK(Awh2nt)EeqF;O|(1iGkojT|Gt%&pL zoEruz#phhx%W(>~!rnPIDB+}Q=UgjjHStmFTAj?I;kVjUSa51UlfK*{%p!sLC%boquh9)|qXkh*F^hv&y29lY=*KKpyqy5QAFfRY zXEZb!CVq}QkK0k(;l?bcCXn8yXASBUhBkO7klJY`^0n(L%H2|?>p=rW^?h%3tR^P4 zxD9${J?Zdj%t(Z}y;U~oanLYvyE0MtmgB*>H2HD=)xX;{W7 z>DZS1Cc$r@a9^<$ak;Np#dIyxjZEKXx}E9AO!qMTjOkIPpEEtn^di%%Om8y1&Gcuc zcbVR2`jDxNqj)V$J(>D24TuX9m7A0Rtss6fe~@FMW0UAxX!uZC*!=rpp&WyjWj031%xJr z7q__N+GOv>Euv|ST6mi7@74`LE7pkxjjPigv?KaqxG6UfAuOp)A$*B?8zxe?jJ~e@ z3fv5D`YNbb4RTrZWeT$jyC=V@d?|Laqofc{t0ogTJp~+5WePZfRq_x{RoKzbw5D)M zw4t7GX04Q1YJ-Up=&72|fwXs%w?HQ}Sp)jNrU6LRz~-A^-^_Gc^Zf|zG}@^YpT=AS ze{E%M<8>*_FX~X3vtp<>xWs+_eQ?6WKOL{a<&Gm{FFog5*vEWHIb8xRg^51wcSxIG z!4IteJLnSb$5c91n!j%O0P(7HI=kFa?J?Yc(%#%zii`8zL2tGifVSBlql2&b1L^b? zGwKkHZZ;b9lUhXAG5<^?jeQ?gFVfjpG;KvK{eDZLp=_TNTMI3H6Vn>dn6Frf7VRsx zql_?m*7b+4Nal0_?VejEf@ne-QE`xH?q@`IGi`K@>{(2Y9VdHYFQQ3%YzJ4=ssJ5tb4->1av>*ljT z>o$HH^ou6%f$l?3D+Sd$^w{+&-gYtD5!cM>dq6vK9c#?>XI2bJcho)#etZ|I=RY>N z2s_mWi=}_~N!RYVXBOY=+&%X=(~2W+cCL-~e!DZZ`kxUO)uk}hd1?^_bu3KO`syyE z^{YMvomAD*MT+p2)E>t&RdrI;(mgFaA*DVaZJ{Pnid~ADXlv+oQNuCPaZUa{H6^y1 zxVElXmulj#w~BXB(m>Ia+r|Caq2L!t1I2_}R=C+UkVdq6bK<O_c0^qF+>d*ucIloQc#Y`)-XwZ` zZYsjeYugue`uKsMLvvpSZM87V!BKXDdy2w$-t3!d8)5&v+WTF~i_iCNM_dc`#T?W1DcD)O6 z?!f-7`G0VKs}K22IZdfOQGx80v+m$Ip^BhVEJsg;bA6!b^Go~<_rHYDh;TRbq$`Ef z#5GVHGSy=H1lU`dyw+CoH*Avs z5;D3Wg?!OHP@MJn9Q4g%{vJ4;SfZT=@xO)rR_Sf*=2Opt@F_GEe(enuel<|c`bv_0 z$(+_*aAql&sFH5qYU*kceNx{C=lFHEt`u_7u9TNzpr!mnA$@186|}I+3_N>({5ny} zmqpy27Y#R)7T4-3MX!?eK<5QE2K5MO0sf|?arnIuq7;66gq-8wnd9mS`&5|<8fzK| zdeAis^sGk?=!ar5Xls|*pmp7sg7)!R4;p6v5Fy+3Nj;Uy@53xg$$h5Vx9)|T8C+^p zxzxT7J_yb)A)j-+7Z6TU;|ge|`3iHs({`L#vnb9_;7qdo271?xXp;Zm$jjfa+zF&y zxWosFN?{(LuF{X}ekDLB6%PlkQkM9mN)dls>B^u@jn42pCxL2_O4U}3fCbvC8&4W; z2V+Fqlc6~gwdQyi)KyF?yhtPo1tD_Mp@>lsG#PgOIAm!&jsVftO!jCd;3 zIVh=b&D1)c9sUAG`11lOUmhXNwlho=z3S88%-3B z;ZH5%LGf=v%Xkte$m-jtyk_|Y;{ ztEn`p=2M$eF~$y|wj7j5RQ09*mfBmH1=l#7YuEOznFz-@{VENk`V^!gD3oHaS%y;L zoQCIz^D6f?N*n7-kRJXiMS2)ohT2#EFlrY{C#l>Da?uK&tk0fEt;(a=nus%se{~{X z1wDL0UdZK5%+-~93fbQ&r-h{!(eD$=opMuV<&&CJx_WW`pDQSYZd?lYf`gsnRecv} zcq-N)_PqR%OZA7!9i<#xs+%fPYExyqQJ?=QYGaOn1=w%9okbKmm!Bjt6ee%>FLeAR{Jt4l zdR-b9EW&$L>Jw?+zV!i0;lx)LL6075h?IOhX8_V%SW83TYtC4u2bxPbYZxOYd^Ld7 zJ`#~%d;R<+X~e;KYz}{S32J5Y0;jVt>MLlpqB+C-f2Ew_EswT< z+b;W7K&ten#;@;#H~cFXAHWU8NZ~*HSB;|3reHN!IGh*Hi}I^-nvkFS8pbv5OrF8Xq32K9?k4-E?dqGFb5NBB!^>xe2#1fQZ>y@SuB!{3{&F(O&KQ85nW|yOoH-=KJ z=ptxu$Ib5$@^Y1X@AdD~T!`${8yrUu(9`cU==S25K-ZP}1}>dzpwjk=%h}MRst=dO z(44Js9ag>2FYv3}pFL49yZbMf_uxzEid<5v{z6LXy8mmI^1%e8Vf)sCSX4^B51xQL z{t`mDZcyf)u9?)I4F6X>wATlfev0c6;`-6c)ZHR}8?SWY-91p$_wob%ToOI#LUe{} z2ID&4BQpWu0K0i{@?;rBL1`~uxpM>v?vA?1bJO98)x?sZ$Bg?fZg zoBH|!wa3jL(m3_+GE!}1SZB)P8g^5lRf{;er~zWUiMhQ+1a7_E5jT~v?xVCdMcQJE zwE`XCN%Ykceu!)P)?#S0e!N0dbUUv#27AYKFIb!Ogk7yol=OXevwdrE)Wh$CQxT(D zv#1pT@zqG-Oeqa7A>JGQLqY%X9|_vXb3AAtuQ{NdTvsC;)#s~lRG9G*naG98(ct}* zFJ-5`6gMN*zXxACGd}`-mK(*dxOFew*tKy4F}8O3sJpN5DKFYo6KfBh2HkzA1onB_ zb?t}iw6g~8ZG<(&%6hQ(!&)A932o~@?*;b+ReZ7XIP<$<)C(Jx5*vpv*#bX~^V-pq z(AY?gS`56}-6Upd^!LqsNXH6|mJNH*-Bmo)sMoBbJ>12tFoA#b#h1459-iWqMx(4v zdUy+5Qe)Zntb`suqN+wefBjMqKQUdSx`VQN;LfH-S1!-!5h#ArsL7EvJ%U97zT#61 z<;s81qlCDu(dV|$dXyADIMC@HrNo~ObhSrm;T^90eQx`?2X?O==lZL>!|@ zZr}9CGqn&28r?ySXd%)yIxy;ZLQ64Fqtm0#0cC1*d&}1et;85c6WxB>@)OWRE&Khe z;|Zycib3k(y5^uMCkkCf7sYoe1C`-PaXKE`hDE{Sc$5(g@g*j`w1o`K5!b6btXj$$~Y*`n9E7Dk+ypwYUB7Di_=OS_yE z(I~NtxaB|{65~aD6vxi-brVU9<_rIIsfpdhAO{+f*h9Rg(X`$p6BF^{1}gSxy(cC1 z65b9pCoxF`Yjk1e;>2W;pi%g(b&09sB?sD;m?nm6z^yuIMA7%E^ve$ai&Vh1! zZ4j?G(9~YA*duJ465@QJAXV{X}>(LSJCDSw9hx z8WpknBz-DsXf$@_Snpk;zD9d52PN$m%^k8*Nqa;)jmpB`UeQ&f;WJAm?GwWts9e&1 zG2Ma2dVePNXw)n#DCwXW(p=?s-mS=_Lt>pqksE3z9Tqzrs8P}palwINla7f$9jJ5C z2@&2xg%Y`;chct~UZdCw!;?;n*Bt2eq%&fhM(g&xnRHJ0v{e4)1AQs#YE*Xf@}!F* zTciGm*Ck!TsUPLC|KW)VSHwMyx*pz|^tGtjO3At&-ko$q4ACfQvh z&_<1x^u7jkR->-Dk3tvB$Iy@O&C!va7(@;{#3|qbxxiM7pK~i%SmpVb9``j z!(F2)qblNVq_0MeM+E?t&}h<_io!*f)oA{h0H8>XrjM>DEV711OGgI)HPGnK-FYTg z*+L`B9v|$rchD%MOP*#^k! z8u_D)0%U!S%o{6;K-pZQz>NVw?KSdST@k;Y6|Yf^)d4`s8d*B#nSy0Mjlw$mh+z4$ zMz43PD2mHhHF~>S0MIy%>h7#4O329?b=esJG)tpJt7DQ&%7q%eySgdRN{xPpEJUu? z$a76opsgBxzCR|pl-#M&jr~o5_G`3cLrik0Jf_im8=3;0)o2%FrR8OfK8LKd{6?c; zTVj&S$e%TuvZX1|9~#A>9Kz%yjryS+!lY|^RYq4kmqCOJyp(8zaZQ=lI;`t$6Z8;v7|x0a`|DgetO>Mzlt#BFk$u9A#8hR@P_& z%BZTWqtSyc(}JtX#u|CNzgkq2Z8WOAcWH8U8K+V6y{mx|HM+icLvjt7uFviE$3>~2K``dxm2Snk@?AW z_U_TAu=rm~Yp zzrR}+C_$s2*2g3_lW7_~Sl<+Aphg=v$0RqGuW0n~=B7Yn7=7!0J3Kn2g`A+#Z{f9p zrYV;qEiup3Qm$5r>tIXyu0p&{Z7Dy{i0WWV`H4nU2V2Pl8c`i=B~NHXb+ENOrxDe` z*7B-C977xVt=-=%d8Rh)rdmrD2Hm~Kfio(Cpki+QuC_-;Smq~o8-2#QhsuroTSl~O8bCj zYLqxIKe@A9pwY_%_W`X?h-2>}*J&BW-bHTFh+^*|^EL8I$}@G9do?PVB<&o%N6|aVmeup|c*c zh(=T=5@eu8R3{Q-X^p-ckY`Gi6*T&7fR9L&RW+jirKhZ`5%n)UWmAnp=Qc^{C1W*; zp4$qji$-^^S|o*F&AvJa?_MpKgWOv!SvM)Q+>M6w*N5%qN`GFv0+>r&+F8c~U* z$~=vz#8TyajWRb+3r>^EG@7(|HE#B<)yQ>x`Q&uDS)<_bRe*MA^v%Wc$-U(sjsCb; z1?Y%I)KB!0r!}H}qL2JaA+7~|ZF~PtazFXEMu*@36Uf|I zmC@}jcar-{FO7cN@+VM$LL9>YS&Gqo5n=6+GC)Q+$zGDtT2?JLA>}36Mxz=_Qd0)X zSsGc=2BZv@UR^jogjqY~6&cRxTY1f&ol$r8X2fCXwTP}2C2-&tK>$F z&J8{4vs$)ISF(nEkNT{UgEcx4chu)?IYFbU;9A z1KCnH$qO3oER!1KUnxoE6MrUkzsz-4 zD0#)1)C2OAMvuB)PW?>Y!!2=kx!`i@LD>T5{0K!J%J4WO*J;%IkWbQKxrLF^;1PL{ z(ImIG67oz($O{^6-`}(J=d!D}a=Cr~PpPNnAdN2c4odn$ zW;;-+q%(4^1N|@cti0$zf2W?8KRJ+*c0s;UM1}cNg`+-~k)BceyHF|J#ecEF=OrwP3@25#)okl*xcBPq& zPc_WrqL^-uB3Sz3pM(!=TB)x zjrTOFd-SI?U*m#CU-bMV&EN1TrowEU>yjQ|L}>KQQJ3@}BTl1Ixkb~98&foTJ2EuA zq_I?^3P(fJOBshXnipwJFKuA^Le<@)b<)F()*3~eXqz5x4ACfZV0?OcV~(Xl&O&NXbzU78jjhaR*qe*TDZoHpf)99jQXRmwJsAV9@_;=9z8|(0(T1GdP9dvJz ziS?h6tWhYVej2@bqoSx~yrj{AGlcA+yt}q8Lb0P+Z#Q>BG@GeqWU;^3(B5~X*D`V( zXm@&TV~q+^ruX>Hzpimuqt!R=_{SJOIb;U|>lsyxQ*IB+)i*8%);ES|^muJ#Py^!) zM%U%&AJP?HOo|Kwl==gh)T1y@ry=Onym}`p%xUNky$4^S{rxSC6(Cj^wx&8q|$s@ ztnp%vG>zge{F5GQ4AZFM1(L1P=(kOqy<+V#xYW0v@sBmGu}qaptl<};%7IEH)@Y#- zl}fBJmys%!cE&D^s8re;|BtKt42$CW8UQ}bmbo)?R~LJYyryy80|chETB@J@q83&=S*ywebvQNAH4lzih?4CFEPp72m{9TVM} zG`5W?105v)l@As7F{PptDs)?Y zv$9RR40^Ks9Z}=DG&5hI$Gc7R0ny{#F75)+<2_is$CM#lSy?M6M0^Q4w!CSOL+nqvu zDDu2dT9<)R$m{G;;zXuGwpF6VED+r)(c&*4x>cgZg-|!vk7_w+hM!r87B_s(By$)g z?qEtoTdr^EG)g?gGszrA1&tE#X-W%<7kiLTAJaR>iL2)ajT0v`r3;k;yZ@XbE^A0* z`EH%>tO!aK^^LgR`)&)GARYo8U$8eQO+3R?DA2tiU3|u4Y)hw$LmIO>fo|!EVkU@g z=?w8Qh@QbFiO-n$ww)xJJ!oC3Fh(EXK1r;@#JAsM(E~)Ux0A)zAi6atiyc2_l9iY& z_5{(bIayrBM7QR#pvmGr9%EZ`ny7C=`{O-K6ET;tt>N!M)5LJ5RC0fPJ7~ICu_?`@ zt&s0Gi8Yyc-7K*_7pt2krZc4q9nQQ7nk!aq{-rKkti#0XvdKdySnsSZTO8|>IZvDj znQB;;Zl0J~DmJ%NY(c5m(o(TCrD9u3#dep99WE6+UMhC3RP0iz*v(S02c=?vm5RM8 z75lGLOyAHHo8=7OsQCUso1nqu{ot;^Gn5+l!~n`728}YwhQ#?54!gpER}hzROXpdnI)w% zub0ZaS1R*KsmvFpGXE`=>DJP9+saIzx2+k($62{lX01}04NGMECF2X*qkTsX5x1Od14XM12^{tI%}R-((23n7K+!I_z}KP zyvM~_StxdI{Uvj;*o%p0E*AT7vCPHdV3*9L;&7MDrJ}h4-7LNX#S?86_3c>iLg0qV*6m_hQ1QXa)}3NC(E0qz*4<(Q(8w*7 zt$W3mpndx)Tlb4yK$k-6SPzO}ps&}ot#?=)2WmgCZM`F6mZqlGqhcQDZi=6!KwJiz z+}O`jC~jiP7XEPdX>&}x0Ge>UPn+Z7Ezpp=ecGH5Q`+-6=)+oDPl{Qfu_+eoX)y;h z{=CI{R$K;3JY=yJiyJ`IgDlqb;to*1yB2GSc=U7Tb&K_qcn%auVpqiLplKv_Rs0h) zWlS-?F1`cZBDx_OzUCtf%P+<^MR(AVS*Gf@#Co82PE+;UVr$TCqC4U@pmz05)$fWw zf)?F1Rlg^CgSzBLyWbZFXtG!zh<+gNe2evw7zFxrhQ<1)7z*ltFWUX7n4rmG{hyct zx<%&qw>TG+@3dH-i@$*ykX3piZUQyCSBzhYZ$UnNit%f)Mh8CI243B)Z^U|Yz-w9q!XaR}+Cx&UVSU-xXph{%!f-Xms#pxx0`$lQ&(hng%_N%tS9DXEinWh{ISP030qx>}(A*Q4FBuAL@})uihMiVKZ) zFRL4-X^_>d3k7-K@VA!JjRS2@_P18l%?2e5_qSHjE!JeSR@XfQ?f7Y=wU+LUra{)) zI;kTc*)QX?dWIeyrWooinf6$!=;Tt2Z zKk4pj8f5LQdjV=iVtsVF&U~D$ZVa;a)s+X`pAqfePuEzJ#oAxj6|{(qbD(a3CX3Za z7xGzw7OSr=0W|xH#X3Yc1>{BKr&|mf6Kb&r=r)6v5e?HF0o5f(aiH!3XbU<1f^?Ta z^GGW;-5(&|D>2q!-5t>PMafo&?y05;)-c^$O;fFrI%5~umkQ=sV|8Yb7paTaRns)V znxt!}X{vRct{rGh;T&t4t{bTPmHE~TU0+R0ty6S?n$}yhbg>{qWHFwt8xNXNRE+27 zrh??CVmw!u3-Zb?#=q!pfZh!%#@V{ZpzOk8oTGaQnx0UMb9J9U31f@#Je|^&&o8f} z7|+)=0X_98#tU@qK|wc*ah}febLO04yinI0RBwMV{#EA-Ivi4r7wJZT@Wx`iSQif3 zL0b7u7Z0jQv_v-n6gO;_b*XL%Xy)8vyj-^plti>bR|s;BFUBi%mq9hJ72{R9KS5oO z730;q51@93it!pCn65Q!bpJqArXpKs0A{SDeTJIAv?_fCuDcplT~JbCZ# zCvrSb=uDuFwj9q>y2>C+QI6+nT^*2>#LnuPG0hRm%{*Z(*6oDY{#nuP7j%0-T@IC4 zOLWDcwA5?Xi@KYd9$7ExaChGOnxI$KE4m7xx_OfAs;(yJ)r@ks>$-NJJMragw{-oO zQiasbHEnlw%OLiNWIodE1^q)ZpXe?_<_wbgm#*2jyuX+WEp0D!-+{~tEp4xLflR5w z^Ua-X?{wkc@yx$xw6uNHrGYNSx3szG7c->_@g!5PAM*px6jHrxvVJ<~M7);`>sK+Q z3ci~M*~;oG{Kzxw&unQculEGGk=`rmqqSHMYgPRuE!M+YUB8SeRmj_Hv(?l;Wy%(U zCf-4H^uv1cHXCL4u-4O$0yz_USR3e5G>x`3(wBf%M2)sJ(cjaQVr#Ddwij>Z_{dCK zYrQvUO35r+8+{z;pR0Mcw)!QY=KU6!+v(SVeC8~(wbx$*z1X+f_O*WKPrS`e{cP1c z=z~DT8#dZ3`cTl$4cl!U^`k(0LiXA^>61WdMYigl^%Fp1)FE3J{Z!EO!U9`Y{cO;) zK__k9^z%XK31@BJ=$C+^$r;R3zXtTc@1m`{ehcV)&~@9l`hA)n*uK{nfx4vpW9zNI z0Q%4Goy|*sQQ-0=|Vb-Pg9DSyyP4;>Edmuwtw0oYu$}pa32(wrh z>brx|PFbvr^u0iPt{k=hrXQlo%eGV>0xF(y%DzHBO49}VN_~o^8}`-u(;)YSNA2tM zw?V&09<^`KzW|-cv)MQ4KWKVv-=eQLoR91=iEY(?rRlMKyS@X+n)legLq9;1&AwCb z1l3&l*uGnzuE}QKqhA2pK-%1=U#97?{eXTiC?d*cKd8^w^w@q_e-o4*_1Jzy{}0G} z;WPVDy)KZCbI8Is_I$lN==T9aaDl!V=y6{mxKKYGv}26TeoUXI$=`ZHziR|<GL)DThHj5S$Qnrp3PpYC;zjsJu={)zxBM{$Hp~^#4hRsHThdF>yO)cY}XYj_^SSv zCUfu&{X5Xw&}zYV^zOktb8Tq7;QRU}pgoyV@MC=sP3GXI`U#qv2S3v<1eKX41;5g7 z*JKWUt3LypKzjI~f1s&e@F)Ez(D}@xcAcS22=D!TrX|>5s0L~}?Wi3YJT!UP6oUm6 zJ@u&FWcX2&m#wV97vw`?E;d!?r7Ko@;f~!xRYTQ zXwX%^;Le8qpai0>h9jVla|Q)}V>k}#N9sHcXFz>PW_QDRP&mA)YMMne%_cZ97e3h>M78u;ipn~G|1qT0QC=W_V2@LLS zs1ABu!#mi^P#+XeGW!~ufp*Rg4E8p(1N|Ho7~Id$MU!`Mf5Z2nPC{VtKtmtU2C|+$ z247HbufSkm1NpcgJF0qn*@FigLO^0_SnyCoBxrJKV6dMd9`uIv=WiGf+Ib-`IKVIo zlt||Avtb74e!!eM5WAET7LlJ0j1MlEbhGNjg zvEIS4hKr!Pm%W4I3|B!BjpKq74EI3J264ejhW~*cjg1Q)V|WdEbvZ70oIwcX>)C(y zgy0lII_Rr{>A@2Ww?H*_jJ|eO*ZSVhUcK9RGWQ?;Xh6O)@24c zg7-&a)|G}%An6aAeXZdKP5##Ph5?#v)=h>qP}YFU!P^WoG~Ei`VaU_;IC!_=8B?lo zI`KvDenW*Q-k;FV-+I(gTa(RNXxJ3ZV}Y{`Atw#HVz|7I`&&;Nmc?<27j5=)h8>#x zt-l-cHQB5shMw^}GxkQskShj1O*KQV8XTG$hTJeb0{xX-GvtoprKW}<_YJWLyp?Ig zTZKF}q-g3E^3;G6c`R{otB_}gDw?{5yfAD6rIFYh!#+*jLjE=QB=I`i)m9-N4S|}v zg}51`K~KY4g&2%uHFXO?#_6DpMy*1yalWQ*A!UtgK^;h&<&8TvbqlFvJPtZR+N@^0 zps8C(P2(e`SwfF_eM0IO6O!r3vW5MLfg$yc<}q9wh&+tSSU&0>u11BlFjmntC8V_x zjpwoGnM*_38_R)i9@`qy!B`EHn|dU~Vyp*RcCu1|v?ej-Mx)|GoS{57$>1OoQ zbScEsm<#HC++yu+T%5xD8+N6i{X64Vsa(g%=Zt$8TZ66?k#9;E`+!y)UTOZ`7zJ8F z-sS$m7!RtpY^C`J<0Md`Klv1maVefw`yg5NOD?+abM-CpA3^`N^nE z;A81PUTyL+T0oNupOK#c4FvfVy$!tCLl`CxGa2mUSvJ2`t!i>W~ z#RY8~;l>G?IyxeZnV`Q$6qqB83qcW~1?DK@T2MCswqjK5=nF$r{>XrXa3$g9r?$0Flwkn=);d5Lj3 zDF3Gd^HSq35FTG(US=!+T|eI4vD|n?lf$vn_!p@4iSCXyMlpkrv-JswW1X=w=v7Ii zW23P)sN_PVW3$l%H1=?rZJ9fM*m5?l}DG-96O8=nz9@_jmaQ$L9S!BF%498 zQ?6r=aT;iD^f!2~aUsaGWwB$w@hm7a@^#2TquXTO!^!QhLk=6;g7!zQavU}G0DWE1 z-BDmn1ie{TU_NG?3A#sg+_)0dZfk-0gz*4KSzlm2X)FPCSyNy>W&8jt6Io&{GB%yU zd%qu1Vm)mf!jviu3Ekj0V?3nkpyPL=*HoT4ct$^aiE*^180$sjub`&nymZ-kOjC^Y zit!n!5s6(js?&HY5wrW*uNm8cDv&m>8$C6}SZ^4kK!a!Wu--BzYZ_(0V_XhudZmZ; zzHyVLQTB(%KR^+)dszQ8-q$qB{?usBsph3q@J6;$apihS` zI9?i~K#@1EI$jwQK-X`iIbIu6Kp7#xYD8LgiV1IX)VTK!#bb9fEWf^v|(pcAfMu=z7UByI!g~ zozJiB#be%18YZj!cv zJji`W8ELzG(EPLm;M25Bma3?H(OmKuPL zjunEdNF70MX9~eprT(D*_50+gCi!V9FxQZ*pX>S+m}^R5pvy#GNim=eM75+bpr;3m zac!xHDO*_JFgWW-$7j;9WDB#Lwv|t^18@*TH`F?$R~T=8{a?w^FmEJoeQgavvfEgQDY0tUaU@O*ZHE z(q_=O0VUQSrM;SL&Ysd!rfjtL@bI9Yq?ZsY9~SNWNjkKQ_fS4;oYPCX2NJGiI=!WT zG})Z}B)8=}^XHUI=K!g!CYy7h^c6@~Khrr#YNpBN^p!e;W`|`uhe*9N*_=bAA)tEY zGM)ZXuqK-`KpG7iUp3P?OiI&aa}JkggQ9C@I!8#0HQAg&(niqwTA5Cpv|p3WX_tyX z_3C6gL!>`6*_;mPF{p9fOlPR{Mw87MCK*@oxqlpMb4ExNHI-N+rM4iszRejWeXFU& zI!X!z9f{9$#z-SI*_^S`SkPV)i<72lvN_|W`5;4VrZZ7mrOD<@l6Hdj`D8lBNClc~ z&au)3(7V~0&hgS6O*UtW^c<8EmFb)yebQuerb%U1^7%Dxoavk>)zD;fW=Ksz9mZ!m zCrceQ*_>0Po}hzCna*jFuO^!_Q?i4GUdnV%mtr*8oHL{epj5KI%#vnmvN>l~#5dQuQ0ljuuf!4GrOw5YWer!EqZ^z{r5>Pc-wn>?QXc5h`3=sM(sR&p^7-r4 zl5Q=p`;mO=c(qg!^e_2D>uRYH=qb5lSuJ%2waojg{936m=zH?X@O9D%(15|aoa?0& z(4VVrjo2uy0%hDei8`Q$ejOi6XRli$wo6SxD(PW|)D09% zK1aP%@&S3-UWe?G4uL-OejTz$YOHqhQ@34aVbX+9-w11%Z( z)LA5@Y^1SlVav6DoM$9q6CdZQfg7CXBvsRG=kHP_(0CFnk?L!@?YtzVf)0?_A5x~K z+sk%~tRX9;I^qJHa^wo)aL|vE)g^0*3-E(OsQ#$!>OOw#&(kY11 zZ@T;=eE`w#RJ@P^w$rf`3U0Q?_7~Dj(7p?;Ltjd-m@?3Zel>~y18qLiiO8^n&4H{- zccL0x>{IHmB_Af<=4%P0a6GTUCK)pfqn>9u>kSPN_46z7Cw(Xv5)7B=!>*8OwB{ zVVbf-RTR#|_d1NK9N@F1<20dk5beQ)?l94DE+KjiF*?pNsQ$q(t5gYVJ<(MKlQ-^0*q z=#xu&5S`yws9yf( z`Ta%oH4~p-Eo1}H{%WISrVJFY{Z(jflm-eTv#pJ$agp9X5dEsj7*-cuVB*I^ebldj z&xnq!J{riBA<%DVH$XN`?qLnlKFFlwY>c`TejaDFu*S&F#K-A@=78upo1o)NAsNdKh!dju3pz{rV!`h_JQaX$Q$K@=oQEt zonzwLp&zP$n)XirH>?rf4~=2s$HPFhor&&)9^pRd8N}#5I0)4~L+c6!y4JoZ1w^-z zFS^f^fhrxVN%TL^sEJTalzmVe@f^1q3 z7ONA*xMYT*WTsTIN^U|JN`p*V7lvkWAv)>^l*`1=$q{IoOI-w7=TaAe_PEqVqQfqA zk?6EbT_h@Tsf$E+UFxFIpDuOL=(S5-H2UaL7maWUTTeF57*w8#k240c*m*E_Gwk6PLQN=mpf#bs3A$ z#V_kQ9+hR{>p31(XX5KQ9@XQSY(2*#i%VT9`o^U$74>$hOGN`qW%_ZE`_E|iR21S; zHvz@C)J;IiE_D;o1g*|uoq(pf)TN^wm%4Pc$fYhFt#GMJM;l%0GSFU^x(syGr7i=V zbg9cg=UwV1qnj>ulhH$$y2OjnSv z%P*)B6JO6?&{s@+J%2$BxY&CBf?BxL<)BV3bvfu;m%1F(ORI}^&q3iXb-5_Pr7jnx zxYXsMNiKD{Xs%1$JhYf810CAZGkhLe1$w=!Q|LUjiHn?*&B8o%Qj>T1eDsouU%B#7 z<`s6Nvj5!j&`S`#jx9u{t29QhPX6HwQ3ob|b@~v| z)_@|CJ%mMQ3l|xggT#(#iVRboArGx0rZJxVX7@LQw@w`?KKJ2QMeng%k@Ii}x$ zmVz1*ZA5!PSwx%Ad5}NRX7mK~WYMhfEvVjY-X`9b8@?5F1}&YlG<-Yq)wCgeC$fVs z{&Y;g8--Dk`%m5Qkwf;NF`#`Hc8Bjp+dy?9^F#NcXLo4k9O3$$UDfuZDtAAtAp8Jo z2>NbL-^vG3cTiqRe&`|87xYi!u4;#oLsLQc5j2^~ZH_QJ@@)7~vHa2tS2t+~-=+P>nc?0zhuIY7xa~ z6=-+L?64BFP1CNhOK9d3S~p9$n%F$z4|L%v)f^%ATE~d1$nrm~F6q0%ZlFznaeY|S zFXA@JeNIKbNj}sXaTnG8=d%(c?xRgibA*)a*3Xaw^HlO?69Zk zIOzP5r4fIje_qiTy}#ZY@f`gNqW?)fN8)Q5<45sxRGW$3Cm$x6J`kh(=L<9jM33p0 z=oAw@9!^EPL@yvl@0wqsI&XNJ^murUe3>%PIr7cf*Jv2%<{xI^H3|W#SF?0)P$a0@ zRkQF0C4lJfj=V)Fprff~;Vqg1+B1y2HiKq?P7X5*@6dcuXUFdm|Dq+J-j1t8Ye6S2 z-j8^Xwt}u+{D){CXzDa!&mzP_C%AF}1QeL)z!mh0vSzh)81#I0&)RT*}xr1oFOI;Ot ziA!A-d5xA?GO~(X0I@p#AB?Ofp9cNV|0z)k=n#ut2c7Nz4~abhZM~SKt1kZqI&je} zRF~g?DqQjqYRI2JbuLvTLLb@O(T609P*XO8jLFTa)|9J)9&IA8dB}A@&o{jr`IX!R zwDEv0vXN)M#N$gGTb7pw0_hx;K(vfOhtsR;9809(1nnQlYV| z|HN0f`OGYxhm1izW|{>Lxgx06bPu74Tocq`dPSm!ppkjIe{L$b08P(3Lev4&ai53K zO#TMsy{{rsPmq(e*<9`iN+xYKmjjsSedN~27V;+^Bl>4#OSzdqzj9B{8havJ$upTA zxRq^Gy<2Pf5mTBFpIE(HTiMf%W~K=~jSfe)msc@m2;S2#Ms}3Ti>wu*>ye%023%<9 z<$IBx<({Cf1%DESf#@%Wbe3mA-Tf2KNbE9Gs!(n7yOEvcUOL)ls!(IV`^YXb`H?ly zp2)89C{QtZg{Yf6iHVG*p+2gcyi8N2sBdMxo{u^(u~O9cvW+Q2=+dx3R8RRZ#J*2# z5Y=10#gr;|kna)omBWp^zs8N)MS06bpz*oiMGcVk5{=CgvbXz24V3#cr3w=-2SxeF zsMf9^=g(*$Qnm;XS zxV(xfLs*)g8)cOnV_KIX+=<%|6)gLJ?h}Q`OF?)2w?{eT9ZYG$!|Vf5PWcGvEm639 z26TidQohENDwuOlMvam$n0ODFDILS(+LGAxFim$Gz8GAhe8?G%-b zOE~0zJ1R-eV|w65e?>G|-T;|>CuHf8&$#)&zHT7N|RO4`(^(Uk>w+Q%#*1TM)fIERcJH=yfGe9tfh>l{`5BM338rvJKR; zU@K7sh+ZFll}Cf<@&2nk7DTthuW|;6ZihwkbP(MRi{u>8S^saM7t4!4SNy*xTE#@~ zL(IZ&az2ldU%&8*ULw0!;M;cb2@heZT$L#mtvgYXs6JDn+x-(yM=q16SEQMRY#&@E z&t%F*#@&OWm&rMxI=hDwEdu#B86LD;UI7}{#6h$Hv^i^d&2I}s2h@o4w_5%a^l$xIUDwFZK~jT%(Hi+3 zsC(dZ^IBP`MCX@{d;&*Duayz#K|!x->*TVa4+U2&>*UIyAQD?Ie+3#tV(aCGpyedC zL2eG(OJW=3_Mlp~VgfhHT|k{~jfvhU_W%tdu}yMsP$Y?Mk_Upe7xk*PS@r`RE4pIY zEC+$U_3u?}i|hmq^1ou)B1eOIg!QVnRZaj63A$l6!$H*NDCHL=Zhv_sLnH!Tmgheey3L zd%ucAi@AhRg=?et%f%2oxpqtR0r?8(^4fhwcR-=bk3}Dp{{)R)UQF}?v?ljj^db2@ zXjkqXB7JqbN*QSVrpM8TWenQC>2IQnAbMAMM6L;<_mM~B2B411Uq>I2n}g{6*%8^o zCD7~N5qSv2x({?4byN-nt+}NTIY1Eus}Mzj&JXk;N&wv(*pVm&w0nPVqRF5^n*xbu zf*S5{66J!>n&rce%8NntuJWk73PkTJkII`thUFeYzPuY$Yk5VYBcC(p$BZhFPl8&^ zA4hZ^v~~E@QHAnV(3#=C5Zwcf*y|x2lb?c8_Esc%1)}$#$L0S(^#1d>Y^=ez!^k`j z@^teupy_!Pi7JC;P55opNx2qi?S#!ljk$zf{f~?~C3{0mK6qkOk(>fbJ#dz2GwA+- z5~4d=-Blt~ll3la@BetzIl0wWd@MfLqAZi2sHOKk z+ag9dF3A?qoQQPuA96TodBivPn!JpQT~lw!PwVo!O9zZGH{=hXysZ^tZpyeGkG0uR zH|CaHg9~}?Xcco?t`8cxqcc%+5WVKyk=rxzYt9|nlgEVnC+j@2~LZK{5B`+(ul-(uT!6kk!UibA^Hlu`!S2`b_-p>9HKZlq&3z z??pbAhl6TXcp3Frb}(fNe%6$j$MQPRxQ5eXp2~lNw$1-7=5P4}sCeZ4fPdr$9;|n^ zN-yN*O#HRx7jk!8B_1}cA}O>A|= z(2{5V=l^|dZKbiM{;~CyWuQvo0kMsgeVT$}J(QQA?fs);n<-JPcq=C_r^dEY+O?&c zB?NDp8QVtL$CQC0d>6#FQ}RJij}#4QrxY=zqW_MR5S2hI;b_s2_R4jLO*vXZ^Z;V? zO7gYx7gIWU-siiKUn_4QM(-m#D4#&|KC**?+R?FOpfX2(i?t|bQ0*gYiK>F=uQzv8 z>VRH1-VxhTX#xt2jjh~CX~UF?;$nBic2YV+j2?}hmG2-%?*Kb1UJz?RUi0Xp_&}^P zdCjAX@-xKfKG;>UgXkS@S0w`U-Cz%)t1<;d@2I;f%ecrsxIeb5(xp9}5xvJe8SAN} zGi3=t zBsRsw#4~NmS4`Q$jQ)*A+mvQJCS+Y}Gup10yVJT^g6*{TXonK;EfvkQjt)~c(;uNG z?}bD}#*7YEj!=>N>kd9iqa&0eF2N^#8jBi};-)FxH5r6V z+!O#Rj@F!7FZ-k`9W#>=QRfY30q=%)6mIE=TbLUEV%2E>{T$ zEs7Z%H(zn|+Zwk_>Cyl5jP}Q^Qv8@6xGf9u5Z1u4 zl5eURbu4a;63b%g!m^OlM9l`!I;tyiYn6LkWR={6b;?sFx=Od=)+ypZn#tSTpwwid zvE_yhN+*}tW@We*t0-(%MnWtq`_H&7$|OxM;4OL+z=Aa%Qyx1h_UZnxs*!&Vn9Aa#2b8MKzv?NQ2s7LmHWN;S|HQny#B2f9k? z_9;z4Pf6WAr5)%KsoSq~0hQmU5`7O!By|UrKA@?j?ttP8>PYGiD#Jj1NPhR(@tm6~2$E6n|KW)>JP(UrE>0BEC?$rm08#Nu{wb-|pk0npG`Q zzR_eco>qPaH7fLuKdX!e1uSedk%2`lb zl6ghB3EDNQS=Fn`Uz#k&Yl?m_AK6bN^M+CZls=qX@DM)?EO@1j9?qdWp-1#Io`R(Sy{N{#ATIKTbZ~;k{x7c~9CC|6U0PjhJ+W z#5OUdqsF<1;y)<6Kpk=mi4HRrqM_vJpZ_UmK#}C>pZ_V>KnJ~Vb@-?}23_!eK=hU= zU)V7Bb%#$%t{o&LLOsHiFXYZMSp@Yg zXj)K35_`o&x5MdpH`N$G+e{_*HmBqDYELE_yBsg63%JmPDZ4C+x|As$Wlt&Wps4GZ z9>_V9@5Za@HpmpoN~r2S$Sg}%LRAYO=1y9{>S?BYwDc%>0ccLQs08!jv$|-Rt-P1l|Y-ksmg)gllO~FYAw(zYdwoeZN`+28ciWjwN=}J zx=$fbwN<paiknbQUCxv* zOqukJrJTAOltT8%^6CW;-45l|ro;HkugrNIUqNlhL|6WKd?nR~sSy1y2Dw#LM}R!e zQ;h^2B+uKeswRI{6ROFeyG>~3FQ60S23e}AOEtBvS54i_CD7ScS4%*L#`{^St9L=i zLxx*wsLw&Y$d9PiR1L%VKDctu0&`uJJU)T#pH26VwA51@fwm7>X>P2x2R-+@SWE2Z_GpElt(opJU|7Db3VyP)b0$rJ0%p`n7PHrMWs8w7ls|OA9p{^n0Bg zOG|Yb$hRt%Td7+>Q)=Z|TC0aZL;Y5o+o)$in-hMsv{kQxmil;D+NqC0l_OW0+o^9r zJ)CXpwO0*+e75&DuCRQql7~gGxhrG*EFIK3Adeys!J@VRebbn#GZWpmALA`*1QS2^ zbW%q%J&?U8p@dHASYC&EC$F<~Qm1kWQ^>nzozxuAPq9?XnDWW9-YOEEW#aGtcUCWP zA$l}+R&O$;B6>7-Rv$s^%B?a9UDRg~dwQz^(L1ILA^Udqgs!SQg3gbQx_ZJlYAvQh z^mw6%&|PiDB|KZW#nN5v2--mQ^6u&YP&7H-yQ^WKHRMdxT}=R8_~ii6M9}nK@`+}H zUd=yAvpS(DrWbKN)Mr{IdD^J@R#RQ! z2UQ57^LxOqjX$c0iC-IkR4Xve5{5=KNa(2!0M#sPp74_zsl|GTUg|Wa2X5n{EXF?S zubP@w^;S25=siO}^(ZJ{p~W~ry{M^KRUh>ch~6^{Qs0BzlPt!;Y8fjVryIS47^>C= z(R&6zwJm7ZEQ>Kf{XtW+s>9SFAbQU*Tnz)I&#)LrsN*y>t7=teg6KViOI$LiQzpKGVQPIFox?1Fu3&`P2{bgShZw2$W8y0q zrCPbzRvD#+G4ZW3N{!Vrn^lcbGeC58W7T;ey1H@dI!(>0Ca4EMbafNeVh~;3Wc8k= zW>v?kuR(Nm$EmWNuRLAd6t#w?W>qJsEkJa2)70)Dy1ElpA5G1wPEvzGbaf}IiA;s; z={8f>~?{9x|+cBz-^arx_O4WP1Ctfv(#6hmn-$1=cqympZheD`HR{`)45JL z>SEA(U-H>d^&aTa%0D~JS3iJ0{X*WSRNFdeD|8NSLZ0fwMV{2sIU!FCVB#y0r`kYt zCGylT5M7Bpbre%RdzMe08p~ts={HM-v zzo}kKse(XaOVj`+zAj7Eb(+p~TCNJAd?o0*tW+_GuFGmQLDRWTYt^?*8A6>l z%P?L?S80RV14LJ8qq+)2S7{UZ${1TEVdHY2gw5(Q(6N<)30u?>rb2-}nQ5zf3u0f9 zUz*&inj?7KGxE%+ZR!Xvvew}VJJduj)Y>Dq@@_R1^u5Q9*xl+>Ch~*=^6K3lbvB4T z)o72p97La=vq#+pb(hJjX?xT|pnK%~={@QR$fU2d?Ny6G^u77L>H{vejrOW&BpoMz zy3IbdEE9i@(LS{bh(6tBzgmZhKDj6`;ecv^7=6~wLDd1VII{AG)M=W|bvmMM0JUFD z-lb6=F%=5**;e^#|47<t8W*DTJE6`5?IX_^JE7)+PLStF zpHP2e;!kxrscr(%xt~;bL8e63`lNaYRD-PbN%h3%I#42 zKbdG5&t&JGGwKcyJ>t%&`$6=GJENZ9b!3(1B%D!SG4Zp_S@jLi6zG%6&Z;cWlW% z@j$HwqOYDmP#bfRm9Hy2RJ&+ek?=@OV45Wi>^pMEpK2Zx-zrbklT3wdt2|M!Fp>9` z25(6CpLz$Bb7w=s-|7?4F5evq&($h%bky0xF5iO*FV&u!PA0rjSAnLH%zxDqO$QVH zQ}yw@Zkq4O1OeMXyL>Ms=x`Bez3dF)8!t#n&mKd};y0zFyYCb2S3V4_F3XJQpRiRpn`5&1v0 zD*gqun~6-E{1qB_?6dxVtaoBn{5h61vUg%N7Y#_P{#hpapKwi01IX(PUqtWjYvLu^ z$ovv(;;me0uvcOG+ITNhDhl!nNvw_YnfSL1>fkpZ`l;%=_!HAn@mB80#Jadb5?_hv zLyL#h!!?-b+(#$Y$BmhID-Cf^5N)Lq?&p%(2nV=idf+iGnN4uIOJ);1(v&q{#5W;UE}*Hg6@Cb@>H&3yR`?myQ5~IM zYpf*G`O#0CXC$`4t(f?X+G0--ol!d+$n?N%(6+3^b~xW9vpv4xlKC~(kD+byyOOVQ zWhVX(>etwlOL#bIZsOP2iz!?1P0dT}fG02&3V)th(77Z2jVWK)c4JxRPWUS5ZQR<# z&iEc^`RHwlUGV=v4-41D~pbF?uKJQ=V$Iu{05H&#hohd?1?vnjy5Pv z?2h+<4xKog_$@vPDo$O{`8!+$Dw%aTu?H>z#r^S5=kIaZalAig#_hx(a23#rq(2jX z#C1STj=xCkiJO2%);D$Og@=Kzo%oRW6Al5z%{C!fQa+PnSvRgSUc? zgjY`Li}!(Mo~WJVjSE2SBRrD&;WMDs;cb%o<4d4B$vwLa!0zMusDrL_P8x`-fxf=h zBgqHX2i=}$?J@{wfyS=vljMuDLD!;ulLq5OpqvrIlZN0`poANaq@j2-XxWYQE`In4 zXx@#iF8;Vd3fn`Fdo*$jz-_pM{Nm`O0NfLF!zUr>XS@m2r>a31hKoRTjy0<~9RH7t z91m_nAUiXBerES)(Pwt&_6mX+efIYFB%7uzpP5Mx?3PN$!uL-nmYK4JqLLB4oY<3z z?@OV08WaC7ISj90qI-F6QW)OJg}fKE{CXrl$drow7c5U2iH|e!qbd@=2hpP{3hO4& z-uc-k3Rhv`=a*<)pNZGS;2t1a7mK~L%ymhz_-8JJ=6cBS*v^!S%Fo@M6py2zj(&qA z0WSs7Rub`ACf<7@KEyPtDHCn;R8j`s z#)Z!HZfcx@_c5iSTfOTFQ}A&n-sV*N9z@%mhIQ#*R(=|;!o=sEi9NX3+-Km{OnmM$ za2F=t=1d$3qHWH?@l1T2vv4NU9O1j@%Sp3wJ`?T1O_+m=n9_tBW!|~X!T&JvJ!>xh z=#n`X8z<6nrU?Ud&8p7D6+rLN^`u{L4JKZfjTAf?PZXVr`2pMClM~zvxL)E%otOnhXy_;02(p;*^T%EkIgv_GCXADfwY=6qa*DNX2a=q1g^&0R9{ za7UNSJlq{J|1z$X^02QKGYG%pC?-DJMR*m6&UO*LHJSFFDo9n`h(0jgmd)oLii@y* z3R?*__eEIclIh$R;R+Dz`|Iqki?H=`CYk#p9LB_Fv&hK@5zYkV zRj8>f#`8dd)dnfQ;T250l_hu!6K`b+-UFF7-QUU*d=+%PW@~jBmZs8CrwRY7b)f5V zTpRSF+zNFC9tC<*b%nYTXE5;|R^i!9yoXhIK4j7!R^h!`%pk16B}{xh*W$|{x}IyX z=QOrv^4YVL5V(PCilGfrypEJn{uEi^v_*mBBjZA4m-7;<@ zwhvUTBGvs;ng4@Wjk2@{b0!@NpWj+sgXwdd^_j?b0Cew3?=3)$%8SYCa7UNS^|%Mb z!rkTM^*9$4TB%&}2K>M!b0hu>Vt<+~!bU7)(cXD~8!=)^6X?h`;u=i1-DX^JBg&o5 z*32!>e*)18CSJD*Z(vFja?4at-h_9%#5Uu@5Yv~9b8N;}nD}hB;QKC_Tk!uNGoyU% z;pp#ONNmA3ufI(ZOWi>{-lgs!o&=d& zNajI21Ju|UpL_`CxYQlSOI_*?dB|@9MFMU^OKA40+3UzoqQTEX5zh{!K)xP!yMk} z4BqP!JByEgt}7ef=`6nJ5<7=)Kx~isx8!s9Ip}T0-;#@QmAQP|(&O)UEM#-h~XNPG@h8v_H}V~6EN!N1ohB5CnYK^3 zEXZLjFbk#{pgpL->}IM3+O8CsMN?f+Y=r`|&eQB1}0$-7aeCq)7$-DVhv5`z?WDflh45~u|_5v zh}JbWH9Pbr*4WeqL}MN%eE3Vu!&HrlkGhGeK2w@-yiBxv6H_24up)Wxs%e2sW;4?= zh;1dA%}lpIy-8+sQ}rXX2i|526M396I|6!>^=x7K7WAZgw0ld_2$#%OCMU!KDn+}u zGR`Uxx(`68ibuiT^`V#A4Y6hY)%m1v`BhMgdw0S%iIhzp1d!c~w66B3umqAV^5>O`U#jSGqk ziaL>qg7ID>K?$1^!&On#i{ka7czw^Q`i;{N@bNCseV_mPfAaav`PMnLS65e6S9hn) z>OV#N`kM!!vEKmmo!t??0p?z4>^IO1)<*mWntzmA871%fqCH15x)z}qtMtd%RK&h#4pRV9Z?$l4K)jnM*N1F%b~H~Fthfn zh~F^tFf{fXZhDVJ{Dzz3p|Rfxv-o(#Z-luP8vBhj`|Ad^S-o8Ok2Hr%O||tX^FpZ= zi4jdsE*fRdfR@($O(o5dAmn{Pv_ zOl(y!);t95`L^u~E;LU{O&z~+X0;J1=Q#5KG_J#VbBitFH{Ps*#(opb4fcrN1oH{0 zsghk}z9=&&PXa3nIoaG-^FHyE8=&t`HIw34msuy zsi_=t%s)!4NPO?^RFGqaEPfNs&*8TuwtK-u^CzjPR3@2@XwE^UGRbTzwIVUxeR9zx zvo*AR+Q~(im>r?j*iSCH)I1m3I!B*^Tr(5e2l0IhCYz(ArqY~ZPJmxL9qB3NY-lmf zFDRI57C~Fx<}TMXbCo6DbaNg2&TTTPV7mE~#m{HH0KXf|Q3XD8r^RoESp&b$v7HKL zm|t4_W}4r@Z#Jbl({#i{>VCP|RBA<{Pu#eI%gxRfzbnih@Eg|R}ZIInNUEDsvG+eoHg+Rc5i&R3DsWrkjx?J!5ZBR+>kpR_|K(enG)X^SILFF2G9jC;0I$z)I8BLLK-04=tsT7enJ+fR*MHsi~u~ z(wr%^BC&@`w$i*GT6y!E7TjfiV+nb;`2+lB#V#+n+qAcgwC*a?lvAniZ7hDP z%@p|Ao2)5VZT6I!I!0^E!IqF~%wY(5G=9#&HRc#-j)c-hYt0GJM#gL?xW~+ec8&Xq zf_u$8Xt|E%1^1bAq^9b3zd0X%{%n2*7)q{+*9 z513mme(TLj_VXAXMQj8EhmtrCChm^tV%b11ak zHJO7pna@JY3}y~`++5XKg?y+kb5OatPHFP(rzgyA`0mXl@J_qsbc49l}yx;(;RzFx(0=4CA1GMA=Oe$Udg zVNQ3e6vC3*N*6cZ%OS_fUKDj8Hr5dH*Rkb+J?wk;o`|J$N4DJ3F=E*?jx86?=J0RJ z@E+L{l$%SXiRg(DdA;nPr^|5fW&3~SzG@nW8G9-B|M&KB%7wBeRox?QL$s|v-Iv4Y z!jwI~u{-lI4&S&xwCl$9h}6X$`#JZyvZiOVzZl?HH>a|^N!D6fRQp(E_B9+vmA_pl znHNbNBg4lf?4J1{xA~9R?E7ZJ@0CAY$swPU#I5(m#@fZGH)CU?gz_@ZGnHi1q$Wa+Ew=XFZ|r+ z7t1l~3qSYvzE5y(UtG$)y?izI_6;PX#DTl`jQE&lmhfC@T~Vmn^UN|lMyYWlB6Trr zI;W<_nd%`-boZjEgZ za%*(m$E^{wkL^ERt5Znv9J@PGyU{H3#_8@ud)YGcBbKSRoLN@OIsKIy_Ej^Kl6~ZS z^r9RImAvf%4s*lXoY!}9Y*)Fn)I}z(Z4BwF2^H5G@*+9&s_+rFA!FH2i4|#Qn(LqB z982Wfq@>DM$=~jQ&NPneq!pbmI$jlV@7T_6C6!&t71Rg9A^XvM9d;`_TMVRAE5~rF z>?qrR!aba_a<6+(x%t>VE!}UGN8Ix-Vc#FdpDsBC3V#FJdu(8L;7xXWiX>F^U!-rR5Kd)ss zOI>{V3A@$NY%EvOIHrq}^Ek{l>LI##>1KAT>yg#e-!!pO_O$2Zv2NVkRW5Dh`l@jX zKh5PdZL%+^+#ASprtVjKLgQZknx7AHKB4* za&ax&mD}0}xD2W!Vflp&Sv8AWzT*t`9VE-l_OrX=WSAYYH=ZrLO1ZB**OYtOK~7Vp zY?am$Hg>BrH_pXsx7Mq1NR`*w?AEyIxPK>CAWACVwz9s~kpCG=iltx!G4o|38~s<)YGQ>@KO{^p*Yg z9oz@hewWpUt!~w} zYze2y7X6eXqK>R8)#+}!H}OK`*s-sH9qdSWWeLwUDg~sS?6?I}gvhPZrNIJI!ge|%Ngq6>B#V$SA>WzU>5 zyLoO^DTLEG-4eD(dQoGGE@%JWla4iv)g9geQ+4G1C2Jl3JAJwR4Y^+zu2;ljv$V4= z!_X`vuR*NGf-R?pjHK{ir5Oon6LV;+v!9Zq@@4y}>9FP09NBVe*&>!xL;hA@qN_7Y zUMhu1Pg5-rE(xb|>M{E5l>hU-*44|u%dO6Wh}6Zz1AKJYVs(etA*b7|VRSJ=?kGl5 zv&IU$Lx(wKwMWr7q`Eh1=7q~ZcYA4m(FMl}r=ZGUY&q3p^*xjO-_>IOx6)B#wVJt< z`@VhL0?O^4#BOyK^JskS%PJ z`v7)%MIVKgd8F>Yua(qMSaw=#8)Af9)kjkMPqzQ>EBQax6aF{N#z!!`ezW!~wYIlf zxSg#%O%uQEtNKjiHD|;U&X-fxaqYmq;c??1bBAN8`ONvw{zd5=XCEOqR(DEHPlKKpn_CF~oqg!f)ly}HP25S62{SodwL7EZy2 zG|z0eV^?RDEICVh?n0JOSr$t>%dlPD&HOE?i=Fab#_3^nQ7Ff7wkx+GmeW-g9d~K5 zx;f-O;;Uu^mCiroHclzq=_#D*tM)y9JFi~UVupBu))lIDjU}ztEOlqMA=<48hySm9 zPcNY+uHD0NS?WUVmRNhp>6UQcc4Tub)i)BP`-59Jh0o<#V|A7Om`o3uZp z&Wls!FLGCbr7l#MrJXq>%dmy*x@aSNT5EYWvBiKz#fsSJ**uxo|744`Z0a~Rw*1ep z#lNeBjq7e*x2RpCS0Cp-@X!r>+^zdazwK`Pw15gfkY)#Z&iPXAY3x=~7wWFP)uQg~ zE2-i}q%I!V&T-jdb)V^J1Qko2Q#=cV&lh%E&o5n^%{NVsX$Mm|uOH--T_4EjC#^dY z)?C%q%<>7jT@8j>6vzwCYY4G#pUb=cF+&aD~w^|9PXGJ(o zO*kfSeLs0KlCsK6J#%FZ&$~nPWKj**`XSo$43DwaFlx1_q)OlFd$uz0Q!$!QvT>{% zHnFdgd;Mq5*LrUy;x@#0qdB~_48#6-<`lLsmbE*;zTeVXf@&(=syu87_bBDIrpeDa z^OLvytlicr9P(eYSW{rPi~gUVE}secJ#Ir36suTVsxRmb-tZNlN{7o94x@HUmab-t zx(DaFnd3I@IgNYQ8IF{E#;;E91*xa_*lmb;-8fAZeyrTN3efpQ&*w~LyRtM+OB?rFMEzRIn3%&czZtDfz&rmT9Yk}8bywc0z%vvPpE zLQ(ce3gPGE*>bv@&zC;c^bDNX_%7G<_k=m~85%yzBBkOx3!HwWv^3Yy9l%IPKGXSp z44>)h-6EB~)g4ZO!*{-ok6rkzXNwx;R4g9b4e|VKoF>l>Vc*7QT;sF;_gL<@h*Rcg zcj@_3TFq)=7qy!%UX`PYvZ!<#hg?mg?wLlLB%0TBIf~L#8IN!nRa$F#R2UvZ3|U_r zjoAFW_b+lb;T8yw;nrCHNw?aUP_e$^VXB_3`+Ueqad89hg-8vh>{3v^` zlASkmJ6Ka=w=S-y8QhSwPdJvctNBQ!|Ib_JdSJ$&x0yo z6^2)vbX_xTzn{+lCh&auLESFO?5a`p2ZM#Zu|QEXiqTFY~GH@E7@kHWd1>8w0^T#ogh z^gUMiTRE!!`Hz-It={+&B3A(&UxVnd}d2=QH|axeiw;e7%oTsHAiZ z@d`|0B{l+R+eD@*vi4qJ@yTdPyq!oJ}r zWOy%KS;D#S?pD~M`nC#hecmHt;eB$Q?pBYQ6DfH(eLhBw?R?JivleHLbv9p4#}Hr9 zXl4^?HKNKEv4`93T1!dTZ3u&oPT03`|553vW7L~kCcKw!ZS&vnR!4dMC4Ah~ETfK# zaw}i981gE{MqzknRJp6UK%ME_V|Ah4D^b1o%6VK1zU~h9>eIuA=OE5Sx#{U^Ic_u# zX-!|Hto8;^Pd}U{mqZr@T{vac8fy23S5Uebl*?x&kCwbTidb%vPoArgDwg$3Q9W6` ziyCqBjLAn?&2bUCCezpD925={q*aq$cYR8+g#|8N$6(t-e$`eC!N4*3r2}A?;X!DBrKB1;Te)RgKh}#Z%;cZS_{KlH0~` z$(4N?t;FaZG_n|E;rZpDJhI%{^zOf06{ytyb-7!nmi-v#$Y+6p-mWZaj#h5tRrY0z z4eM2F80&04bp@A`Q{#0zyZ>+bs`iPz#iolt%08nk*UC2kULN;|+Yq1AT1A7j+Eu+) z(%y(JR?tjJ_qgxpkpJ9KxNrlH-a`cOY z{5@eBr~LaYjmxHdm;u@5HHna(=>--V56< z(~)j9Zs*H4L)8lNY+=;Xp%e(DGVuF%r;bRf%+~km)SH0nJxA37>VAQ8t5&kUnRxn}cc-RrJ-?LuiPyLc zXS>G{X+wVFl4n@;R;Km+M^%!4*RfNjT78g9wc{Y?sNPsq=e4z*swGtmpV@7oM@4+; zJw&-Suv*mrnXy__U96Vhj-}S9XDf;7Cn`17OO-pnoa?CEsy8b4>zlZ5s6OA=!tXw- zH=s39wuIf9oN-oN%WjsscwEjVyJ@aeZ`sp5f^7CxZL98#{8i3|>VN4(LWbY5{YNd< zex*{j?wwlQ>P>A=Dese9PHU$#z3bih?eG6@S>ktdz0`cI-cLWciY?Z+{)f^09&Uk% z`%G{BtCg^7fyi+&#FcVPYkW*2VHzJzx;mEYrQeEm_TCannR4HE<{o7Y^A}pPovGJZ z!+PXo>|Q)s4-2+TRO7k@JyDrL~g_Qw!h_8A+0GWcl}>&WmhF}UCm`s z(rS+z%l3P&kNB!E%C4lU5${s!q60~K$A@-GZDJW+*Vsk=etxIsD5dWZQ>dIyaYqiP zHb=H+)@F7qsnYpvsjdpSF5#!F8(Y+S{Y_?g&MkX!2~zNg>MT7U7CHci~G-6#I6 zm5Jqgnb=Hxfp|hZPWE#8JwfiL==Z#MN8dufSHHiXTK1 z`f1t^BAR%Dem{$!L<{<9+E1bx@dW*T7QcuN^wYFoL_6XM`u!}TwAZv4t(S<=G~zkL z6ZHF8B#=Fkey!=(hJJ17*N%Q3`Xy8AbkGKh6#8`}y%YVq(J!5T-RXA@{d&-^5B>Vm zuOI#T({BL%2GVa3{RY!-2>s5dpO=1_^t*t5S@au9zhU$nPQMZK8$-Wr`i-UEIQosJ z-!%G7r(YiZ=4hkE94h}DZ8-4+{eBiM!CyOzBWV|j(w$5)TJ$6tD+WlJDdi|BCrFtq zWuBC?NH!O9rF)^2g;JJCd4i-SMrkaMknA9iY0K!FW+&*&N?k;PxTvN#x$mcMmz~fq zs_8G1#QhIvQQx|s{+n-{&aqNum~?5+knW+TA@ z8->i!s>BlqdQ)Hg?8@<4HHDc@b}oOd;E)GoI)`PNM@8nW=d@Mywa(YIld|q7=|7+z z(rmH?PSXFMJVti@rktBB@%lnX{R4gIEZ|rP^xvv~6kEgxi>GS~9e>$5RIj2GrfW$u zZj#3KEn?8@<04g-FkR!e>O<|;Te#@UiBIS~wSJSf=ovD67n03IhE|+brw@>M6*~4W z{+N8f*#DVc;`n0!S9+Yb;}OjmDt)uHj}|2ws~p@u>l{PV`Wx#UAIuzLBx?GUp(Ovb zXtWV$`>A0v$+Wj-8uhYOb7V=%9SJYqXyj@gClwoWHU0wjR9UusS++SEx7!?z+i2wsJ?yn>*R&%W{@G#w{6Y zTP54JK(<)9wygGYTe&tbbuP(I*R8S@YYF}e+j8xuc}{J)wsY}owmQd^W8b#bJHDA+ zZHu$9oh&=wrjUKc?X?|oY#V*pcFgh4jA;8>DtR0G23hh-nL?%3CcCGdWq-2saX;p0 zGU0rCoXx*uxP6u2Z!e#4ydS!d;&P8IlXb6_0lnUJkZ^ltBqSbz&SuqdLq+VOtHpC4bX3#HqM#sY(D-{vNs=prE?UubF7%)y#C&6 zoXPq<7pXS9(K$gcsC&t|oO0E4oa%|~w6EN92UI4N7YX6aWSXzME1 z_}jm8b^hw-LcMBCTUUXsZ=pW$*$J)<@+g$aqfjEl6v%d%t4*55$Gz2(yIkdTp5E(P zrEh-oadLN`_Pnb?uZ{i_$z3URB>5|aTVxBDJ8pUVTe7T4h>xz&`Fn-iq1Zh7n5P^N_mYWmnTEO#!I+^2*TqKRqukjP_ear3JlVOoSmop|1x%H>#M$nx=HBApk>-xG z?RjSa$)RJuS?A7{=NFB{&phLgB{Ex`pq|WFy|Y5Mik3f#Ri|JCmdJ!$C;H>wwWXsx4+7)chpb3 z!K`uWcP%#S$X;R|k;kas`S|*k=5nLBcB8pgrm#V!L#5KhRz2^)%VwOm^pRK1t*|Vp z)xV-TB%iBy0oNAOCRa(V|!|OkGMXz)i?Ex%aE1~ zX~}>kzPe5yWi;v5MT{~=@1!pP*_OTAoBGDMsa-^zE#bwfae1!4y`4w0_4?Uyh16nm z<7T;b-+5zPwr%f>)g%|xZXn6&=g9PPD0l8%2k6V|Ig|ps;|_4&dy;0`t&Szxu4aYW zIC7V3%lE}M+iYBu-M$%*9$iSzOFggIEE*4oHOrSRkWXpOBRBW_g|3blFOeaG6ze#R z;d5k|IWo)~8D^((&2=jbjzw2lQqpQk-pC7EF)bcL* zjO4~ozK$=Z*{6+tt&PW9&Bpe%HeMU7bMPE@!Weo3m*=wDmI-mTnt5##Hpn!~q)epV zxWcHQ*8WkrY*TiQNZ2CnE@@}Wl?g0wPN;%?%FYL*<*|h7UoAVNr7q#XuNJL2$7l_9fb$Wqr+Q*UnJlHoJ#eCB4@ zzr1LC)H>Ha<6mkq-^R1*eA^AHRU7VTq1iTmQr99!maWd1O~)?Iw)F7VWZ@FlIMZu? zXi?&F%(b=bNi~XTx!F}cn!^ko+rH%yW8z#ID~t|vR~Vem*YTR|mrdPTYPKgg^(T4v zqggFa813k|Y<1nZX1trvwF_I;(-|F0=faFb7q@gdzu(@4a=9&UK#Qre4CRih+UH#^ zC$Gs}&efggx6GIJIa1C?nAL^bTIR^Bn0jqU`Nu62_2RqwM-|w4#Z|9;`RIw3#nN5w zX!UN>R?B6qweTHMp4*DU+1KS2iOLsEotR)a$QE*?k!)|YJ&`4CS?UlO>B{J zo3vC(SuJI`W9t5%O}5Auu9cPpQdUUIVLPu0d7NySz$Hvi+({#qCXUK5HO|lXj7&T( z-J@)QyYmxI7=KQi-?CPYpT`U?TP?MDon9-)(or`1;<w=nj<%uUL%{LS4$)dHcCrd2JDdXC-u5eAG{3&+o7Ov>=cGE@>~v1tVv=0j;A|6T%NaY_NOrcL-lfepS+8xj;$3u2 zA?us$>^Zedn`CDb@}(Aa|<0=Zg9*ZF#Ls7xnY$~fDP`*V|OoNqlnon-mb`AHLK#JfStg-LM~t0*Zo zimzgFqWD~%8pY>weiR@5)Tm3JIlpbWxb&H?+vG>_48GM-^6{v)1@h{q+%fXw*=>)} zjPN8$o)O|~-^}*5+d^xkFIKWESA3IbTrcwi)EP9DBde5)_Lw&9>ulW>e%q{h3(^PA5&gh^qP5-+iTIipW79? zHj3w}Q|4DPpdWf3jUTqzT!OpY#2`>1_#^rjsw2Os*V{VeAt8xE43 zbq&k9QkHYKv7F~;*^u-J$!nzL`PFR6y6r=|^(X z>VBRId6X-t|4eZtJM*TFb8eBXx<$6?Hr2v%ccqF_pxqVOs@tS*xntHLZ*p~1%&upW zc{F&JrI17Re@gPh zw@1;8x#sO{Eh(MdEYsd1DH2|+aWAy(T--awWwgAGzJ5jLIFF+K9hoVcZEsvVA!ULt z*F_r38t1!tyGZtua+8#Akc_isuIJI)zHWt4<6M8;%oLWhNPhMl%ht6s$v#9%mz3!w zxy7ze;oj22!;;CHh0?YoiQS{hUA50IkECHGuJ+*;|e3!-fTYCv0?mlvTvnT;s!aR zrOPYIbbaUImL2=Zypm}wvJ39FnH`gD*ENhL$!i;K&lN_ZbLYpo9g}t5*{IZ7ObO6R zwZ)Wc$nyAwD~x14bNRfE1#(x7uaxICt8uz$#;h}HAMf9?&bXwUW$a^FB=c`L-(6=+ zshS#>LHW|kP|7-kXUsZ7ko}0!W$y~3j^@+1Vn;=Pn3mA#1eJ}hQlp&*+jh#0e(~DH zX1U<&g5z@hq#X~sCgP*^Lkr#mu~UDTxMe_#dKX{mCpy>P^kC;=&2zYm$ae7hIoqMe z_MaMRJLkyUa~uoi*6CBFd#Z!SkQ@iE4W>Hyte@&={+3-#ctY&#o%K5t&r6orneTOZ-Na+~Q?u)ZOYCp%p^Ywfw zYn+Ey?usptB`Khi(Ef=m^ML42=1u5QPuCr7y4E@OUE8^9nS;luG6#=QWey&rDrBrJ zB;)m=w(@xkx>iVguJh5G9_YGF`fii8+eW(+pXtl#nx$p8I_HilJUF#Z3{xe; z)H|M8)46N4wA4yjE$tlZnr^kyT`kk8mGT7b#c?_t7w|m$&Fl}louKO@t@Qzl8?Wa} zd05IkdlvO5nv3(grXQ8HI4Wy#RF?L*gOAh^$AFY8(@)BjZBA|a~r1xeT-1$+Oj3CtnTm)gSF1ko=Z*uF~F0>aozytM`TW=Rf3~)vZt6+oRCVE5JfK zuiH1sG`BhqJhHV%napc5T|qC4DU9Abqq@fiC->?K=f|yjiwb95(s-@JUO-oQCHCNy z{-VS_amU|!ltg#Gg+@#5>Ze~dx5yM~oStVVx8EjHjGzDzImiYueB~dM)GQr+}!K7Ix4S7@3ld?H%Q;i z=w)SNd%2_7x6*FgQ`W0YrkU)_8uzYo!l;HRH3NxO>+bKat!bbL3fRWMYjoRJbcPSI(Zanq6|Fca?07 zYMDa0Bbu%tj?mdXx)00pM7KP$Zh16$SLAPf5~L+TT288-AV-N>S)N*%*8vyr;~jDQ zyu0W;j)K5uhmho}^_R}${lgvPe*bVa$*V^1JCCmVvk#Me{qQ&ByQtx>3l;YOddEd24&TcjK7H{*8?pKS>>$}z1{!UxhRwH32 zTXKUV`j%@a{PE2W%TncP6Drhx<6KJTI?AP1wkOYMxAbMXr~^y8V0m}n!}91KmPh}n zi_hre)C1p4ERQzd=_2O3E}@bn>Wi;WPvrgo^u&{{X_a&r$+c}vV!xBFDU&+%vqkgW z1a~xFiSQ1OCK71$V98@n60Iuh^i(O+qq*JskT35W-12r&zs<%g>mKTtA?-(Ge>-A- z@uL;S5&MphV#N{r;18YJ5&QTL?c`oD_4$5B><>=eO7iAAc96_@{XLTB-d;yCcOs3q z_Uk4#C;7&>5Ls%+eM<7pwSOhqG{or~UDKa@Yj39OT>Dj*v3z2k*?)61-xFlnTxfFC z-6~6{MIFB=zP}bVp2m4C>hf!2$@fMoj~4Z}JhnVLj^$6(hqb83XQog{`wR{hPmdW%(snVY-}2%M`yZ2aKW6`Go>Mz!??UZ%%>G6d z-RrTx(UoOGSGMe2Jdr~3y78Eub2(-YE}2Z0cdopQk6RzJ-@jl1S@cOuNcyK1lYD5$GLnyWyPM<($@h_*l<0OHvzN5rKx5(WKR@#rS)vO#_b%03!t>L*2$yUqa1%#AwoAoZ@OzdZO{|GBa?=0?ped70dNMCL}--t#)imG@MU{QiMmBzxWV ze*eno^eJ^x9_qg{I=^bNQ6uHfXz|IP`)_rXPNsEobk^RZ{cEEC{`9vb&m;F{%25m` zaV6dD98eS8E5EM)PTV@~CCf zy-d2Fn#8`JZ~9_jnM}Dn>X&=ia(t6*P+2rzO%ISgu!7vZ#TGi_G6!vwb=elpYk(>l zYg_a~*DobIpTE^o*2v>k6ZOT;^o0&1!@%|VZ1Eb0g z6=y8eRr>1=t;oo9@*22SmS>ip^ZJt+2V|LRqdy3|kx?66-Sv--!_j-vM zSL;Wk`3n6w)tC0MWiEBD=Q_6^d{U-!GJ5Zob^6KZ_i60f89k(YY0A#%FCRT`a7}dE zrw36OE*sy)qo*Nbl;pdRZs~T%@IA)_=}sVbz>ySlc;+8TzSo(hBT*AcF&EMuMmObU zCwEkvV_H(oCc5*O8pE@HQp`6=3kRpi@EX7^^KwV?$}lNrdJU}-qxrfZDP|^}HA$2U zr@(hDlVbR;C8hk(>cM?v?tLitI@d|MUeIU{`A7-xA#Z)EZ173_aQiJJziR*b;0y{$ z_e|y5@_?}*t#YxiU&Fm zDU^HQ*|s0Lb|<&1n!bfR}H$Xe$W4~!i$HHLS{r^dLddy8zjf1YjQo%3uPKM|2H z>pMr*^n|hIlP-dG#$>M^-f=*SllF#IuMIhAKbTZW@@TuahD?yTOpxhJpmgX-Zkf(} zS&O621!?`yA8O-#3uL|pGT-7Dwk(&H<Rm@yyQ{qAbZvDX z$>j0*Z7O2suY1(HC1&E5QI0J!$>XPGoQQs5@r&LQ(d!n!?#+z8YV~4sn@qn-re7t~ z=PQosscWOSO^zA*ol!|^qxf#Z+9Y?XJvYHg2V3Hg3IRMp9?@ z1zODB8PiD4$fj8%X4iDuld=D4H$DI03{~fo{gP~&Sz=z9&hkX3ITuvRGStd4)XFkw zG1qhoTyQ|z4@>)DWw&=-ygUB5oY{}Y@LKw4j9g38we~L;tTVpY|BQPA?M}DIIxgq^ zG6&b9%)#X^b8z{~99;ei=^kYazw-}SbM0Tgx+trH!rVski!RjP?EPkxXSrf7r@Xj7 zypwfQrgK!Lb5zDXD$_}q*BbL}e0`cOS9Hha5lNtx#*gB746l1jTunQt4n6AP<9Jfm z<)o}ji7~1hy>lpI+1z}-@Q%Tnp*AA z95Z^*JQWvnpRdpGxR~ea=xK5rpLe`_Ie2)Xe0rqDIg)m;6P^3_zc;+ZRYW8Fak;B` zT<+XXpf%Nz-W4v+tHQ;3Rk%2>3K!>f#6eTSh$D{A_pBoMF|8;0e%aNr2k4smN4jRY z{^q^32fK(;NOJSHoRi%Aedi=Mf4e!!&EIoQa`Ts)Q{8+OS6T^2j9jn2RqbJAc7BTgJ_C%X7y) zV$tIilE2+V^V%E?I)!BXDKxsr)IZ3Pi1h~R*Y>TPTF3e5(@hck~Vt- zNvAz(OcUX@_aqr>&moy$FC^K@UO_U+{x(UE{V>T?yOG^Qq}h9sOt()Xd9M8ql6~y= zknC@Nf@FsM1(IHSHOZm&dXgjUM@eSezb84~Zlf~f*jtjk)ZT&QRC{ldKKnqD`SwvH zud+`jImdoA$?NU@u}*q&Z8gak>;o@sCbrtSC0~=WQp&eTIz>Vh%T`ewGAZglI#QQM zoloIskzE(pL_JKF`=d6DwF{@?VUljg^K^`29i`+>aBQT!E_FOga;jqsNuOgo$$ZBL zB(HLOOme>TT_Al6q_1E47L%_bRyZ!8qrcYi03Gpr$lXM|?>I^&`QAC~LZ`@e4Wp6_ zZqFs(?2+Y{a;KDgq@2}(?bndh#jPFqs6Ca!M}Jx>+jmN7@5t^rDceffMauJ}%#*TI z$`exF+KIzY?9B2hDYr`ba~fL`yGY-zoMUcR?jhHZyP23P>?zQ_U?%K7=y}ln&eCDhE-vKlEhi zUg(+7ebDou`=J*?F9j>Xda!}W^*u~n!}X?rVj=S*vOO7kCYS|#9`r)62zFYA%lM_> zM%aVUE5YrshoIMk^dP&8uYn#g8B8H^xxCObK_8e0&Lna;KlDPd2=-Fw8=+T1uOf0g z)I--CsyxYHCYT2nf~8<3SPyDW#0R}ZE>|XWA920NSeggj5C1~w0qCXBE5Q)#_0Z`t zaha}0Tt?}8peIB3LeGTmgPsRHpUCz0!(Iq`0D39(AoNP;A?Wqc>A`(f4x%gv^knE> z=$X)c(DR`Cp%+3AKre+JgkA|fL|iX!S<2*gt%scyRSu#o2lQm)zLFq6pPebD`2A?&4KC0Gw?%~iZiFb^yQOTq0# zu3rPFwNUX4VwTo77@p2 zgI5Ni2f+|1S|c6M3;IAm7yyG{2&6@KFPI7Xz&y|o7J>n=6byouUBTdZ zKj;CIK`)pI`oNi>A1nlmzyMeZZUlp1CAb|7f%RYmNUsB`@_`2E0h7TL&uoT<~2Ej^jI~W4%!3I!xP)^VQJzz4J0(!wrFbnj7dEiXY4;F$&U;r!yH-bU1 z65I}kzuoMh}mEd+T1lEHMph!WvK?C%FDWDh30)602 z&<_@Y0k9O@2nNAQa61?R>%j(4q@sMF0eZk>&uoT<~2Ej^jI~W4%!3I!tLU}<0^nl4= z3g`th!7R`R=7BRoKUfGBfdQ}-+z1B2N^m<^4>o{WXH{+k^nl4=3g`th!7R`R=7BRo zKUfGBfdQ}-+z1B2N^m>a0E#q}6ZC*7pcl*nec(*c4;Fy|a3dH5w}T4{DXM%pP2n>K5!R=rOYyd?!-OV^n-<95f}hV!Hr-LtOU1%A+R2707Va!A2dJ@ zm<*%j(4oQv{;2Iv7(z)Ua;%mZhF0U}=) zW%g9*<$;A@DOe9`y;Qhl&Z&?~_Z z?Df#Kek#0&$oVHj_d?HvK9nf)gFO#+KlDQA0qCXBgRE-}OC>4&O4#c`t-s1YMCAOv z0~GyWA(87N1}fT!Tn-QPROnvlJ}?jTgN0xq>_14QmzkmHBXa(JFaQR@5GV$#a2_z3 z$mR1w&xG!So(J6zy%2f;ECqw`uY_I?iXq4k^nyMxkI4D^p$EVqSPB0S^m^#xe3h<7 zb~=sxIq(EZR0p$DLsLJvZ(gdTz}GLawX1%03& z41hr}1d0m~AM}DgqHM=7hw?sUry?;N?E`v29~c0GU}%gAFR~SVG2y?u$2f+|1 zCLlZ*0E1u^v9~s2W#D4O&!PHg1x4P8%-4&8l0O%PrYV0ho$VRL{C~z{v_-|i%a|`0 zdwtBm7KdgCapwhee$7<$fL_oC`oRDg1Vf<6M|{u=`anMz0E1u%6qh4D=mmYC9}Iv& zFa(M#5Fhk{KF|*az#td`#g&K;dO;uP2LoUb41wY*#0R~g5A=fpFbIY~F$?iQFX#jP zU;qq)AyCXle9#N}KtC7&gJ1|0S0g^?1%03&41hr}1d2I`4|+lVCOG#mKNtXmU49F*2l~MP7z9Hg{hKFQZV%`MeV`uiW?9g z^nyOn4+g*>7y`vS#0R~g5A=ua3;8@g?^eI$f?ET(sCYpzuoyZqMtk+vAoLI@mazTj zTbX>Ee16u4-{vQ>9sq-&r%>6wpf9X1MSRc?2EZT~0!5Ju?*aW_01SfS4ld8i+dPuB zw~70Z&;5%2^+F8NTHhW3g8^j^fufY-r{3;+6yd=D7z9J0cua-!fL_oC`osR^Dx4Se zg8?uEiYHXK02l;Apm-Ab5qbUzJjdmob$d|q+1o=eurBThzQ`PLhxaAs{df3ZMtCp? zhCs1Z`FlX|3Un~=s?vjC2=u1;G#~ zb|||C^nyOn4+g*>7y`xHD!v!=5#{_12EZT~0>wKjoY;x-f?m+SSJ?w#s1D)xDF(q1 z7&w6Xfgw;FMEyW7=mY&=01Sd5P#i*h&6&ae59kGbpdSo?K`;c; zKfqM+K`-b7{a^qLf+0|RjrgD!^noE_jP_!Q_=b6`#3R|~&XDAdcLx5#_9yNPN`8K4 zNb;Oz-eYXPepyiRsb${dDjy#xzDK^G7xaPRuN?o2Wgf{+%e|6UEcZ!1w%qrFith&l zU=R#};%~?Y^nyOn4+g*>7y{{^d#d&YeZ&~;)8&5X0Z{yiaG)3TfqpOm2EhioYX1=mmYC9}IwH zMBa~}f1RrG1-+mj41hr}1oHo&-zKFX#jPU;qq)A&~wZqlyoDK_BP`17I1E%Nv9q0uRG3 z>_`vvf2EZT~0)-RtK`-bF)200VV1O9IYB_kdo|2l~MP7z9J0XoC2l7xWXkd;u^BhCtC&`FlVw=mY&=01Sd5 zP|#O@IDHT31%03&41hr}1k!6QGQOV}qjg*nkes~28?WrX=Bi$PFbIZ-oUdr9{Jlih zgJ1|0tq_jhs*B-rf?m)E`oRDg1Vc>it`(A;Uu%_4u#HML1d1f3dq6Mf1N~qC41yt0 zv_*W-3;IAm7yyG{2o&uQAEf{0Biq9V`oTcho~-=+pf?TSLD2*0fnLxD26`(0Am}|0 z@xfq*(nFwcu+sgYZ-_?war;(y&W9ZgfWoWn9?%a4z#td`y_qV!4-~@?9}E%s_>1A_ z2cQ@9fqpOm2Eh<0Mj$@u1%03&41hr}1d5R=eqfX;Ul0t8fewa1kq!IBilH#+KfB8Q zKT$CN20`B>W%q-gOO);fL!h`++4G5V9M09merl%>Xq&9;9wOVlpbzwe0kDk7=?tBs z7$S1K!_dW4rTaiXSWM)20q8+66y|glPtcq9vK*if^n(E~2#OiVFJI9QdM-ygpbzwe z0Wg1-Dwmk8!lx3soK>LbYNQY56JizJt2p#J#lv9n z^-52js~DQ6;(6!|c}~~&2gLvw0zEgv9~29e9s)fJ;SUDDDk7IB1l@Bp;(?w;hzAD1 z5a=m@KNtW*pyw9&gQ3Mr_bh=O6n>?9!9cOnLtx-m_?I9a7z9J0xKsIiKri^IaBEj+ zRa&Y(N}sDQ)?d-njU3}LW0moy@u~55!=(Riy59Dk?Na+z`yTsu_UNc7QGbXkiF!Gz zKI%kNQ%9mB&5`e@aU6E^bmln=oOe1mIG=TX?)=5s!*!l(kn0*(Vf3@nFGW{I*F;yu z^l4O1+jO= zR>Xc3J2Gxb+!JwCaes~*(`;R{_nX<{W8;(J)8ePZ-x2?Ae0}`)@$Q6k5~d`qOn4>X zyM$iN=QiKeyt?_J=7*a*TAbg)-(pRRjV)el@j;7YEq-p%tYu=$jxBF)xu@kfEnTfT zv>My$x>mQgicRd0*fVil;>5(O6Bi_|NvuxXpV+PSz}6F6&uM*k>xWyv+4|GgKeqm* zb+a~!Z3efQ-eyUgTiZO+=6IVQ+r%U_OG-{UH)&bY@uZ8}=C{4I?R{+@ZM&syu#KH?)7g{afvSY2U=t-ZR>h=UMEz*Yl32XL5G(l;mrZ zZ%d%9ayw}aiZbZ2_Y^yKt`>6fJ6n7$_c^Yr8CM)zjj zle-V;KDPVR?pJqzu6t$o-Q5p#|GK+zPSrWp=Nvfa^K)W)r1a?3BeTc&9+&mFw#T)EN-z+T>77xkLm>-t_d_FCF&ZLjscp6vD4 zUd?*<=zVGLTY9hW{YdY3d++Q0UGE`%Cil6ek8xi6^Rmv1>${=vbA8|Id!X+ReeL}& z=r_LKHT{D9cK7?L-!J{5`nT?XqJQTB83VEgj2tj-K;D3Y0e260dO+2H_Xji#_+dcQ zK=;5-1HA+14O}|#j)5x&t{wQmz`(%A238Dwec-Nvdk5AJY&EFopxi;14Z3{L)r0OC zbZ^G{86RdG$oM4V^Ng=Ej%WOskuvy#!LtY7G5C*z9YbahSvBOoAs-A0oWJLMm$#?) zGVfd7*vy`plQP$3zL@z*=E=-<7xcT}-3vNpC#fRGa^d9#IVjq1eWxrM{4rzPDC)$VfO^%Pmx7uFugLX*# zq5-Pz&#}9u zOu2OhyZdcq+3`Y7zkDLQC%wY*nT2{WzpJ2IL%H_|pdzMV|uVZE0u^j98 z6URvot6(|wX_g0NI!mwqh1@M%J8%vt?^|yLBh~j3q1=RG32_JUN-<-^;lSZ#={D`_z20G%mx8d7R@nr7RCsuv~SBr8T5-C*R9QVM|xe z{f1dAm3_J_dGl#(*(#+f^ZT;(R83!=#c8VA4PAQ;g)|Ov_y?x3UDaKseCIRVGD(G; z*N=59RgF|$)tkAFKS}vxmwDuFlFKQyx{77DOIhCiVFB6qf3lQhTm#D`UG5DgnfqqnPes#30auzoozy9LI9DWXQpSS$xQdq-IEX(1Qit(cSU3o1^$Y> zE{NiSfQpC+iV7MxL`6hI{t|aZ{=C0)PTi%KiN5dmJ`^W1Y!ol{k}_BwUyRJFx_ zMd>s6e@ValhU+C%Ug5X3Y-{PY-?exwh4wAOlkrc#^-jL>25m*PG2E=Z(){1~_`Ue7 zO>;6f<0j#>9g_0@ui&vijlcf?9JhQ~UM#j`PHXXdzba+heB=GVUwrc+;JgO~dS?mz z(bv8Qv`|kyCY1MmPvCp|1RDJdxgUW)@>TIU_|cyM|N1lGejz9Dnf21%mV8I>XFvBO z@LJ_I-}pQ5C}py0MErkdNJ@Ln>sLX4=NH!lzmOB36Y|16LH%1;tDPm^5$?4=I}4u|-f<2v zNjZ0G50t^PvcLls@7Sa9?2)`If0caeh1++)ec+xl@Txm51^)AnHv?bz(tCiGi>L3t z4!q+Yfd}978Q|JeWTaYt{e$3-ZIJRl?PfBTE0H{F&T#~{kbiY+MnHa z2tF^rwy<{odev{l>`2^Yd7%jyWa{t z_tQ55FSzqo;C>&M`m(w^?iTrC`v>oU{{5bNfN!`Py z0KRz7Q^57winibREVz}kmH7)_lD3qriw)g>#ZO_oe;ESgebP#=QfRrhdOZGXDY!Oz zzp^Ydn#H+X+h?-PtlciDvX)@8EO|{?1HE&+|Ef-_n-c{liuG z{P6kffbZR~8TjJ*Zs0H9d>(Man=b_3_@)8i86Ox1mQ;TGQD+hSgI9{5U%vSg;8NvI zRmw;2llU*wzW+*%e^RgXkj~4PoE-` z-(LC#g;xSCRX4ur?cklSdN0tv`}{9H2>#sl63X&uu-;sMBR*^CX_ZW@PLs2FyGmtN zgVwK&@{@}tFUg*MbRq_mKrXmX{LH!U<9zYjyFXR;yXSoDi*@Oi5-Z#HZjc(WT>pOK z*TKJa{AA3aF{QJK1E9i!w z^BwVN_=De(mT&kWkNno*0jpR3Vcu&62HtGev_6LT4d88F3cMW{ux@Pzp9c(B2TlUt z0Ss8xP6i(V2CNAW051RoR-p%ie+C$^5VD)+&_}75}tJo93zX1$b&7K7Q zO<;g24tMObww($7kasHh!@z(Q?kw={00UOJv%$X$~}+yLe80N)=N zcnA0+;4cFPY`Yb}4+8RE-TuYkQ-Fat)h~e`0u0z%8v~yX47?fsF7QKvfp?g{8~ku! zz^eaM;70-j?8J;Ku?3{zde1@Z*8pMdiO9{6t{jo#bBueljrdX8Lae zKLr?gr}|fdp9ZAA_-_So1=3&qtH9>~=`a2}z}tcJ7yh-9{sIiV`DiM9Z-MA5yhUg$ zd~Y!@z^3qO@Fl>&Tk2l}z6=)_ z(3`;50|V|MxCMM8FhI-kQSeS+;BDc*V!3$|7snE2iWz`*PAKM#H(FhHB~Metr=;Ps(N@zJf^1)fEt z;(G(Yz#H`M1s?(iUe5n2_(j0L+u`2_J`Ch;HUEC_JTUMI{sZ8nz`(m0O^ojqfq_>- z8^b+^z`z?rBjbBJfq}Qne+2vzVBqcczX$$GVBozPEsgKJ1{ipkqN(w{*8&67_;DwW_ke--egARrM}dL&7`hza`vH(1hdzh)89WJP3Xt|0JOw-?cp5k@ zcm_BVj}jljTr zQ!oqs&A`CBGMEi~3;&oJcyA5n0^b(QhkF$;@ZKIQ1im9!1iT?Q1Nfm}De%T%Iq<_l z2k;}oO5iQQYT&KGTHq&wH1N~G2H!{)9`pde5oCbh4EliI3bMe5gF)bTf*kO>!4BZ}gAw3kK>_%~;9}s9f)en@ z!5HwT!7kv>g5AKM2d@G?5xfTY%iy)ZUj>%~e;vFY_*8HO@af=9z~2T}0)H3075Hp$ z74W&>9l-w%-Ua+a@E+iwgZBad7F-SdXK)Sh#o$_?KjC`dxeXrze!bztl;r(D^3re< z_ya(4)Nl*pi z#xDX7Y`hD2P~+XegB$M!&S?B9@R-K?fX6o84?Lss0lu{a$Vk=rAowz1;4N=_2>eW7 z;H_)?HZa}z2ylJl_ki0P9|iU{{s1`8xCeMqbVUq^GA21D^q;r>BkpKMY7uPaOq*1TgT9OdSJ$6fp3P zP8|n+43M%-odA9uka;9^68Ib-^GIqYuswAuaBgZA^m#zWgw$-{f>axDVQMb)(}C1Z zYCiZ9AhnZP2waw01Uxf!2CyTw6u2U_9Jn&o0bG?@30#v}4P2XA3rwfd!1bvOzzwNQ z#I_O0NRsLV-wX`A&eU1pTY!OgR;mkpD=_f7Qrp10fz)_vJNVf^W|P#p;O78o$*Grv zp9f?%NxcI6d?2$)st5c6Amddk1AZZp@ha5^-V0>BN@cX1xO1_y$k$nKxEg{dw^e0y${O$K>B#BwNlrDe;Y_!OOX~s_mk8|!G8*5OiSGg{y31aB6S=1 z6TraxMd}mazXUSAr9K7zB#==qbvyV|z`*-W>JIRyfsA#j&w)P!WSmKT9{gEg;Qc=J zMeyf2|(o1rtg6_0Fg_Z9tEbFegLHj7Elg52A>QJy#1Sg3Vr}E@LtyRIQW4;M#!cofCo4I5;&#lN#N9`r-0L%o(4{DdImV7 z=~>{RP0s-jYx)E5@TR@MBbxpMJhJI8z@wV}20XgyAH;kNka3{t1@Pm5fp>h)cVBobjrNCzc8AFTz7855cg244vbytA980=G9!1D@M71NwPDdTY~R;O7Gw$(xP1^zl< z;JvbR>QwQ+N zO)G(SH?0QV)3la&?gb(nG^K%$Hf;d@ylE5kCxEo}rcUr*0%`3{XMsNnq_sD7fj@ta{>G?AZ@JqV(=q?w6W$A z@Tlf7C`SXC$D4Nnk8R!!oCje<<&94DJ2}m1jel7S+AW~@a<>2#yw4CPG z0~a=50p)ZcQfTv=fQy^21fJ3SR_IHB%s$Om0hcwu1Gv2TUBEM&-vjJuejji}^VRrV z31l{Dz6Q9Z`C8yv&DR6BHh&1%)%;;#ck@laZOyj;FK+%Qu-JSnu+)4T@RH_F5YKKP zl0);Sz+VMq+-|-dcvbTqP~Hw?d~W_6_-#O1Nb~1`ckw?nw2(VnjZxIuK6M0v(4Xz`+Fb~UGpQr|8D*s@P+0_f&Xg$ z0o)gXj8V;dfG;)w80fY96uJ*&jB0rtIHBbU;KY_+LT>;vMzuT%o&qvDwLAqr3CQTw z@-%RA%QL|JTb>0T-trvqgqA-5Pi)x>JgMbRz>{14La3QQ=Jb}o0oS+u1Gu5(1>mNZ z7vXLOGV`{)1bzXKnYYEC$jl2wN^h9}yrHE5%7=h~_tBOV_{V@qRxQoop9G@SX_*B6 zSs?ON%Vh8`0h#Gq4gmiO5Q&t3L8r&H91MK2Wh(HgmTAC$w#)$jtK~4@%t=Q8Pn~oW zaPxl00JrRS+{6Xm`ib+=*DN{cy;J_?-7s|~+KL;eo(lZP)LForr_Kic*VH!P$EMB& zethbDYz4l8&lkL};qwLW8&eknzlqNmyl>(21@GahX8^y0&zHRC@%fVXM|{5I{dwwA z;9v3ilJ|FfzU2LL>T=+}@Y(1edB|$u(TA+{Ci&|QnF(Bf$f>}shophshs*|^eMlSd zoI^GM&pTv3nu{9UV>m>YojMntu-XY5sZO zv;6bHXZaU^xB3@?xB9){v;BVX+5Q0dJpWSgdH!YK3;ef%FYw42YiM974Q}Q*T7f$Uk6|5e*=7#|4r~!{tWoCy93e;xQM{Po}$_#445@Hc~J{ByuF{(0cT{`;q6)8l_&`l-O{rf&n@ zFnu=g#_4Uqk4)bVym|V3?@)A$OR&K?&+9{Hda?If>|5ULebBoVYn^-0S3Znp@o{u| zzJHX@se6B$f0_Sw|2qFx|1SUg{_p&T;EZ4>cxP};@R8tqLBoUtC*&vGJmJ$5?wYW4 z;sq0LnRw^Kmo=Qw@P>wWHC*5DtA=MA4sATH@yy0`jRTGO#>*Q&-S{B?Kl7u;y^YPO zS*f#9uS~r)bw}#%)Jv(RrfE$_H>I2IZo04O{N`-)1I^DgAK$XLWo66xEyFDzYWaA} zPg{Q85==T^(zHpZPr7hYZqoZEeQwe}CLOTfwEd3RZ*0Fe?)S(24xQXF`P#`JpM3k| z$0n!tKXm_-_usnz`}hCq{s$az(gE`h7(C$e1AcwL^p_p=vd_QlcP~5oz>^O=^T2Hf zzV*P*9oTr#&_T}~bo#-)2fzK`>ke+1a>A5(Qf2D~}pE>YYc;IQrb9zk2ks$DDG^$By}*W6nQzK{&BciM%gz3#NPoObSoGONe^~V5 zqJtKnws_6rvls7P{O83p&sccI#b@k3)yET>UCdR_xw69{j&7J^qTZ* z({E3ICH?L6MD`;ZJp1{)o=@NScF&vWDDwJ2dg%%BuB83pjY11U3jXu-KR+VxN`HU6 zw3ha+o{%PAl;6|o>wY2c%J@F8M`)Gt-TUs4HbD@6Pp3b+UEY=cK6896?FIH~ut`Fz z_ZN0u{)!FZ-@N_M#P5$Det)#^`!h@N?;7l$yvVM}|FB!~k~baw`$>!vGts@z^d|63 z^iS~`cpCjyFXhig-_9-#Pm4dFS!e;;_66wL7ourjjGlc7TJ|OA*q5MTU*a9iGsRzq zZhbkL_2uZ*m!nl*&MdW@+38GXrSs9IU%-rX0W(nsJ$f&*P_K6kTK;2sj^jC==LDV; zc~0UvnP(=?DLkk0oW?VYr z&G*ML?$zuICz%$4*#FOK>h-U{H=3$-@p1i*YUG^R{*?Z7q??H>b2OahvG}wF4U++PC zy$9X(9yHf`&|B|8YrV&N70;`AUV~oxQvX+ItS@C=xYWO#=XE@<=aDuv!TZIaAQQY> zekSe)=WcNBX5PYYhA#X`-r>iKdy?0$?Q*i$tM19rky6>mGx`C}-vQ2jpo`}~7tg`Y zeXw&+b?&LoJJn)lI@gg)E(Tjbtnxc5@`-ss+4 z-e0i#$D+fh#eAjzdyi?-8-kXKZfaiS( zx4b{>{NLiWf`e-`e31{V#Bu!o!lb>4%c;-{Mc)zxAyh z{?@nhd)~$KNB90SeDU{Z$N#IN|J}X+>E8eHt(`Rmi#sL$7WZBgSbqK$*!TYx*!Ta( zx&Ozxy$Qxgm89tloI7ytiOxOIxf`9k(Ya?#aOLLS$GLZ#doOkG!4%{FgZKN{`MS+}A-J7qv6q{0KhLAyV?00M`Nf2v zdVlBn3C}MkJi+@3-cNapCO*S+^OWrqu?*+^wuxoJZSZpw{>=MH|K{eW{jWCf_4jMp z>(6R=+Mn05foHFuZD|O0w(Rw;ZVB)^J2-FB{NS~d_IiJqbS&3>l@xS z@k!oKQ@-zn*3fX(kqr&k9rUi7n*LgEfXlVE@&l5bU6YnRVeoD$<`H2k; zn@{|hcmIjE@jU6v(|pp$JbA7@sey9-nD_0IZz7JDr?#9js9_E~?fTSNr!_RZ$g|%p z%5m0xsndC{MeQM&1vo`oI&Uz%3ZQbDKTOXfz zMeCEiX9w@Y{l3;C8sFD?op*O@L&Isa8ye2wS2cnd zANox2;;i)(CbzAha9G>Z{xNNz^}2YM+OBSVan{w1AK`t^fghx<@1FR+)@z&Qwa+H( zGr{xiw>G^v>zUvqZMQakr0w>mnR9P%S~_=wzjE$iDn0k1)a8c~*SxzYo<8r)pKY{nYIve1`Wk_&Z|pUVq`@M^Z;D-qbiW?UB^N#qal?Su{I%X3?YG z*B4*sy}0eji`kGwBO!_j-4xXP~<{ zo)yV!yc504dH5~aUd)xVTQY;$j?(UY-?ILmp0>6*-jcpTzMQ?Jye2nX&KA@8orN9Q z;dE;F2aWmZDYZzp8-67eV4>YbV4u}nGJU06{l3`gDT8>y7B*#eA&ImNypi zgPp}y*@4X1a9KPVXIWoQ&#GK$bU3qn<#47{YHQahtI6$ijZBP&rSrM6O--Azs|#Wr^1QiGyz>pcs8rB& zJEwfn7$p4cT(LZs8Qzj94|Nx|77AJ)#$8#=(iEJBsA#oB?F&_zjKAAHPd${f!(?Sm zE<4*+*X57b%*}m#FBD{O*q8U}(Um5(%L7@NWUk}sDeAn)N}7xIa}F$ zwH~WVBTDA{IqkxyUFWoLom;=I9P*Z<-(~aV?t*?&savz9!tl=QifpO8vXC!ngLX+$ zzJ#COu4q)h<`j-$qF&&QDcp$Dz)RK4n-%lc0rK|58tUYiqWqA%(2^&CFu2 zN=p1qW$S1c)lL|n3^FSV{rdg7u^3TGV$NJC{&HbsuB7Gf2wMKiswsb^lAqQ2v5{;s z6Sf2;ucA$tvyye|nxWrS*}mLJX1JoL+mu<;ZH-FO+S(Nzq}#76j|^Az_{h_I^Ay){ z%$cj`MWvn6YUZ0uvSnEP3W-9uEws>uoQ-Mb)V6cFau|ZktBb`#v8$Zv+tFRj^jT>e zSHB|#J4DJ?jg5?I#}a~MCn_KNTy+hLH~rF_c~&vV`}!>Y?9N`+Rd&f80^!XfZod*qNott|=BqR^|H2xk5fuv>uW0JZGVGmz6`A zqRpsAA>o@c<-Q?A5N)*SJf)&v(g4+IY%{8qYP+IQMVhnPe|_rQD3Z4c`Atx#?Y|e~WeTLL@zFg5oELc^SjN+O<=X5D4q)`!Uw5S|OdzCWz zl*l_#FK<(7b>8Q-8(Fg=aS|*&GLr4j(Ne0~o_S?zisE#EtCAT<**0HeA5=-J7|EAL zwf>+UMr@FtdwSh8Mk$;>XOYYHSz}q1f}K$67@GMu^)o14$0Tr4%ZkAU7h|eF_2vqx zDx>BLo^+M2(M-OgYFr#unV#3K5muM)IMli3nNl|_>^hEK6?fab$a~v-MH3|&i;l*U z%(b7czN!bLSadYLc%{mtRZ(_?#Ys6HHo~za5>Kps$l6T00WK4mHswks>zfp`&Z(PN zPQ<=CMn|)Gk@&-4v6SKB(IG40fwE7yy81Ht?%ktd=uO#-h{P^vb?O~?T_)d;5VI}6 zBVX8+*IB`F3Ih(|Besx}6<@lX9a)jf_lL`zcv^D4yIFANSyqbRI#%psg<2kRtnyGc zzhXCCI9tq{7*Ej@iv8JQ4Ha3JxiTE(@fIatm!x6JiiNS!6}#8uiY0_*zU$~6{rz1e z5E0E*JcJ*~sAwW}Q5YGeh-HXXiF#w9uwyJ_x)Lu8lc?|`BD#8+t21Ut?4jEcK$fL#8my8x^QcN3Rj5-34w6JSS zn79BoWk-6m#g4u{0=W-KHdbGPkQ@@iPQSZ?DlM;29LeZRMx^3)rMdz+kZ_|6ts5KC1_GQ9ro2L=6C1PYn?IU?mP(Egi(;u(9azRw*ODt@{l(J9&tynmOtobe#(z&FW zA>fCs1&&qG3=v1+hx23`QlsuX3AyawPgC7E4$VYqwt*)S?_~v}7KOGEE z_e3L=MO0PPb&03zC#!t6Gv7=6r;~rzSE9KVLUP{2nV9!*jWfZ)u?Y^Oc3u*0?YsoF zb{c|6cB5G!tPHmfF>bvv-8eO4I^@LQRy{sjpzs^IOxWk>Ss7c^P$|qh10v+afEam7 zjDFC_a^)-~BNa6?X0NLHWBGrfaI473=^?qTJ;LS+wnEl1*;40#>b2*G%!MFp#`1l< z(g@h;eh}VhOGl9wcB?y0`Hdje!0OJFc1UR=2rwmfsXPK%nr)_cI4iNZ-tAnSQt8?L zN}@=PW#@kj+*}{RA7P~obpDinGiWrX+cDv7LMb)OEHjWB#HFee-jW_(TeF$|&iwFh z5t(tulQxbHUG#yFjbYK7lJG>33ZnJ_iE~pH{b~P-F_aeBBEDS-(74d7m#hZ}U1i{0 zdAF2FrkE{mFJ=%qg(HQgB*Ck_L6fg^>|)(*zT+`b{P%Aw=Y~t-3*nPYm&%!ZS=^$Y z>&lkJk0>bQ?ULr4VM$PqsO#bPw#fw9<_)qg5m8fG&BC6ZT_lujbseu`0JC6bxYXwD z6z)h5Y9_?V;oZ1Ypb~{()xJnO3MyTXk$#mWn19jfm2_jI-9y4)%AMOTRcgqRjfG6V z?Tolsy9?2TzNp>iR$_H?E0_$q|7LD={$<7l{SW6>d?x2T7l+JypcV6;u&R2PdLmPC zed!!BSHf2NWj=C|FBF7O)k|>4X5DK1@diEf(5t&i-jY#S;K;_3wVd?c2hadj1lufKxCSNg_^MTGeZa&Noz z{Pw8llSGCQhzg@ofK*nD0(j`}mo-njw^Irs9u9Dgm9kMAYnxkLbV4zqRK@Ulp$FH~ zlS25Sxz^+H;(9#Tf6(Kdf9dg{|6z~EXR^oRR9Q0HCmS6!ObCLidcmAw7lR|cCCW4I zUbj{^k2x1!hW&g$`%Fe2(Dh-q-%S{f+FR(~9ez*td1(aBDZ}JA$}dTRZ4s-)idXBf?Ez=9`f*m&Ic}ypdggGhFINs#HPo|sl=|bH zMd__;N#~A7Oktu!aC938p;Zoq5c=G@+TvTsN^^ByQk9rorBmTEH?S((J2sfMM$y$* z%#D_frGgwj!ukN!3OhSfj0&%p@zW(w{A?W$P{e7dA^mpc(hUn`wvPT zU%Q5o0i^`Mt0o`e$_%0t1dfs@89H2x!)*ly5+)8*^HiDo1+j;=1>QE=4=-y-Aju9? zVPr8Eo>SJIoy+c8eMw(-ROCa+u<)`>qTNn8sf93qffa&$&k6zTKPUuzX;a}H&yhk5 zr$6v8hoI%5VqsTQWpmpWqTk3!-8 zSrI~P6{F=2h1#rH^~vZ03pqP%rfrLGFXOQhSQ;G;77t^r_Pr%ridY1cvuRnu$e@yu z+Fq3{XArlSY1MWpT;Z)<>2+*g<*i!1VjCx}yfq!&9UHy%U7ee~?HyY;d+E~V%w{jA zFui$Ar`MG&?#%UNbz#z)#=RR^VMMUiTeo&@B`9|kpKZm~)8py%zA-b>+n@1gyG50Z_4F!tl%huY_V0@{o+5(swSh=s7Q$l ziz%5)&KfJgR%+Mo*6C5RU4 zs@(|1xxTP;;`Lprb!|3}jaHvYL?x=KjKhg*qBl+V(D#t9TUdFspR(6&_FOqGOTOs0Yz05pCQ$cs+`$K<;kAx|z zQI+l^c)||N(sD6-*J5mioS%r=32v0p=Fz} zy+DSAh)8LQ)edawU20fnxY*5sZ7b%1V+y+q#_H_72$cc&%1oY6Algmc$20k@e9!Ad z_ETh#F6B~WU&TTYzV!jt#M%es?fQVA#M)UDgwCL^QYVfK&x$OI>g<-`F~-!AM3n9K zItCaFDoN>8y{rK8rrB^xrPY^|MRnfq$(919g(gc_s-;L75OV`L_|n}g2$BU6G%JYW ztA;2(QJmFytfrB{3O~3RODag%k5#yblSyPU&lW{bPjcm(E7@KG?X#Cq(j}FMR_8^h zWO=G0^^3$5^1HHSYO@a=lSP;w%u~*yYGF8M2U@?f3VAH-Y%19~o)pD+JV^^OgqU+u zTBJG=-&VCmU?sW{saI>U!iz-vZ@gGeS!|E7{tj~)IgPt=xKM)E!)_UE!qi601hO0D z^0k#!PqDw$F)%=bfu=gBZTV7WAlsRju~5vgT)C8DcQH$U$(AsUVStJ~Y-ZHJx1^pK z(Hyk=!mjjy6*1eo%&?M5V@fh5Rz`NILWgW*PF_(M%lDsM$kEm4#Mnm)x;9%5b&Jw< z#jS73QQv7ccTtOrin^Rxwxg%VDQ`ono3m;;$>vtet#0eJKB^jdtp{tRwe-q{S%+WM z7;Alu)B0*X)@h2hp7!17YW=56VUw%JvnEi>39G!8(=~)b1N-0pT9))khE{ee>oBQs zG_*i{mie4)QqMO_?28k-`~~ z%hXmGiH_O1lw-20EmawMYN^s5YN>AYtIrIZYi+QtSuFUG=ZhR<7~dCX8!!W?AGfRC zZkccONWnh6sbS8(yoIL=_8E(tI%~6I%DI|amz>pl-b{0@&qMlGBS=23X-kA+9bJ9>ycIJdk7VFH3hSVEwAj>%r09A z)W+Oh9NQOLZ7KEBnxQAGi9w>*`B==;>T+Gq>M-f4b;5L`s;Tw7GBYZzKe0fL zba@Q^YE@D5^%a?toVu!wtaGf4d}<5ZT5h@|D(+f3%BjLG84%IF)NFidN^*$I!5*2ej zZ88^9Q&%tO(;h=6*A4P){pH_*3v~f7>}3e`mE%3qLnJvMxbUEwPc&=WhG^^ zeXS1~Us4>X^$_Y2YdJEtWmwGCNsbOSs2)N!gVYvFPNtjMXjBfY$B^1{6{F_&vYt*4 zs4!6*ODq+S<3Se^a^k3_;!sA&st8pOr0=vf#jNlgu^x<&ud;SM|0`eydg3ac#^Sv%NxH;xC9H0uzeI2 z+(cWeO^^%f^zPD?#)*Xq1vP+*e&hI{$tSm1#_<(ejMU8}L)AFJ?DHL^eX_@4ax%7F znMNmC>m-G|Xpta#V^7_m{WpG-YsY>kS1@p9H!rc{qE`_iT_u1#~el{_Bb3F39Wrt8l-bY1&$7E5mhs3``w zPf(kX&U|top_Wer72VNrB(>K0bSwkbVXi|=aVKE*=`WPd!X2(UQQ5?ed{>8OHdl2R zPT1wtOk)49HlMa|sT1BNn9v-cjt84#_Tj;fF2tFS1m!xB>6EmOxO7(92j3>9eR!ZD zi&B1HX`sqY5<_r}#nC#6)swuTBwCN}rhKOptK&mNiiBB99Us;#_U*@3Y5VpQb~uZ# z&WFggo40q{nVkYAtTp{eCN9-q)v|OQqQ`dXgiGf!e93X{rzXbLW`0nIBf|Rl+(>q; z6H=2B8cWrFlB^~cTphBvBNh;KB4Wtoe12UP1u08IQEAl)xMDZTs&Tnu+b}*?wt>gz zIzg4}BPP`OGMNkYT(Ye{R>zC%gmSp5rYc<2w0S+C{BOL;HuS&oA~B8YC7}kcO-j1d z(aXGrinx|%8_~7&joE=ZzPIKEhw6~U235{V*A#-Z9STscjj7?8!h@wsEi0@RRO9v7 zVMD47NKKbyPq1F7ZgvW5L%1!(S_aEEStso7M2GLz-cm_OI<|=KjmHUfXVU6xKd3Fe9s`A9t?yX1#62rD^`o=DoK@8EyOu8!5T`5#a&^LXjSbYL zOPKL^(o<`{BDSnGNfV<8QRLKey2dzC!a@9+Ag)R2KqI?7%%Hh__(OrG>hbZsDbo%^ z)PBoOYxIW)aca{NZcNk$rO;`-XkOVx=b%L$5AFm_4JVv$I*YbR&6c(y=ju-OfWn@> zk$!J|X+^HQD~E|tUK|3oiaQ5v^AqzUFE=2tyOLAKwc z9apau?!9`+rIlKYwaRHAF)Y!OKdljlHF`+=w}Iqiv2U>vh+U&*p4J~zY}Y?_S0uor z)CQP)ST1RToQ*)}>T^{2qT4antjfA0bj$aX?s9@BQL_fgQbMDw2rzYu9mqq@l`*1h zD0uxjs*mHzoRsPJB)DNLuyAuI0Jy${46Vtq>N3+h-M02bFYZ<_j!82xgEZ%kOd?`_ zS`9k-vW_xTE{{5twuo9V_DRwh4`Mfw#|{=Z&M{(%8OaT^Xz45D`?qjHY6~I@=^o+P zoGtGv6geO3v{agz#0I;w`-u5lvz+7a%X&rk#wLW5VV%Y8L)b8KI15&~lyFFWMan0Q zEp`dd=?`L}RALQLd`it$daI;}pQ;^t{a!Uq{Hdg*cc>*d>ec%=tW4dleQzz+E1?$8 zlRGhDmwcyUqhF)1q;&M}6f>nQVge@xsMWr12u}Of&SC=tNe7a&tdX6I` z(XxgWD*=RSY79c`;GCEvcVRKq#jZux>vp4u>y%+L#h|UkQ4>74jEJ3FQEq)=HtNeF zGFasFCuV|5+Gb|W8v2rDb9;JBY#^kRpe$7E5TZJ_jrNO5Wou!VBT93rAsQj!NtJH2 z+5R!2U6m6RJN;W<tR&I9`#+kKf&kS+KL@{;IT1t-yHY&i~Yo%rG zt~9ZVlzYQM!oNBFgk8Do=wSdh6y$OgslcrnE_o0u(;k_1vb1G!+f73iq|SWO0~78j zk`F_$3!uR`_(@>Nx{6y~&j6Y{cZCE~w$v|@iwy?m(qc+l?J!t`c9YrYh(<`H-NrPT zY{P|OOr=5B66GsN;~!08xK9_VoGd|W<KvuIzFapN<*Wo164h5*;jVGg@VQP~s zd(YvqW5eB9ETL2730DrOkR^Umy~!p_F+9*JezP%;vxl-Btp56AR7F*_9953aCPTCAu+A@yHIAZ-f&} zAbC^lC+(PP*N7@k__4!iIb5L`P50-=^H~U&RQut zAVnYz9{C2Wght*lDLlhu#1S4f${L-i$PT^OR*@XTC3-#N$YC6N53%^ka=GGecxB`W z!_E=eOUqpmX?_tUVMnJeEa_&--^^J6U7~3K(V--qxdg6jH}%xVo@U;O*-9``ThXH1 z=2M4^_7*}$0L7$a6p_+VM9MW3XElM5gEG}oz)8Ozf_(-VC=+>*pf;CR+WToVbr}Uc z@eoB&4x^T6dr^d1(iCQjgZl0j>-;FC8|5;A$hC$AfI6i5L!3DzqnntRfQNT7s3+~9 z94=AEPWL9H8Am9Um7^L#s6(1OOdHBMU{1rani$ z=Quj()eTd{A^G|}-p=4poo?@Ycbt|`nV=LMA1f#t-sv0E3mGx(gSsde*?+e9^3vGl z!|q}Z8i|TlGU|n>#24Z+%z4u35W!@i6a|7DRB%I)qPF~1R8Qn6Hb{Xu%S`QDu5dz9 zLYxXoqN^~G*3LqBdH1HL_sS>JI-IK1v58J0q%K<=XG1rlL^*Qg1~wP)!_f!ewme2f znNjQMx;v(|X_yI2hKB}&=3*F5m$M_>G$rRxy^=!7oAd*XL6KzlV%*s*b7-#5Sd3zB zMXzoNoGv9Pn&~7#yy&>10oFP_P!yW-kXu*OE#;VWOHf%7M9jz`OV*GfvV9a?xceR+ ztW!qT4%tPX5=O9^>!dpu8_0T{15pqWeh~N6ZQV3Uk%Y238OCbL`RT84k?UJ$vxN?2?K)=C)-dW?P{ZQtLNuS$oSwB|%%DIpF2;bA2~@9m^wwa4 zBkp)3c~v;tvIwv{@Ixh}SzafHKWB`ssc<7=NRpC5oToo$# ztt83Qdx@Bay>P22A&f~E=aLV!z;czkx!i`5^Ck8UREbWY#_z{+mg^!lBnyFZNm0h+ zdcmVIP-b_bJ6C2gCSf@?>oArsC0UoHwQ!ZmSkA6p6;TQTvqd>Bp75$SC6y8cJ=5E@ zE61%g8drA#eHa3UI!0qumS`i~5G9G}lFRF2XJ5n^L$EHY7rp04F>TsTw()EoEIp-H zA{rek%B#SAW<^oNQwwS}?xm5n_4KaRdgPF95ji*)9pQQ|FKp3?MOCYGBFt^Q;#l5{ z8M-lY4T<531)Tuv7H?~oZY+M?o6A_3t2vm=WQgkDA+lMd6w`CLMrz9h5vGT;+NEU$ zAy;h4U}D2|M6s<#mTXLJ`iB<$rG)dmiB`#NT_ue59YvKLD_JAEU6hE?G00u9`i0Pp zH|)b+c4vI80)0d-<%)RB!g?317Ho7v!NW+`&MGKfg#&L(wm2dez;Y3p$OE!Oa5l^4 zCTAU#Tv_(Ajk07}8yZCQ40D{L)vC^yY!GE`U>#ca&{0Y_5WXCF5Pz}0Z6k_WjX`B3 zO)V!O%|RZ#bE5vqTqOtmV|O@a#uTY976C<-8pvXQ%#!1eu}emDS?`J@sA}Sv<<#Xd zLG)3vE5f#kYAAAfs-+y1)qG4NId1tL(?T&;hk_)TzfjRacQRYdLeNqzaD8rPuPpO8 z_a6>p+<7Lp?aBLeW1i-vI2aQ;Mso>=nV0THkKIp67k9+0Zk>#_l*6!8Ks)c!Zh}y zOX1aKWulEDW?7?h=W>TLmnfD98m5+c0*!b%4j3}zHURGR7)r2IwvBxv;c$!$fjkk+%)xaU)Mc*PGqR=;!xKa)ebKS?y-Ms0#zd87 z?`~BYXooaR25ZA|{V~t2?PD($1h?8ZE_WKo;Y^(#2TQu+(ZTrP3Q{llF_J963}aL` zq@NCNm|hH-b>@>s8dNbt?>BJ1?N$vJAZHg(vjX&wAK|-nXM>$^I^hj9JKm;mr6!8#D2Rs-GcRr4JR^^xlrS}iNSr= z$jB*%?3C+h7_ONQb@QUQdmFktwyK0$a<9!YALVx1;t-Krl(E9zQsAyNLBpfX%-doQ zVk==ockmBJ{E?5I;`eYwxUQDvUk04^oVzF3rqXNly0AYar*0Na$dcaB7)v|hBK@WZ zJn9^%HhNfIu&T`K%AKLx?jwTPUjVRS&&hi8$Xg_4UMtydE_e3H`XbAo8h3np(QTg| z)6s}fWT!^ADZpi8AjCy=eF-#f&KU4=IU*g5oatn#;12G27sUuwk2vo3LIkD5t6d9UlcmX3)2&`ZwH1YR#uRxI?<9= zbLiIC)FiJw^M-0kiBHM}q+ztZF8Z$Itwf@jllobiWmMqh=oH+zZ?>um}9 zauHUO&aO(QOuiPIvq$$Zf>Cu)zwO-6$mEuzZ0HmH%p$}qzEb@3!LbP6ok1w%_ot1#3~_DdJ&$YVLg zgpeO&?^5oS60c+})Q`#yK$M)ma@@6JTz#i$x0=TAjch{u&i0F2WQe5Oc5b?fXprHa z?ul)f;KMv}Jw2nl+`!00rEMtQ(=}(mG%P-b5{b#b3tfke!9#M7kA(LI+*?Hgw>+Uo zz{%&lCqq`K-Zfc8YuRD_;Vnhe97d7OS1kiYfGHrBuK{xf!SIio4d`qL0 zm-H}Y4uptEYA73&=x}QxO4*tnC}xS(32sE4-$wTw!HQe&>M)bY=M z!~Nmu7EKd+8)Zp)LY$98SB}!TLNdK8MCF?yj_(jv`9>_2LPEcb-PG&4p^Y`De$aWd zZ3?A~N>a<*G{=^HzpM0(+58|V{nlZ_MsUR?iX#@wXcrX=JF+_D{#->uwUbCxIwjNm zL#>mCAn6oP*tO-|S63lh4VkpY{Zr-|VldyB^G0&sXiiHGEn8uj_Pwo`^H9oqx;G)F zGQAjX=#EL`Kq+O^t?X$jJ30MnY)NyOm2x0on|d88i)Xgcc6gzD)uBg*BIk-qXS&k4 zrP3)D$Q{LOrjojAUN(*I~um3++RDhW*Hm4t4w8#hv~HVNx%`5oFb(pz@U+r*XlGP~!| zND3-ru3VGvsc@lKI=+DVi=`3 znvA>-HRZTdnoIZ)Wj!N$bWK!v@IX@(ISTF~R=XpUD(q)&AbYT0{?qlT<6tz}5Xqx`p= zk*fb1jdklr4DMnNEMXI_!e~z-3f7nMPrOmHa&vuD1)*EYJ;bw&MryB4C)dWmG1CjC z9okU4gAbcdG9Xz=Tv03LsKZ{jy|lcQpard%Tb3oxPqx~|fCY)z9LdUyt&0X4Q7F-+ znKxClxRKq8VWiUvr}&VYTo6P76$xY2iO48gefbj%yK{ATSXJr>Mg44VxOJgmsy-3K zR3U<`)q8?jE9UMrRNOwLsAR)U zfvhk>4MC)~L1Cocq)`6@Z|l`so}$t~G&M}>6xCdY4)^(prGL^~@ztA zVKg(Hc{9S0e7d^CbO7;RAZ5r#I-B+~y|KZ~dPFf9XuV5#G)Jay+TFE#q_?19_lPa~%}gvAgy;;LQ$Q>J5hkQt&pG=j=AH=^f=JWPc9 z3nOBhpcAT8tk^x$qek_AlGF%Z3r<8FPb6Me)g7e~W?&*8b16|%Q%j4XIeUqfDYLzn zIXd>dq+8#8IgQ#qyc3?D~DFb;lx1eC5CD7 z7!J{i(b@|KYAs5U)+F+)x0`YD!LK$h1IBMd%=HeRa4Sr%8=nI^4%jSt8Ke zVnQ|wC$Y#Jlr1{tqm@FT{f;y*@LZpTZf|83(K|b#3C?rYlMiRB%tYk!=ctSORcGL=>4M*xAb@sIGZ3 z4~HUWf~jIk!X3}f31S!nb9RDiHu2VY6Xdl_|EBkg6DD3UiJ9<=8|( zQ@K=la(Z-(Xmc`TC$5jD48dky+6{`Dl2@(Y_`+{+~Y|e7$ zL{v&-%9-}cJi;W$V8PYrQVR)RmL=n+WpgUQ(>lv=*?$x#U(kK#1c?o~glj$9oE$Gp zP-N4I7GFu!8mytp3EV1=+4$R*(%1@x0hPOa^siqNM2>-q(Tofa+5}AujhkdBeR0^b zH9ByKnin0e40a5HVsDe)!c;GEv9!yON1I{nG=CK`Gs6n^R|r5y|RKB?z#|M z_YsU~rbse9q8U`f5*v4uE)fAStl;Kw?LTrbIO!aOT}hDul@#`wMJ3B2;ABWW@lr{$ zv%oc;l7w<1DHUab3fleaUs%!!O5#5O?f;VE<<7oJKH*Cz+=Scm9d+^q2c2lb)fXAQ z>u^quImyOOSVu04FTu8AOc1OYCO43Dwyz+BhpD4z!=g{bBb#BeOA@9-zU)rOS5fQU z6KRuUy&ELGOkJv_yDI85pD!k8lG|!pUz|p3FL@t zxkKLm2t-B#2DY5&`3WiCGE)E?VgtcoCU=s^X&&KsWi!RTA=A~VMCZ_SXSCvT^S;}* zw~cz1UD35Iaz$q~vkR+4{ZqFpmaI4kyN2E0L?~KOEm34sS~XU*qN#|!U^X4;0VFp5 zx;v&vrg;fcNz`ev8%qlP52AY32>UQpU};{ixQfH8kuBnH$dWQ1mt(p#Jh{yy9OPq; z)KGm+&HNMxGE=X3z>PW3#CDkdSGL=z;g};^XKtggnoPCmT&=r^Nv0%Qn`#`5uAF0M z*KQVXm+0}3m{^u_W{w&|JT0=_)NeCL>_J*-HLVK^@Ti)r>MCYv)S*F1OqTVDO2T1F zv;wcVt<}kxl{8n#l|=oB^aN}%u??laI71ZX-0%b02$N4G?A-J-Nw;jZN4LVtvMcGV zs1@yMo&U$T#JY_ApI$DjUz0txs_NJ1>e0Dn!|lRVhmazuxO7(IsH8ZJ%qmont)`i( zr>&}_$v#hA&&m)>Fl^!E)U~3cwrYeZ!kCi8{2#XnU3qjjpsWi*)GAI7Mw@IVt4Cx^ z@h08UwT&9yMdE=`*v24sG<4*&%?-Ew;D2|}I|-DF&}>I;kbhHPzmT5h2m_*j(E+%E z%yy#s>9%7WURLh()?*yl1jrF~ImF2^z)Z29vl+7QUI1(^*v5dz5Mx^cVmE-At-GMB z;tYQWQxG!=awwSUu6bv4WdS0k5iT=aBS+b%1yP5*jsKTn!<)gM|88N(p-l0dO*(X% zDGIs2fUb%EG!a41v-Oao^o45Gl+tNl=*jWxP7WwOpio!9(Q1Zex=X6qm&+cSdJ?4> zMQV=Rz$Rg2OA!Szw8Bk5^D5u9W~$MI3kebu2|vnkCsElfR_9jRI9A;44l7Op*c@Ik ze|GdnG)oz#cVZ<1+eTIw#{k>}to0^Aw$o#danc#HPEWDkx{Q-z?Q3u1s-+m&%&b z$iR2(B+ZwMdaOri=@*BxE!x{w4(3H}#iNUa&gm>76S-T36bDG6x{GWQP|qvTpB25` z0;1z>QX~{pzrOWAnApqe8A>HxEEZLYX;V{-(-;z}Y_D`;5!&t6EQO*432T*dV`0oW z0wt$QHYq!2uB24ChJtROc;a#tbyHlm`USa4Ou3peRd}n@nWLDFoB!l1idMKNs^+40 zZEMWhogJ#fAER-CBZISZ(oNMKIYE-{s{dskZac_HGH=94PT6B^oTkdghC6F!#V%fD z8$iQ^qWY>{iC*?V;JO^tqd6ap#OSS^L#6yckFgOMF>;0{#$^#2e+qklcRj1*DewDsi3P1#@?6*;48pWNLF;n6BHR11k6vU4bMstt=FIl0oY z`6uL5FEJ{)OO}-})V2S3XERVw)ML|4;gpyPcu9`gVpT$j^>Skx1hij_#u=2Irj-$e zs@>-;q#Vn1JuFCv)?@2<7rHh>htohDrelpola~2bZc~wdnsDfdA|t8XQts3V_z9;6 zy}IoG6sw-_x{{DYx4`~P4v7@KQ1>3XMR+jy2=Sc)M#Bh9e;2P}+|XW3oE1|2g{X7*UQ{nh zBI*gZ-Q%4TqmqKyB?*XKT{$`76}$VQ2q^0Af@~y-mWssm$}W<~IELs_MZ_>UBIoI5 zG)FHa(TG4r(*qPeJwO*;GJ-$rP@yktffmA(Ll~->i@53PSVIY`DBVPMX=Ozy$+PJL z#S)(g)f^lD`7`)Z=az{TEnbibW(%naq!N9^c_;0_D(5x%P9%!=$#W@ip}Z-}fJF5nzcsQdW3{MX_U+0f>3OAuun z{=tP7*}nMP`zUtJG7lLdQk-GZQxLD zEm9X_9okT)WK211Vwl{iRwB(31;WU%ND-0Pr__WP5i@qirmitjgp1f!3WY~6?JhP# zkaSJmu7XRD<@4;Kx^ac3U*jXPZ3*utiT*mcHH@E~l_ky_Q~libW&F8tc!!dF`#+4L z`{l3rzYJNS<4$+Bh9a9Z?Ekl-tiA5%|2AgZfw0-)KZqky%2nkml@~4zw39>*w}C-SDta2lCt2dPqZ;{G8HW!+gXp2`cRWFou zNxO6MpLMjdDhL=|hZ1c`&cDkKFH|uKRg;$(v4K3e)R8n zlxrBuT{xIyh5dannLm6d$<;bmonmeKtvuB=lk2!zcWs3U?e<9IquT~rXPv_IMQCg zZBSLW%G!sblj~MJ38!S0;z&^ByOk92lhz9-q}G_&t9*~glWW1`i$28KW zxrPw6qtJsERDsh-YIRw|rd80Mx zTBByEC|fM7(6AxWC6Rp?)k_{>!~Oe{#$H9zs&U#OjFK@ZlY=R$0u<-k#PO9RJ)G!8 z7K}V2tR_bsThyX1T&8ymC2;TCt!44ewC2)QOyF^t||h$L@ce?F!SZJ!<(siH3# z5_hJEA>GIv16t~)*X)uD8nqwmysE>mlz3P=5utk5!x(6FD$I0^8V-x*3WpqXse;>3 z&3NAZkDBE&atTjT%fo`q{F5w0^4Lfq86cySY@bTRm6FGnC3ntYizIjAmBJhCtcB== zq~9suKKSx<}$ra&WeiyNlI4n_v*37e(XSaDoQ_iDNP*;s_3EmjLY>Cv6@$Q5n2M57tk z&w|*Gq|X_I#l&QBwMs9?IGFgvFP0);GAtQp?bI&0)r0V1)3x2%3epw~!LyFC)$a30 zE-!I8dgp*6%O|2cUFaf6LZBA4~o=km>QIBTiE@ba2u%_oRb%C4ovKFJ_|2h90V74$VP$R(K48>wtntBHi#!X&58v7RBd+(=HZJ z@~)WVSrJnrDrzcvMT=^hVIE{#Lb1pe!|2W)!yL};LLCSZOw5W(%IW1)H^zV5@(`xJ znpVBzW06J&Jk2SAhlf~N@zDPy3zUVs1b|zf?d||s|A*LCQ+=CHNsG)gqP2BlYbf*+ z6gv_xA8?q4tNy=9tsJTCihrRLY87S4vUxo{Vxyq7Xn#uSagvb#ri?GjkfRT)hjXJs zWEmyBBR^3v( z+Ir-0N5e{}`if>apgUG2HYXxPx^G`Oax$+*xUphNKH_ENY^Ua1H}2(NBOl@9fnn)> zdxtrb&SsP?{5`Z`Vsq<85hKXg@`HxE)qpfRBS=mSa|eUWA;%u+v@&*M?ihNgrpPUa zE*e)2G=AEhi^D0g%q461V!6_{4hS;&vIS)vY2&I*w9;1(re3rfs3gcJ5^~qd4L^f& zk~%YDgO5YG`Ab7NXGsD%oW8}n#172S;DsZN-Elb;=&(_XRL;Vo@e}*;NUdVKN4k&3 z0jClhmAVh>8js#VTVjJuuKjX7;1bt7LKMQF86c9L@MEy zhD)8x`5gY{Qu;}Wtz*5zMdkoZnIdv@C?iSB$4AUm;-Pya*vT#~7oJHUNw7t5a_3p1 zudFgrM$fB6L{adWCLj^oB{Rxtg5}0S$!lxe-`&U@jR@wh|L48hn#W;y9?Ih?9`1Jtvrb=;jCCL ziMZd9XP{R5ZwqR@(*~vxXBDAwxzEN8%z}u7WY=&dIr8E9oLpW11MVnVm;?KyCEwvP zmf5KT1`N8Sv>?_On);9~XFWnZ>@(bH5Rz=f4qen1*Z*O?EzMlimZ6QPCBhVyF-;Ov zO_Q;})RmR~s%heHtJ)&PRh{^pM7-GXXqBtYwu)rFw2MdHgk~zy z$`4f2#2*EmNVrgtZ7cs^SwCA#Ex3|iS&&%(kP(2AQ`Sa|6q^g7;-CA7tP0fV(@kTj zMroJQ2oz%kJ{MC>70nEhw8+rFkR@vO%@{%;t|Tag6HS&;%si6~yr^USZ{pqtM$_Y} z_k7-Nx4UP?-Q(_Ia7=ofHX#`sGd50Qz`;rGc-*!p9^2#juw&v7#`B$cW}NAn@k~Ni z-R(hFTyC@*?TvJiKw6|lyX+E)D+Mh`AYHT|-AEvDSBeA@NU=mDSb;=VM7ohc+W+r= z>g##lx5o|y-Ne&x)u~gbPMtb+>eQ)vp66KacII07Vq4(HHO#f{sknm~{E3OU+o224 zOea|-U0+PoXNxi|2oviB`_09~Ak+WkbpPsNFhTGDKOx;v3m|~zHdW9X1JY*Lnlao7 zV6YVi(KGvF*b~5D7qhq4>Em^$FE;t7aBk8WYhpP&&e3$^6$}d?ofngg%oG~J!b!;( z)WUDh`HbDdz)6nu5N!bV1)YqOVnp1O!H@EXAjACV+!+{jr7Ya3WS$g};H-MB_;R0EtL_|W*do&DPq~k3_W;MFZI&L0?cdv%y}}k@y&BRE1}D}NBnr6{c7D>mEhAml(cTe zl?0!%H@W1VR*2_J&2oKA-yV0n=}o|qX}_D^DS}iAb#%}BbQ7!Gj*Kjmr5tO=p44H2 zifl>d530L!eTcM2FAzT)70#5@$vBXGLYw2u=WXwGol%>n!h}YxDXd>&&l6#C;i-5z z@)MU%#>K`^lYGq)wWu+hgdyXij|Uf&6D5VtYu=Xc=(*({;7nTzI-aS9K@O-yiR^j+ zZK_Hk*xYC=fG|r90H?QqrK?w*{w%n$dhEZVkd3E}QW`it$j*+KAD*Am55&XBnBkOU zRjKC4NJ;*36#PA^rq1M&Q+-6*Nr)W6jaP4=9L*&J-DXOuh5$T_6KJ5coe*@*GNtVO zrnEiWl*SQFNxaRJq&YcZa)=VZ?qo_orK|Wh)PApbN}dVGl}oxfD#4y#i(haJQ2b7z zij!A}?nS~~Y7R6)&s#t~a#Y{Sp@>IA@Ae_?XL91S$$lc%1!JY8v?`^f0$e#^rAv_W zYka>bWmsEMGFFv-wY&)NK1~G)y@1DS3dK2_d8wE$Ug}0O(M}-eOX|~WzTqBTW~{1g zkp0RSeT%kPcnwyhL>nZP>n=eg;*%bdr({c{i&S0M6rd+|bX33yQtSQapvFO|ET}TR ztl&47#KKrGU8+}&f~2QObPY}ywB>Dc(5G?J2}}$6i3A$oQ|lPHqq8Z4UNyw?DqI#OEhg8E zN6m{J(#HT(rg16dE^A^YIQUKW^;#15{t_AiS8d7lP_X+%OgNS3Y+u2Ylu-{;>S#%w z;Xoik`8Ih3jChYKatC?4wICV*(J0|4n;n=mUCAw0rSIS zR3nofs?ffcTTud7U^2jVpIc33L!Brlc_v7>%$+*JE8zB@1xvQv`&YhF+I=Evm<+>F zoei8gRr7g&m?7dSCoRLA(Z^kK@^nl=KT&C)!H-o&$_^<9LB-SN)y!9Np*Akbi`G5b zv&1-j5v&J{Y1ISyxTiq0o|W{OOwLkEi-XS+@y7K;%(e4++pyE>SrS|Jur1u|J;%jf zeUet^@%mzJFV=;2)@TU zy*TLD0|ft4Vv`;n_+DxD9~!tt?fkd^%jGT5-d^lyH66c40v7#0qu#B>|NS61X$bx~ zbo;~bHWb>SXi*>g=m$QXUm7?`tJzf~o!8ESU8biWhE9j4WChMi&O&8@Ws7)xQzZ)i z>D7TYYt7pRJqgoV)q;mF<7>;*;P_+YEkfL%?;oW0%klPWM71rG`I9#&=Vx+pvOkjx zkp!PZnp}#hZ(fwvHtHu`CfDL@P*+uYZ$fLUp3wpG>C3O{oH>t%J~ZTU@s&+~cZjdT zX#W~%oo+@#c2K8VU{ieJdMeI|lP)TLsCLSJDF?18X`RQg{vAori0NY?xo z)SSIx!{gaL);du=rt3qIlFOM=+Qp|=jK>!WwBg|pKzi%_m6q)0h0WPO~@iCoBU^ z-?=F-*Nw`$U#}Mzq*7iP=q-Tmy6q?OhZnC0uUmKv(kdF^4C%HNKe}8>E&KUJa%8Qd?I5fuREqVetrrmZ)$KA zjYC;%APJvQ~D=Ox9uC>tgWWfzRnwd|ea`Bba1eFh+ zxRF~+NuaWhJe1oM_8~-O`jBLN`anoMcd4OLGL&d5R~s*x*8;}7I{eW9@9!gZo{tD5 zg~Pj-Gyz<;7o9TcqJbWOyQT}(*EL@4Bp|Msmk+1mBTJbwG`P)cBCefQJj=T$*LZyl z0*(Ble4{|52hfYT^z;lLEmadTOWd1uS~u+E`R81|MCl?OIbU=lSk#(U*o$<8E`2>k zmtR{L&Tocf58QY|V9u*gS_pG42g zRNQ*)T6#YexsNM%QvW`qfAmVFvfRuE#Rb0`wG*J~k_i>gyln8VH{SiubqaoN1NE+O*cH3M zv;lEfwG79d)#zx=YM-Z@tR8@)dZUSw@S2jjYEz;e&RWg}etdT?eQhtlcUo`PzI65V z$8UJ|ryqsh^qsxVFHzBN`b$)8YyysucY62+eE;;>O>MLC?d*f?il?umX%3Ph_nCFgK zk(DbUn~OJ8Kz`(fvWVlml57E2+DJcjnovJyCOp`y_4xc5rNo>pX#P&Lrj@ujd!u`y zevqxeQs}bW!Z~pH#_Lxuoz+XR&fSQwC+N$YSCo!es$ORv**H8&8NI$Rpy&BcC)iiw z2Tj05)hBt^)-IfW^|k0aalH#UlVVT>_G*3$eS@Q5hnASNCr@boMHDAap-@4L94`@c zw@c>y8N(zW&)(rD9$k3;j9gWx6y8klb=4u`O6eac|t#b24KXy^<>kH zu!?$Tahi+rnv{;o7-_4Rz4(M%y!Ob42d~%0mV07J6&gUq;W3dH&-TFA@`dyUdgam> z;`#JBzy|BGZ$C^hJs-Dh*1+ zX_NOzNw0}k%I_=7 zRdUG?enux+SyCks?Oxa1sy~ua^U>p)&(C^R2);2-Uk|TYCPO?1Mo+>*jumB*j1`=! zPb$Yi>urYVL1x?Qnn4R>owV##Sn@Y|FsaiJO+H8u1yb#^&a&6qLRYe<3J0nt1@xgf zALXisJ#v@)LE=cCKa+lCc)>j5zq$Z&LPtU}i#ikHR(whyyr{)7a@urqYn%cO&=iCq zNmM)~2dhqZY*kCYP{dsP=#$Ex56SjMT4(fl1>rRwJVQ)gA6+ttR~^=zH+uENCnF&w zh3Z}5eEPK@vqyMHdKiQivrT2VW)oddBIx?yfhw6W#evJ7oP{>`rz1$Wgb}b@P|HSG&(BeNtuJ zyspD{dW)Sf&UW4IlielZfk~;pgD7~nYelKGZbi@wonDjK-RQd6&nl<`DvFoI+hx^1W#04_Pq#=fR+K)Yzk9pUwEpc`b*uUSO(~%VdYz{7 z-Tiy@SD`D>I^DgYG_sz|$t*=NbeMx=0qI|R-ymya= zOhTT4f7ra!zTTQCPF5z%ZT~^Fdrkc4<3(=gN&TKy?v#6SNIAxCa&7Z^p_LOO%jlgq zy^z!C3FF0B)8A*+7UK$+j~j-hsrO*_l%P7EGH+LvzOTE#>y92%IdVWISr%Cbqvndn zB}NTy&`I<&w2U(Jqw3v*UAITCcomF(GA_vduu^(4jauq<1Rn=Qr@QN_pckz}tuA%b z8nfwr-ROZBkI=BtuP<~Tl$L#=`;h-W;=ezE-p!ce*+XiL{-PaKcMggJwB(fjpEW(S zhJNdcpJaAXH5nOw9!ZeTDs@WzT@n0Jfh(3Ry6WRIj~jYU<(mgnTci2&NCxJ2Q_=2As5;b zmg=fCB(w-{-iN9 zC=p7f7t}d_&Tv|!euxlt4Nhng{+N`s|6{^|67|D8eqd!Z{RMUD3z`PqG^+nfC)msf zR_^acj~-OpECu?GwSMVa+mDt~Os)r|&JSXC*Z(ae{kkfJSTX}E78Ik;s0}qcTV8~Q z1!Aqp7ASX))hR?3UCu%ZJBcl7+vxV95tWal5<*_<^!_Gs7rfBztLpr9*@ABRv98

StandardFormat } - - internal ref struct PropertyConfigs + + public enum TextCase { - internal bool ExcludeDefaultValues; - internal bool IncludeDefaultEnums; - internal string[] ExcludePropertyReferences; - internal bool EmitCamelCaseNames; - internal bool EmitLowercaseUnderscoreNames; + /// + /// If unspecified uses PascalCase + /// + Default, + /// + /// PascalCase + /// + PascalCase, + /// + /// camelCase + /// + CamelCase, + /// + /// snake_case + /// + SnakeCase, } } diff --git a/src/ServiceStack.Text/JsConfigScope.cs b/src/ServiceStack.Text/JsConfigScope.cs index ceb91dbb2..2ae298727 100644 --- a/src/ServiceStack.Text/JsConfigScope.cs +++ b/src/ServiceStack.Text/JsConfigScope.cs @@ -116,8 +116,23 @@ private Config(Config config) public DateHandler DateHandler { get; set; } public TimeSpanHandler TimeSpanHandler { get; set; } public PropertyConvention PropertyConvention { get; set; } - public bool EmitCamelCaseNames { get; set; } - public bool EmitLowercaseUnderscoreNames { get; set; } + + public TextCase TextCase { get; set; } + + [Obsolete("Use TextCase = TextCase.CamelCase")] + public bool EmitCamelCaseNames + { + get => TextCase == TextCase.CamelCase; + set => TextCase = value ? TextCase.CamelCase : TextCase.Default; + } + + [Obsolete("Use TextCase = TextCase.SnakeCase")] + public bool EmitLowercaseUnderscoreNames + { + get => TextCase == TextCase.SnakeCase; + set => TextCase = value ? TextCase.SnakeCase : TextCase.Default; + } + public bool ThrowOnError { get; set; } public bool SkipDateTimeConversion { get; set; } public bool AlwaysUseUtc { get; set; } @@ -158,8 +173,7 @@ private Config(Config config) ParsePrimitiveFn = null, DateHandler = Text.DateHandler.TimestampOffset, TimeSpanHandler = Text.TimeSpanHandler.DurationFormat, - EmitCamelCaseNames = false, - EmitLowercaseUnderscoreNames = false, + TextCase = TextCase.Default, PropertyConvention = Text.PropertyConvention.Strict, ThrowOnError = Env.StrictMode, SkipDateTimeConversion = false, @@ -201,8 +215,7 @@ public Config Populate(Config config) ParsePrimitiveFn = config.ParsePrimitiveFn; DateHandler = config.DateHandler; TimeSpanHandler = config.TimeSpanHandler; - EmitCamelCaseNames = config.EmitCamelCaseNames; - EmitLowercaseUnderscoreNames = config.EmitLowercaseUnderscoreNames; + TextCase = config.TextCase; PropertyConvention = config.PropertyConvention; ThrowOnError = config.ThrowOnError; SkipDateTimeConversion = config.SkipDateTimeConversion; diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 73c9eca65..a34ddd860 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -8,6 +8,7 @@ using System.Web.Script.Serialization; #endif using NUnit.Framework; +using ServiceStack.DataAnnotations; using ServiceStack.Text.Tests.DynamicModels; using ServiceStack.Web; @@ -779,5 +780,38 @@ public void Does_map_Uri() var toString = new ModelWithUriString().PopulateWithNonDefaultValues(dto); Assert.That(toString.Uri, Is.EqualTo(dto.Uri.AbsoluteUri)); } + + public class ViewModel + { + public string Public { get; set; } + + [IgnoreOnSelect] + public string Private { get; set; } + } + + [Test] + public void Does_convert_same_model_without_Attributes() + { + var vm = new ViewModel().PopulateFromPropertiesWithoutAttribute( + new ViewModel { Public = "Public", Private = "Private" }, + typeof(IgnoreOnSelectAttribute)); + + Assert.That(vm.Public, Is.EqualTo("Public")); + Assert.That(vm.Private, Is.Null); + } + + [Test] + public void Can_use_ToObjectDictionary_to_Remove_Property_with_Attribute() + { + var vm = new ViewModel {Public = "Public", Private = "Private"}; + var map = vm.ToObjectDictionary(); + vm.GetType().GetProperties() + .Where(x => x.HasAttribute()) + .Each(x => map.Remove(x.Name)); + + vm = map.FromObjectDictionary(); + Assert.That(vm.Public, Is.EqualTo("Public")); + Assert.That(vm.Private, Is.Null); + } } } diff --git a/tests/ServiceStack.Text.Tests/JsConfigTests.cs b/tests/ServiceStack.Text.Tests/JsConfigTests.cs index 952026040..9d9f35b32 100644 --- a/tests/ServiceStack.Text.Tests/JsConfigTests.cs +++ b/tests/ServiceStack.Text.Tests/JsConfigTests.cs @@ -38,8 +38,8 @@ public class JsConfigTests [OneTimeSetUp] public void TestFixtureSetUp() { - JsConfig.EmitLowercaseUnderscoreNames = true; - JsConfig.EmitLowercaseUnderscoreNames = false; + JsConfig.TextCase = TextCase.SnakeCase; + JsConfig.TextCase = TextCase.PascalCase; } [OneTimeTearDown] @@ -58,7 +58,7 @@ public void Does_use_specific_configuration() [Test] public void Can_override_default_configuration() { - using (JsConfig.With(new Config { EmitLowercaseUnderscoreNames = false })) + using (JsConfig.With(new Config { TextCase = TextCase.PascalCase })) { Assert.That(new Foo { FooBar = "value" }.ToJson(), Is.EqualTo("{\"FooBar\":\"value\"}")); } @@ -66,26 +66,26 @@ public void Can_override_default_configuration() } [TestFixture] - public class SerializEmitLowerCaseUnderscoreNamesTests + public class SerializeEmitLowerCaseUnderscoreNamesTests { [Test] public void TestJsonDataWithJsConfigScope() { - using (JsConfig.With(new Config { EmitLowercaseUnderscoreNames = true, PropertyConvention = PropertyConvention.Lenient})) + using (JsConfig.With(new Config { TextCase = TextCase.SnakeCase, PropertyConvention = PropertyConvention.Lenient})) AssertObjectJson(); } [Test] public void TestCloneObjectWithJsConfigScope() { - using (JsConfig.With(new Config { EmitLowercaseUnderscoreNames = true, PropertyConvention = PropertyConvention.Lenient})) + using (JsConfig.With(new Config { TextCase = TextCase.SnakeCase, PropertyConvention = PropertyConvention.Lenient})) AssertObject(); } [Test] public void TestJsonDataWithJsConfigGlobal() { - JsConfig.EmitLowercaseUnderscoreNames = true; + JsConfig.TextCase = TextCase.SnakeCase; JsConfig.PropertyConvention = PropertyConvention.Lenient; AssertObjectJson(); @@ -96,7 +96,7 @@ public void TestJsonDataWithJsConfigGlobal() [Test] public void TestCloneObjectWithJsConfigGlobal() { - JsConfig.EmitLowercaseUnderscoreNames = true; + JsConfig.TextCase = TextCase.SnakeCase; JsConfig.PropertyConvention = PropertyConvention.Lenient; AssertObject(); @@ -107,7 +107,7 @@ public void TestCloneObjectWithJsConfigGlobal() [Test] public void TestJsonDataWithJsConfigLocal() { - JsConfig.EmitLowercaseUnderscoreNames = true; + JsConfig.TextCase = TextCase.SnakeCase; JsConfig.PropertyConvention = PropertyConvention.Lenient; AssertObjectJson(); @@ -118,8 +118,8 @@ public void TestJsonDataWithJsConfigLocal() [Test] public void TestCloneObjectWithJsConfigLocal() { - JsConfig.EmitLowercaseUnderscoreNames = false; - JsConfig.EmitLowercaseUnderscoreNames = true; + JsConfig.TextCase = TextCase.Default; + JsConfig.TextCase = TextCase.SnakeCase; JsConfig.PropertyConvention = PropertyConvention.Lenient; AssertObject(); @@ -130,8 +130,8 @@ public void TestCloneObjectWithJsConfigLocal() [Test] public void TestCloneObjectWithoutLowercaseThroughJsConfigLocal() { - JsConfig.EmitLowercaseUnderscoreNames = true; - JsConfig.EmitLowercaseUnderscoreNames = false; + JsConfig.TextCase = TextCase.SnakeCase; + JsConfig.TextCase = TextCase.Default; JsConfig.PropertyConvention = PropertyConvention.Lenient; AssertObject(); @@ -209,36 +209,36 @@ public class JsConfigCreateTests [Test] public void Does_create_scope_from_string() { - var scope = JsConfig.CreateScope("EmitCamelCaseNames,emitlowercaseunderscorenames,IncludeNullValues:false,ExcludeDefaultValues:0,IncludeDefaultEnums:1"); - Assert.That(scope.EmitCamelCaseNames); + var scope = JsConfig.CreateScope("emitlowercaseunderscorenames,IncludeNullValues:false,ExcludeDefaultValues:0,IncludeDefaultEnums:1"); Assert.That(scope.EmitLowercaseUnderscoreNames); Assert.That(!scope.IncludeNullValues); Assert.That(!scope.ExcludeDefaultValues); Assert.That(scope.IncludeDefaultEnums); scope.Dispose(); - scope = JsConfig.CreateScope("DateHandler:ISO8601,timespanhandler:durationformat,PropertyConvention:strict"); + scope = JsConfig.CreateScope("DateHandler:ISO8601,timespanhandler:durationformat,PropertyConvention:strict,TextCase:CamelCase"); Assert.That(scope.DateHandler, Is.EqualTo(DateHandler.ISO8601)); Assert.That(scope.TimeSpanHandler, Is.EqualTo(TimeSpanHandler.DurationFormat)); Assert.That(scope.PropertyConvention, Is.EqualTo(PropertyConvention.Strict)); + Assert.That(scope.TextCase, Is.EqualTo(TextCase.CamelCase)); scope.Dispose(); } [Test] public void Does_create_scope_from_string_using_CamelCaseHumps() { - var scope = JsConfig.CreateScope("eccn,elun,inv:false,edv:0,ide:1"); + var scope = JsConfig.CreateScope("eccn,inv:false,edv:0,ide:1"); Assert.That(scope.EmitCamelCaseNames); - Assert.That(scope.EmitLowercaseUnderscoreNames); Assert.That(!scope.IncludeNullValues); Assert.That(!scope.ExcludeDefaultValues); Assert.That(scope.IncludeDefaultEnums); scope.Dispose(); - scope = JsConfig.CreateScope("dh:ISO8601,tsh:df,pc:strict"); + scope = JsConfig.CreateScope("dh:ISO8601,tsh:df,pc:strict,tc:cc"); Assert.That(scope.DateHandler, Is.EqualTo(DateHandler.ISO8601)); Assert.That(scope.TimeSpanHandler, Is.EqualTo(TimeSpanHandler.DurationFormat)); Assert.That(scope.PropertyConvention, Is.EqualTo(PropertyConvention.Strict)); + Assert.That(scope.TextCase, Is.EqualTo(TextCase.CamelCase)); scope.Dispose(); } } diff --git a/tests/ServiceStack.Text.Tests/JsonTests/LowercaseUnderscoreTests.cs b/tests/ServiceStack.Text.Tests/JsonTests/LowercaseUnderscoreTests.cs index bffbc2f4c..4ac1b8185 100644 --- a/tests/ServiceStack.Text.Tests/JsonTests/LowercaseUnderscoreTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonTests/LowercaseUnderscoreTests.cs @@ -12,7 +12,7 @@ public class LowercaseUnderscoreTests : TestBase [SetUp] public void SetUp() { - JsConfig.EmitLowercaseUnderscoreNames = true; + JsConfig.TextCase = TextCase.SnakeCase; } [TearDown] diff --git a/tests/ServiceStack.Text.Tests/UseCases/StripeSerializationTests.cs b/tests/ServiceStack.Text.Tests/UseCases/StripeSerializationTests.cs index bed5a6446..dfcedd679 100644 --- a/tests/ServiceStack.Text.Tests/UseCases/StripeSerializationTests.cs +++ b/tests/ServiceStack.Text.Tests/UseCases/StripeSerializationTests.cs @@ -13,7 +13,7 @@ public StripeSerializationTests() { JsConfig.DateHandler = DateHandler.UnixTime; JsConfig.PropertyConvention = PropertyConvention.Lenient; - JsConfig.EmitLowercaseUnderscoreNames = true; + JsConfig.TextCase = TextCase.SnakeCase; QueryStringSerializer.ComplexTypeStrategy = QueryStringStrategy.FormUrlEncoded; } From caf89f4f4fe4600176bfd2219fa567e18e7cf608 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 15 Dec 2018 17:51:41 +0800 Subject: [PATCH 030/372] proj tweaks --- src/ServiceStack.Text/ServiceStack.Text.Core.csproj | 2 +- src/ServiceStack.Text/ServiceStack.Text.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index be4ec1f9a..7a11239e4 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -2,8 +2,8 @@ ServiceStack.Text.Core ServiceStack.Text - ServiceStack.Text .NET Standard 2.0 netstandard2.0;netcoreapp2.1 + ServiceStack.Text .NET Standard 2.0 .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. Contains ServiceStack's high-performance text-processing powers, for more info see: diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index 8c0c709c5..3cb503dce 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -2,8 +2,8 @@ ServiceStack.Text ServiceStack.Text - .NET's fastest JSON Serializer by ServiceStack net45;netstandard2.0;netcoreapp2.1 + .NET's fastest JSON Serializer by ServiceStack .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. Contains ServiceStack's high-performance text-processing powers, for more info see: From 48fd298da2e1ad8780001730606fa2a6173644e8 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 15 Dec 2018 20:49:20 +0800 Subject: [PATCH 031/372] tweak build proj --- build/build.proj | 8 +++++++- src/ServiceStack.Text.sln | 1 - 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/build/build.proj b/build/build.proj index 14534e65f..daaefda02 100644 --- a/build/build.proj +++ b/build/build.proj @@ -84,13 +84,19 @@ Targets="Build;Pack" Properties="Configuration=$(Configuration)" /> - + + + + + + + diff --git a/src/ServiceStack.Text.sln b/src/ServiceStack.Text.sln index bcf0dc7fc..b90674668 100644 --- a/src/ServiceStack.Text.sln +++ b/src/ServiceStack.Text.sln @@ -8,7 +8,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{F7FB50ED ..\build\build.bat = ..\build\build.bat ..\build\build.proj = ..\build\build.proj ..\build\build.tasks = ..\build\build.tasks - ..\build\copy.bat = ..\build\copy.bat ..\README.md = ..\README.md Directory.Build.props = Directory.Build.props ServiceStack.Text\ServiceStack.Text.Core.csproj = ServiceStack.Text\ServiceStack.Text.Core.csproj From 5a90a2010b486ac8a8bb4d1dd5f312ce4386f556 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 15 Dec 2018 21:24:27 +0800 Subject: [PATCH 032/372] remove unused build proj vars + .nuget --- build/build.proj | 3 -- src/.nuget/NuGet.config | 17 --------- src/.nuget/NuGet.exe | Bin 3957976 -> 0 bytes src/.nuget/NuGet.targets | 77 --------------------------------------- 4 files changed, 97 deletions(-) delete mode 100644 src/.nuget/NuGet.config delete mode 100644 src/.nuget/NuGet.exe delete mode 100644 src/.nuget/NuGet.targets diff --git a/build/build.proj b/build/build.proj index daaefda02..a505afd63 100644 --- a/build/build.proj +++ b/build/build.proj @@ -13,11 +13,8 @@ $(MSBuildProjectDirectory)/.. $(BuildSolutionDir)/src Release - $(BuildSolutionDir)/src/.nuget/nuget.exe $(BuildSolutionDir)/NuGet/ - $(MajorVersion).$(MinorVersion).$(PatchVersion).0 $(MajorVersion).$(MinorVersion).$(PatchVersion) - $(MajorVersion).$(MinorVersion)$(PatchVersion) diff --git a/src/.nuget/NuGet.config b/src/.nuget/NuGet.config deleted file mode 100644 index fe6a62c92..000000000 --- a/src/.nuget/NuGet.config +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/.nuget/NuGet.exe b/src/.nuget/NuGet.exe deleted file mode 100644 index 6bb79fe5379d098fabcabf69f3e5c9e8214c229b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3957976 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

q?zIcAk{U|VH1Lr>$qLBDkJ%l8D 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%0Dr|q4 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®FbQ_ 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%0D-B$lcXj(!M5VY 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 &075Qv=WA+vP92B5(O=;-8ki!KUdW03zHFK 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

Kr!IOq6Q7?TzDzy)-fY;^MGt18Mq3kykJ!_S6 zOgX#-1Z{OPX1L(8Oix5$Q+TVPv$dh@mDo%0ApR0w_$%a)^$nXhg)i_P#CwCvY_glv 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 z%0AEJm~z+)!rF#${zP&*0rEvM+|o5n`yW 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� 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

atVm+*N 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

E-dX(#V9smO0CBt?_5MK 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

gt|@rrlN16 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

9zD!W!R&0Y)Zpyd+2o5G-fcVmRv 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

x4)BdgdV_?M1t7FU}ls>IKNlf6BeA(7z)_? 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�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�H?s7>kZa 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

j5h_yN4(`Z(zwoll0)mCy`^ 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 z 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

P!%aBS7G9X@ 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 z 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

`$7q0mOk)0&n7L;_vmCI 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

S!LAcQfFx?Hrq0eITQ>_vDsF1 zOam}1#THx5F~@;nDYn@9j%np&w%SIHIn&8(wJjavpXh(KZ5-pD=zq2y9OHLaez9F0 z<9AnnvArGB0hT{QE&po!I_4@cD}@>47(dc(vqK%@N7`+6j4*Lr-ELP3lW%T^owcyD z-8S8q@yR!Qv%d+<@3xO){Ik^`c84$pW*oFwJAc>;`>7W9MSp|VpLUUBo`MW5|7o`+ zG4|zRW~XgeR<-&oRp!^N%f8PPH~W#uOXnnBr%v&$d{(@|20K zrFgLh!sMF+A;Z>Nyjbfb8Lpp;7waI*`jQPHQwknt73<`f)4-Gyrn_T$g2@r4k7M$| z915mHvHp&k1g5$$d5(DzOkFUEVnda&E5I}mW{qQ3f?+!>S!}B?i|qz5$3v!6v2D)I zPB15dDP3%*V@jWcU#=1+d;eH=&gNx`Ra7SX5Xf-G-?vybVaA(UV9titzQx7~6Hk7Y zEjCq{0&@anxk)oQG%#LuFE$V-wXR%pry_gdxm%5>4OAB+Mxz zhea5|@Vl{yhzrXK)-}~*lUeD)i+h?EBwQGmklN0u2pVjV^NgYSqGTN3+tsa}Y z&+@6ZTx!eamh-LYov%z=CfTxub?xSkeA(r4Tbw_g_O{AMRnvOC@#WI!Oz;OXA(Z z*=t6Rrz8Pnp(KoaCW#@xN|MOB!_5{MWE)8y*;`UVj+9i9Gb9b0ewM_MEsr*xQ^>)REHXw?KyHuyda4oHAxcr zR+2%iW6TzLWHU(#*-cVK4wf{KlO%0qoWvJ&x0odfBF{)7$TCSB`B{=ee8-y3S){+D zfDD(Ekqaa>vmow@gu7wA;de<^ob%nN)pJSk~A_}l0&i*=TnQ$&(|Z8 z3bII2N4}S|kPVJAeZ0H4b9R>mkl~Ura*-s4+duhnyrSB4Z`azo|Rv(|7V+Wc8CIkztYya-JlQWF;l!AxRZkAZZ|9O4^9$B-6*& z&+XGk5<~_{oKG=1olla)k+dX*+$PB)Pf7~NVo4cUC8;6noNO94k?kd({%)U$#E+aR z2_X|CQRH?>0+}aCBkxLb$d8gDvi>QiVFd|F>c~No7IK=z8*;a}LJ~mok}&eDB!(=L zB$1ya8DxV~O~X9WS5iU_l~j?lBn>1ZX(O{GzCGM6UX%op41T;kc&?d&<-r2CO=B_U*pB#N9RNg&rs(#U<195P>0L{>^F zNRNc+Q%81`w2(t3-o4x{MoR)nRuV=Yk;ITik|grIB!g^lhUt?>c9)cp;S%S{b?05; zQb_~3Thd0}l=ud?XZfv@6f#qiMP8B=kgp_VWW%#eRt?!l z(nL;|c=mStWF>y&F-ZtnCW#_{N)kw5lu1t`he>kCg%al~aOcsuRZ>A-mei4zk`}Vw z*(S@ok2_}%NdSpU!pLMv40%YBM5>Yu@}ne=^gPF;myrD>RU{#4AlFOU$XtnUUw4aT zk|5HSM36qCO?n(TM3O?zlVp*cq<}mpDI@PoYDinsM7BzrbWhmrJXqpK&X9zVYb8^Z>gytBlQ43;=o=sNEb$4R2d7)b)TMv_MEl;n`7Bt@husURyQ z&egY0diM)V=N7W9#JNVc^IcsMKu(v0kt-!JWVR%Uye!EepGfk^Uy>5C#f7F}6$wik z$O)1*GG5|bC+ci5T@pkdl|+!YByr?RNeZzpGJUehmXZRpkEDzoBdH-5N}9-2iD$6e z`5}oPnJ)<;DMdDno=sfbhE;i`_ zWPeE*IZYBnu9hT`ha?$fktC1&C@CT9Ut-d$$ZnDba+IWvTqyBH+%0BEf=EdcLEe?b zkzXV!WYbGcpDZ#!Qb3NAl#%h08gjd&iIgRtgWS%`CC;^X&U3Lw5<+^8HGQJU07(KF zDM=$^B{^i4q=?LuRFLJ8IoU_Pi-aWw&QS! z3prEb9qP`>N&?6ek}&eIB!;Xv!DJTWSr5=35Rjw)R6g-Ceo024s$zOlT5lF=`9H% z`%9uoT#`V>OVY?JNe+2hQbcN!3i5}fj%;_OY1l%Jl6a%;7HLTUc|a0ImP%sCpOPf9 z!(@}?Tx;UI!jG2ZkqMF#@}Q)O)Fch$Z%G^3DPyvHhr3w^OM=KKNd&o05=S1Aq>zP@ zEYg$|kae#z>1AXWNewwt(nQ8cJV&^lr%C+C6Os_}jwFh-B+iuz&f~nv)uvAx*+-H? zPL>prjHH4*C~>Y-a3(L3w2+@9-Xq;(dR}AF1IT`oFmjqChFl{_B1K6CSt7|Jzeq|* zuWLQh$aINsn7hSuk|44|5<%9v&SW|NHt#$>{Upx6%{y|uB#T@rDIgC? z%E(el4f$QtMEYEB(mhAHS%*se$c2&+a+@TIyedf`-$>HPMpH~y4%tUiL{5`bkn1IN za_1S`OVU72 zlC+VlB)+5Fvx<@+@{S~e{4R+jTTeCVDdZ4I78xZeAX!NnnJcLwHAxd$Bk{!C&i)%s zx*r)R2_Xqd6uDNCK#GzyvRINsT9P8t^CpvCLBf(ca)P9VOptg-xLeGY1dxg(jI5Nz zkaeb+^d!<(l0k+^^2kM!5;9X#MV^&3kh-Le{4Mbv<8IMsy6F={4wgiaF_JiPt0aZI zD#;?>N(zW?hRG@;`$=lZnUW@Qqr`Kp+j*YEk9;NxA?xH!Rut(kNg#1a8o5%ELyD3j zvP@DzI&L;ubz~<=3yDdbD+8RL_X&~!GDi|dmP%qsTarY!n`zQB$S_GB880az1xXco zNzy<*mb8&SCBEa_E&R8b^dPdYB!V0-i6i4ADP)!;i##JKAj>3W`$P8QC~*(rZY6NfS9%;yKanbD6}C+$9MiuSufFN=X9w z*BvH3jqEDPAxBG!$fc4Ba=WCCyd-HMpG&+axm&Dtr%4YW0ZAA+ND@QNlq8XBBpGCm zB#*o)DIwoTs>r|YGJP6IP|`*Ym-tS0w>VD{L~fKg*GV|9pShAavP6Zqbwkkbgg9vckwfNenqhl0y2_a)7QDnL#fs`a^WSJy~tdSIvUXPkS6(lUFBPU5($V7?v z9CwR*Bmtx%2_s)hVn~n2OnMUOE6E_oNb<-Pk`gjUQbm?X8p!Vw=b9epoqwCTCfzsM zm8c|$Tr7zocS_>O8z~Btc}Cr%hG_IY|;nCP`Ar97z`W zkEDS7A}J$VJY%wINJP>^MoT>ByPc;?{K&Hs=XxgRC*@N~6j^JY$x0x*NYcm%Ne)R% zipbrP3bH^_M^;N(NY7_Yx_6A*aG)fBjFNbuz3Q0?{$la0xQjwIAuOv0ZTQ=!U zWH*WDLbr2F;z!0xLP%Z`MP8F6knbdEWV07cdJc(5ipcqr3UZsIj=U~uA*&_ci`*?X zf6-(GkRg&Va)Bg<sqPLl+XDUvW!lEjc@k|ffWWRN}; zlb%NokvLa(Iqx>-NvcRr(mKjhfFyt%ED0m$NMgthk|Z)$l0n{)iGd@gAs-i0R1 zbD7(44~ZW+NfJV?kwlTXk_7U;B#l^Ala)iZmlTm<66eY`=MftxsU!DDTF63)H|?I) zk_3<~-ZtrBWQZh&oG(ctvm_bh6-gfXMp8mHUSzVWNLbQ9j+3;J@e<$V?iRO8f=F2s zK|Yeik-sD3m#U?$3Y%Pf* z10@OMWJwyCAju(jNQy{VQb9hH)REsMEo8GLrlI!=cZ&g%0CKD(j9em#Ava5sNJ)}G zK9S^+j-@8OglsFRB8N&E$oY~sl9Tu*x?4Oe2_hd$B1qSFOnMyIL6Slamt>I(B?aUb zNf{|iYRG4jCepQL(mj*h&O1u{$dQr|a29%55~=QGwE$) zcZqMZyTu4e5E&DtPMb>%W^hqE)OVUVGl0(jw6p^Wt3i6nwjx3b4kZ&d4tK2RA^?~UVKz5ddk;5c0 zWV9rSOp#=ehb4Jrp`?U-E2$#?`q1=gAUjLi$YB!S)$SIfB|+pmNd$RV5=Y*aq>%3= zS!Bby=~F=ZOUlRyNe#JF(nM~Rc&>3fKQHkkA4x*U-;yY@^+%>p0y$8UMlO=%kb5Q0 zb)wGi<#!|%r0d6KavkX}X(6Xeyw|#OW=I0aYmzYXlO%?0^NGnyB1cOy$Ye<#c~VkB zmPo3|_mT#(?x!ZJjqEJ(UFU8wR1!qal0=ZJByr?kNeX#Il0`m|6p%k9Wn}ZuOv4(o zx1@<2Bk^4Cb{;SBBlk!`$Xk*q@}ney^jcxk)5u^+4mn3sM5aqB$a9i9vO>~A*7@9I zd8fEr^pgaT<0WC_N=Xd4SCT{)NHWMONgmm#VbV*;UXm&jmo$(`k~VU`#FurqSSSf1 zt0fU+lP^qq9N9k@%4@k`OXW z5=CB?B#^HpX=Hd0J43t2AlPIc#Wd}Xo%$PSV)GE5Rf z#!8aN-I5HlK$1sROG-%3uT6Rt87OHWqa_^}tT?ixB!vu< zWRXiH1>{ai8F^h&Lz??7uS9V@eCrRqaBuNV?NW9bBv)+&dkZ&YmWZhLJJ%;QiNg_u}GRP&8JaVg~gp?&! zq%LV79p9PsHWHBdrn_4lA_*c%Nd&n`5=Tms6tY~BMcR@A())YUr;J1-HDr{eiDV_7 z8E)sf5rqvBt>Mgq=Nh+sU!YhOnM6$Eb-prZgILKfLtpHBacX8$WloX`BjoZ{J)y?JTgd9 zLe7*_ktvb}GFQ?@-jz7lsXOnzze|G1R%=Xp1c^xE$Z3)kl96PQ`y~ZrfuxLlBdH6bA)zoAd^9h@_32Bk|qtZgG<& zh&(NcAazL`vHmn!DP#vp7CA!VTwCwFR#TEPa+{=vyew%VUrIcAcaHZjlkP|QNkYg- zNfenNNg#71X=JG+hqNU{WV^pjdIcFKsUzbhEuL11+j*(P zkF+HrWV^LZdK4KZNg(4TX`~>@A&VqMWR0YP^jXJb)sdl+7Lt;9?{&AhOAmB@LvH*JQPk!zIqAES%pdVLm!yG=l(dm?65j*v7Pm=)$n%m2QkTS$KP4$-%MDGREOLOPfSe*JBaAc}?P(<92RH{7A<}Cf)h`hV%OAEr}unB?;sdNgA0b$su=3ipa~73i7F>j@VzR z!Jk`NNNBY#UuNN=BMSVaa&8pvsqHZob_ zd&u3QAPFL`OCrdZk~p%~CMG?F>>$Y^LnQ^|97!3ODybn)OPa{X63@eK=kEVD>3(Dv zNeDSc5=ACR63G3MG_pvNLw=DIku5hh=@n#%q>h{?X(2Nu-lDt3Q<4C(ToOk9ki?KJ zdz$nlGDwm^5|TV}jiiJ;B&i~AOB%>(NgLUCGn4Ln#NA>~Nf0?s5<$|EI5JC;Lgq=b z$Z|;mStBVUJ$soxHDrLKiHwwZ9(6m9mH3fak`OXa5=E9v637}!8tJ*Y>61eSNQ%hm z66f$LyD3l@}VSyth0rgoJaPSl#o%9 zDsqdYfy|e*k(CnPTz3oamL@BR>@JBQ$4KJHWs($fwpMdWfx1-VC3N8XUMkfy}@guBIt zTbp#}(?`zha8F4XIYAObCQ6dXeUc3FmL!j?l9Ui%ACq21_LVe{(C$s!j?3dn7eGV+R~hI}PyB5MUqmZ#))-bvy|4wr!IC<1hNOjDEAc+%Zt<`rfGm=Pksl>7q}O&PJ&6pK zWRP){`r=!K~}m` zX7=d1cbAU)o_4-(tB7oB%fp>gLd>^x4YJC}?@S(S)sWshxLXXinn*&2A4_t`uaY9N!H%Y31=&$jM+Qq;$O#hfJa>zfB!Ju?2_yGQ zV#rI9BvO-PkX4dA(tRh>xrA&bsUia;4df_E8#zbfd)D1zvLuM)B@yH)NgP=uNg*pG zS;YRbyUxFr47Li$W|A_}S5iX`k~EPMC7$Qp&KFDk$PJPZa-SrMydX&+?@H3hDoGCM z7BpKFku4+@WDiLlIb700&X9PYcej`#2_R2N!pJ9*7_xR>(F=C3)l;NeOve zQbj(LG>~q)n5;IktHf7!w>VA`L?%lj$RmRY4LM5E zM9!6XUT`~KC-EcqNkYggk|^?#B!T=UNh6!=W*X*@-6cij2uTGwUs6YIlC+S=CEgd^ zEtX0G$WM|m;@jQyi6MJPlE^WV405T&`TU{tjy+3KLY|dWkq;yd)>^CfZQ21yEeSdvBFloXJak}}e*zv)v$wvjZEK@!i)Zs(IFe&ljV2)SJn zMV^-=kWVCOq-)6Z$syZIipXJ-3Ua=rj?9p>kY^;`SKKW=lmw8!C1GTnJxre%a@=QX$USrR{zm4uMTB~fIVB!T=PNh7@nm_9k=AW0E9M^Zs< zl+=-uq=mdM@mAa|{*nZcZT2?lVPuFThMX%&A~{J0d0vu7R!B<7+WVNSDzclTfgCGo zBNHUP*WE4dlQ^G5b>8c$k_hsXB#!jj*QBSAL6R(Tyrh6!Dk&p5Ney{i(nJQ zk}xt(5<_m6B#{>+8RQd59_g~bNiQMWNUF#|k_K{?q>WrB@hxz-cvuodUXw(SPb6{V z4@nBy^Z?T^i}aTikRv5!WVED)Tq9{B_ewl(x}9H=_>m7KA>>y{6xn#7X_!EEm86lw zB{^iYq=;N6sUQzX>d5Po7V^2o`RcW=b;1^O8LBsicH-8)DL{$WD?5a-^hn#gYw&wt#rwm-yV`H>Nl z5HeX3MIM(VkWVCOWZj`=at_&7Qbf*{IG?q4wzx%7M_!k-ke?*p#qL?X4mDW;w3+Eb^$NfGm-ek(Q)}Y#CiEb@+|fcz*aBbyv$`qYpC zk|uJ3#PhD(d4j}`%$9_ZiX@7xlq8UKhMV*>(pQp0hDnOZMUo0KQ&LBsm9&th67Mp1 zi|-`?#Cx>q6GnEF#E>D9ByzeWgG`jcPn7tPdnF-cz9fo#ElD8W zV@!G)*;SH5hD(abSV;xBSyD$Hm9&tB67T!&7GFsMNVj86pD@x#5Tj=hG#A61jZmt>HGBzfd?NeP)GsUmkt8psQhHnK?K`^eqm zb4d_cBZ(mE#!crq(npd)_L5|gsHA|LDk&qENNUIwNfWtS;`!L^{FKCxyd?=CpGcy} z50V73)`@1XG_r*xhxC^ek)e_bayjYSkVKHKC!0QTq>m(p43cD#QzQlC z3P~BcQ&K}-kTj8o#PgZkx$7yWk00qP2_Yv)qR4fU1oDg|jeH@=Ase4+vWmzcNd-Ay zQb+EPw2*}o?+SN|-y{KK`_oKT7#SgnA(JIZ|k|Oesq=I}UsUuy^HCZjBm&E&(yG4IV0EtS%$QhCtGC`6=Zjoe=xsp8c zrlf?dkW`UBBn`xOp4p;}^p*I&cDLA15=4%YM36Hiab%n%h1?*?BC{n0vS;3)y0f z>FoWMM_v*@PLza^%Ox@74oMPuL6Si}lH`#;B_(A23rwFXvaO_n>?>&_M@f85cZ;(m zLF95t1eqa;BM(Ya$V-we@~*_Wn~C$j`mLmlbh*%MQA0MBG?Bg%&nkD$Are1wmL!B+ zEr}xcNfJm!l14t41NcW3P zALo86&RGFT92qQ0A*V>3JFqxsO^_6jyrhggD5)XONt(z)iD$Jtxi0Y|t0W=hFG&kxwUONkg}wX)FmyX zE%CP8E&P|6J^>^w2_tcdbMG7Hr!p-`B6&#$c}kK;mPtxTOHxHPN}E0nBqV7g$4GoX zyM4w=g2-)>2vU~Bk&h)Qq~mgvo<;gd3P?m!M$VMfkZUDP)>6p=F}6(lXGBhw`PM`)R3zsO=OP5^PAh}Er}m#NPTDCLbklp^zr`gP97);ASX(~$OK6Yxl58nUY2B#&m?)onrzZb$TpHH z5|K2JGbC-~YKiX;cZ&xkL1cj>f_yEBBkN>LpA@pAB#T5P1>}558JRArAx}w~$a0CN z?RNe{;zzc;%Jc~#gCtQTAxR+DNYcndk{t53q=>ARR1ojgCf&JrlJlwyN?J%%;{DS- zCMgLZSxFcvN@7S=l0=%44C1}U^vNSZNePKcsz_4OK(dlHQk3}qa<_O-5=6RRYtkdg z9+Ehckfe|qk}UG7q=5V&DI>kFGg&p{NJ$f!Ao2X|c78Qb)#1TF6|9x5MgujeRKzApWeG97cvqV#u|UB=VvpgR~@h zWTzX<k_eKK#F3{ZDda1ObB`)#a<3cB z;VmOFXlo6KZCa)=~^TrPBTN{Mr?E2p!6nwgwKj*=9S zt0fiWc}X2vEomX!PB)XiUEQqXB?06{iF3~^r%y!^L%x$F5&sM`IfEQ3$s=PWCFFid z6{$%Yh?O&w+sJMbpT})@k|c;^B@yH~NgVk~l0yD{v&qUL5lI0#OHxLrN@~bck|t7@ zc)GcryUsLOeq<*}2sug;MaD`J$X${&GGCHIR!NG8?-r9@LH3o@k<%nCtT&)ZC&8nU;fi5xHS^l&?0Ch;SANeFpC5=B0iB#^%) zX{7h@viM|v1Q(51(2bVFp`qQkh>&F+MIXV=OtO>8%Y7# z>@G98j2t4VA(u*;$o&$}zuc^MC4R(nx0xJ5c9KMqm?VKrkff10k{q&BQbgL43bNg7 zlU_%LNm|HwiP!6HQIG_XMUpVGMiN8%++(tmNK}$RQj$D!x1@wrB~@gNq=5wPHCb(B zn8dfPyG2?OMCM2$NKFz)ItpfT3JFTG$Vf>6$wM3GY@31osKjpQXcgld$fUQBZ6w}}+$|!K0CI*Tj9e{=ArDBB$O1_Q`C5`k)_K_UDIq&csz_AQK+cu4 zk*N~j#_kr6NrK2?Nd);p5=S;Fnm#F{za)#qBn9MRNg0_bsUgoun#gjA$LDtbP2xv- zJ!1NVkbNalBrZuHmrK&fU6LH~ilm5qE~y~h9yRH8WP3>q87lE^;%+fo55Z1X&^UA+Q?%P-@n~07DElQGN}gLlgJ=R202@jN2Wp`<0L_3k|csWD2XFWBq`)KNfz1qDU)76j+K;=Ya}(~c}Wxb zUgGKHcHZV`Gue+ED+wV}BvIrgNdoyvl18?F#!Sv3CrFCOjgkuTnxu~WDrq4*&oh&~ zo4Z>aDhVLxO2WuZk{I%&B#A7OWRTw^dBp#$NiQJ>NUF$bk_K{>q>apx`26k`3nfA1 zJ4poD@HvwnM82avraVdQK{47pvB zMBbKUkiR8)WcQa$RtY&>Qblf-G>|tWZRBf-Z!33;^!Tr?=aAio}mRE(sy;Nuo&iS4~y|*;|rEl9C*9m!ya+ zl~j;!ubIhpWPqfFjFxz}cDJ}w5HHL|JKxL+B8N#L$aRu9@`faZbbG_h$sz|z3dkf$8F@)kL;jRB zk-iJeWY0Ek=Tjwq(klvPe}sV{Y^7DjhrFLA-773$lH<%(&a5Pr;h9) zX(4AzyaBh*9g+aDL=r~6mc)>53r$uM*;5>96MN&qdl+=(9B~7I3Qj_J`(e1Od#E%>;2_ctBqR73H1hP<)Mt+jy zkj>vQ=|yCaq=Jl=)RCJdE#xJMcPDp?uO$Iw+TKu(vmkqHvt&hF$pBtfJsi69?J;>hok6tdYe(M1rCNVw5C+Op%0gpl7PQDn1EO`im^wBt_&_ zNdRY#7Mw2*5g-o4!|o{0Rtc=mNWzbWw}-$+8pzgC;{C=!$;ki#Wu5<_m6B#{>-8RRob9`XEW(o4wpk}7hj zq=B3(X(KmDeEYduJShnx%OnxxH%T1v|77~4kOL)InI4-ZEL9 z{oT%eC4M9(2_ctBqR2gx1oEaNjjWdBkWGI!=|vtFB3%Nz&J;2>!o+N<0 zF9{>ROJd08znDHrBrM4wCra|j1W5_GOHxH%mNbyhByHpmiEp60#b&>nK0#zJNdy@o zi6a+DQphw(7I{okK;D*=k#8k6WbHMkPZQZ*;u++2K1kw6PM3s`Ns=gXrzC;ABuOKm zN^(e--%Ot((nnH34wTf9grtRBC2{Vm?7XwxF9{%TNW#chk{Gh~@1{=@*-4T?4wK}O z^CczZ7D*L(Nzy=8O4`W!f0%UNf$kQ2NrK49k_d8*B#t~LNg?k^vdG_(0DE|k=e8zoJoDDfQXc79XhN4}JVkggunCyMlzB#=RpG;*dShfI+ak-3rz z@~)(g{4QxBTXi#iyob44L?i*^Y)KfIDv2RaN|MNONe1~-l1KV102v_( zBV!~nyN$A~Ii6LB5yNk)9iwbmt!K&b!SZ zi8sdUM-o70NWw^25<|X_ICph-Ca<@#$;u#mN%F`kk`i*Aq>4NtX&@g++DLbw$?}bG z)B8z+$Vrk2a=j#uJS|BfDNfQ|$@f_!N9wzZ4qa-0@q9lsUk|dD1k~FeFl0!a~6p=NO3bMiG zW{WzqgQSHFlz5MKw-_l2AQwr($aF~zd0di27E3b7_mVuap5HVqA$=uPBr0hjqa|(R zdWr7@cZ&xlL1cj>f~=Ipk?vcVJ}IQHB#Vrc6p+c1GV-XThP*FnBAzWxmM89Z-c{m9 zj+caxt0c~S@SXShxsn9(p(KrT-^yg=kliIkBrd5S<0N(DHc1P4UgAB`?NgTokUu41 zWXs;BPYgLgl0;6CWROXcJaUhuguEuHA`M9c>9(~=ZzJ1Dd?&eE93}}ODM{J^ZKPv6ljS?r-C|ow5IIy5LC%-Nk(?xjJS)i}A4>{I*X>Pu8QDQnLk^cT zkqafB)7;KCO8m%NNeEdYi6TEr63E6om_BJFB*`HoBt_&BNd>t@Qb*=VoNo?r-u>Q} zcu#lbcS!)*d`HtKjD#gIQ#jFI>f?iRO5 zobM!XHhobNLB5d05%10>D~0rzWRc?~1!SD0jN~OX4$ysECq<~y6DI+gQYRD={6WMBCGud;V+xaMoADJu(Ax}x7$Vy29*(_`(r;)=X zIplIl5qV5fK|Yhzk&X8=lUv9^67Tu$7MDr_NKO()o|43nWs)TFt0aT;+~1_K;#pyL5c=wAC@#N+7S>@!WYZnw{hShG51W{(r>v$nO*I>@>k z8DqTaK`HxVZBX>sW3}+?FG)F`Y84<6B!!vt^i-L#%;a zJ4V|w+?sQ#o4$!H<7^pWIo|=$(Q$Rp*ZX$qxWV4^SZhG1OzWB0rAtSnQ%3&RF;Cl% z&#~61|B@^1IU}u`I_1kQeeKCvTaLF@cgm!Wuq}C8PO@U--1H-CdBB!athvZYTOPON zG|RbDzv<(7#_BlT@{V`p%P!~J$Lv$GIue#2x!jg{_E~3GLF77HUbN*bYZP*;EpOR! zwlx;H$Cf3wB&`xswB;jP&a)~=*_KtdTwv9Z*KKLplCqq8_d9+5gIr<-E_3(#*p`m6 z)iKt}b;`^h|2eQr$J(}xvz+_#+t0fm)p6FEPWiISas9ehie-=1^1mF<*C9nR!{Emv6c zI_00q6Rnp!<)6tDt;NjQ+MctsebywajSNMuw04-#ncm|fTl(3@OtwOu^3UYSR=89C znLOEwx@UD{n3J)_A`c>0S%v>M=W46?|K?n6l{srEXI*1`_5aSg)>{4l&broFU#~Ie zHGiGeqf`EAc%9X=Q>JySu_rsv#r4+6|993D>lF7GJ*QKwyWL}Ycm~_ARr{tywa7a zwrpkhxyec*_i@a0D?HgfW}YohpBdJ*$a|7C$oCTGzUod^*8|O2$xfNp(bJX_?erPe zrySGQ7UvxxXU)0FIqRR-*v-!Wwf{H2+aUXxgniaOa=0x+?6YpsF^-&PA9JhZjs9Ia zkIDa!jJ1!s^M7QbEwd#{IqUxa5$CKq|0B*>4@*Yc>DSvb_kU!XEsy_?+-i&c;$*M$ z*us8G{4a5~cvf;5$Jod*jyT7>XwB_>#3pyX&#z-Y8n0N3J7rSG)%G#YPr<8J$JNe> zlRIYHGSYq}ylVOWOPuGuV(oxDYaiptd@GK;ZOgrO)>HHO`z#9q-xlkS%XoyV*Z< z=J}dy%Uf2gQ|5Qvw0lR#1$O#ED~)_&pXEx{J*%T(%QN;_3#~Q(B`?_WwiUR}&HBkc zrkCAkk(KBa_qE|<{l^;HDgR_Gwr07<^spjbJ1(}<7h7|f)5{iT&SI;A^hcIhHRNzx zoJVY_)#w!WQFW!+DKmO>-MdT2efDFx)CyhiG@Q|6Q(GSHlrXZ5Ept01f}CzozQ;~~ z$BH9aNeU@RvPeTxKsGwa%qb)LOKQkyNfVhR@l0_$zbx@1Ur0j82186%6bVZb$k~!K za+@TFye26kt0fg=tAkBe9T_5NAy-JeS$B()B!GM)2_st^VkXCs;gTeBg(QQ_ljM=_ zBqe0?p=NRwIZDz%u9dWrrzO4{+%3MA1d%NcHIpOAVUjp9UXnr{lVp(*( z*L&yHJ48}LE|oNqCnTP!?pYs6{7BcRnH+MZV|!a(wSP|Ev2vXiPwIFmoIVx7NMCUvZ`#raM2i8ZQI zuI~8LmbG56IzF|o<(N$mcjYr{96A*x|B-e7aeYmH9KdhgU+3OW zBNpPDuMi8_LMDU|VzF2lLI^|OX@r?ZpOu76Stf)=V`vsa2xCbm3?byJePu!{7Hfp> z>wV7qd_EWZ876&2T?@52#!O}T05Nn`VwpKCUqfi6=b8lpp*9P%nB`Y4CCoA z%tGdnS;aB`f>4`7W&_I<$Qg)McQ zsay<4N5W2Kxe~EAVrU!gWUga5Dk3Qls=7{xw91%)fII{Fmnj~K#;k_?+pLwMW-V&- zu4a=GaS8I!KHbf1VYvcAec#P&XITWHRpoBxAWMBj;##OKmHAznhrT~fGn?M0dzxiR z#DggH1!DFz>HFh|5l=v9FYjr#uyjPEi}UnAzLKSk<*L+Y5Ngj9Go58qMCjY%lzGxA zINnieiaCcRB_gF#!p6Z6s(p&t$C4Y7%!esY*f<-qN#&7JDfCg0YSyvnF`sI7uv~^x zvG*MiFEN zWPdZIm0~K5xhxrGiK+0&*%cXPQMTRqc0j z%)#aW%fk@5Dmla~enQ1O4=F^cL(S|}sy**QXsc$KiSi<`QhW=c@qCz>%JLh8_WNOG zx|FaG1!_bcW)`sgJ0kO0rbASo3YHwmg{bQ=vxent$YoN7q;wlQPmhs3JeU0%r=&!h^&)REv80flw*#M zNIdp6%>V@vNo2VILZdFvOpy{cu7FT`PBe#EsP7~vneo_?bW|=x%nI~trkTfbE0@YQ z`&gPe=45k%sS&YbpATSjO$RPc8|z>mVF^>kmn4umE~Xvji|HC)l#aBV_6E#K913&?rd{} z)s;Mcu~c?!ZGKW znJk|}X#1RJ4oKdrUmo-fJE;R?Gbj8f#%yZ3Q6(jWe zXReurElF!Oz1o>;=CJ71&RnxhiE$C~&|aQvRs@9Zx6Cz%0`fg-zuc_Df71L+{n~{8 zJDwI^Pepqw%}x~)xth4q?BY^iA%@OYH=09I zDveDL8b3Fh<1DeWwM<9}8}Si|?^64HPskMX;zlz;%KDi7Aas}bCNo`%+NZR|ZZ@+5 zLSJgW#mo)J!H`)*KnT5_Ww?G~+OV+B)7a^3aG{YqtKQRQo@q>mPY~{}I#wkC?0vs6D~jJETNs{|L|&6OtujCStypF>Ne`5n0D_RYXRmR2jEGXk@-? z7Jf>3s*EPc_sFx(tdY`Sya?F@dEXrRjAFvZyO2L2ADN>8aj+iv*sT3r#e9hvTE%^0 zu4DNLvMpjhH5=DcOmwvT*KC#&HjF~mp8uL{QlfLz7iRqbs8n<$d|^&ViRSsjw7!&? zMFR4qqOLE@IF@}OQ>7#-kz1a={y%7@D~a4+U2kTy=zFm1&3u+)ktYkK)|AO9_jIASF`9RE+E?$@gaJca*0}tVGNekRQx+Db?a-2#x0- z%uJTIAv9KhFmqT2IA)`n$FiAYHkz}gbbH&Ljq6-w9yN=kyzV7K=x+0J7+dbGDS|I(*!$lY%>4 zhQVfT+3# zHYr&OQEg8BS;=D%Zu2inUV*6g)NUpT8y`Vb?fK&*)yARE8uIM9#cY;RWsD$ZLbkaz zASSM2el*FV z?NY+VaS`d0vc#ALNkCmOR?2TwYKc+I5^EJm2^;eu|3ZvuwMbbXQ_XoSt4&ID#b{Z* zQo3XGTxVNDQmVx=l%nlpTO%y5L8xE0HO}%S$2gWTLG7s)6CC4MaV&Z^cC7>!JsZ1L zvJyE*(H%2kr3EAfz3{Befb0YDtvrQ6VBHQwrD(PK5< z8eq|5KHeH)(PKW|8e!4nIo=v$(c?MZnqbjKQ@j=TJ8g|Mv3i8ZTkE7m|E`BpQo_cr zXfti+cx(6%Dit=;BQo))lEWiX5krS+*f<_SE4_GYkfi`}B(_GpHO^85$%SlV#l@;p zmq7BQlv_%!fXsqyYprHk2%&8_*&4T1Oie`69VNy4#TbPsHQ6e5mE4UOI-@06oh&OM z=OJc0D?_N5mmt*U?X4P?w;&fGW_zoNuSBbnB^g33 z+|g=gIRHYn?`XA3iO$bES?wyuI2JJ#$h?y^CZ${G+LNqtDH~!=Kuir{lB_tN+Ppqy zHslT|2~wh~og^z&iOftbOtP}2L^JPf(Kk@&nvpW!g*-c3v!z5c?`##RJdw5N&Q@7K zmdR4JO5}Qj&U(984N{_Y?P4`?%#Emvw$CnB3(FD+ZJ%8%`j!gK63ZYo=98@smZu>! zw}?gZ z(8__v*gjSX3$58`5AI{lR}$G5X;y`lCB|=P^ZO{3X3dGCenrP~npL}%>S^eFwN=xs z29|$8Xsf1K%~Ea@`#@;#>}###82Wqnr^vjomAf_NsT2nwhGu|$tr98KLa$r)wI*1O zLCl~mWyP!73m_Y$#Isxg`5rRWN@Q68*(4=}MXv^@S!pbKH8{=6WT{7~Ur{RE%4T^C zLU#_+t$ZnK%ry|2TlTXGIA%S>Ma+IyAG$7vvBtS4yRf*&UK)H3cLMa)ed4 zo!Vjz$V_>Twz9V;Sz)lw>rBnag>!Rp+R zGIz)9#W6Fi9+m?l(#N8oftg_qupEUL+FyCr7)w6Oi54C$keNwn?mfw(?{`pLBuAj9 zGp)pctgL{{g3PjV146S+fmINY*@!vSDhkNikkhP^fY24< z>DK&!oR659kTm#TGQI*vdkONWIjno++r26=rhQzRvC*v@7!wDu;{bHtyUw8zOJmb zx}=1S9WGR>om#7pWmgDo=i97dmZ=b0dERD?OQ|#t;!?L;%~MprXus2lse4u!=Es?QK@#KGf#0aSuvWBJvJC%hMg%hP`NEJzBWdN}NXRiMH@9D@}>eTddbgmlEA#y;dfd(p#+88e!3Ge%ESD z|7+$CtX3(}E7m@%onv&KK5KkGRZ8di*lOILq~7=dZEi%HKeMtklza|(5c0WY9QfC| z{%a*jiPrUnmGrlmFRU6V(S8kDbsVGHGiVh~|7&}`w1y7)Yh7PkHJPeC8_}M}(4Jwd zpT)k&G@gQdYmG{Yw&y!*TuOAme`lp0^4B~+So2wQo>8k#N_5oyXk{O&O3}!C9(Da} z)kul%(_gGcDbdE@AM$jgu2{Q>B?r^3RUEpOW`hpRU0z6(1innO0+#m_BtuitNtW=m`mvv zCfUiyP#!$VgW5ks?Yr2iEX|OwAiLV@Sg6!S$nJLGv43sPo_2$ju<;m5(MZ_aEyG=@TtR8F+a?HMnp{HLCvD@*c z3YE%+Bts6hJC#JB&FNa{W{Jb;~3qq<7|2hg|6t|L0!k9 zJ;&J%QZ{(Hr@8hz7TwcaJ9#FR+TiJ)=Gy5jx~I7|U02XuP~Fqx?J|zhJv~A9)czQ? z&qVD}`HE#mBxZ~yFCy+7RqDiuB(j_okqpRb$UHM5$3xDAoDz|9A(uc-iwHeAJP$Ja zFESr;MnvdYVk&jkUxey9Tg#;DkhuaeV8OJP)Yljz!m15viT-byJ(e5!u2mjEZ%M z>Q_{@j!3i2tlE4p+8nmqxGtS}k-eHlXI^BlW6_xx*@G-P^CEjxO1IFn%_4hTimK~D z)V0VKr^x*knYAkIcq!eUp0z6NWEP#L(xx{|Fk^dq)~dAASo9oKX{WR3IjYjmV9|3_ zrJc#5=cr0MTS;V&s??$SNsCQdCb#s_jyh zN9catWS2?V;OVh(lU>E4$Hq-|1B)ITH`y&LdTi9#?JRn1)Yx58RPE2A_M7cKj?w${ z7JGdUc zf8A=AvFN>XtKBF?op;uv)UEa$%%^lV*XN5`yGlw}gU%-6{yFrSoYj-Kls+7=m zEw;y`Y>3hG>SEhERrV`J&#SlF2`qYEt+P{D^t@VcXRzpb^$t6SMbE2CYd=y~-Xdp?VvSDWnGfY3SRKD&cO&#MpEy#b+lb(uY`Br>nI*h#1Tb&Ivw1yaJ| zY;3U)P-?kdEJbaxPo$KpQu42gG?P4RSFq^g;$gdvMenai>~<+C^C0p(Vs}YVnKwvT z$EEZUx56G|(V17+qbxe}qc*)ofc3Mu2yOlzc^q^QiBq@+uUj>E_7Y!+SDV|G4^ zuIn+oNJ>~#AoH)t^SE6qMP)YdRP*C@`QP%i+O>bn(`q-d=ox9H-NvG4iIsL2i|*G- zdss?XzMbcyu9fz<6jl2qDb{Q?e)Jjb2|Ha%x6m`&D!YV5_jHwA&Z2v|%C2S6Eo`%! zS#%5A>~<*|V)VJP&F)bWIafYu_e-fa7GsOi)8kLtgHo!+Ll7D*PuasPuR-Ws`IJ4z zvK~U`?x*bumMsvv;&|E?XHZY8#Wt6!n07m!B?Uq;?RJus=nDTCyIe}xI0!L2qdgsV zC(99#6v*>--FGykr+){Y}?sWspq7ykd8;ltYeythVV%GK#r_ zrOQsiUzKP^($^O~c2lv6X-3S6DAjAP!xbHsqGw>vfxKt0#yXYcNyJ=Gr;Wwjc@z`9M*GPwkfO#a-6h^+7fPu&icsn& zl-gw1u*_u{(`ypD3PK~{XDyTT`xjBs?_d0EH>tYBk$Ap^#@Nqx3rijH&=~vKZevNp zU-l{H7rTRHPYA{QVt27T!)v6?cCRjlcbq9^v)#{f7c$dxgX8uf%Ss5{bsV=xSk`ba zw%AEm(DtboA3$iVZn4u?zT}u+?LwB#9P_JP!VlNAse2{BHNl%?WUZ28G(VT_Z<@&M}ESxSKt<74cLR7k8-6p(2U)9DFF7Q}J- z0&+CObu!ARUrS}46Cs|H8<0~VzB4-@r$a){oPeASiF4)$8^3+2T zoiZt^r%jNZojNJ1)H2Awopvtu5lTG{+099~TIC@r!Tw5dGNhLAp1BSftY?snzJqtGYFaLj09r7hD>uN0x{I) z{Ty*kbT4m2%>GVBKz@c~IEmM)m~YTik^`NTfcy%X?xY7K7VjTrI;8;#K@M@+00{XwrLKUS;tU4l8pteXBp^3HPIbluQVluXv943wClh&YgUoi~0Rpx6Dvo+*OCzs_`$WD-}oq~Yu3c1Fq3dlZ?Yn@J( zCX|{EDR+7Tau{Tx(-)9qAU8P4*Q?rBq0~u`MNV2kPK8uDnE^Q$a-&nq@-j+Y3aN3* z12PYCvr`k0YazEfeNv)#n-@E2H&E@>;$7sSv(;iJLy4Tj>1?&wDGUhB&$m0p|B#Y^ z(5!yDGe00ys?Mnh2*uPnwE>~`H0zzlfY6(gOPm%dOAPvJ*CO=dPNze~i1lbQorxNq z)hrt!be3s!dRczwn7f@m79Z;uin-evR1!H`-Q$e^LyQWweRe>p+fe&Gj$oMvSt2EY za&HNr+JjFxg)Dl7w#unx(JQo7P7{k>p|v@^ zEP933<_xgt)!>s(+>NS*dNuf@lcXdv#-4Ig0z&P1%E{nTdbRwtlO-iA`q5_U`_oP? z$LRHQyOYl`Uvo^mQ^+y;3DRerVvZT-zCYuXs+dT7o^|F2gxd40Qxy=J0iJW}0zxyu z^G=f#_157x*zzwry;9ViFa}xe^atb*$ZO7MKtgy|_jM<`T5hpOd){<%148Y2(Nb8+q7Cj@acWPMljPyUJjz!N%|8v?|^lbB`)5)S|n=hR~ zmfcW$BWfRVhFK1Q+%F~WX4S7#Aj=_NISDM6Lmros$x;h>3bMhO&2lfKLrM_~U4y8J`fb4 zFw5uI^0eOg$w{nLEgXl?TH+@sRZ68X8Q0Aev&qSn61czNbV^w&S2FKo4{mb00@5#K zgk>7?P|TQS?1J>+MnypCe3jUDzejPD?uo!WqGf^2abrK~Ye zMJbZsocwxK>LLg|5AeHF7?9r(^M_Ls5Nj>2*4?UrOoGI?byC)tS0E3G>E_-+nemlf z$o3H1ZD>$(2P6j)=ce4LYCrEF!=NuGOm;H@QU=-1%?`-*kVH2>AT^MGxrI{JnD-+y zmD<@g?xxI@MjM1?(PTH7<#k9MVv^l-DN78JM#!#i8OMAIc?7b%+a#r0=vgbp?Pbxk zR*E~oqGzo=+_-yWzl5H(_HdI}^lY=Io5!MOn?2n^7Co~~acf!h%r?bsV$m~Os@uz= zXSP&#fQ4q8C(w(%+##0#p-PtVq%($Oh#G=oP`?)17`V70jTgIZ#u=~3eEI(qauEAD4z^!5V4MOMl z1Kb7{J%?wwJuG?-&v5%$^gMQ;JHn#pu>;)+7ClEzcdh%>_R(|Hbhm&-p9>Cht6228 z;2^hwMV|{Y-7Xe=F35EISoFEzVAr}|)uqn`2fGO@`dn~`o5P~d1&6o=EP9?l)U9IC z^ZcQ11B*UiWVu}|`h1b)_Oa-5!C|iTfNGCE7aZm$u;_XIa5t4j&+~`787z7ZKf*0$ z(R26_Zkd$m)p534t70N6#%#AaAoS&^Y`0%Z*syVD@g0nWBi*=WYGK&e8bT}TBi&S% z9U=6@?@?~aGK#4;_JH)E)X{E*l(3Njq3h*bH{n5*Cl~SsVshQ&fDA#7cWWO~F()JD zTgVKzmE~-f6J4u?V$_$w>D)BaO<~b*(avVGX%!^3tOG>VX z9D>?UcN1S$ax=?pw~Xac2=(F&H}4e{^9<)X)1A-qN<^Aj-i$~O3*BR;ex2!#v3wbk z{M9P+pAl(g`PWstlz5e5qHji@>E=qow+$~-+we>`Pl>0mM$dFhSoF2$nQpn1u-F@! zt+%K>%~GmG7KE+U#>XI9cL*-DH>yiuJIbRxmsKX zp^;hW#<47b(0)JLO<<{k&|W^YRty@_+(HWvN1#kp<| zi+&^HTz8OV<^}40!ntnB8fszmeUKuzK}xrw-_bbF?Fb0H!FRr!)kUS&#Ok*xi`^V4 z_!cF4L3_E_t&-AZ=y%_W-2oQ;?pv`t!lK`OD|RP1Pb>2H*gM5;-0Nz;>-RV=atm1W zdmIenUiL?DLt`(GYGlirL9y&+QWT5F?1?}IFKQvyQogIw?C1ccrPxxt;!qTfQQa64J_+g@R}PYS*y z&tq(nJIXQyp?$H)o&6To9yUm5UsSriQmVx-kZm!ds$9`aG5E_q{;ETAqnjh8JM!Lo zwOhcVzs*wZ7PII(RMl=7i=Gpz-6|=s3q2=PyEPo6zYKGe+sLB719OwRLW+9xcSp46 zCU-RpeVZj2QsauZWxvEUw0Tb{i7ZD&Bx9ZG`&p258PmdY5hN3Gi`yqfT}9FxvbVYu zO2mA`(EBpAuJxYUK9!IoP^#8VV_6J27IK@LAth|w4at+z$g&DD3$oZvd!O=j8~TjD z*v)6r>x9K_8H-*gEOr}N^r~R7+sUF=1&iH57QHH1>{=hFy7ad-7P}cz@C*amLo?E1 zx8-BCeU2@}lMk|m$)76uoO^M*yN+ceOP$;KnTo+DFlA5c-2s+KEO)pQEIYF-ap!-o zN~N(hxa+=9k_Dmm-05}_eGRjI4E)ZK0) z%Po*H#N6Yi4XK#>AmxxIH=E^gmiycSmKPwEh`HZgA!U8c8VH@6n%zDn-uDnXGd8=% zSCo0Zx6^zrX;Sd(5|G=Fr`gS7Ig@3Xo5OM$%Y$wKOF5(gr5`KvE!`ZVOBEpkW*cdC6@J$Wf4&-C-$9465rS$SZFA z*Q$km+`?DgWKxSTQP^tAYri|;F&zaY`<=mbyc)xIOaXKiDUGc=zVwf zx71TLR%vc|-|dl7ZM2{iz5V*W8~2^u8pe|>AGrA}G**8??R{<;%PWXc(#Y~=L^`E( zd$i>zWT}3ZK8X2ttnr~crX+^OVF>cEn=(SRcYB{BhPHFRo6YidL<*I}&^X){rTX1s zDb)ta&Qi)bhDI-a#kAjT)$hsO+y;pexiL|>6A~+i0&+jZ6z#Fmm{y1-(#@zm1F^+G zK-NGUQDRX{y|FV!CVd6h6?v9UA|O*ldqB29df>;&0M^admqvbX39$bOK0#E_Ke*T&Ms2+ItN z!y^!rCNOmIZ;g8&gw~>IBF?3KvEEw=p*297NR(1-{0yP%lzm02lqE*&b+{fxo_$4? zl%>XYkXevvq9Gs@lP;P$PcmZY*NFBP9RZ=QYVR-deX70MpqMjJ>Hsk(AQwO~M7xxw z#$Je_Z$VEN10gwnjQt_BFAfqpaZ2cyP$(u-@#&Wb6VtEKc?}X-v5zg}>gw_B#VoXZ(4tb7f+nQRq!FwGsk0W!A=w|k-Ei%s#DcevByJD_~ya&k> zB`owrVL#+V(JrN1=r!a?qDxAp(Ttcc5Ob19-xGmOmf{zGOaIl(9Gq@ijKc8KPr*Rcb2; zZRfK@;SNf6glvtNvqT-s9uUfWwrFPAAF?B2&Jo4(Lyk*~!y&W|FA~jC)|j+rqdez} z5h>j<^z}trEfb5@P{`=9Wvv z5SOZjOhL?LVua;x&U2ZVU}=F+PfH?m-4l>~QL02(J5hV8ja{&&rP}9;gn&@YbZ=*#XkzJRxk3ylseXL~p;`1wk+U<&`k1dF2O`gvB9A5Edc5%sDHHQqj)TyC zze-fG+yp6=H~EQo^cKg&36*mg{-CatVvXf2+PQrkgj z`z#i{EXP4;eqJobIM0=kBIH>t##tWVnA=6gE^>=`Z$c=~?V^h1*ND`x>|Lc}YL&#C z4Y?SZZx;O~WmdWuUe5zQR)KM1vFiD+Tj=0>%58bm9XIs$SnVj4snOBv(_ zDeWvPAk^jt(ZTXD(o(-Kdn3JCNrtkrA&nv>AT$#07THqP#Oiwv_lP+x`o6@yqEyOK`5S5vAkV#G zf`wKWDk>qfN|K;ynPN zvGJ5BMs?eaL4- zuaxNcc~-1bF_F8M&x)adtVWxk71o~75kZGWV`3Bnjnn+EJws{?7jmVOs zzB&9Uq)X&UiCzVCi2@ZP#~7{fyF`hUZe!2sc*+ZV`E}92@)qvf&>5{;v`C4rD!WC8 zl<5BI7OSOf@Seba{}Q!#iwTz3Sl$qsd&zO=eFFIwF+HM;{GR zS}XbkLdW}CVkjVVy!Q%x_!nb7x_90d87z8b^^PcD(d(A?gtd<pNTFOilN`E84zMBl~Us;5%OQr%tABU zu8=Q;n5JUrIxZD5C=vrQ4YFR8NQsW;FGYuxYU6I)$EMo95?ui~7^OCdqIAlPuhF7k zM?;21nUoE3eMl|*PE<)*A9D&~4#DyDy=YM4wL#|KSNwhuEnJFb5{mgj^y)l_nTb3b z#RQiM)!_aiSs|XC3@ukB8sJ`qw;3N{35EPbj2*VRXsECi)dk~W!Wscq^ys5 z0Mdw3<6>Pv?w68zfa=#Lh*<&IBC=T~*Q)m&wul^-yolto+zfd_mda;&4MM+Fv_%xK z`~jge{uVKt<*?iEq&KeCw}?WPDS&1qbwgnu9A|FA&;iW8Er2Q!yEs)?GeP3 zBW5ozNyao7zd{y6_VI?LMBgBu>W!*ALfo!?#bc^B&ay3}6;C5f^(^^8>~2G6p5|pp ziMDw^FH4C?LaDn^*M43OODbfUl>EQt+25=9Tb>NBhD&8|dosK_mczL{8D0}hF2@|` zwXo!K%z<7T%WRIB?sc%7$1&5rE-BG|9psHk2^*Ip<}tMSU{6f{>vqoa;*~^JAX#1_ zi(Y|bc_~t&nGf>{{+8zmuaHY!fx4bVT}ODuEai~rrIh|HPqx?mw>(FAE2PvL)hI=8 z(H`Y>a-Mr2uOZLTUYC@xco;&z1$MNzE|7;-GCAIaiZPx-49$nfcq0c<-@`^HA?Jg@jT6|)C~TA1gR<|>&Ep`M=T)k&!| zj)rVT%t>CelqFK^KHQV>#PL)ry0)3+#Y>5nd-X4OOR4;WzcA$>%sXR zK0!}g)zIsx1zv%aE`vthPN?fTuSQDP*oZu|<;%Smj?rUvp_h~|^T=x%TKnDLje8xVTlug+@<2tD0b?{x-*o&dbV z>kSBv@Fm`ul;{;ugO@Uk`X0R>ey5izrQX;MTYeU{*qvUNlqCl3i?bkidC8|!sd{4y zq!@CKSHzM5xfIgmB@|Lj^a`liOOk?bP+W{T95KyaD$C(0MY7DxV3`3ahdk(Ivz!)@ zJSp|YMUX`@rs-_eo+}~skQQ%9N_37|?u|%MztczOl;z$S3(e28eU^Jg=g6%QnUNm$ z28vWK^o+E^OFB>0RgJnHKwT@m0x26}=z954$Yb6dDbXwF$Gv72eFfd>b+XX25cG6J zt2ZE}T0Sp9-#={iMx@}YWr%4*=9S)fK%Rp<;boss?TN0R+q`@!>tmLng>=XDNv~1L zhL|?UD=77p*U2$2K)NAMd+`@gp7k-GLVBenvW!DMfV6wbER*lRIvnzhm&!5?vL5oR zm(FqmWEk?Cm&tMwWFw@*%Vw#B`~rF2%Vl{0@;l@OFQ26oVtt6aE8c9Den<$?=@qg3 z4A~a)l2^jA?GoIlg}m&|XPE{`hP>icu$&0l3$og)VJU&^4|&yVkfP2qheFnP%>kj& z(&e>EQSSyGg_zg9q+&H%^trOzOOaA7ZbD{SlXQD&EDewuDAgTVt1pAl-LN;jOc@hh znfG|vT~&tw-}1cYmHaKw2l!GX)uoQpGSvQo zSHVI@CEY3g(5w4fsgJzIfY2)LBd=46I?K?R`eUzGO7s`*KJofk^fR}gcmpi@N!?Gp zAr}1^W*1>gRGl@#aVg8(;H&M_nwV5V{BZ zsW+-b{2CGbWC^xU*a$V?t#E9gPrWjh9U%0#(a*d#mSmOzZ-Rw>pOLoD=U&fcD$f+e z+=7+ff4zPw(Z8gB;U$$&%=*Y*(!cPESoB}gzwlb5bVq*i>I*OBKUAt(WFRxGvA^)L zmB>*?e>?udD-H;)69&B!DbY7O2E9@i{bt9YH=jkn*)izVN>RU&L74}=4whXnR4c3X z-Z+=iZ-1=!;^tBdyAA#J$9gYCO7!iI|9NQ~qu>7c(#w$&Ht4rDYO&>qyaFkeQW_u| zyml_7-_aQM`dRcl8sB&$EczXdZ#?62)t|u(nhZ(AhaSH^*RGWtEL~lzJSpB=O=F@AoTvlCeJEW zy`UD-`xj$gQb1^h_Oq845PJXO7q2)V^!~+WuRI{M(i`_00zxaaEna6pXodEx*B20a zBjY!3I3Tpvn(*-RI&!~L3u%S+yO$UcTA}^nrAb*T?=n z%B$!_$S-C&97i0*#Q7yGGawWb=g()E%`ubw3YH5vW|CjaGM8hv@*7ynIc6)rnMHr8 zZ)<-AOA>#nZ)?AuB?fxjz z+0IX9aqm)n8{%V#f5PCaiXTO)_PzdGux8KK70HHkp_6J%1!!f(~ z!z>FqW*2{qW$Do|M(js;y3e0rxeYOsq=+)LPn#h0w$848Jj*i>YR|5I63aUf%CnoF z!ZO5pcJtF&euYq*clR?{67N!N-rdh(nGT_`n&RiN91Wqdn&Qu9$%oK0RD1YEEN4J= zMD2U{B`oJd=(yO^FJrkJLdV6Peg#W8gwCE*{2G=T2%Wp9_zf%#5Zb4yeiKVGg!XBw zzk+4K40YwQm*2*6BZS(#m)|L+QnaEJ^=ogxi{*I;#q8~`W9jCYef)lw4AlZ=p{9!58@(S?;$N~O%Ku(5a_~}q^S0sg_!AnofP#x8jYxf z{C*aCAB{#`rk`{T=hSq==&q+=`6pIB^9z#N(+nrl172Q znniy}qrmT#5*;n4`h7~|@6op-VwjoKG9#$JS+=2uC<-(gYLt5O;Q@+RbTzd0a% zkTd+YfP4-)%O8>wHfAEvH;{Auq?=V;vsupd=dfH1*@&1Te;vy_$S;ud{e;_9sYQ_3 zkMT^PpTa`Fq_Y*|Vn2;#F=7%Sm-t0>s?Vo<{-%n(r)dlr^zMsNEs|$*`)=y)h)dj^|>u0j))x`oon?x; z*gMzzbu4toFO<^6LT7V|xxsH?p|d%~+~Bvd(5he#q{8oDp;ZCBpIhN~vCv9}V#0ne z3$0`*ChYgK=oQf-e~?A5h!*)HEPCZo>5sAKl|!YEA3&thEA)z}$`>qpMO5V{u;>-h zjeZh~UJ>2sr?TkPMYW&KqE{EyeijR@E@;f(Vn4nO@6+T$P8KIS4mO#$L1oY z#vhPUZ+wqEcpcNC4SyLs?@HKHz7;?VwQth8vSx9VS~Qy^Z{b-@$;KxsYoyG^-GmRuD0&= z=Sv9-eYJJ3U&S$JApV?M4QUla9vIEKdj_EP#dhQ{iykY;~?g~sX>DZ?x@Rw-tgKgvR5m136p z6H4UPpjFC)e$jojeZo>`t3Kr8M=fa_%6&Q&rI!0~QkEK5qVESm9`?(n)En1Aj)FYm zSFzj(p}$kF@N1-W8T41G;}P?yUneCxKR@O-DiQT4MXS@t{AMXt;vopFP9O7I|5oa8 zf3=iu`D>N=$o#mU_&{_o)0(Z-&yo^0o3#A3MUpuPMpBb8SGnV>aUsXASba%rV_DC!$mxWOYQ& zfZPx1^5@9RON|R4%OS7(^QA;rU){14R=GBPQS5QVbo+HOW{G(Hbklem@`m5YEv!Hc zoiE<-n_2FGJTGHbuyjCPk5@sl1`dES9+guLsQN$HCD7V-;Zo!{50V*Z5u0eR2QT1kR83h%=gbU(pc z#{Sq7D&`U8Q6u%ZEOGfK}FhDI^gwANd_D)sR$3zd!VpidhMvFYJBlk4Om{ z-H;5#eCAKE^g|AZ4EPgItGd2}90U2>A8S_ z$OgZH`<8>g{*>n=eMxD0(lNH z;&-vom&s_Xe(zf^P^l%xmyj1RGJo*XST?h4^lMq12UN_cpZp?~syB9oyn@U>`qoP- z&t8!CA;0*AQo3TYApMZde!|PDg(pJ3hHUY3ST2T)LVop!rG$;EArp`Zzwk9GgCh|3jtwOC*qI39Gp$;jp z8@kO~g;ob*a*${1&^jsIhW=~mHlYy~{Y>&UA<<2BslVprq13h^{9pX*wjW1(WkZW& zooClj0*kIIC6pm0x;6F;Wl5XW0y?hU^u}l@iU9 z7Mdd^IzOlBeocy9hNBy$B4Td~St_MWmfGOym}#MMm02VrW*K6pg=(aPja0}ANP4JO zm5R}M_6x0eliD0@Plm4D*3Z&JML&TvJ=7K`^&~PM6zY|-Ax4+V4CSmO#Fi?=A=+R3w;NX zVonOBy{+~Ieea#_W6um_u+aD3=|1+%P&P|CN_~zN=7(}w4u^axr9euh$m5ukLxn8o zbIi%1Ib3Q!auxb@MJR=1 zzJ**bC0&X-U(oouGBomu8XK_>PP6=M!Xi--;G@`EI7cIC=c)Neo|_{vl!w+5w?>5Wv?I^ri0C{^ z{*k945<_`jMX99`p*-(G?urQI`4ndiTZ_`xbIxTV9@FX&XKg zDw0xZl;CZPLlCnf)W$+@f8;(8vrSgqaXRh&9U6LMTl_$b=9=EM!7U zvwSv$&}gK!Erbx-d|&VDdSBFvmgr~ulo~O@*t&< zH~h&g`4Ady_@+OVr4VvEG9CU5mSV`AkhlEVETxcpA=GQy(P!yf;bknnogG<= zL5B8PAN%WBZidia>tlbDEag*Q2>Qg|!lJ$q^of5B%e^Q?d(l3BKg;6~+5`0Yhgj%~ zMKsFdQ~xLneX)o}S$yiBV0i_l=nCFver;GT_ihN?Rs75!VEF>_Bc|(fzr(T#GA<;M zMLluQ?@wacj12Xs-=D>z&Zxie&t*|()L;1XSc1>WGomm3`7FCZ=#1z~e-X=}5IW!Z z%3s2A41~@%zVcVHoWhv_e>KawoEh*pu;g=Qt-p!odd{r%x3b*EnXmorEDv(#YkwC@ zD}>gKZ~Ox+??C8R+c*AEA&az+IWy?bSTEO#{QI22}y<|1(GMFJO;^x92kh- zBIQL$9waqT#PS}5-tBWlpqgbhv7AytqvJ5^^i#m_RSfCP)S3*uX@T%=`|y zACehJn<8cE^Ha2EAg2VJ7%6nMum_S8Xk$_19L^1Nuq2|?N64HP$lF$ynhE&=azUVA zs+8j(>me5f(tJ|RhWrM(B+$xo8B2a(daTS8L$q)3Ycvoaka8EqgcJsvf>NG=>;}0$ zFv+rlGdBe$44L^DvOhAn1V$_=!;mz{ZGmc6$~fdCNJU_LM=3kKfPEC?u0Z=vQVxP# z0l7Djx{H)KkV?psK=iI8725fbTF3(dCsAhTJE2cO9tmi>OSuY}S0PISMJ%O|w;)Y{ zAr|vsyg(Q7OkiveS*iw^?;tM(QumbdBxC~eQXpSQjrI~GY7pnxfdZDVA=^P-4HUBY zU&OT($ZLUOmQ+>4s0LEa7|CdpDuA%{R#1futm@)G1k$f`gQOBdvP$m+oK zeP!kg$kmX(Kt0P3kQ*VN1(NrZnW?QLuOmOFGBu;`1ApmX4DhC4tG!Vu|s6d zZ$aWAhF&>S$|}hIkT^X$H7v(M67-bAq|nm@XFzt-jl-pEM5)UlNqXWDQlehM{s*$Z zo^+%X3qrsCX6ThH`$6tU<`8}2D497D(hNCVPoE`a-sKoC0ZG?q93zF+`Bjh%y@=&B zl==j6ygtElA1@pOvb!lJ(Mbc)`=qQ3ET zs@}_@zVURbKER^B%9pK=vZ$|XW$TkH>g!tBdLTpgP>r2CO;2D^W9LrOlUdXk!RF{` zEb5D3bM!10^|i0l^;{P9wXf6l0v7evu(^5(i~4HVT)m2g&h+TZs%Pj8Eb0qoXXq^~ zt(dE~V6L92cd)3heVwWIvZ$|pouv=3sIPsUrH`_xuYKj{lPv0MUpacwXWy^7_y zi>7FU@8GDXH?XL$Vx6bAu&A$Mov(MWsIOw3ulKU3uVP)G53rnY9>!F3;^?W5vgAST zfaK|uEb6ORd3xY@Ie*rnKT~m5aG{>SqP~iCp`Og5zKV5`p2niSigl5m#iG87b+Mky zqP~iCv0lKUzAQFRFJW1Y9@6i@d3qI#`f}DKdIO94a@Hk!3(F8n(QnWBdIyX8`q+HE zmqmSD>r#DyMSWfCQhij&B8`qRUt$w%O6+ZZLCx3dV=SeRKOxuYNtx82I_*J7)VH{9 ztaq@qLbiikulr7vnGYd0>>>-V}p((vpFOcG+ zku!U|xs6t;PbxvpQnF`@Qob5U7V0V0^M!=(0+;IbLc(`=OZ7$}72X}*QoTir_j{*I z?~$dvJG^Cj{wdT}h4v!aI_hdZt|OpDUY}PYug}jx4=Xq$ug~W|7JEY1 zvFAbV)JJ7oUVrY=$0LO9SKg%?r&52y_baRPd=_=5_#VAe2w(qs7iX3Fq!g_aQ$g2T zs`WrN)f4{CTD6|eqMp;N){9uwbDGt9GmHAhO0_<~qMrAx){WC-&FWdsYCVHRJfK#ovb4Gmur$+B#p=WsMsz{CA&!WDGQ=^Ya z(bQ9rHTr~*@N=3q`t&(872)SJYxHau^_*snULr)!XZi(QqbHnBr7FDne4m~yq+6rs z69_n@8?A@m&LLwX^LdUo<*y_!WmU-_`!8c~X#XM9-ii;yx%gFX=<^z7s#dcqmu z{?L<>kLu|WLRY9B(;Fg$o>gqrJ0paif_z*biV!*$EY*EyhHIwh5TDSKBZQvQY|^tM zgr3TLQZI@SdNT1Ty*@(d`O2sD4i@!gsAheTMLjqAj2?ZKY+XJ5`m8>kWfsn0=_{ z+j=w0I>C>AdBpLFVZd^c_ z8Z95C(ji~yc`P?TPKJD`2l8ZwzRGweWUZbfq)uyvTmbn-96_)T*LxteulrVS6dAb$ zFGuEEy)QzpfqbWr36bxkE`bc`2^UgZ-BIf8rr+!7EcCve+mQKQFJPg!n^r=G^(9ig z_W+OR?JVkzKqLA9m!h}pP(34h%0;p*dfO_!nRA1lDK(|x=}AIrv~^fs)tDQ<>A5UFLvF{tzu)x+ zA;Yn1nf{@-3#stYb2oI) zZo}_o^yg2#@Dl2?lt&7^_NGEI=b^(L0xAvA(?Qg3HD5b``SoAn+cHQLdTHpmt| ze?HY*E4~lX3He7axm31wIx_D=wBX!)DRj?w4P=|(sE`_s-fj2=BqliHGRo9w7opS; zBsQ2?AWK~jp;CIVNl1;h2=X(;2&P>rGxd zEYCushH&j7n0&R&v_o{rj=>3*ZpaRhU4qetlnI}UCI)>s{9DF_RERG%(EF?sgIPCH zrcC=3^}N-ACvAiA#Ztau*)5pDvKg`)+S)x>bd$_XeN~p49_+eViU~=hhi*&A{IGJ6M&63T@8yl*gDNS$^tGKV0uZ!nJ~9dZ;TIoK?uR+|es0kU7vSSaez zE{2>AIUtzJay?5*u$kp{NG>u5274pqV#q zQaE#Bu#@E&2(9y{22;yrJ+mQ?qEvRUIznE6oDm$jU1lysrWV z>sgLpERWqc1dY2yCYIiHwjW9r2Mbu}jlMI5bg|Ieda3oBg7H#|ARj~Of+=-US|Q&+>VwTJZ$d^P4+T>mkeStx2}nb*p5tZxP~PWnG8sC zF!~{?2X_Y`vmws}(^-y!Tn2d|Sn{yU-B5 zK4H3=@n*0=NR3vFOoPa@N%5X#=m>TRsn8xn=1F8af{Bk(%@x`+kXImYsr^sPE0A{~ z%RT9Wd<1#hlW!qwA)TI3%^M)^Y$d-#-t~mqie8U1{H?@>bOlR9f5Pt#TM;Z5QltHi zQqz!G5$qJwt*QR33?@HDQ_-!dK7SBw7E-2#-oTL&rB(%d9+w%_=l=zhm&&=i4>E@% zvpU!+q+84%nu?Et)1Q!;*~lD=%*VkcLS%-ft1pO;jftgv88TVOd>YIX(k8ZOEJn=?`W-Df>fngQoqt$l(yc8+%?lvk1luDriy`ZReVkc|%sr5AgGov+c|shvY6Zbt)^ZH;Tiwk*CNDE6M zgvMr!1lw5lh0xfHkzl73?@V|@u!l2;B10p=HU!rQDf1lzp^;!4f&-j61@b!D+87+- z%sG%QA!9P*)x0Sf-7J=ccqcqPo3kmH!a~n_&{)|Yg1Id8<;Q1n?l%@J6e6D>UW1x{ z4wgj7mylnBW6x5}b=rKiz8>;>aC(cB>mk2F{s^W5twO?Y2HqTOXQ69xbS&5$?35zrPb%u! z9PAe&pPi&@x&H(Qg@m`$e}cI$Qh&nRsTLX&Ql@pG^`lWwR4Dx=nNizmOvv}L6t!>J zHq;d%v<*%T&3#2?)V{?R%4`b@ZC|mW>{m(3v_7s8o5NZ}u z=i7i%=b}^~)G9MRtz(LIp^$dYY!AtY=%G%|><+nBNDpTY;7l;IhBL=-CK&4H%o&^s zg$6luDQ7~V5zgGi86z~tnZ=wjLKB?1AF>dwn<4Ern)Vvs3y=ySJ|T6!_c>#Q49*O2 z#tOxA=4Z~>p+wI3-jem$p(M`i3ZZFtLMfa%975CXgi>WjI|D*<%ngk%qyE%smqMx` zaiQdPDc3;gO3wD7QkDgfhmqMKWV|k>!aJhv5K0hIr`?6jlOmJNQqQtesF>M z%gc}#P-@puAIn>icF45QkdRuf3-UH(w~+QGwO*?YLq3A+8A|C8{n7O0Q?&0P`-bMS z9KwXPF1dB0Hl@~x+0ztGUzBz4+FC^d?D_6wzUO1TyCE98LC(7RF^ATb;8yD60a z9!YqMJ1kTvB)r8P7Fxrij*N$g(z>Wrx2CqQBSOtAYWqqH4MhlTUq^-#SIAOo`#LI= z8zHoP9UZC{65g89LybbhTT^x zAF^bGiXvoRWR4HDuzZ9}IwUiM$=vF0&PgotZqD(@WO+hQC7cR5#S^-la~@>Qf9g5i z%h1yev_Cw<6RPJDlnM*gb2a3w&?NWpYxM9&NKR<9M^5QR$U?|Dp~RI^Xbkyp-MDug z%3%q-jV%tD^Fu8xJ45Kr19_nymc3Xm3=Of&fZT&p7ll$kpqgv7lOR;{C82yF;iWS_ zR3xNMJ0F=3Q1kpyA4@*u0n~G8C~1}K;mw@M50$bkf;@)IWua=88pxB7%R|wy32WesF@|Y6K~Q$JvW5nK9;4vgiJv02@SDqfJAM?ovcvqCo(e$iG|dLhFF5{;LHJ17s~jQGBw&B zkZF+mP`?oQ{sg+8`%q{oLiR=G;gIv0tobOEIvDauC^Aq@^K;o& zKI8;so(y#fsnc$QoCbL+l-)0Du7~78nnRUBYP6-0D^RhTJT-@oOpYvh-DwhE6BVa zDq%SR@&@FMP&v!R5IVDZGgKv{!gni#-kIMKTEbEVp*w3Gp++g*dFET8wg{ojTcI8) z+Jh)XcMO+@0&A&<_&yPY?$o>;%3@L1Qr->a2`SSWxvh6Y4MM{AyWb17a4Fi`yo;%L zFVw;E97^>-R)o5Qg!d9FLVYshd&|oVu)GhUDP0j7V)@LIQ7K|dsn07y(O=V4g!|JI zN)%G3twX5~(RxoPBSJodtO^xG$RK2Os3Af&LHa^#gy8x->iGlmWoU#mhnP8?rkx>q7}Fc`PHL=`2@6l91UDN@uy5Wm9OL5P5{%ADJIQ4N|nc1Ea*1 zw;w~jLgbrx=~~=Rq4IBK>x)p&;V3m0s$#hlaxCQM&=QvWA+#6$CDg$3BFnF#CYCo@ z#zQSED_MREwXv*&(BAL&PzOtElcr^%tv^CtER(zsp9uA`Y~*_W4E3>`c8uK5{}mcw z`GqrohlW@-vrL9YS*CW$sn{GEXR#r3(fXE9@pp1=kem;RGM2C;L4p{mGR5d&IT~^a zGBL&k%N$4nWUApCqI&p>8P@q&BSDJqB4lVQh&7U>XxBlmMX6XLlcj`ZJ7aEy+=PtZ z$d8axNWdr+QY+pju^6Ho9YQL66{zQKNYLnFp{KNJh4iw}`^O#=(kDf1gHH+>|DL9z zOshpb^frl*kugkyYwy&<_wn1oC}vs3Vj0aWU$EH50LwUp&TSkceZ8z_#}#;12yMj~ zT`aR8uRwM%v=Nc<&W(38&@}$K^*PAUmD2xDXy0=AJCT|5P>M#ygiERKDu(4MWIE7# zSZ@7yTQT=S-i^$}G(vi|k`~Bn$WE%yG4DV=gCrO!8@8UVosCQ(a?4$d%+5xRkl|Q0 zrMnopQljV@^$0S%7zIMY*Qj?fN`&B78`}CsWXgre_gT?3qFszCSx@Yz$k068#i(W( z@??pWs4b8QQBR|g@P0ngXb}=VpHDQ}xE|H#M5CSSQGHG{x`c%LoM`k$)I(z!5{-d> z)icc)WKqjvnlZ$pme(|6ltnG~X~r0fTFTRm2^O^`Ofx2>M5$#u&2To-(ve>fptWV1 zk-*}1%k^iPFa-ci><-!6=w&&9WnUw8 zlxnWi&Vi&Lv!78ZL@v`b$N@&Z6yMdzoB&BN8d+|FP$tD_;d&N9PJbhxo0bx>17gr5bKXvHyT7{K#E37rwww15&a`&$~2nxH-sdQ zNulYY{v2tvvSgsB4z)Z94EXb@82D?&ZAbdEQgSkyXyywM^{iRrR&2kLmELr9%A{ZvhxKwFtckC5XAJS;nLgxqT&|&u1Bd37Rh4so`}s$0%Y^t)Fcq{YjZ} zAHDB=ca%EENRgtg;I_^&@>o8B(A~Flj5e0_kiAjrT%%V=xb6(dB^NhJt zwBLBT<{9%?VtV9UooAG@s41Oi^t0H=9Eo}^F|xOanl&};^NoBVa=NI8ml{Pv!qc8_ z1pe82DlRkPg@mX5a-)SsP5Tu_w6-ng*l?`cvlSRVDN$%_n=VEVLo`IUrLF-|e4VkxIvUxyxB+kTA7-dm4FEj#EsE6I&w|;Ihl36a|X}`rt zW4Rh~Gupbv$QBar&n-rd5ZRwnk;&&$>TKs$qnJh2e5+B(qH4ZX%^y8n3f-d~>fusK z!lfESJ>mX@>rrQwVNqw5p2VoL%3F;lswb+#`%P4a;b$cBe3ix$ml>ThqtVEa#hB9D zj2Y3Csq-CuGmgTLMMk<1yyY7ix++p`E*|hh@-{LYA17s^&_TcuyKx4)Ua(CDW5NEEjt+!cyXi zHdXey#*=uKmpw^gS>;J4%aA8|EZcmb`drL1&68@D!#!zc$?>F<mlV_D{j z&nKtiBTo`pHh7ZC61z(EFqF}h7KWltJeKJuiUWz3T`EP)SI4@X#1Jkhq3 zeV*+}JWGKmDJ-R)WU|zIlE<>llVTxw(;8$sw&i<`QkEe|myk-9pCEL8c&||}MQq)x zMW&rIGzNGrq{irE`5UEf!dZ8X(Zdq^KY1LiG1jo`>PbIK3gkOc&!7;wU)>Jg(~h&(p! z2zk_)5VA-+5jF1xdE96>s1&}Z067fugi&Bh$%Ujtnhe7xk@aLjo-$ITXxAWf3FH~0 zcxTGgXr+)_ATJoxcac&Dp=-G>86_;wLGD22Wn)x`thp9*^%bKbkxI$$@ZN_^o6#X; zIBEq-JqUT#7-#te@+9OnqhOloq4q7LRYjDiDx+uLZiIiFcMi#^(0A(SjX0&KW`ZM z5%M|YEu%q-b}mZYh!N568bi~mKNx)tp=;Fd8F_oiskjM3$I~vOU{5LcQK>g@#olPx zOO*0{f4y(C2?>uCdEe+@c?zXQ(E9sEmlV;%UxW;D<`rbNKvo(fEbl;~e)Y z$YY6JgEyr^J~Fz5;4RjWt08?x$$qk)!yvaoJ~L+QFY7rCau?)tql+aM@-E~XqdG-q z3Lzgt291V;rIbUygA5tYAyOWKY=nGoq(w-~7)Bo%y)3QBOo#kxq|cP4-h~_l`OO$& z`37<}WQ$RfDlKj)L3|+0IN8 zB9}!2#Ba7s@tupzYmkuH$#NB>Lr4!xnI~&l?uWcDGW|m27^)A26dpmX4@Z^Hme*2j zvs6fh_7qC3L&i3jq)|rphklW5Z}tcY|905k9FZBH+S6`tj3iGleD2lT;RU zKEJ)0&aw|Ohl+YKg)H)=LehoI<;?MrlOgeDu8=Zc4&+QB`BKDodJ$v?b4-Yw^G`u` zH=~cDX_xXYB*~l*BIonBkOR!Lqr-E49CEOk6CvCFg6nMNya=%&hns2Xa;|1(ESIB)wAVVy%w~BGd(mkqb+nnoGVesWUp?B)W4RWk_7a(Vmc@_*g%q(gKxp5a zZkDh-523wZx>?Dx9Fm4ov&?FiPaw3N&N3TVMj&*@=NPkzWy&Y=cgitlE6XmBV^Ghr zW;;tNgi0N2cCut~sbkGvmORL8l*%ysSmqoZrR}kdWPoKpWM3g8EH`keGR=IJseMzlQXz#bdqD0KQp}PDp|h_{vy|mz z2ra=(vyvsplWHkqonIm{LsGOWk!goynNa0wnfPH=+D_^(ea`` zBC|i_e6vqToz{O!l$HURXBM0!r*srG|AVuyOU)7?6+Sw?pN>qvS(Sl0yFXCt>JsTUFlk2Cb6h1T?@<%7Imeo#LN*=rag;3{}26HXqE_( zJ^UPUi>aL<+fw~0HGM3qKc%L@qWV*6#tV`4(B8PzoE{7@zO5HoY-Sn}jJH-{IAtbz%7n>-8zwVg-VGr;Y&bq@w`-Ep8m1cq{C0k#I`Fy9D zETlV1W$rS&SX4cCo0CGiqIxgEnK??`V|L|G55x7`XZ8sh_UfrM3(l5Pq3XHcY!OnX zQ9Xa5o;ow_9Lm&aZ(vP`9>@4Gvsy@n?+Xa+qaHNtSwqU{PnVjplTgN0CWH&5dRX zi#pqR+)QOrXFHFZ87#Cvq_&otSu8JdTT9IxmN&USPndZut2y(8S-|ogWHEk4Hkm~% zn<0ClKTT#S%l4n+DO$*rW+h89Bvr@~7Ig;ll-a} zoPNF#aV(&7{uj(vA!S+(xAlVA#qt#70@VDX*(an{dml0%(rQLuK=nwu1M-SFD5OUF z8kvV7ubM>{QKm+lggggXX7;fJ`|)0V$m?dx#WFJu@*(66vr0&vwlCxh$eU(kg!}|~ z$DF)OmO25M&~NxHY&w@q$%e#1J}`4wE`{t0S!EVpAv4!Q_JQ=8O)PXIIt22e*;61h zcOf$y@{ws=Ddic+m5?vYF(GyMk`;$2^+uxew5pp})8ZvteWn24lX1(dVM#>QoYHNd; z%aX;i(adL=&$7uZVp+&CYE}!u(^ZfvwDp6jT`OyT0rC;{t3R6YLgfCi9+@#SIYOR> z{A{L4(RxtoHOMb!wya0ot>_ezBSrfJnNK0Vnt2hj2{LY$M#v=OH?uNAtlu$q&TMA+ z9QEu9`NNF9j{02V%RVMbT-E=}Op~Jhf(*@{zsy{ge^~xDdswV5aVCswxxX~w-nnd z5K^P<1{p-gwNe+z%s~)Zd*iH<2w9Izyfs!rnOZHA>q)TYE|hWs6^6Hc0#MeXUXr5&Ec;strBqLyw(Wq- z9AM33iDOBzx>#mHXxb07(#p1O{U9qtNcarxAZwnGI^PK>MO(o^Rs+i!o;0)MdD6~u zr6)Z?B5NKJ5*|}}kToi#*1H>ckd=5F^|02b?gk!YC9$Zxfd^SBEH|MoTI&wBGFk5P zBu_|%H}>FQD_=;N?}=P_W_7St#F-aSY9}n68CD5rIv~@8RLYDv<|aW7u^JY)+QsaCEKJe>!j%wbkWIc3W5&UhuALh7^$$e|+B$KqQn z3My5nr6WT}t65gBkQ(g-NIKd& z#_E&eUHv}R8W0j*UdLKvQoMV|$6DHAs(F#PcYGY`Io3*Gq5Hxl8CFt+WI>Lz(jw$^ z$nn-(A>n(+Cs@@oSa-DOQzMwqSls7Yk*}orj*u}6RmNUYdr~6 ziuvQa+mq=mOFc7{U_PH{%@8siwO{%aEl)@>3ynRv404jSMo6t@e}i{EK(eesA>qB& zY-?Odc%k(I-;781RTWS$hU-=H2|Y!ybxu8?_FNrcc{#ralMgtTDV zFS8QwrncmLVOm?RvgQd1k5#+cTEaq47}5MGwAxtI=(R$tLr8@-f*!t#nhUMOd*oF7 z2$7|dSpN1Tg(a{~F6BZim1WP9Ra-4AYK=ncQnbtORi*l+h`I5mXg%d#Y8|6qQS*C{ zBCAJ8nNMA-EVkCLT!$+aG*^qQ0U>hBCArBOiI5Lb&&}3kgnSJtv2v=ZtupN(wDmjW zRx6=K&Q-N_ms&}+GBXF6sS~&wX8D##xdLKA%B*}LHQGW*0%VcZ$WjB@9a3(^-!Dr& z3z-2~Y$ex8d7Y)wYGL^tLT%k)H9tU^;V8A=xYL^Zh%7aX44t9fWfcjj(Y8R2K&iW| zHA04?)V`(4G9H!nsC~=bR<@K_wQsq{s^pB?liXtsaz^cK?zIvh6ZOQZecioQE{odN zRa^B!$~5a+d@BL{sj(VmCMpp^-S3MuiuC1>2d#jR;V4z=L919ug_e$b3Xyrp3M`fLN452kl`f=4I}4c` zka^ge%Q7EwE2P2dlH#3{JYtP<=0;>Hka@(?o}ilLl+xDyh?OHm_K-45g{rqEU{^+!&)QAk4#$UI7@=dCglD|*?x2!nmnO5a{Pc&PkFKe@)9!7c(R)1IZs+3 zYf;o%RNO+4|W#tPAuRp7-A|YkI;CJ}0 z5PsFJvPxt>GB4H-JVud=FG(mYwhk_n+Jz^klAA+mKk>h)T!5klL=hgL^~ z&{1!-)$p{K3U3L1Z1uCKCHRTuG|P-y7JXJFi&}zxR<)1{-(2*Eww*q!SqR>M0qMeW z@3Yz>WHsb-EATAUT%#>OW&ko^rL~aMX-gnKK-O8&&x_W*<^G*jE~HFrL5B8q!&U=l z)S9r~(q53I)S9rtYG6@o!X_)>MVV1+!jINCi&_)Ltm>C2Q=@gGt-sKpU##YrrL2QQ z{fTQ|R@W=C9<{doVKuf%QESUzR`#n>)Y>v>^$97{enCA3>e+1hUXwLX8N#noh-N3U z1X;GR^H`=q_CO}uj$THkaD;^%1et2*3c;Jw@#Px2o)Bwyab^}Wha=;+Cs?u}CqROB zTDz?063ASLY4@>Q1DOYL?2I>LW)b8nNSxgz1YcdjmFS0+yZHb>}3zK)UhPl6D%)q&3oJNoz#}xPTxkUz3rq3c^|T$of;t@Lk_a5r1&~e z4{cwm_7WjwzAgxD@2PepXXq_PlsU|9W>Hr>4zt@>dbys%?GBc&xt_!A9v1cc;s|>U zi~4e&!~^Ihgj74 z^HH|*u2_QJIlxi&kdQjf7?$hLQFioul&Qn}?W7!S&tOSrNw*7ygqP_oyHZH4_7%q4 ztVe%l*?lbOC`DJyjlrEngrET*UWlC7CLw{l+r`e+{w?k~m z8Fpc}EcF0nXUN(15|*bRdqK{#+gV4nUE{(9+tBp7eET_q?J@pt#&cwGRU=dr;r-$T1X+}Iy>_N*%rMm;YLW2ox^f3 zGPgjkw})7sVkx%MSIJTxkj2O>u(O4Pua7OX=SlIdk1e!|q=@Td_oCE7yPAcrkCEJB zH$+GsiLLPyX+C4(T*T>52=w9ki_&ML(>;Q}Uiv4YNJj*BOGwl-=*@-Lz5ZZ4n zvXg~`$DNkjGi1iQ@>XuA38~e-N2wseHPD(of} zdW!!=)U()b5fW~FvE3#!Uh9kP9w}Ni&Zud$^I|*kLow|_Xeui03?XIO@91GWYQDps z%bC~_ymb?Dr#+9whI|aU%PwKr4e|}7%C2HL0J0HskDarI+A7m#LH>YL+l4~HXL|S9 z#s86dDdOwKG^O|1jV$lok8cP6P0}1uil*W|yC*_iWNPh^2uXz8Z~HzH(=O)EzK{p( zqzFlcJZNV|$cc~!J3m5lA&=RW5pp$TsofkQm5`_Go(Q2a($Co=5%MfD&)dF_!~J;! z(rPC~$O_0Sc4mZp23cnJOYyFlEw=|*&c=MEIkwy$VYwJWBLtS)V=Om7=-ha@J;Cw- zWD9CuZfl=Vf4ZZVLZ(g%=@UKlwLpT9PTR-wE@THGhLG;4k0JD?h)z3^MX$lR7BcVJ zC9;&5^U07EcHmQ4^Ds)C0O_$EmI+T1SYkI|?Zv%-9(y{=G{|Y9R0<0{AxqooN;{S1 zFl5e0W~H4jMYK+9%St;tLh_OM!0r+vpDeo((rfodWa!-HLwit)?|9UF3o;+tBP??u zl|shU_2)CYT9y)hUX4fXecb~1~)H}RF7!BT=LrMneh*|{tadQ!ylh9^}lUwP8R60=d&)4{U4Cw(j@ zc{0j!jVIAx(Ny4$Glb5FzVgmV&ORtg8$=HWY)53|{*bOqthEy(WEk^j(5{l=dlL1G zL5A!lLdtwELVg$0$e9GpXW9zBx0^Y$C(rrs?KaM+E7HSu2WQk3>0!HvGq0m&s%O2u zhBMs|+IH64146>boe_ITNS$vrj!m&0c>k(BDkOYvGh)vhpt&&|rKWwvt`btC4dcp* zjZz!zULoP5!$!OBU!^wM?Q7*+{S&2Vu5Pj?Sc0=~g%kCR+6iA%rcBg49rB}{BP3k& zPj;S=aDRTXD}~@Z3ia%ZQe$=(%ZV&M+uAo&bGV*gY@d*DJ-^r~LTa>fF7>Nj!14^s zxZV7(dVaH8|5eX#c0ZT;m`nX`JA+%d{)e3)B;5KRcE-Ol6L!|WG81-@kQ!|QHPf8` z({B4$slV(Fnel!*{AEvHCtCN8JAc{9Eb30pUv?@>+N>yT^CaFPYp1hhLZ)mc$zoCK z>ZCoFMXjrob{>mbS2x@FsubTn*=!fFr0_bw#V%n<<8^+EUCENknSbnRmNPl?kKG_e z?6qh=uQ^RZ>a=;3L7(x`qHk&1@$No|35jy>FaEmqPq1C=0GZ;6I*SX-Cf=ID@&JA} zo!uT$DrPe>^k$(cPQ7R=ypBzA8Y5(P(bgIvav#1AB-$C28Q;`Ra?6czMp)t?wB^P) z<1CNy+}PHcWO;$-#loV&uL@X^H5E^A>Zd{L)4#c@rEn5vn{zuM%9I;hf^Zz5)|3}IpboLdl`SJgV zTIa)=H<8(TD&GH(^#4b`|BtAxAYAj0$jsVmDz+WPb3j|kbjX=o$&=X6=WQkQj-dIG z5<^#?u2~*2r7@4=s@e+t2Jt(satZooqGp;d-Dzhz7DCHZce+?gF`kVwL8q7HRL%sQ zewK5&o{%%has_8X&M3#kEI#j82aDdCLTF5;YWmg+0yoR4#=S!he4>Du0@XQ6#KEuHP1CKj~>6PO3a7U+)GwROlj?Ms!y4Sy>Gr}^+_l|dR##lyp{_NyTvZ&S* zoakY>lvV2qjv+)IJu9#*c6MgSjMtxCoHQZfGnrkSLaygmv_yEq*} zhGW&1va8c2q|EmQww+qEwX3s+Giq5RI{jRaS{8}U5Q|zC)0|NjwJfGN6I_qlkL~7Y z>*bWH^X^U}3+?MDGu=sLIfOIQoeUP**HLBCIjs2Vn&Zs^1{*E>xm)CNxXMZOkWH?ss!w+yA&aC3h0Zt-IALJpdQ7KLr z%NS&-kX{zrhd&27(CK3d{D?6XLIzprSkMVM$QfbT6`2o&jI+#yP+JE(^&4cL=Rl~f zgPlf}DW?-hcS6Po#|*lkc9UwGo9%|YP3vb{z0i!r+_6FvfUQkcW~AS37`8N?(}o! zMr3Sc4tJa%spcB(LCB7fBb)@5Hz9jL(wtP5wUGTGM>?4-TOfx(j&ibDcKsP6v>``3 zIV`6_PKKmARV=qcav`&v29_5g7ekJ5npnPp6he-5T3B}a1#hl^WH@asXF+a*9OsO% z)Iw?@$2$`&t050TPH?oJ=(ehYsbc&-yTiVT#!;mR< z*05ASj)L6eWNjleOCZNV7C5aek3zB_B~CxfOOOxH`a&l#MV9J<(BAJBCxK-MLVM9$ zon$HAl$JWBLc;IMEp;k|$k9-9&{nBaEo3-K{gx?pmi()p+nh!ra*pMo)NM|m6tQm5 zul{mpfQ5b+%txl&84@xat9~z+JHBX|3R%xJB9j&&3n3LwrxdY9-?EPL=&$?DRld>Lft*dmRW5WHRs}Plr5g~LH;tnT4$Z)Kx z=T0YGNR39L&hA26cRIyFQzNZYoeb#K&Jl{3zwMx9kT zfvIA-d&{&+O;-$!qprgB)hZ`mWaM0Z0yS4VNfGiqd%#)tbSQ?V2JyGLip7BJDlWFlp zjgxu7N%GO$kaP77OxKG}ijZM%M9_;)DvRp#%T5N1>T{cu&7%7Jnp4T5`uw`n$)fuF zrZd5!`uvuY5=;FVj#7Q@bn;nLpWk&Fg~+8t*W%uDnuUb-Nbfmq5t&X**LzM^gwPt* z<*bR2_aWU*?sjthQDehaI`df6$g7o3y%0I_Y7I)Qbb9?_jS}Om)lX?94;G&PFpS0~Ap8MRFRaQa!)GX2xZjgzHle3XkG{^g9bs1Zt=9pCmcLnEg4 zKxVU37*A58sWDyuIF&4FOjnfK!=lD?O>ql$kfmtE)B&hxTeq5p#z&D%b=z2IdMJDJjVc7?ACM4vx3MtbvAQwOkw}<6y7SkPM zxe7vSxaCIgL^aEGp2jsEo4#Sk>cHA z7BwCz-YsWQu}-o@<`nPG2)_O7mP=kOe(d6?)LLTWYI&)~qkm+uVkno;lPj`$n?a0(2v!|Q53)Nh!t$?&a_I4YD)M+0o&NL~%L4Jnp?`E>ZOh`Gvtz_95GJ#BryM$#Q z$Tm}OF6B0{%!I^34t85uG9Yn~8EzZPX^_1khq#?A=R=N$9O|xNDS(^^Np%NVZe}^m z9b>74WFvF9J0YYF&}L&0wKXRo6m}a@$yFR88gG1oJ1RszK@&n-7rIG%Q4hmg z(?#BvqMjNH3vC7TgxWkeN0gH10CA}25;sps_$jta+$I)P&wO`MNcbtXd^eCpt%r}x zm$`{T!dug2sz3Twn63o06_$k%x>pjGyLoPeAw@-+yc@E@ecaZB*Q+l(T zwI8*<$a@}Sfjh82iTr*y&7TFXaR5p9d5{u!28((gWTD$E#XC2?#U13#Af}XBzr`K@ zPbMdYYLN-I61v#6$Wa54-Iw(;?qL9(8+J4uXt8 z8r>n5S&%^-i5_<+S!P3MeE3ptt2_rnU)_DelPmut75|ai|47rnq)S(Ksh)6+qi8DX zw3m?i2|awmohzhVdkaEO96aF`Nb!DGHhKM_Cxd=NDNkZX@ZPY0gcONVa?WoXgR6mV zd4%i$X?Dwxrq;u69Bpx{goK|YZE@>4^C9{}d+g`kM$UW-p*{BVZVPAVm-v3D`31L) zGk+kHDx{M$p-Gu}(e2^Po)F5s==KSb`|u1%tDBTgJq+)|UvdkCRQQfWDeBKlZod@m z3<#Ba$&H>Rrc21lkeA(jA$8h83$W!vUU7|MC?kK-p96W-O<#=1vzH0EcfBGPcA#b@|EWbkT7E*GY%;=l(!~x`Ow?{~=M)El19k=p$nVANm>005ou^a+< z3DWJ33#rAOf3ytgajPqQ9uT@-7nYe2>Q7is|BqbyAGsFtGv3z} zE>#No9#iT`%w4$G|I=3T05UXACY({@K*I6@GW7fXQ@2Y@SNJOfpSyiRhGW&;($C!i zo*U|J>F4eUXVe&ves_#BYV=XRJINV!xAY4)`eZqu)!ouBTtmoktQrUMr5n!~x?4)) zsK0clb4HB}`N~b^4BaiI%vWwIXVh4c0XLm9beHq6_b>v`&Ekw2J+juF%Ne?(N}088 z9%s~elCRx-&d?oI%6#n>aYiloZ`@)QwcNjPOIXw$)oeHHsIGHcIHT^Uu5;Ttqwc7F>vnQR-BJD4?d6QRqxzlO#~F1;^*eWvGwN>X zkUPQ|b+>fL9p{X?Tl&2_$r*LG^n2HrMN2t+M}F8fgoN+N54#DRQQO6OH<3kc7wg?5 z7PVchcTL6XXnt7T3k%)1t*O zH!5z86z|BmOX2cv8Xu~8<%mm z%&58Hj~f&co`?RpNftE^{c*+TP^mI)W4e6)%OBUovInMu&OH5b9V|3gY266K%{`Y& z)o5wRT!tR%ar0QthTH%N#uW%D({6y=4hh9IvD^Wvf*5gaT0YcA-+i|Hv4&$#|SL36$_k`ZQ_#)a03%z~u z)vcruZ&0E2IbM~Dxfc?T?JF$NQPEl)enE#N#Ii$Nj_6PLxV)pP$Lr6Iarv^(zQc}> z(mK%kj&UU{8IX5{R0_d6TDi|V#Z|MYKJTPz_IjA0L|0Rh5Z59~bw{Z_C&aa}s6Owk zO2y1PRMY;Ctox6vd;I?g{>qx2XoNZE_3ND1nPp}|CKd~A3!xFhY_UuxghnP?=vZ2B z@>c4dyfucr#XD~ygb-Td9g7ViG;<9S`r>-9SOe$Jow+w;1f*Y)~!UO%qa z^?DQ8L#_nTuXiC~R}O}J0y)6nA?optB(wazQ9{oh68*^+h;7xU*2RJTbQaaZ1N|97 z*87e{&4*!x$$|bH8KbEsf1p2~MfKu9e=&>d#cY4M5X=<8y*S8U$D(?1u)m2#_2LkJ zn-F}>0dE`(qhCq>i3_RCvR~ATL;b!Lo_vRx!~97?y4`*y`_oudzmomwQZ&`(WPfR% zSQ>bWF1Mc}{9Qu4HqY~qv#2(w_!BOoQo}K-%}4uFg><{iXTCpANR4(1YW@{1obN9Z z6491IXbm3Y@8_5+IA(!=l4I6FXq_JCuH`C7%rxAY+(q_)q`Q)UGuRoB#jebU(0+QN zDP^YGJhJ2IyYYC&yc0u@%+pD`7$Pk#zK^#=4JkBA>I}1 za(^p}nzv`Uzem<1{$V$u)N;ReF|}vCZwxJ@<#U1G$FlowN)m*4+t>yEuoQQ_U*J#X z7`4@1;7=FgZBZBai&@kbwZh-PqPD1u{M%U6QeEk{^SvcTN7_sL$x%{+Uaa!x3-SK( z3;cybBEArMLHkaDzeLD--=UCuQR*^(8O!mI2ZU4!@p^i>zmY}t>vI1lDQ@2{_uH4q z{X+HYa(_09>Q|vZewB<-$Al~W*+OdYgi7uySNro>RzjN5p4I+hArY+@@-*Zce`O=jpmMO=o>>Vs&SGKVn>&ht01+K&v$Tr{Tip}y* zS5jCyUCCnk(v^IcDGOA4N?B&QQpb|!N()PlD_tyWTp3{bhb!YOPr4F+ne4?@R}xu% za3zgpFU+eZ*H;e9A+8j%oajoq5bwY8I)7u7{1;o)8h>k)Y=x}#cSQ+}h`!0cElNH? z%+3BmA@WZ9myn3R=yK|X+%oBXqH=$WkP0y#iQY=M)!!yWjz^-JZ}oR_Oar!XI$N&r z_i)U=A#?<&@Nbhb+RKnpU{LP=p z@(0W9{uCj&OEV=_o94qgy}zGhf)J{w+CR=Q^C0vM^csKil~nU^Olu8}`tRZ$XMbsw z?1y@4{jpbx?7mEtG9h*TM3x+udVey@N|pwH4$D<6|MVBKL|7XARV>vk_xYQIc-LQ> z{4GN8Z5_nWQr+Y)zFM}K{y`Gao=yG^A>MQ02mGTfYMzP*{Ygbs%DapHpg&tkxAr`0 zJ_PkV=+9^Afuum1{B=US^XEtWjZ%Eu5OX|Y9`X0He8tl2pRt;9$x?LX@~FQ~ihH*6 zZ-1i{Jok&$PDMTc_KyjPXmPQz+BuL`f88~r%~}wW4|&EvB&0$+3PSI4KIflvEyYB% z#VjxQn}yV9%OO{x)Jy(;j=3IkJ*3m0T1=&CwFsmP^18oHNJP6EavNl`zj}?VxfMcp z`QGr43z4%5(9Dx>_>-@fEu>Li_n=gdI&+w=u3_JDMg60B@(OCE|L*^~G3tEY6LmiC z$yStl0J(bIQeQ(J*+u?>&^5^0ZpmTD-|s7xw4UEt1Hj3Y;$D`%lk^EF2tKkFQ7di>>{s2KH5dzhJ5PE4%9=X zw(lYoGqj6*2pMr@f=i9=B2?--CDYX!{LvM)20c-0&=dNC(stA{?v_&P!V|TYJyC1f z6SbCqa_doR*^{{4J*_YU=}|HbF;*ZeO7@2Y z1NlPaKkT89aG*=baExkCVxa#9dHkUnBeM{b7#LbBh31Dm8**S^Y@HOEoswjBAooTo zC!nV!2L&dD$T=jbUvmOOw@^$CZkNPr7b521K-zi|Ib$UCbZ(%KMfLQMK#P!wM)O`? zj#5d1aJj69=DjS292UrBp?NRYK@Jb}vRsW^6f-ZdjinM&1vxS>!14g37LpPeVtE15 z2stV+!Lo(r=s^6fGW!tA{6LuHSI9#sl^U4CV)&#S6G&k>j^)@uI?H(w%C#Vn#j+am z7$hx_!*V;zae-WxhapcQ=J-G!%PSDdenOyxKLU zlE6fiOd{s=K;8z*Ug1+uoU;Q3LU7lb-}}oB6btc2JD(XS)QkKh6E~QJ>rUW zKgd~uHYq;(YHApAPN0KJ-Gdg=-LP{4JshL%NfLrC;MYC%3&@d>rGYUKX4E$52@xwpxErxS7}O05iZ2#IK) za?Hhn!rLjPE9M8tQpDs3idgpCQ`WO8P|V`6TpB20nFm>kQU!d>>=NtZGRS3tQW0~j zb{b-?fm|Nw5K^NpgRFyG5g1^(0#Xhs3}jcyHkU$fhg=z0%CZ4+5YA+-3KX*32cb8o zt_~Cn@vgFq0;NLaUO?-;C{QV+%cs`h>Od8XT866w)hueAt`5{m(Ny182U=KYtD~M? z6X;-3OXJ!=r;rNm8MN>y;#Depn zNW`c1rW*pK9PM0HMNb&jNW3>+&*&IK6uV z1w!PAyVyN3&MHtOWH?T(oqGc%ENboC8z^T{Yo{?#B_&3!oyI^li&{JP1sYh?+Ib+b ziAAlQ2LnwkYVAA}Xl7Asrzz0FqSns80$yM%i&|gL1+s;7$EfAp9w=f_%jfw(dz8@fc`>k! zMJ=C~0)s*#+Uw{A#k>+ot)ccrv@P7PR|8E#x?|KDd@YcDmpB5%s5SU{AeV)<7Frsc z0|ik+dv|wWl!dmRJ+Ni=1SX<{_V>2}4YjgnwMD%h(CehAwewCOQ^;_PT02_;B`j*~ z^aYx^l-i=+4Ro-mE$Y2MAB)-&wg!e+)Yh^skoXVEUasxH(x9Ww`+-~`T`|A&^7$Z8 zBxE>7Z3!O++Jtn+s4byi?YZtV#E+Fs-E(@ZHUmrJ<3Lh9<&xWm1^FaUC1f~GJ$)Mp zbV-R(r3M1wyQ!2M7dH!~J`K!aF;Med$Y+6Mmbs84AfE@)gveZ}kikH;5P2jy3o;bw z5i%TeDvtag4>>m zNTQUO<&ay2q(wcqiD>_Xd;l2>EM=kg3`4#TB-|@w-Z(NwyAAK3{uoFWQlm8^=6l49 z2l7~`J-G3y{TwLfQf-KdhfD-|Ip!6J4*4yR+(+z*n7m_GxR9P=CG zNXTD-29DWxuUKs{MANqk@t(QF=mSD3d~*>)XTmZ15K9(>#_h!DV=Py3%x?MwOBKiL zrpIoi7FPHkgPf0CQ}lQt-9Gg+XNqpi7;$}Zv4}~zPm~gJ6(m;Azn{c=$~jH%5HcL2 zp7>1D=WL=F?`c<@Uc{oV9ro0-AE20s_TG88szuESdXta}?M1Y(7P7BCC}cQBJwu$K zCp{=@R!=YkdX^B3dq=5_C>78Pgw$$RKc#7H5M8h4QtAnmq31m$>ru}lO}(v2ih9=O z=#xU^m%%rqo&)sphbczxl^;M3)F)X!L-tQ0v-Q}2$rzf`X$W$V9?!A^F*_l1berX8 z$T;L+J&9$vz43&1I_?$dDJ*+IDAyr+8jA%Ttb*1$u?FH%jfDrHbX}Ufn#Cv|4u8+x5?sLzDdVDkWt6Nj! z3Kr_VN2RE71&j0!Dej)KSfBBjh;c^|oTz8AsAr=m=}TFj!&1EvJlppNE{SHwsy=^+V{){2aYY z$m>%^Ad_^jK(Bj(N_EAILwZo^JiRMQwm_EZ<3eh*X$iP;fh^P0TV<{ggkmnxi-q7V ze#jtXg~rFY}Ff>M|08A58c!>_>+LP(GxvwvcX3t(^kBPRMYK z8ZU9VJ}#s}`&)$^1$U+Hds_DWZq!2~Y_HTSg>-3Z8D6C~LqGy_` z^`0o1g*LC&liOs?k0a(N$hCUxGosDzn78ZnWGPx3VyN%e=@~-g)x-%xvV?e79M|bN zLcG2EIz3m4yDwj-=Lzx7gxBbWLge0kB5Gcvw@UG;@z14tyO4-ajejoHyEsOT@wid% zo`9{5;V_riq&OyyL>4Pl&kmW)~S=1Z?H|yhE56xvk_a$!DwP$JhRQSF{Df&Mx z(|tlBzCHGl|EFd8433!%p_qtnb4)tNMD#gAyyt_r=-Djl`QUoJfkjddOc5wTw-+eE7wb-ghnLZs#iwIWhk{lPj07r>a}HP&oz+S^n8{=2#q_vU9S>S zp(SB1!5a`$r8h*$dLf-Gx1bb_F}p(_W%)bHox1(JSYr5^HO@RybB#VHO8$;|YW0*T zp)o@BdM?XDD0Met{;AhV@x2V8r>^(u%|dX_26+fE_v!6X@)YDDef$N=UW4xe$7-)Z z9@R%*B*FVlkXe|ax<&WBB!zmh1u>87O)NCq{Kt@1z3^pOPsyn9N5~lDX}yCbcHdZS`rdfARv%#5A94WX8GV#xHslz{v%2<*%yldz6Y`vHvz!jO z7}Bn1u&jivfjqD0u&jan4f2AXF9fqmK<obm~JxrGz_j-+F5YnZm2pNtkUm}l(oAnGK-f?5IUL-|(64_}C@MgVONUi(Dhs}C3i~8b2 zx85(LUQ=Iucth7;6-(Yd`t|6^Lh5}lqh|WHX^)=D(&tJ#%QvnJO2HRdWP5t_5g}fi zdvxtJ*;5lSJJHh~J)LDHg#Ity)SIG&zRdELZoe)|%}317DAlWDapBiJJp=L=WQ!}y zSo&O1BLv=cMU4=6Pj3=6%OlC22~)JKdYcq{{~%V|AF@riyC{1FzGM(9#st2vCkgSc z2jACIgm~A3@9Sx@l-OEmo}Bmf%qTen;|4#_^Q8FJqh{K>`}G1L5nm02j%@vUF~{5w zp*MOy(n~q!X$aN)kzOfdL@pa`{#YN4l0?XWp1zrSA^)uogM6mv3GsTdUGEa&^iTq8FBIb4Hy+W;g~)Zf2<;is+l6>N-Jx$2;`MZgKJfq5 zv%}q5-oSFEaTlI!h0uSTC*MKny3&=Yd(M#eSHDs9Or6Oxs$@ECnWv+LJ6)kIljK`h z=AqOw$ak(}u#730N=suEV!q!+u7UjE%K0c&4jFf46{H68lPk338z4XHqfyI{-Z`4k zm-fgde?3Y)hWh}&>Lo&k}>-1p?R zu>hr3{JfiXm@yzkE{%5)bGR`sqzlivasLN$gpsqAN_F8$D(*T$=DACi-euT{Bkhr{ zbZo*qzBubnab+D!ksR$xHH7{>Q(bw8kcCE}kQ&W^Jc&2`7a3(jWSgm9i;adT387Sm(G(?zKu$J>r1<8e zo&}K8j8P%p-OJOAF(Jb-YKfg@OtPpYmSy-pl>Jgmeu zg_e!%bOm&_kuAi#3wn-`C!}1v3^5DQ!gGvrj!}1n&M|sf)E%L7jkb?ud(?VA&*&4< z6{EJ6^NrY#DdzRv)E$^*MzfHJmWz?hbT4v(BjGm`^!oolz%awC^F)Hsfp5M)nZ()H}|X z8hJwGNcb&SJEcbF|0t$jn?$L8$c;vy5P6s8bI46b>ag5?rdt^8{59?)8F@my`#%w* znnm6Jxy2adQaVZvqn=xgF(Go>pnE&(jf}6vy3n4(_=KH^xz*S-BIRI|BB?OSzLwe3 zA@ohs4Mr===@8m4DvdEA^6Qy&SLAO-!VX!g05KDYxy@*2DTT!Chxu!aJ|P&P4WX~o zRvBX)(+u$=rpn0tM%J?#5{CTUSjzG_Q!YN-l)lW%NWzA*9Zjh?1Ki^+xhe*`9+?&z+FFjSQ9)NF$`dD2tNEApbO)Sr#Ft z1JbDePp7LnKR3EU_aSL}_C)P*o~ZrQlU&ri88vS-T175zHqnhnyAW@G-)MAkjLLPN z(aSM(&y)6@`;2~$QQ7Y|202FU@An&{9HZK^$r$Gtb==rwXy4Kj8;(;ge8BJtsc^rh z_khtNq(-|Az1V_YJZQv!N2O}DD#$00CL>db+qio=7oA2MBYOtrd7T$C z6GB((u1r-kT)m^}nK~aaG)tH#r$A`Ff-OdqY_oeOu+L}_B9DI8q8ELJ_LE!}bY!~` z@}A)n;;r|sD%bRLQ8UeK@5v<)Iv4e%!&VENW4{Z-Z+ z7m_u9XLPdYEMvx)5U=L%jY%QHaq3>>_eSb(Vj0G%dzC*J#VqPx<&Q=yi@H}iZj1_% z`ykzu`N=5yUDl)al%I_f7PY7RY?KS>j#GQeFGdy1EVP;G`Ne2pQTxt>u}MgU?-0b$ zJ~&}Cvm6bfeQ?5PV_C>CzZxAZXL8K1Mvsu;IJFP{X7sVBeegG9fJ?oDk%Y9(|85Mi zdTMGW0>jWLs0zT#55ndw60IEQhxXNsA@ z@;hSaovf*5CYPG#;JGkjrkO=TymdOwEQ^xe_Qzc#vq4C=I}6_)X0sHZTBm!M?JQ~y z?qPNcS?@EDD<1XiVJ7}1dqFeE(K_A3OcSy>X097kz%lb7`-)QAgw$&%K`h9gW}@bE z{|ovs8fvJTfHV?mqDcvD}Xs+6%&F zHJ75JG1U_`8(7qRo0(>_5br+rOtW1`g-^{DJk#tH67i|If@hk&9P`8g?h0V39$;?c zm=4I9LI!1w_>Wr(nPpBy2^|3rG!u3cTY^@7gr?;oX0}-974^9Prw5tgD4{oh4>EIv49BVe$~k7PjPV7+_%}z)9J7F9)W7G! zW)a8CrWhPa4mL|UM*W}8HOo2X7_MioSLI|lG!^|^uqV* z795SRcPE+KghYJHQHqW>N#>x85j`b2)YNw0weN?SJ|UR7oz8Yp&tc{a7IhwVgc%l6 zqg{%cS7E6hWnv-Y*FCi#^C+%{q?&cpsAf50VI5?F*(hWmT9FpQ&hxX91Wsx~51o!75w6!cUCpbpEceB{keAGhkO@YN` zypRfa=A{gC2FIwkRx`}7kl{G>zUPT%E{l5K^CYu@MZGtAvbl{#y*HX^Cd5(p;W+ia z=P70ui+bPlRI`#ry*GNA*~OyX8_hDcJ-jtog{85?)T5*ha)y}{B@aN(GTVd<$Eo*o z&ow((R8P+}dsx(4ndg~(LL$C!Q$1jThUYM)$E_hO9RGgp>>Efm~}gPp6o2tqV()-u@^yllPLPwz6Dj z_6jN2K4)2D&e)q`Dl~eBmwIu%8IBU_MTwadB{VW*t(hvMJBCV8ziu>}qGBj}#B7a{ zEok8_W=B*h>U+5vn?TtyLYv#O!K@Mz(c)*yUR0Xn9HT=%L_L2q6ZVm%4rIB_46_`` za=V$vaso@0xs>H}mOIP>mRy#|x+U1bXkn2vfRY-+KZ${Ibw$)~bkl`2-dW*K! zOxTy&BZZd6-DbX!^|BP|xz|kI&x@hH-)|NRsqn2uF8V)x&@5%S1491=51N%iYP3y| zpHR<3X0?nF$LC2%li3s{Q~j7{z#NT|y&?ZLC!-_)dE89E*L9+=ms?F+h`a)#?5$>< z5O3a|C(TA#${pqPq}j|dYLwSgW-G_2QC?4(9UP-(xqRB};utl{<m#K3MeW!1=kVGNFacZ8)&1MqEsCgzgo2f#!$Ek1db(`rd>KlCB zW+uxQ$WG@H-DWO}`YK^6&qRJdQ^>^93}OpN+o?HlF{oqAfM z?RJ11FWO_)vFru85&h~hds&hoHITQ=6hoHEV)?I`%W@%PBVu~Za+V^FdE0CeQmd6i zni2Dk*=$lhwc5RqXCZy&fF+i^m>ZLhB=4EYHc5pRI7Gv&9+)rJYzj(w4yCq0J}`YD zS!y%n6G*>V#!XwwgdGHn&mTPsn}VV%?9$NIl{6xGH6hd#&?lALb$$D;L`Nr&IX<`{Q$5=Wb^wq+hW;jun+6JNQ-|u?~p_p1NlWX3~$~jodiHONUOoEj#SIP>+{ES>PtYVhc5Zdbe zRyoTpECH)uNR4(Ei*AjuEJe*ZsM)Z_S&AXcA*O}NgT(gSz+zePLcD7k+X_qZy@Z&R zC}mr7Sl)ur{$*P!EOg8)Kupj|W1(Z_H9|6_XzEB3vT~y2M#MN)UXJ-9Ab?Kkz-TaAW2ryVH6|fCCH&xe6lR{ zA^Jt%3pmWmVEGo(jhMr&5|-U&$7)+4$yP7Revm=P5mxvJSj)`R zWYI9Tna(^~v#9qJ zF0^JGOQpQo2`;p3Ar%_Ed3PsjzR;=^;@wNR(5e>VT?JfdHONx#RltQ-6AN7h&>7JR ztA&NG0;s1etah$PT?OP>ogAaC0`jb07WHNDi>z%d>dW94S%WO<%it@m5f=4j@RioM z5brABVr!CP)K$R6mT!SrhVE5BzLg-P!l$kR@-3TV)K$PGRwBo!tAI4*)Ir6Nsz{+Ep387_JV70K!gB0Mu=`yQL zNW_-~`3KhEWmYH0tb$Ok%dH-kbr5RL<<>TqYL2XvMQ^Ld_kxzj~!LgQXR+_BE2Qkl{G>Er6@6IULi87}`^=vQjuk zU0YpkrE!e9wz}HNgxd4S#2Dnz7BAm)yYENW2L=m zjn%`_4WTVzjkS&CJuESbx!xLJ`2s>Q*IOejKX6QmHO8{%!7`@AniMh|r@kq0gB5$6 zT&IbMp(EQ3R)Ub>xcQhfpN_O^EuCXhIcBYu$T8}AaGjOJG3t77ot4V+@M3wCD7DgA zUVu=WORX#+5nm2!rheUM<*?*&n{Tx8Sk!&mo2+6X>wTM7PM=E^aF z<<_8(8f_oQ+laZqa+J_pt9M&zQ9|!QH&|Iwl7SZf(<&Cy9iv*< zXjQYQ7H+hfSX6uNv)ZF#s6F>vLs2m#4_I~vEsf#0^xfrbhYwjxS=3C1O;#O?ni26~ ztB*y^i1;rn{zO@in#u4HE0aadWY}z#v#1#nAGJDJ)QpIaS(8HK63as0|80$(L^W5q z?{`08O$dqj)U$vmtk{!fcJ)l5)ruDq@u_DDt(ML)>eiG3Ta`lAYcw||W&g;kixOIfA6uJ*498Fm-RB>$ zv~y*4HKXRBl_w-3>S;mELzcbNi=h^NZ50VA7csO9N3BvJ5$#p9hhlbGRV)J#dd4wk zHM9K0^1ao?GCfJg{9p~T9K`aYHOZpp@E^A_&X;{(gqRo6!k?@%7WItd7pp}`jaGn| zUc^jT;~cXVvRz2*GODLWdl2$7 ztTc{U1X%$2%gW)H%OR&iG&`527P1@?V;9I$7;7!(Ql4Trv2?P;+Ji#mk%Z22r`lst zatZ3$-PV>`vA3NkB;uai>}_uovfii8 zZT7YYWsJ7>VR-Kt{YtR)3n`cUUgS-XeeEn38WB_hnPC?Q@!ogX-!2v6&CRmEUA{sr z4fjhQx}AHG6!j*BX^*XxqGn>T?aqs(sF_%TcH<>d)EqAd*sUyTZk7Y=Nfz}*j05eC zOJyk%`Xa_bcI9OxHQJm{@mv&p?p(Wr#X;Yf&=-*HULnIVM?mgCPm}C%j#&h`8*;ck z$#MqdK1i}1d%3JRkL3t^2Fq&5!-$z@&k<7LTiGSA@sG4qrD)ee=*s0tJBOtdLL(AW z>@q3t=#iuBIw9URc9h-6qPDT4?f5H1-{aIaHs8)JH~Dh(jC(QX+bZJwTEOWjpTXAadu}R<%(#%kZwr2-N&N7H@eUs6e9N>8YjHi z&bU%8F`5I1MwBhKGg*dF4~-~0(MGlSbx%G1W89s>owt*Bky9a=u4EzROvovAmZ(QQ zi+mgHInB-&BJX(o53%Vl*fl(Q%Hrj6EY1; zEYFTzP1z&bZ;*W;EA31n-uzMd_EHvgBw1zGv8W?SfjuU~+v+Z}^=srhjZMb4Y*6!M zc9S| z#T4UxHSAiul0{uNU2B(IM=_Ye0PR_hQrFq7LcFi4t+CtIP)wJmz8bd1o@7y9XIo=u zTrb+AEkr#lQO_E?h2>mGp^%Ic8AIO@n~N*NHFmj>8f_I~)*$A3dx&G!L+B_`V$Zoj zma225P)M!z802P@DzUp*+95Ra?OHo_EtRU#UWaTz%sM+>NJQHXsfLu=Hpl!0p>L$# zXwP8@9wDDn-DIb-90R!-15?MC`UGX@%Tk_X&}6 z7e5DCZ^y5rHsiYcLU}LcR(pn!h;QO*c`xNwJIpcP?2s`P_8g8m5Kq8q`>C)~I7ZDv zv%yXivOTU4ZKiLDZm{!YOpLmw-e4CA@vfjZ*d;<_FR0BM>~dKuPQ9^GY1jRKr7G9i=L5yOjDR>vGG-Bo*%H6vZ&dfAF%Vd9(5h}fL*}#sOz`~>|z#m9rvJJ%A&609<(dDo;T3<-E54d zu^WVR#e4vX7t$|9Q}Z@A+2NaMX+*T1~I#5`w<|pma3X+IMGaj#m zwAt-KYP3I){c6ZFcJT&^snP6tvDi!S28~_Hax{cyhkM>GXE}-G1-nW}L^~I97fQWo z$5zUERzaSGbl3?jYap*cUb1bL4G@}T?qxfX!kQTKq;C7xzBE7*#V(Bko)XrAzhkUgYVkoENZUl_w3BSQ7>dJ8j-lw z&JiMW?Hj}lDt3twZ(i#U>{1rB&3|B*2`P8Ko%exVDJ0@k+w%u@9m}6+p^ch9v>RFW zI}+az5z;KAOH*4yzunHF<`4hKj=hcAJRGCuwf@Ae6C!)D5cLe$O+sWZvLV~;%-gAy zw^x2;XAAN6%CGEPj!}E%h@HqdE={eA@9b(8wMBhzH?gQS z_=DXhCFUYzzX84Y(YEgp^~Br?*#P;;?vbLY{rwkvLWsA&PuPWbQYpE2)0x$;b`{H` zsE5w$ezOOJVAc)@?M=ViLoA=OOxmL?aVaw94||+tCd;4pq>zYq41{X_%l1`McDY5> zqs>~dFiIYPObPZ1@y>*&2Dh=O^WLe!0Ty*`JT*APqRxbO4~__l_~@wqC~Dq4IL1Op z^(TZ(vMfOh>AYoHFt$dt(03JtW(=4Xj2AK-qrP7`EocjgXl00@clM_Ri#SHTvp+4^ z$fDla_XP)7)VXL}P`itAdEbKEGnmez<_U}sW(&a^m&ireM0*8`IY!O;yH~K0MP1eI z9UPAmx~knLSXwJ{Q449NwHd)y7Ih~_5B3X*XidoVES8TE9ATlk;9i25!NfYMN6!7& z1F?d+LTa>jlzJCp2TNJrgwV{2!C)oJ=PaRM9m~&8jV${gCF=TOriK!-6yJmbrf5n8SmG zEHuU=gj~tNL6+E~@k{|SFE|z@$3jwqDGjooc*Ic6M+fUzLXZr^%n#xsSuBkcAaobv zn4r#b8YBlX#|D#x)N1FkEC^O}Og`ii#H0m#S+0j%4>>+K5GA)k(u4LtDOZg~F%Lo( z2MdJMYo(BvAtwd*5Hz09?P$g zpHS-bU?EG~d|B#@U@^-P5IT-!2TNH_giNB;nZXv8^C5J0aaOR6gEE^zu zI#aZqV2>2{+TomF{6@K)>0Z-5h&d;i#zOmY5ORJnJ4z0MEDz>J$>ER-g3TuJ0k0LG3}Ay$dl~7*EZD z%`BflY)EZzh=t~DJ{VFT9FLM?Aom0_9+LIYKjZ0;jlrBK$%Q-+%#V^QA^!?)5>l(} zKrWJ&U~-e}1xW<*RIp7*y+(Hw>mbhrwTERcEmg{k!PI}rQhP(%5%X%WL`c0D-_i|v zJ-CTu<{)MZq$}uqM3zc}3_;!qrbfx{ke*-@OEzK>W@3Jy;26s#5EJs>;L>KQr&gou zf@H{+VBe#%<_KbF>wP!a&r-|sUT~1*5lA{pZ4HjGZ04A4!3mZxSl$n6kI9<PoA*mo*>#q~T}fs+&6P}+i(JWLiMUe2a*r$3EYG>p%rfFiC(Ay^srK}9?0LM(RlqXal`@u-U1?ys=2Og8BGy+cOP(9k!*a7L zgDe|enP7R=m4s(xFaGPw9F{L#NoO%nP;FkyGS8JFmXlnmWLf3PCYBprX=iD4rH`e> zl@XQ)-M(wja+}>4on_FKWR_oD$z<6-UG*Z5Ww9$IEcvcfvy{2g%+lmaC(CQD^s{{A z${5S=2=t>F8N3K+}jJeXxGUXK2!cLY0UFm1J zYe4;9jIr$aOo{I$*^A@dQel={S5jH7b0wQ)lPd)*TU{xWqS5(kGtOJgP~t0;t5zFC zOeZ85O6nBZ@hu>nXF|fE@z`NvQ*5exO+JZ;~YXcLTa?%aDM2A92_cT zdHAFl?NCTksD(vGsnZ}wgmN}hJvCYqWEJG7P%g^?mZL-YET=-~{BVA#m?alN=ZC4G zGM1|#bbfejsG21Lq4UE9p$3*Z2<1u(ZDM%@awX)rPz%cokO<_2P@9l??QO`-KVinv zkgr=VjfV5&h>k@eo#nlLDT_miLTa>~knb?YBO{d0F;hR9B4$iFDOAm3LFhfQlS6|n zhp?OyN_s=)8bEd$J#t#8R0wK@+=Uiqg$6iAJ1thb7qTQ|_sCNFLLP#g5z1zn1)*<6 zWry-uj)%O8n$HUP-W2P?y$g{ODik8`uhKbfPN*bG=s9CfXhN3q9q=)}M1+~`&k1R7 zQ9Z*kY6QhOq4X%B5ftZ!%2?D0it|F7ghaISP|x{@IX^Tm1f#sT=JP|D|CRkZ9c_LL z{W?F?#IhXn6l7UQ@0BrQwRn;PSsq%-as^_#A-SP~D0v%lL8yeK8vDhEkQJd;mSU9J z4#7N0Z;R!l-3XzWm7!#ozd=SI`Jo(^dpPEj&^XH@kRK6qX=qYNz4k1G)@eZ~{vFxo zS0MBT-({gxmbW0Z)mb03)VQfMVM%0JeqGVsxvoF z4)sg%-G)-1;7!{{LgOqgkQK=FNXYjA)q@%BAT+-2k?Hb5UsOQPhHkK;Lt&pceliOvfCNA}KXwDZ>Iw4hvX$$$j zl=3-*dircAF-rb{nCC(bEcE|=Kjei_-w>6m)fR5XXmRxYrBM9;WIYq8rwuVLhf;*p zYI~m^tGxtyCA5@d&Ugp^Xpqj(CXONLhrAZ59Hx3|v{@)c(iQT3CFKOj7m)5y3(I+s zQAkfHc|^t(L4Jn36>1hztK9+F?Lf>A5USfjF|}GZ*Yi#&{To?ow=-h3Kd0gOd#FlC zy|yoeM*F-MYUP;O5ITx(4YjkJ$+9if!&1ufeyE@25ta`^BP{Ph;?bTDLm8to`?ruV zq(79!vPU-FYlD0g%4L}iSqk|il+UsVav5YGRLHUdas%YkP$^3(q!RL3s7#9c-~D+g z^(V?+uN{Y@=(#xdejX}kxd){hQR<6OAIp=Fhavw9`F@tANS=m#6-sB>4A~6%I@JD) zjOk_hCe#%r?;>VrDEC*{_YXK`EY!mC1>`%#{16&qq4_F*g^Y(Pf0LzlB4+p5c#A(2 z{$0v%5F7GaXjDkOw)>g*Mm%IPlrbsWa~^uS0zLgR)Fh-v>ws*4;8V#g|AO2E+0B{p zhphQdmZ?sYkb3Q6$YqG}Ica~&m}Abxs5D5Nlf`lkVu~PpI0GyJwC5|L_IIjSN+8!m{7xOq?T|7^z-bgB z|1a`!G}fIqDZcv3aPLrilz82l(++2q{@hm-@>u_g=5N~}Q z?v%2qejV=gv8Y_hjvXgzcDIdWCq;_y1Jq30#ylsD<#Wz8&&d$t<(lWTu&7+~9BmKT zQ$*HKO(%ded4D5sd~QOocsXMjcJI?74jbJtu)JEcOrTt_=~ zQrv!}I*ly8v*rGk>NIgZDp#r#A1`ZGxl)}x7S*p~oE9Nou49}oDLx%F(=uG(^s>z2 zTnn6ST#w4Nz)73FYpw-OHH*rX<_rk&a-})rQhf6`*YVCI%L2}Iyc4^ZtXbtc-YH~J z{W{+1WKp?JaN_r-QeLhToJ1+UlR4KyCy8YV=UV8b2=TU!g-#=j%C*oLV^O&lIcW*I z=33LcCm=PMZ|pUEHrzoeq|#IoGL97uTb5o$4g* zCu>%@PIbyyRKHGhdWCqoPIHE&xcyqej~lPJVnU)fF-i|SXlGsvQHo#`a`Ma}Lp>P#m?if_?n zxJQEh>ue{B;knKzi^_GbldkWY>pZ7Qh?na;r%8&N>wKq$TKA$(Q2hy2L4Dp?^=xb%|5V^{8cd zi8H{Wa$Vvihjz`i$|)7%4E1YT;m8;Mh5aQ)3bjGFl zPUc)!Ig>0)I2UI7o+)cqxvp{wSyaESaynU5uB)B+1E`dj>uM)aiZ7RQt#*=FuHam& zofIM7wz1l2WKp?RJ7X*=*ELSstX*?mn%e~yM>zz8TM=itaokv|{qz+H2dIE_NQTqRDM z6yJY1*IK88rJZxFb-K77m20h&G+WlJa;W) z%A6h{Uam4{P>Q=H+~SO|e9F0QamKhFmFpH~>A}0^y2WW>QMuMT6GFUP>z#zTRI0-F z4fpF-M`s!5T(>%5A>LMZt5eCM*3PZY0E^01;mkQi)a)K|s9cp!e3I;`%JnyAsSvMUe{+hY_@6hYDUx>cb8D!Z9 z?P);Foz6&9DXRHSXH1B9Km1N7;V^Hh-X}^G3-RXrs&-1H#N=U|`R%xuTkVVpiTG^f zdKjhZow2BT{v#y!aH@GY=1|;8?u6Xq^azRg4nwJZ@Fvbir%#HO26-Pb8=V=+R4SsK z4f!ABK_^KFo?AhFg#63NWLd-Vs8hnS-{+VK`xksY+^Lk}-obm^LACgGPgmcpcV(*T zmnW*tPdg2w9=R_5ME2*Lb|JD~Rk%am?r2AN%aFdC+~E`m@s{DsPLULM8NTeynI}s5 z)SHQ2PBP2i&@Y-nuFFXk(j7zdeos9JcXyqU6e?AtH6msoNVk)Cl$TwHyy2uo$pMfz zojNJn15^r2zSoIAno31{Dp#+QFQh_zvxA;H^g4ws^c@y@R?_Q~upEAzd^hK9r;KG0 zgx zQ(vFc#iC~F>vQ^87TzoCdDrP@*~0a_>kP3h`Ag1c^`7IK?=3@W&wEb7{}DY(s6FpF ziBYlyveiizBHuqf2lBp?CPdDAc{tX^hfXfbCuq+xkdK^VmNCde$S2Mq%U~y+V?s8>-x(^4)sx6F*OfGuvs}qxxz3eBmWN#_7vlAFr_&(Co%3O*(=0{I`EUuAGkU>7 zb3TxK>-0rQA>=z}C`zt{j5(7+YBl=b*?^})-#e+tdfVYz#Qfl7OY!~w_7v>~>^tMm zQkJ*T=GgB@@`QNzmdBkU7WI$zlhZ6j&Yw_@ntyV}IY#|k{p=(ykXzJesQGrp{OoiJ zsqp;)se}CD^svM)#gZ4&$1)SrDx_bEyLbQM#HNXUX*=)1lP(dHDaDtBQg1>goNSg8 zAX|mxvYf>+zdHFW7jw+7PLUKh*KbZqlzfJIesdbQR542Z2>HX=#6o8de+X%2xdk!P z=1@#)R6Wy$baG6`|L|QV%*^?x)5FpQp_o6NZ7jE=9=b~U%Nby)gV0&!U(SdSZ+&Uu z2_bUr%s@Rc;Tgx#67%Nj+%23aMDEKDVs;DXNbym7XiJz9&SjzYP|TEY0gLKsY`BPJ z8~Q#QF|pxNmW^m3t&6GQa+ZHXXkAPVSF=11IRd424>z#%Ku!?S#PT8JbjY-D3(HrK z93kyOyz?<%IN^A?)%}8)<%scxON7*De?hK<#DzyVhMr~L35gGXU6=b7PBmSqrH%Ljz(ST13i6>ef#&7~5OI7<`R=Y%VTc>e_lhc`*_J&01Y-VY8p zvpfNz^?q=;jirNQ=7u|1dO2opxJQb+4;~Wki;|1coQ0^?baqpXc1yxz0J)Ifq5PSLD`Uju3C0FAo+7 zk>mVQlvNQd=NNUQzAacI^KrM}ZNXJi0&7uv9a7yEY+!i?QZJ;Lh29zaFl0fng@xW3 z`-G59Qrw&?gPs47q-@zgFCynwq^b-WEFVE$6_U*Iiz}%t`{m&cav~;;B?9RYlEHEk zgnpHk!7P?+2>o^{gSkSM1!hBNet3JZNQzbk89+X_2UiKH)e3Mn`Um8Wpmw&{6WnvX zMZt&=Zx**Gm?p)Y#VrbENfEQSm}GocC|JlsvpAB)!4jVYAWMP^eX>8KI@ln@o5kH3 z>=q(N+Jg{tSFq0~H0xd(j6H|y+#91twwho(iyGN#gRMd;w8zo*amZ&`Fy&m)QXz*! zRs?&5RA?_CCLOXWn4BZFpxDZ1K<)|V2=PX(`+|j1+%f9DU^|N%qZ)#dnX-mzjCwd& zEkxGmeB`_)7<=B{^=S&W3aQZEM159a{mWN93`p{^K7t(W7Kt|=Yj()s_h$skqbrX^4E=28-lq)dSmvW^p%k3gWW@3$UDKQoH!p$f7av4(xsSv3$uOg|{)Cck2tsw<8Ej{H*p)#c zvVUF>F$u+#k2gEr8BF?zqzjR$UJA?G)w+(7wMXzxKj6jCUpH||@G`7)SU zD(g)BvkNg_26JvCsnr7c*vEvF3Xx@vJObBJg3EDLj8%$snbq@9FEfag2`o6dYwkUi&V(>!CaOz z5pxk%7ylS6Ww{(O1u^}>PL@&#t+4$in0>R%XAvX;*G>n5+l0tgoPkuo24im(E!CDI zCJ*v^utrF4%wv#`U&mL3f=w(hK(0p2U%^c*Z*q*Lcd>lVF~jtJmY*RvAk_%HsGQ2` zjiDNrL-x^)+oWi-FdKx#>3NkT7&9R&Ap7cFEJs2fg~aQXx67C_AkRWZ>-8)JkhdWF z>6?Z0#>|Jj57}Su^2wKwv3hHjES+NdAqjfg9a5G-{(>B&7qe`Dj5-p}O6v_Qlxi&G zP<62)0`@* zx3hGxIC}BjGUhYRXM#RvnUr53^O1A1-p;b$Y$=E9rORbZGGqy2j?l-fAgR)(L+*tf zsh0`qjVXdW202RC>L{i+W+CKx$T4~f%L9;h$gz4g%Tp}J>-9ovwJnf$5Hm@ST`BYF zfqV{0)00_-SWeP&SPm$_7=@UV^#T^hl@cL%Lq3Fl?-Gc)v6_lX*68xTWB{L}PqA>K8j)Aiu}vd3utvj;UiT~86>jiQ-)E{hsPr|E@4 zyb*hvUgj5+HBE1lB1X0mDR|SYp85clg?HhiJ|xriqK8SUw9g?lYnq`~vh=fL>#>b8 zM$N3w){BHxXnPQIAo4j!Z+S%K9CsPs8U)GFv(`u%&vKrg)FkC-$W+AS>g6n1kbKC6 zdJD^CkgFhhdg5A{su)6Zt&8-G$EB39T%zZ&+|4peFA!4YUR$267qP^>Bk!Kf)=OB_ z+bL)3Wm3d!=O&asTW=O3k5&sHm+AdNysa}w*P5w5-Yj>n9%NB7*tvR^klvW}Si!y+ z`OMXq3#ro{N1baSg?ft+xlO;v5#(~c-6yLNbEV!bC7|}YtMwk1XOK@LVy@Qvgm`BP zSL@mnRKo@CnZnij7%AdRf!^(WwVupEX9^_6`b3}5IqWrhrcdbo&-3&=mX}dF9jUL? zONDsn4kdbv5ZSILP{Zr=oj##d*X#X0X+g{l`jAiBAUEm->!=lSo6;|?OfO=gRXX$y zkutr6WjpFazuYptlI2T?OjXVDgDdq?w2^c0Oq572TjVuMO1fP-Zy1|tamKs+oSsrp_ zIm=V7G_t(lN~aKSv?siiZS*AC?CSztp z=xcf_^mZxk?6gi#Y^NAGWBeKU)al7S8Fdua1L!+_LbJ;I^#Pwm5YwPHy)N^)0cFwA zp;1rkAd$b6lMu5;&yf;Xftb@FO?n>7I#&vW)CJyxOcyalLgZFHS4f!Mt@wfYc?y6?GGk9~t`xGbRVd#=^vSw2MRbY1H)-C+6Nl{A+4LKTz45^<$S zh^+I4sPkibCkySF1(0SvvD51xniV{u2Yqq{VxG_^3h9lZXN73q@}!>ci=k9c>4h9a z$J}d?>M1?;P0G19hRV7b@{C@Lp&HtMJz{yIjeD;{mGsB0H5DjBWL#9wwror!y*&cr=YXX2iy zGjUJUnYbtFOxzQ7PVI?0r}jjhQ+uM$sXbBW)UJ$BXGxx@bD~#NOGl{lrq^6iXGtBd zsI#OuT~TLAZ@Z$-LAJP}&YQNnqRw~T-Am|vXZv14XD%P?C3FV#kt^y9=o44e+0CbW z37y@1?uwedf8mOny?^D3n!SJRikiKD$Q+w|$(QpDV* z2C4e=K^B_ZkbJMlZl;_UXe28kKj?`*xgYYQo+8AX$@J?*LcBAMpY&})ssd`o!cTe^ zOD^h6_o;uwPTOL+GB%&-x&Xy2tU0u5A%xOF-S@_(hLrS%6eDml)6! zSZW|NLmSY8Eb89PuX=<<-Mjf!Pi1*+1x80anfRNY#7tj+}qjb6M!# zdM3V}FsK&`@s25f=sRSLd$sTny-9vThG`=?W)thLRniNS}6Wq(NZ^6OejH!*FQ0# zlz+rz2$8EOcOajbP>zfdU)G@d3=0(qk)?M-hKIU2hSsHg1Bnd{3Gv!BGBoi$s*lW> z=HVklnL_HcUpmn1NVQL>REU=<5Gohq)j1GK*eFhnr{>#pQKRyhg3uFymDNqTu5CY zb9k&a52?n5s#$Va#)nq1OrDSP7{uryt&8%J=bpDiLZN0M-qnL}s6|MfmWKYRMoc(V z@-d~7d+$n!5lZ_+^q9N%nxPCK-ZnKuxiSV{vyyLkFhlt)s#ncW5zA>P>we^Hg-Te? zgER^$XPFCm9AbwSvdo7(C1kk}uU8|Xv~E#D?M}qdwuppsKb7(XgjQKZLWL}^vP46r zLgcn+Mb1uWhY;@!XhNumMV%!jhq68s{Uf#o?RCkaTo&3EBu9h_gn0d&5-OGA9xqZt z;^$OndDJ60 zCS>@e1Ckn==#wpwV?)_OyyM_;p=u$rT{qxZaD1pqNN>#QW8`mVVyKnnA(ly@PL?NF zP6&0ew6UBR+Qsq)OIm1<T^u$&w+q{Mx(1K0d;H)nDP0r=|}{SO(T zYUsv{P&G_fsYa+8p5ltC;i;~u8cuOV)iA>qRm0OlsiKDRp34sO>eNs+w?frtYAAN72r&!Sp!MyP;A)$q(vA&aU{R;Wmbw`Wcdl?d_nsOh1FQrtai zdT5mtu}6K3R!k4Iu+Th;>nZC_*St$6Gh|!#PQ9H!U4Q2bJ7;;sp%O|yv>q3DZFV%WTS*V8Puq&|U4YD8< z`?ZWY3epQ%7)tR;d@7!;2(_|gA?7$pU1+CIE`ijC0=+UHidh7CI5g2G&q5vx{W~dtAm(bwj!5$!_v>#>ZcR=Pq{tPv-JPIj;{2fZ@moe`` zRzik{%Y{^Ee?p#s>=PbfiMEH4YI`8RL9)V;-$|+hhg=n_ef9k??W}N$kczDLb5rAzT!cnM0PlrW9Ta$G)iQL3xvq02@;U%?C^3Sb=nQcM~CEu z8-y&=?uHx=IWOGIF;7B{gPb2u9F#pqk^{*LR|@fFR%FCr z+2KtrKkth-K?&&;;*ILF!`p;-SNUd#V|P>O%L3{u-|TQai@M4;JDkAs4r)kO`3l0x zEW@r=lEGrTlE-q1D|3nL+QD+1D}5~Ix)S?`Y}Y(jl2}%_ zlFIU!D_Jb+O~nP_0+vl~Oc{%MYimJxIm^#(Of$>A*Qh$TvmEJ4H_KF423Y2}691=c zMWrhS%fqguv8eaK7KC$H)cary!bL3VeXs@LN|smMeCk;~aHWOi4_7v`95he0tA}N> zD?==oxRNj=Td~NMWR@pf$zXZMl{}W8T`6HnyjGQ7&2pA2jV#x?(#CR+D?3;=xYEb6 z*_GJ8WSxI-C5h$G5>qsceALs z$QFbLSc2E78piLDtvJ~ggJqU0X+o+3H$u{WreAjk%UzI4j3fo&ES3hyVj(#!gFEnk z&0i>0o)j@7su3~$QnU?7^*H46@Q%N!K5`s;PDp|_N{rZVB8JY|t_&x!d=8n8`dk?{ zSOy?JZ6Zk)g7>psj}`vN=gROZpL`9O7mkmioR^81xJmf(W4KfZt`#6v7;L5$P^(>D< zS|E3Y`&l+ZUW3$x`$teJ*+26z8@xNLjU@5Tt(JuoS=5|=dDvi4=MF2vX)Nm8p)Q=m zqRt&whVxm}nZl}YDT_K&SRJkuf-9V;;fJWhC8Vk>_tq*(~Qwj7TY(U5z?+CHKc z+LuW69i%>-!?K&@zHpP2z^EJKk^27ddY17JI#S;sZj&O)8bCe|ga z5lBU)Y-(EaD-#7#q*xAc#?EYIF(~I zoE4)v8}WX~a2m(ljC>A6K97boIY#wQQ#hMr?neyuPg6Kg#)wwX9jLY8YM&$_pS9sO z&gU7Via?$Sx3jzjq3gX*gg3M7bY%z20OSafs+(osQtZ7#dZdWbPY^Q1F^3_Ba(*%# z8z=klXb4?Nelk2pNL64O$E*)0a?AxBvp#Id7?E>2a(*hD%BlW~m@^?yhp}n!*D*rv z8=hQ;7}__UabwiJ(c;Q-#LPrK&${vgg!<5vKFGy;#l+u;>tkp|t4cL`0_4AldES+? zST?#+0-@e`LCJ`FA=DeLjD7)f9r9^YF{8U#UUWs9kF}|YdC8SSSYCGJSje4-+2qQ( zEUzdTQ36?wm{(m{3TcM4yYf8bIY@^qpF=t!Z|)_ZLbim{cwRU7IuX|N=kY&tWedyauJo|%bme!JFI*X2 zCiD5y6`kcPS0=LbxN;`T*RIThB%r0euH3-#jVm=QyIg5v`JXGVv3%>wCoJE&@*5?bfoC93Ax1NTES(U#2CEqnmX9D*x@M$E5oK)5dB<6&B?QOz+E5VN?AWEID#(nlB#95V?q%h1vhMzf3& zrN51wM;h_*@~Efg5^+WXi@NF6$AbNgY9Vqq_%Z6dztP7r>S*;ZBXd8IPmDTR{maM_(h;MM z7Y7(k9HWjY2O6>ai?(a@b4;Isog^b? z4CT`iqmDb{jZHqG<4)M<5mKRDjeL$mKDLoCmQrEeDULD|ArWJukUAmfLXwSYA+=f+ zQWZdsFp~a7scN-{A!U%Gj8c{tA{W(#sY*+`b6jVs4&88X?(Wtj~5 z1~SE{WZANRthO6+x)C{0_6BW>z)8ckGmKm*B4_%=O*cw?av)-+8+}p&=OSnNea$ci zSZHhsA!dd#oaEB$l=I2 z+el@p;+V6IG?o<{bGDJm(g>kzXy+K&EH6Un8rnHV9?J(1>eX|N0+#O})T`$j#VlF{ zR_~+q9HW%w07!2M|Ob`docAp-j{-yi;&L+MxsxOA$i7_ zL>cot$6R7Guq54vuPr0yQX~Hm88Zpe0J+R)5mKw24|y3rv7-X3a$%fowRQ_A$JR3s!lpC4jrCbjwgxqHI2*HR1Spd1+SQV5pk3wo73k^*t zk!uE4LKYd#LaGAKA%>2Fi;WhRcOkU4d9l&X(g(R8sg@XA!GP;D|3PUCC zN+YJ)NDhgzglvS|Wt6l08!=lTON|{Y$3s4V)EE=Pl&V(Cf%HL^89j!~=Mo4#Nm^&5 zm{P8V>^m9vT#QzhO31$;D~$w8#;k;dA*+oVmKI1l3_Cucz(GSY0B>LtWb4c8bo zEFVIse;zejgy37EkV}y2QDZ1Vsp_=9AWI>S8Oc$SS}pPRSZy6-ouN5Wj)!~(dB*5s zp)Z5)fjnoFOpy7UijRQm4&@j6>-!8f8Mfd|oyd3XymJO~kxxG_%mX z{v#o;7@LI1I#XG%8assG`@+ciIK;ea#2+DBN|Fv~H)@2)oHHREMk5R5d=8}3Xc6M& z{HB2>Xjm&PM*bU7mXeN`-;s*i^)|`S&QrtVv-A1((amRTHQgs_mEOf`2MK{MpVvZqU7>z%g?uN3u5Vm>k6i!L z=L$UuNUMfC`2lU;TZUE1YhPYW0gl4-6s;%!jQM9i`yro~Q6DeWUs!wj+bF-#w`gf* z{=Hj6lBaOA@+3VoMtc?SYx=>B8Hb!-N6tSONypIkl6&SgFJT>{5%EbF*T;S_QiXKH z&~yDCA=QA9;ftZ)`+!mG6UygTqs%9_AB=h%jXt5A2aR?iy)mkvcN=3;sXo0is-Jfo z`7Ek`b{q9Vsx;LrrZlh30Z;a~s-Np_fm4S4`?1QH=cN;m!iBy5J zA>&Y=-A0~}-WauYb{oY)YPAaxbC`j@UL*Qsu6p`pZaWQO~*jWuyx6#<9PQEEywmrhfj*$n^=m{cMj>AY@r!7HUX$@ienk zigqL9S3K*gnGGDXjALTV7LIwul}?U%-j!~SdDoSGj`_}&*ooBAWm?=FvaA?0S%~+( zi(%$+DQ=I&nr%Y7Q6kpdCdC~kV$GdW#3=DU^kJ+y#6qJ4$p|wriAtAipZXyq%_N`v z4%x>{72=H&0kc?$+~@ZoCeBPaf%55%Q}gG2%_JdJ0a{N>zps5wgC&ZV(muAYnJiPq z(CWTXr(k8HnJvUyV-|0gvZys?qs^=nsVrIgSfmw>G z_OYn7h2zWt7HS2ZUyL({Sf~|JVow&W(9*EI==eU)OcWxI-7`_vI5Q%|>%)JW*(|CL z$D8>q>bbx1W`hv#cRJo|79zK49&#RUw)&(1qMO}5nFk4*v6E##)B14Q%9a@~MLV18 zY?&ECWSuLJ$})3=cy+eTG8R?mh*`~|>KrjAri-$~)}b0k%zP7_3(AkxvG#ha7F@ zX6&8wF=l}fFXv;-QlD%4I!DQd1bu|Io{N!l2mAw=v69x zqB%y0SJosm=#wtQOfpk^@;T%LGh2u(oqFsF7y=AItoIx>F?$?N>n#nBc z3qe!OR4Hy*Q_U8AzoQIW-xp2KAdUhvZ%6Vnz3igvebS!(~M_n#hyuTd75b^NO8-W zX(kKt$~xaHXHo6SHCtI!S-EDxIaHQ6+sQRcrMR=5TyvomG28hAzsg**k%eYEBo~waV$ZyMk1=nh8QWG;}wf zE6vS9 zUPR0ZkS4R_QkioXgr3k}Yjz5$(gq=P*8iB&m z^@&uiX8mPUy0-;4nuT*nysi9_StLaE53MtQ*=!VYd*I9)Yq1VQN8ijUP8U$iQ0SLHaBzW>fC&*+0CM^3~V*~Sk#q)t>zGm+Fo1DvO;QUMIalk zC_!&*H5-J~YO^484Q;ErUPx~Y{hDZ2xs7YsK0^JzwwaqmOqI5Bk9;2XT{Go!%DFeD z5c$wp_pX`FGT)V~D=4N`TL_^qJHKnT2|kky(73wY>|xpJ#taCl z)jolUFPWOfMY29Wa?B31{3?mc3cCZDuIJ~OxZ z;vi<2m0aq@Q0XJAG@l%Un0>4=DcXZ*J3U`H${J$X z067^k`&v0S%KDJdzOkQG;uBgkFvbebmoaZ3W*SnBwYpe7hMWsIz*>HjjQN>!KG5p( z3FVw<#g}<8l=GohlaLB+#1h=aLq3OD?Ke|Qg%*a;2#{nAv77**>xW5J_AN4II%Ez~ zC0UzUE`!X2{M(9@%a~grqme3TZDv^tp`3MVNJy1NLdPcE%DRnGdE-yWsubewEg`E_ zh&QVYS(}7-PXUCi0T%TXK*$#GLOYU2^_a$mLz|!Ex#8=8zs4JXd%V1I0Gs9LI z%PVfG9G1^qDPsBEl}eT|cdB;Pv#6_}VXKAZXg6lFkg9-Ml^3>luoO&_YpB9jH_N1{ zG2(7=*y>?99r@6x6}I|V&Y2venOMIXwgy-(a$|;AmTbq9C|Fq?wqkFm-lz&Z1j!RJ zMv54FZ^52vSj|46U-ty7T}X$R1JoksaH~hgXagAMNshD@TI%3{*q#SE4XQBB9#T;*~XDR1YldMi56bUHQIxc&nj>4X(qp&CHnCpo;!g`{P)Sl2=;#Z^XdrJ#svfD0-`2aFy zFZmHN)!HfgN6xiqlsLoc^9kJxIMW*R3B^peV($>!OKf+FIm;U36N<^UihQ#FX?Wtv zYL*fh|BjqPo@=!TsR(?CYn7DhTx%1@sP}>7Se+d6`=5B90q%C?s8)%6GVv zMe7DVq2uxeSX1GOm@(3QD_7iaA$g*%ReF+ydu@B?Jmoui4d08I@ejEWaw67(dNFhU zA=mvwDk1bc^-?|f4|x_>-uAA~3y9fU-uQ=f{X@R~hh+YvrBCa)ONA}y)n_EOm${cL z$1jfNkY3CqQ)0yGSx;X70l#&TYKPp)V*fco$WEV}0y)o`xKNHZFPc~f0?D<~S+2$# zC(aX+$+DJ5tz0WxiZ<>zjDDEOw)(Cp$rR*6sUgj{50ETYouwCGKE zehy{jTiHIj0&=O9xR_#UwV_|J1|O*|vkHXB?;PEPm^oGn$6RUQ%@v8bc44)$R6-IU z|Fv?K$b42pvc_Tsj#ban2ssQfS6JOb>a+`v#=D`AbCK0mEmLho+m}GDv|8_!vH_{? zhFoPe-9_Tvm$}+n&oYI7aaUVyEb2~8vDMBpgJX)VZ7k~E%{5jR%M~1Rjn%_KcXMbz zoM-j1RCCNcYmkNR?@-LOmbO&Za4pANYsE_u`v%QqN~{EqxeROGC{>A-#8QV^J-=-pXK6Exq2#mLmF@?$F&}?|V7=m0D#&dgIh@=SHhiNJU^HeoeHh{6?#WW7HSi z=3A>cpPDOVKJ%?cj#1;-O;$60hhx;(d%M-gF%Kdiin-ky#xZYm%pxn3W7LSf*vjUZKhUcU*jE=@ z`5dE0{v}o+$GnAO!Q+ToVwG@=Iu=x0WgPP%u3bEbm};w9NUgU2U9s9LkUOo+71Z|L zICU(z%gPo~75D&0hxZV3mz5`^RyzWzK7%Z^B6XCiR?C3=2&u7ZgjBh|(^{)RNS!wO z7kozxF|}6WN|~w{5;GOo53N3yn<1kh%dED0Wz15@p^!RDyH833#D=W2T7}@bzkIA3 zhODwO@0T%8BPJbkkJZmI3pJb$xz}obK*oHEmA5YuAy`Gk%j8>~Sgas?ob02{30HB`FyZOT@wR7h1ojiRkqCC8{y^m(hA zW7H`6ytRsB)F`^qYTy_(if*);S!ficXH;LXT7*;tXcP^h6)#wuIEF@1ifOYtIfh12 zifOZU2=T_u7p-nibunTly*5mH(b~l^YRr7e>gSkrj(N!%;utk%zHG%lO1)7Pn87hG zTVsUu#;H+slad$8YJ_~VG<2t(9fA#)+0TkR~{A;pj{t(vD~%;mT)apsG|w6Co6r%CVx zI?i{>5c7>y&2kzf3+ET#S!vHuOs)1I`kBW0AFT$Ka7K)_7^(U#qeaHVhViZ#$S+oz zkY(D}NJV$DezV#+W`D%|jq&hzOM6zPIt20%QVm+!EGdw+klj|fkP2-#@>vi0!`k+o zOm$EVo|l3AWfixQRA>_*9gx4RgpE>8gU}uoV`mAG<2=nFW9(d?+<2piA7y|A8D_b;?4?2+M9%U$H9^IW*Oto=SSK*gve{24(8Y+?H(Bu z*axEo)p;MgkL4f;&Fl8D2U#BA^W}hz&-&4x5Lm}^wt$@>q&H4osfe?)Sk#q@I6Fs3 zMZn~oiNXxFnm z#xX&=iA7y0)$R2xb8zi+0qT%jjqNEr;#E zCfQ?;rC{ERZDH6AELY5IYB&1f`XAF)YNOhu}_`0mm z2Ey$Bc_qG^vnq4HMRyzLWsE?GR@9^lk&kTCJ6m<&$J6!PKMlxm^1BSDPmhJ6S7c> zcFaC9vh9qm zQi>tpLvrmxmKw1MG`Rx-dcXR?y`?Nq~Mfwx^TSl&2Q#iX$uFhxlY%PFoDv0Um(CCeSI z)U&L2rG@1kS2nX`WT>)wSc+U3Vp-x!!VcMrCtXQq+2KkCOZ;gn=RB54u9UFMaiyB& zWmg(mremAZeXFbNHkQHDmF!?Krzz=^;=UL3Dm&$Us&iG~)f~BI@@jh`%T@@jRlC|w zmm+>Cv_A7{J6DLeR_z+QnMECC=Gi?gYOUHlyXFH~*6^9KtazN*jinw!_xf+OyQRc*Q!4B&<@QdF z8G@XGm@iZ@qh6((kLn*!R1NQNV^ohVR5Dui*dkX{k9necY_S`oddw5mW1grU^F;N} z5;q^!KTGUH(XOgMEm}%X^;X+KDWawHRByGNF2s8m)17uMi+c0YU3M{xdh^m!dm)Q@ z^HPo7z@px>RBN}gsCPQuZEs^yZ)aL&?-C;4H%Qk&mfM3qxf*-#ay#*3xxF4nE9OI1 z*g+vx0lMdMG2ZUJLbZJayFl-?n^+Kp*NKC2N^Z%0Hv9Wn1g9*5j# zr?7m<@_;>2mZj0NR1f1y*MoK*%P)x8fK(6J%|hz5VasB*O^`;rUx@eXe#9P>F@fQe zVzfsvk9x#T{)F09=f0)z5j&Md9lsv2(^w8d&NPayv2$3Cbft(T+m%X|Yh0;kS>j3y z%M-3_X4&pa56kpV<=TTa_7KY_|5K9CEnD%sn<|;*Z$9R(u`^f>NK>uIV>#265|&x6 zRI^mL(#W#fl{S_QuIymhF z%Ey)EEQj*UVU69)a+e#^&hn%y-7Foh46uCbO8jTC75lDG^)XmdT}fj(&y^gO>s={g zS?Nk8i(2)u#;#}CB(ofwsq)ESDRd=| zca7a9V!UI@8oSdcTSUw*DFOQa1szk? z+Wjmy1?7Bxtv$%1-etPh)^<`$s{-ebh}F7~&ssZ;{1qo<#D@(Wim^%-OsXt z}#9<=mXdw^vN%X9Xauc)jA+NUfV>|~aHmR38HW!OrY&+~Qx%fT!g z?Q$W#F=`9GU@sK1Eb#jIxE6)dU$7g6c-!;^yID%$pxyGy$qRN1OS&sK^yCHE+^IteSi5#!0DkbTa;3S_&I^HDLc+wCkWrqho7n#x+H zJ^Trt)kCVycB&As74O(-LU8Qnvfi;XSyVpn+BrgMwYk_cCm^5q?b2ScmEGA+mtF3Y z(-QD(yImv1%lRXFCyUCt+iv}a@~PEcM(HOY=bd)SE>EUHzO>VYRA@(Fd(B18J$AMb zuNA#^zE9}g`@MF9PtHR=-`Lv!M4bbtAfI`VZ|wlfnULFrjA2nL%D%M|rDzu*=1vil zqf+tu@IE__<-drbnP;C}D5N4V53&NOzPF2IjOa0n`Q9$~39TRd!Cvl@dy%T&?ibRb zsrkmw_7IDjrTk(yen;)<(9|sDce`0gm9`kA(=&#D*qd1FE9Fe)Puu7dy`ibK=zHvR z7PVgeZ#$1gz3EzutpA=;RcNb_^TVj&@Cg3JU&rXjA$0XA)|HNbh`M^|#ax3mOLXnR zlZt=HMgI`>W-~X{h>=(WLvvA2K0&GlkP)grBi@FH>zS^+hbu570apqkCqUv{8O|}I zT=|w|Usqn`RPnBS#bu3lWjACA>a(9KpK?B9TzL>e-xV6`${!F~%Xfe)Pjgubu53Wg zH19pom6?cn2&p_71EH8h-IySRu1I@wJjWd7#+(MBJ<}7qX0;JA&W%|Pp(hT4uFzFA z5_7?AG6^g|EAb*4EXcdm6v#6t$5h-I)M=LYZ%A$@|R%C!h9j)w0%8xQ$DYPF=l<(>4CB0VgH$#}2+Az1SlNgkk7 z71|Xjs}rT497z}AUA3MZStX<@@X}a0Z&c``C7<&A(a939=tOntt{$&xo1Y& zrHJiLZ_v$he<_u?y4#0*rn@o+IsXQk;mWlv=R|r$K2_QR2=(erH>L?P{7kG!j0}jF zI&BjqPDtusRA)SC0vQ82FOtPVsSbvmA1P&_oM|7+jWn>-V68R1x95V$m_0I|pAbXx zpGXl);ytli5cymbS;%rcBm%i4QuDX$v6+zLAo-DOZC}xc*FrKOvm*UMygN0sBN;Ii zQ>QiFj3+j5@8+^dvk-5un;WSfCSz_xK6F22Ze$zF4D>2J8B`eQVM&I()rW5fM}}DF z=#Ycbiy|4rWj-YNkm5+bkXr3Eq#`MabhB)QTmvbMWX8%=v;}X3%#Y;yq!My-q}(SR z;o;h?kv5j4s541k!o>dbDWH+ z!9CU{$eoeoQBr7+YJn_`C-+5C<0(eoPuY%`2O?QQYPI{2&we31hZrdkQm1{3(rH^f9BJcJXCQ`p^^wRR zr)q+H3VAe=KALi_)t-ffkk8skwU8?J$=~Kky%ceUlUDLHM_O6v3MYM$`H4u66nDP5 zE;7jZ+;@*0f7V5`{iv*pz6WV+h$4DQDS<^V}JbS0Y&la12si3~7%P9w>$O!|NcOk(5KFL{GqT3Xm<4bf4S@ z*&12SLVNgQkoO`DEVL)ILOzJ39VYWRi1YaC!?q13AIT1zh%xvD2u*b{!1h>UbbQhWISSijg+#`Xp;>2Ez&8ZPMh!%R>a_U zu{#nQq*Qg|cxxXT%979jPQa*o2+F44n@KhaQ zVxj?E=G=h#P|m}m)htgy(omn_(dLkh*@AY_C@~_cg{8c}srHE`uzbl9h(=geUm)*t z#zpg4;_BsCw{NuACtEQ3#Yf9oXw>=;vR|}`r3811zkrO14hgB%ZiZ0I*l5I{`qXNR zAiE$3L?^PW=9q+NmykM5-N!#DYM8PWtF!SvDcr|DBwEa(?(8Q;n|$&NV*VZ7$?`f< zy$%URGi{mAW|mMi$0zS1#)$5U$QpjYF?KXHD&skJQBtedfmQRqSk31W{cgQi(E|&AL9^jHchH1w}Cnn2$+8}p8j*n)ttbyDD znG|hgS;~?YO*vfVJR9;~#7vHM3aQm5orgO@ko0I5%RIysLr#h2A0f*+81*?8^*J@# z%3?z%Lo%W}gveD5mv`dsb~NcoS(aMoaC$V|C$!EXGg{!2DJbiVXtj`9cjZG?w25PW z?nTMid#6VODKcl08IbH~KFdhdnPPIH^**7P^P^oX2O{Pg)bKyi;88N41Mu5PLwzoa z<_f6_9E$y!=Bt-P^QDN9|03jbNwofGO6ASxFOBYEQM1$8(Trn6Ow3WpXAV-$jphoe z(rDzr5mFd!W}%UPA>{I?mMU{rbJ{DT1ybV9=K2&zOIQjZI@bFYM;EfFv+Uw%jgYE< zI&&$Gu97h^B}lajWfeyogj8rtAZsBd(LR<dD>W*_|v|ot4ez>9^EAyj?6R8#Q zOQzqWUAITGgvhqjOr|QD>l1p4?T%=Hlz>{VwJ2I71n+6TTCV$A6fNbLVfV>*qAre> zbIiUFnrkhNR&z`O$1I61=a}&vvn1LeMROnns9|-qndNxMpO8DFT|S9D3v1(}v6HA> z@(H8SkfqT=pBxIgJ6a=TnYQ^dJf#I$5luNkZqp3pd^BpfGCEO6MPMf61Kc%R8O`9B zIS|_JtD;#Pa|48WY*jRuV-|AE>S#X4tl*f{(ISp{h-2=FmIZAEWysMY@MGJ*^zm)r;Wm4Q<%6-vlDef%yzGxE*&2nj5+#hZ637us>5N-Df z&4e4GT`VtOCR_SobU=vr+j%I8ZpUB8h}Yl2Jx_d_`(anMLmq)NDjEGA+C?jDT^aEu zWFp$`%4pR;YoaM>vN!hIinURQSraYs$uvk)w8kgrKpu~_O{P?}+8}bi2(m7klrAN3 zf2?*HWPNnksZz#4u7^Au)uu?XA(fB~(PEa9A+?a_qm3-*bIitQY=%r#3R#7iw&-$} zyC4riUWzU}O~yP5c?z;AS~^wA(~wsnuST0#UV&`JZ1A<{dLiC+Z;!SLsngy;Oea#c zM|b(;J;>|P!0D88oknkL{S@*>G*d{G`z*to(QFp=EW?}8JeE(8GhHiqD_X#^3qt$G zThU^cUm@Qh=eMJ!EC)V-cg_f@WH}Zx1lb&|W|;yRIfG;s%M5JOv5+m%29~oCbC{53 zDcVI43-V61%_oOLwnpoxQA?||YY}rSjX7Byym7)_fla(2)DK8zOo2@%O~?8Uqx$tQVIDw+TfGB zAm2oLd~z@3+vtE#9)a{l*PkuR`Ww$qJ`MRXI^dIyke{Nd=Xf#gkYA#eEH|U)-+}xZ z-7KV5tAxA{`7K(0E~To~Y9XINevc;SNO=JA4P-DHm?`CP$WM?zq5~|gkUt=QMw8Ez zG3}7y*?6}`bQQ~1$Y{u(XjZO_`2un^AE&q6U>ki(qKEIp9#Amf}s zzD#A!!M1{ocgk6QLd@v1@wQB--X|u+bcR^|Ld=N}+c9Rzd`3Qq?*%{{CyV9gd_2XD zs|SZWIV}4jW;$YyaLQRiknjb#jErUcC{$I>jlwO!lGb)eNVaMUB{}ImL6lZAw?;Pjf1z1k}BN)0}D+^@Wbp zoK-Aw@5p|h>NK!C#r2u$G_y4G)6=Ir11xlmD@P4acZOK#7`IqRU@p~%XWfuYr(1}3 z+?nR|v8Yy@;WQNP-HJ1u7AfxDa)#5!qV|?EoK642;elF0JIcXDr;;RIR6|A1?C z*jr{e$t>?9=ckY=+eu~l4)TJKbe5QhWX#!4CQBlOV$ODQSdQeFbDTVuX&iHoQ^+!# zW6pJoS#IE%bDc64diIv;ljBsf&~s!|R*qA{vV`-Q>8xV8pYxgNGzyX1y#uMvbCzF8 zJ?3rq^PNT(wcT@_rfc@z?zv9lJd!%?DdfBb`Q$noEcDgO4zLUj5&wGA_cI7*{EcCo5#msW@S?GCBikamUvCwmx z)QU@;5|s)uG-_Syl(W!t^b|AOS;#`qgi_3GXE_T!6G|}!PCW}f6G|}!P7{lI-t#hN zJ&StY^D?K6MLice$7yF#&qdC0wy~&ZFy}g5Eb1A|xlRwu*WC6(r;ml6!KAhqI)g0q z8~h*Szm8TSw;=rne-RSTvK3o-59D$uf#oAe;2e@5%U6&CAXhjMAr*liAweOj9P=mS z2uP8W#xY|a##x(?OpbZ=UCh^Th2csko5e)TBX}n3N+*wnj;C}*=qjf`hMc)U11+6MMZBHS50CN%F~Sn1^5Iq?A!ig*FX2 zUxa*0ol2H`NCD(Vr=F!4axG-Ovx#LsWIp63C+lX>&!RqeK+2phpU~cNvoq!vimB7? zM5?s%kV$`|ttxl5}TwFi+i&3|rl zcCxfW=xwVDoPu&0^9E!EO0RU%D`b7TIo0h>jSx9*&=ZAKPLq_tPl%yk!9r&}3+-cc zw!YA56(UErM&!KES$G@e?2T-ToK-ApWLxZ{FQ6FjO2uL)Q;7FW&0?pFMLkoq*r{Yu zYmyf`)hbn^T%WnbX=EAiN*ha>D?3>7TomM*~EF&JlJ8+J`buFiiWh~@z^z)t0LY8q5 zn#JAa)Ua3(n#JAa)Jt*CSeH8MeL{QYQfHGCZDcpDZ6N0wXGln$b|mtlYfa0Xq}%1* z@;#n+pgn52(_BS@dt``t6{%J@o20li>N;n$5N|8jIXk7e*Q4s3ektO5)SJks&WXQ6 z>>CH3-@dqhl{5bw=_4NjqqakoW- zQ|gl-dbPo6_DSryxZmw`NeL`O&h#yO*g+HU*D>OG zNFwABC8OJqh|%`Pc7N0rb$s{aHKd|nw+b9-y*XoGcdg&Y2b`hviC? zPTRf3$zv&l&~LfLDHI|{<5?){S*KlyHyS_Z>|jx&@dl^iE~<}r4!gnW5rStqk#iyP z+2HiCoHaUDyGqD_6m2D9N`%BOrF`myR6trCgJlh3mO?feCyi_TD$0Ocu3=zv*PNs9(XG zPA-f3rM#(rDekZ7O($Q()M_uG&h$2bx1Dk!-X6Z$sqx7tsLy7n!6&_tt?EoOG7&Ayn1}P8Q3alVv_1Iyo$(@a#6_^P!WkVvy>mO~bSxIoFl-La=TS@*8^WV<&L8?4MEy{R+CBF+#kN zw%f^&G48Lj+bI&_jW*p*n=fXc9K4mn+2NBzAzwIsJ~;}q%Sl`&OIN?sADkcyy=jfU z!uf*}VW~k4=}m?|I4LaeMP!|Sa3)F-H9Q?T|KODRWG1BFX%*t#3H{mGB*goj{_Jd% z5~s$opPeo#F%2kvDc+Ltv$M-5bCL7U&Jas8Vu~TZIGM|-T^%tbHwmd1Qmdu5YT6>m zfRns}V(`9q#5@G~)yb|Cy&+oB0{P9!_elq2(5V;F8>5aFe>jaS>Ui;o(;_8K9WVZL z+Jsby(&>2dr<1;t%Bs*_Md_LNQr@3VrVwwN{^jHesnfP0rVFM2<&;SYd_{G}D6z+> zl&J#0LukF<9;cd99e+Tq_Bm4h?X(N=e#_c~9X_FvR-4c-C9rRk+@>)T2Bl~rNH6k< znGm~5^pBRxGHk*amRXNzV(%S3VMs`=_7wIXs^Rbn*{fwsGdbts6H0`5Ege3gT!^e8 z)o1vGYM;=Z+1LrId_plJCp7wmV)mJ^-X|0jH=)fZ6f852Z}VlqF%v zgbn3DtE!MWsXwzt0n-JpLO=x^y*LA(Gb3UKX_ITWX+)uCTI`8W`=W{;ibAFZh zlvvBP#vEi4r36SyASPszzmP=qb1Ed(UlAhbK@RfQhsd>%IDe}YwQY#Ed>`uX50N>@ z9OjQ(B9^W)|A8Ft4=9mW1I1raJi?zWMZMWf^mBwijWT+j#``lU)1HJoNLS%q+^TRR^LoRgX@96ni$R+-iXZDx%1R(8@EPs;}Z(U4xTb+SSFEZ2pEfJY( z+{{0b8Aj$Be_KQ*&)*@%`}LRS?^ELb`pfeVDUrYa_QidQdH(2UMTP3V9U(XRV?$&j zWQIR6L=J)6S3-LVuOn;k{ zT@%C^&fR#vdzQbKM88dRmVb~$zw>jJf0#s{_nYM(B@z3~e`BvT%Rf${_nEW&(e+~N zyC&$j!_D&hNW?kwvt_GT61^9l<&PuL=MQK3<4N>hbe2DXM873&BznI(%b!J}_p7t~IV5_&I?JCY#oJnD z`3t0YXM|??>q+z(p;`V$5`9K!mcN-K59?igpBDPNNXlFpAZc`EjAXMbvCoNhvDo*w zS9Cu~BtciwNX~a9n`Evlg(OQ|sUX?xNxDIj&GPC_nBr_oYhRpHDJ};Jz zzuFAB7Eil-^(`lm_RH9;Rs%=71w=wpd_{&EuixtQm#A<^GE^Zbn@`cp8^ z-%6s7CFc42N%W^+o`0A`9~I2=M>nWXoZiCc`Qu3RvBW%oB8fiUnCDL>(cAnye>#cY z=I8kfN%S^9&)-3!xA}SgQ6*9OSYn>vctO-tZG4Hlbn-EW^ZeN%ay#S>f1MOHtK!(W z*xw?h)6i#oiv6)KihjJze1AZSmznRch{!DPH$-F>_>Gss`?=d6FU9NUZhvt^ro>+# zkty+KHhTStU-b9-b3;V@qA&9ogoyY>f1kfxO1ZHDzhUQN>=ph#Dc+d32 z16d7u-rw`OTDoyEzQ6FUkC*(>Z>UyVklBRH%l?#RA>Pv8@MnaGSbDQRM@pxmj{%nX zdr0*0#tMJxGSN?`p^q-!@u$7%i8z*c-=8I=)c6TY7f-f!_zR?XOJCzJ4iT~RPJd;H zi1}ITU!ufkyr%XoUH%4=^Dk3xI_mN_ksN@Gc+*jrza^v}@m8fSf43Cxyw*qlgypJc zeO_ywKbu6q>1drlx2{{qOatUx$bf&4aD#$T`;gF2@);lH;*DjXjZS%(j7D!p>`vR@RNRJDY zlY9>mBRwuqMe>*E8P{$S19c?(y@Bl+*MJfO4N|a3 zK)1})8oPeS6KtsYkWy+Kjh_F9R%Zu>rFcE32YemjbC@2; zk)ksDUx~kW6R4t${yxnJjFaf^(`kYHHKHH&eR>F5Wd^2o3h|b8X&_&Ux4te7w1s4j zL947lKV|fH<>i5lwc-6t59CSl`k5YR4ata_uL=xMMt|#F9mwiZBh}w}*9W>t^tawk zfxw3Z z_cK3`B}FYu^s^w)LK*!l`<{T^En1ZtCu5x^VWjs3Dx@ql#JHwH9teyoaktfn1F`GF zm-TQUPl{UB|K%#&7E)5is=--t~0}Dv> z{WePj_KtCk5i26;7*_lfM;5b_bEIZ#CMWfY#2ge(t?kcgwx-H`tV@;+6q z#L=lZtM*=?M@p%2H~Km3Dm;;1RmB*ps%`8ZI&MP$6s z>BoUKDc)Y<<3Q{e;h9eZ0V!VQ(?Cf?W>a8EL}pW9BqVbwM)7$dwqNw@?Txntib(X{ z_{+e66jkB1Xtg6?Y*nrFUSe0ENJ^>k4#r-9%y)rSDXP_6$Z(*CTIqel4}tVAML*SY z4{#4Mqk)*Ogwz@zqMt_~zXVE1#J14{84qL+sLTK|t&l$h9a7Y?K7s6QPTnRm3w`1m zwAkkNF%w8e&}tBweas{&of96zU0!Q(m)Aa~P4diV_$D6}l1ifAhV(Zxog^L4L5ue+ z{msOJ@UL^91Df$X&ksF9wE%zYTuQ0&k!Xdb+h!HX=MeE5%{E6!CPd?HBxuFVyj`N7QsYNto`#%e z4wD>-%!`nzX7<-ABi`4v0&=F=OL7iLx|unoGFL%5k-5+uC)tgj#j(~u&D3v1rq(!M znYz|?iCHJ5)F?%(9<<6dN2FBCr_`6>9*;}S$=|A;k3}mnip$I)DGPn4Ld4!U%N!xm zf8Q$093#=&Se9vgC;D0FI}feI{A8Ivl6+TUNgi@#GD$V|tEyFk61n~Kq2?^JUrMcf zFV;@TRc7-bFS(LWveuOnk|9^>NZj+!W;2O<{@Lsz*?YMj z*8s_3u8ffcT#5ZZHHtG_Ng`P?SC1==aT%kkX4{p?BpAwR@U8y5+uNRoj zB)7YnE|Mx&21u5PgOXrIp0Jeqr{IxYsYtA(A||mGP^p`A%0ROQ|)Uh5U|pm=u~xBrif1uEjMDGbKb` zgUm70L*yRFTr-R04Yazf2Y>6(%p+-q>~}TpAvcRcG6P4v@gOovz0^rjh7=9yD`F^wJlZMG^fxVlIftJYrTUaVxAcYbc|8t}I&+v>>3Zr+<99hycUe!E(Mk-xtS8I`QmT#rL(k%k zNl%;Yl+jCn#_W>fE$cb6N40X#i#})O{Gn!5Fa0^QP>HXU*2Pk@h(xcQrDid;()BDg z9NKt?DP8?Bpn&VOy z`ff%);?AqJW^|NTR;jNXQh%X| zMj3r?&xhtT%IK@EADLN{5l>Euzoz$*nM)ac9d?~rM53?5t}_= z%__=>XS>AMyUit17W$sWNX4&!^=1QQUW16tdb64O(bsb~n5~r2f2VJQ*+Ch7{%51v zO_>jI)=1pHy3y>TjK1dEV-84J===CYoV!4##~h}NKL7KvIZFNL=f6HSjlIO$*)>6* zL;J)`kW%W?f2Z#gGe8-A7VA?pnKJq>kbY{WQAVGg>os#JqyJ`NuUQ~Pz0X0MS=wY4 zQAR(Dx5+G_%sZH|Kd~KtW>!$KTit4=lIU%9tC>!%^tQUy%%qIoR=+f}DWkX5 zFU>qD-nROcSwI=Rt$t+|Q$KoJ9WYBMqqo%ovyw7;Tis^XP)2X7+st~(=xueo*+?0^ zt!_74D5JO49cCM4^tQUg?4pd`RtL=?%IIx%&>W?V-d1;-Q2+Qk6Jr=TisSEHhs+!)-nROUStzC2_zByyIG^y1 zS*7}Mx885fCMn)|zi&l!m*QoH&BBPx4`yXV<_B{iA~Rx+M`T9K%zeX` z^|M(Z#aq_TW_v_t)a;MQjGDGDyq{mpX;Qp?elhDKGGk_2L}tv4oe8=v`nnYh)=5!4&&SeF4fd%_)K#db0+JHUI#9NX z5@+?Fg`64ek)m3?4M`8i9waggeQOU^&ncW2oGhg?Y6kl0K<2#Qf)H5;IX~DPBAXx= z1al8o%eoD%zJy#D>4%A))zYgW`N2Ucoj!dY@|NH*i9XkTOK?ny zq0e>S8qAt3=f}|Jx^D}%lIU~Yg~9m4MW)o~LxuHN)|_AtiMX00WNxsPWEh#1kUN5d ze^;&k_BO8gK;{SYk5F<(qNU8#l~4^ z^*^*K3l4|0ipkyESQyMdQugE1&!h2 z2GdCNY&;vBro^3%`d}l8o{go!nBzpx-fX-OER>>V<611eG1yNcW<$s;!IVTb_Sum2 zXYOq@1uIF!Y|KXHwcrqmn2j>X8^QGB!^gfXm@CB_`?6q*%D8XNSsrX7(QkcO9_%7{ z2tAA6UoF8Nl6uG-{I+Td_LD4{hx+re@YJ*)2qTcwm57wsQyyn%k&gCivESo(hR_4_@3XTeSRlolpEbepkc_x`yEd4Aa(IPZ!Fm#1;YYz?5?$f?;HY1;QWf@K={>wk24gGVWU55-g%t8Pv~~ z-~y8A)X$b+1&MxM?~7m+$$Nj|SOeGEz6dTM(eE(n4>pkKW6}O#Gs!LJSv+&JHP}jW z7exFX+#2j45%&!Ij8S|U?3PmM6VLUJOX*V?cNAX*hoyKU{VHf%YF70;e-%t2sk&AD z7XB)jPNJU)9SBY%(a(eq1hYwEEW8OEZ;aX&%#~8=t3u5ON-0nox1R065+%lY`0w%f z-}Ydg6tBV^!G0;~&E&@+vm=;ci<gLFXlw%Vjr8%IO7Lwr`kX(HoY?b_c; zR^r}4y1$jKMBYLABUBP|KJi>ycZO==o49CPc(vfjP`dQ{v+r)!j9RTNz4>lW@E`3FA84DkixL z%aVUz#_E+)YAk|?%n{b;)bMo?Z~0D_;;xH$YqAo#F8+>I@m4a4eBUYLNGmNwj)5Fy zWrau*TfrvY7Ei3vTO1>entxA&JkUI3ttOhA+Ygr26 zR)-Yzc7nehgu4x`UMb%8e2O)s#GS)atT82O4zcu8thjT;($!O1qMlQ&gb)$?)zd6H zM8rE|Q>=6;-W*P`N~A0_c239JGEw1FtMz=*bG5PmyLdtkl4=c;BtkxioM|;*ATr*! zRhrcrB0nILX4PFNGrqIY>VVO`jPtE}l1p4^B$)v@BpttQtY(rsAxGRGq?P0m$O%%~ zNtWM%d+?@;Oc%)u$SlCO`T16l68R~xWviNtL_KQe&xKrQb^KFEt;(op|t;7(?IU8?3vrRvt+vWH+S1Y9yHf**6dO9$4*CYK=DbS@Z90+-ucP<`jq+MY+{Tnd=~;o^q>)GLKN^K5LLN?^8ebS+RMl zo}Valzm=%OnDl|_`F<;fGL|dTD03l1)N{X8OqrV~^MF-JnfoDPTn|`nQmTzS+>7-) zT2)$!H;Scuzx5Vb)1-KN$VFDJ5_b=|$SPDK_mH=u=S5Z}iTIWg@`zOzBC{b?R#S-F z38}U^q|exHYe^YC=T3Q*Ncz5F#(4)qky)5P1{wjy3sqQI8te zYRG$5{A?kr=8qunTZK|;jiXO9j2{D^T4Ny#7?hm1O{I!Ju{&gOpe^-8OWyp+ojP$jY9U|hLAwyP0i0r^yTfeayLu4J6HEgwo$fwBs zX!V51C&>JtH5ejaK*p@`5Lt&-yRFz#QM0ON2$?85DMWsT>}#imh;b8sciUM~yxBO= zE>ao!E|grH?K#k1pfVGRY3&?nS5l@DBAzQb&|X6FgqvxVqSnPkEbBl!aIdJa))4FB z5XeDxMwyb`Byo0)lxpK8^m7z4huXe!k*PLTik|U#Kip1|qDJaR=I?fHh=^G|!Y&FC zF{?+}6(J&K^;mmJh=^G|(Qc8V-UlMqSHSKF5izTl-5(-iR!^}yqRXWEq{yCCA+#hG@ql+Fo1i`l>@67}NVS`wAu-UaoygU_@Blo7JBSM;1CrQA3eJ)ebfrP=k=N`EfS zv74z?Gv4@@iT5p^W4DLM1!$FScT+39A3N9Xr;LzHWX`jPLgWg_`Sw^yKi5GnuzmN- zt;LstQQQi-$c`h)BDvU3Ai1985<5ULljL7^DoH8HWp)Nh70Kmxwv=i^yvcAbmUV@l zuQGDqat~y>-Ap33=Y^0f?T!jj;bJ2JGj<%FugtMyA5bFxCg3B;Ty1BPoQjN)Ywg?+ zc?@!$Jx1~mWR^f~u^>=YP5~ob4!PMLqKsI}VhtA99hG9~>i2s)n3^^Q`yY0kB)zU?)1js#h$zmmMQKr;RsuAMN*uAzLB4QtY zubmnqN$97{&I=I^xzDZ-kyOb2cDoYaYAj29P8Zn&B%eSoMP`vbMA8otpYBEWh!k&c zyvQC?;(l@$*)flanmeO@bXz5m{OL-vlwDE!v%JX8lj41rtL#Q83ym`_R!d)Ow~>f- zk&Ox$+X=ODevE_G;K^}FjUD&6k|QAE8b_^NET!5ALS`XTYiHDnjN0=TLms!YLPVTx zuCr@M#AoLoWS+F^L!<(-#9s2G>L>Mnoc)G8YY&rr{{;R!fa*ac6E4DLuo&7VPDvfGrnTV|u3^^C}n2vT{vs*~?@y}~^8;QQ^@tWPC#6A9b&F&46A5rt` z_F#zo25Gjt>%}O%>A+C?PQm<`d-+je<~h|D{7>r%0-YU6oik|6Ke!&1CY<$Lych=~2zdv?t8a$U$H z>aQU0+W{%Hz6FotFQuTLb~~A*89ggWm7>NqRc5+L#MsjztL%&huV?w|#?F!A?SEF= zX)mbx(fglHyHHB0A@(*Gp`W#O;fo?uD)&g2K|Zu|UsAFf^$7XMPH0rJ5ppGDojpJz zj(>!7+s!YljQE_2R_pBruL@c0)6eg0u&b09gXl+`ecE6*P-g#5Ev=M^hlul08|(oo z-ua)6c1Dxv+55fov0W&|TNfYO#ZtjBzpW0m{x0CeRJyN`SHraiYxeu9pci>&GcHlKJiZbIllF#gXl6N7u zVdHbg5-F#5_^)ZcHj+B&$bCc$URur zRy$cq)Le*al}ec>MFz*uTkUkptbyDoTh)+cW8eHJ-v7MSULwUC*H*hhN|`aS3um#S z#j@;Xv2-u^u#=Uz74EQ8DWfagVW(5(e`xhAD%@c=k?0C{ z*ez1LdEQ~SNhvd&5AmcVW@Cq4`CqYgFEeP@NGUVULuMm>O$^!{QoK+1PP-?f)lR#Q zT3t!4cG?3GnO*h}W&VSVI0LiGHr^IX_j>-?j*;Tk^R*o(rOc>CtCuj+ukAoYX2?#a zOan5nBQs>DOYwUC#?Fjr^^KiPt=g&PZ|qzt+oHt!65G$Wc7K~(J5gUD^A>vk)*dF& zneXiO_ro*a**#Lcr4QTvQoL~u+k;Zd1Eg|uB;~fH!eOUv^QIPLf?q&E`6Uo^m6Ict$O^{R3 zYCqOSat~xG_N)7|9+JmMV%VURg+?C!p350%bpY$=7UQZmUPUGyGLhx37vha#63Y*f zOk^gpN+}(_wEfgKV_KDS#{ESRClpABE|a)zlX9$%6#{&${fa;l|=1^i1#cV#yX@_8@*Uo0eU`+ z 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 @@ -795,7 +795,7 @@ public static bool? EmitCamelCaseNames public static bool? EmitLowercaseUnderscoreNames { get => TextCase == TextCase.SnakeCase; - set => TextCase = value == true ? TextCase.SnakeCase : TextCase.Default; + set => TextCase = value == true ? TextCase.SnakeCase : TextCase; } public static bool IncludeDefaultValue @@ -1016,7 +1016,8 @@ public static void Reset() RawSerializeFn = null; DeSerializeFn = null; ExcludePropertyNames = null; - EmitCamelCaseNames = EmitLowercaseUnderscoreNames = IncludeTypeInfo = ExcludeTypeInfo = null; + TextCase = TextCase.Default; + IncludeTypeInfo = ExcludeTypeInfo = null; } public static void RefreshRead() diff --git a/src/ServiceStack.Text/JsConfigScope.cs b/src/ServiceStack.Text/JsConfigScope.cs index 2ae298727..477e4db91 100644 --- a/src/ServiceStack.Text/JsConfigScope.cs +++ b/src/ServiceStack.Text/JsConfigScope.cs @@ -123,7 +123,7 @@ private Config(Config config) public bool EmitCamelCaseNames { get => TextCase == TextCase.CamelCase; - set => TextCase = value ? TextCase.CamelCase : TextCase.Default; + set => TextCase = value ? TextCase.CamelCase : TextCase; } [Obsolete("Use TextCase = TextCase.SnakeCase")] From 93b3e2f5fdae45469d111856a1c9bcabc9b1a643 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 17 Dec 2018 17:56:39 +0800 Subject: [PATCH 037/372] extract .Core to build-core.proj --- build/build-core.proj | 84 +++++++++++++++++++++++++++++++++++++++ build/build.proj | 15 ------- src/ServiceStack.Text.sln | 1 + 3 files changed, 85 insertions(+), 15 deletions(-) create mode 100644 build/build-core.proj diff --git a/build/build-core.proj b/build/build-core.proj new file mode 100644 index 000000000..96c19ec52 --- /dev/null +++ b/build/build-core.proj @@ -0,0 +1,84 @@ + + + + + + 5 + 0 + $(BUILD_NUMBER) + + + + $(MSBuildProjectDirectory)/.. + $(BuildSolutionDir)/src + Release + $(BuildSolutionDir)/NuGet/ + $(MajorVersion).$(MinorVersion).$(PatchVersion) + + + + + BeforeBuildSolutions; + BuildSolutions + + + + + + + + + + + + + + + + + + + + + + + + + + ServiceStackVersion = \d+\.\d+m; + ServiceStackVersion = $(MajorVersion).$(MinorVersion)$(PatchVersion)m; + + + + new DateTime.* + new DateTime($([System.DateTime]::Now.ToString(`yyyy,MM,dd`))); + + + + + <Version>[^<]* + <Version>$(PackageVersion) + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build/build.proj b/build/build.proj index 44c8dc542..1996c2f91 100644 --- a/build/build.proj +++ b/build/build.proj @@ -30,10 +30,6 @@ - - - - @@ -88,17 +84,6 @@ Properties="Configuration=$(Configuration)" /> - - - - - - - - - diff --git a/src/ServiceStack.Text.sln b/src/ServiceStack.Text.sln index b90674668..6ae98a969 100644 --- a/src/ServiceStack.Text.sln +++ b/src/ServiceStack.Text.sln @@ -11,6 +11,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{F7FB50ED ..\README.md = ..\README.md Directory.Build.props = Directory.Build.props ServiceStack.Text\ServiceStack.Text.Core.csproj = ServiceStack.Text\ServiceStack.Text.Core.csproj + ..\build\build-core.proj = ..\build\build-core.proj EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServiceStack.Text", "ServiceStack.Text\ServiceStack.Text.csproj", "{579B3FDB-CDAD-44E1-8417-885C38E49A0E}" From b764eb4bb21d885761de0488a8a77dc8186d1477 Mon Sep 17 00:00:00 2001 From: Neil Dobson Date: Sat, 29 Dec 2018 23:12:32 +1000 Subject: [PATCH 038/372] Support nested dictionaries in FromObjectDictionary through recursion (#516) * Support nested dictionaries through recursion * Final check seems unnecessary and prevents converting collections of generic types such as List> * Tests for mapping inner dictionaries --- src/ServiceStack.Text/PlatformExtensions.cs | 5 + .../TranslateListWithElements.cs | 16 +- .../AutoMappingObjectDictionaryTests.cs | 140 ++++++++++++++++++ .../AutoMappingTests.cs | 11 ++ 4 files changed, 166 insertions(+), 6 deletions(-) diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index a0d475bf6..e0d5069fb 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -628,6 +628,11 @@ public void SetValue(object instance, object value) if (SetValueFn == null) return; + if (value is IReadOnlyDictionary dictionary) + { + value = dictionary.FromObjectDictionary(Type); + } + if (!Type.IsInstanceOfType(value)) { lock (this) diff --git a/src/ServiceStack.Text/TranslateListWithElements.cs b/src/ServiceStack.Text/TranslateListWithElements.cs index d7049572e..6daa032bc 100644 --- a/src/ServiceStack.Text/TranslateListWithElements.cs +++ b/src/ServiceStack.Text/TranslateListWithElements.cs @@ -102,12 +102,8 @@ public static object TryTranslateCollections(Type fromPropertyType, Type toPrope if (fromElType == null || toElType == null) return null; - if (fromElType == typeof(object) || toElType.IsAssignableFrom(fromElType)) - return TranslateToGenericICollectionCache(fromValue, toPropertyType, toElType); - - return null; + return TranslateToGenericICollectionCache(fromValue, toPropertyType, toElType); } - } public class ConvertibleTypeKey @@ -199,7 +195,15 @@ public static ICollection TranslateToGenericICollection( var to = (ICollection)CreateInstance(toInstanceOfType); foreach (var item in fromList) { - to.Add((T)item); + if (item is IReadOnlyDictionary dictionary) + { + var convertedItem = dictionary.FromObjectDictionary(); + to.Add(convertedItem); + } + else + { + to.Add((T)item); + } } return to; } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs index 447ad0efd..c90e3b2e3 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs @@ -405,6 +405,146 @@ public void Can_convert_Dictionary_FromObjectDictionary() Assert.That(to == dict); } + [Test] + public void Can_convert_inner_dictionary() + { + var map = new Dictionary + { + { "FirstName", "Foo" }, + { "LastName", "Bar" }, + { "Car", new Dictionary + { + { "Name", "Tesla" }, + { "Age", 2 } + }} + }; + + var user = map.FromObjectDictionary(); + + Assert.That(user.FirstName, Is.EqualTo("Foo")); + Assert.That(user.LastName, Is.EqualTo("Bar")); + Assert.That(user.Car, Is.Not.Null); + Assert.That(user.Car.Name, Is.EqualTo("Tesla")); + Assert.That(user.Car.Age, Is.EqualTo(2)); + } + + [Test] + public void Can_convert_inner_collection_of_dictionaries() + { + var map = new Dictionary + { + { "Name", "Tesla" }, + { "Age", "2" }, + { "Specs", new List> + { + new Dictionary + { + {"Item", "Model"}, + {"Value", "S"} + }, + new Dictionary + { + {"Item", "Engine"}, + {"Value", "Electric"} + }, + new Dictionary + { + {"Item", "Color"}, + {"Value", "Red"} + }, + new Dictionary + { + {"Item", "PowerKW"}, + {"Value", 285} + }, + new Dictionary + { + {"Item", "TorqueNm"}, + {"Value", 430} + }, + }} + }; + + var carWithSpecs = map.FromObjectDictionary(); + + Assert.That(carWithSpecs.Name, Is.EqualTo("Tesla")); + Assert.That(carWithSpecs.Age, Is.EqualTo(2)); + Assert.That(carWithSpecs.Specs.Count, Is.EqualTo(5)); + var model = carWithSpecs.Specs.SingleOrDefault(s => s.Item == "Model"); + Assert.That(model, Is.Not.Null); + Assert.That(model.Value, Is.EqualTo("S")); + var engine = carWithSpecs.Specs.SingleOrDefault(s => s.Item == "Engine"); + Assert.That(engine, Is.Not.Null); + Assert.That(engine.Value, Is.EqualTo("Electric")); + var color = carWithSpecs.Specs.SingleOrDefault(s => s.Item == "Color"); + Assert.That(color, Is.Not.Null); + Assert.That(color.Value, Is.EqualTo("Red")); + var power = carWithSpecs.Specs.SingleOrDefault(s => s.Item == "PowerKW"); + Assert.That(power, Is.Not.Null); + Assert.That(power.Value, Is.EqualTo("285")); + var torque = carWithSpecs.Specs.SingleOrDefault(s => s.Item == "TorqueNm"); + Assert.That(torque, Is.Not.Null); + Assert.That(torque.Value, Is.EqualTo("430")); + } + + [Test] + public void Can_convert_inner_array_of_dictionaries() + { + var map = new Dictionary + { + { "Name", "Tesla" }, + { "Age", "2" }, + { "Specs", new[] + { + new Dictionary + { + {"Item", "Model"}, + {"Value", "S"} + }, + new Dictionary + { + {"Item", "Engine"}, + {"Value", "Electric"} + }, + new Dictionary + { + {"Item", "Color"}, + {"Value", "Red"} + }, + new Dictionary + { + {"Item", "PowerKW"}, + {"Value", 285} + }, + new Dictionary + { + {"Item", "TorqueNm"}, + {"Value", 430} + }, + }} + }; + + var carWithSpecs = map.FromObjectDictionary(); + + Assert.That(carWithSpecs.Name, Is.EqualTo("Tesla")); + Assert.That(carWithSpecs.Age, Is.EqualTo(2)); + Assert.That(carWithSpecs.Specs.Count, Is.EqualTo(5)); + var model = carWithSpecs.Specs.SingleOrDefault(s => s.Item == "Model"); + Assert.That(model, Is.Not.Null); + Assert.That(model.Value, Is.EqualTo("S")); + var engine = carWithSpecs.Specs.SingleOrDefault(s => s.Item == "Engine"); + Assert.That(engine, Is.Not.Null); + Assert.That(engine.Value, Is.EqualTo("Electric")); + var color = carWithSpecs.Specs.SingleOrDefault(s => s.Item == "Color"); + Assert.That(color, Is.Not.Null); + Assert.That(color.Value, Is.EqualTo("Red")); + var power = carWithSpecs.Specs.SingleOrDefault(s => s.Item == "PowerKW"); + Assert.That(power, Is.Not.Null); + Assert.That(power.Value, Is.EqualTo("285")); + var torque = carWithSpecs.Specs.SingleOrDefault(s => s.Item == "TorqueNm"); + Assert.That(torque, Is.Not.Null); + Assert.That(torque.Value, Is.EqualTo("430")); + } } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index a34ddd860..b9987c9ba 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -43,6 +43,17 @@ public class SubCar : Car public string Custom { get; set; } } + public class CarWithSpecs : Car + { + public List Specs { get; set; } + } + + public class CarSpec + { + public string Item { get; set; } + public string Value { get; set; } + } + public class UserDto { public string FirstName { get; set; } From 7b9b4c3fcf9d036bdd2d2725fc756477445715ae Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 30 Dec 2018 18:03:44 +0930 Subject: [PATCH 039/372] Add fallback support for deserializing string in ConvertTo --- src/ServiceStack.Text/AutoMappingUtils.cs | 22 +++++-------------- .../AutoMappingTests.cs | 7 ++++++ 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 2c5963ca6..a619d951f 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -28,22 +28,7 @@ public static T ConvertTo(this object from) if (fromType == typeof(T)) return (T)from; - var toType = typeof(T); - if (fromType.IsValueType || toType.IsValueType) - { - return (T)ChangeValueType(from, toType); - } - - if (typeof(IEnumerable).IsAssignableFrom(typeof(T))) - { - var listResult = TranslateListWithElements.TryTranslateCollections( - fromType, typeof(T), from); - - return (T)listResult; - } - - var to = typeof(T).CreateInstance(); - return to.PopulateWith(from); + return (T)ConvertTo(from, typeof(T)); } public static T CreateCopy(this T from) @@ -80,6 +65,11 @@ public static object ConvertTo(this object from, Type type) if (from.GetType().IsValueType || type.IsValueType) return ChangeValueType(from, type); + if (from is string str) + return TypeSerializer.DeserializeFromString(str, type); + if (from is ReadOnlyMemory rom) + return TypeSerializer.DeserializeFromSpan(type, rom.Span); + if (typeof(IEnumerable).IsAssignableFrom(type)) { var listResult = TranslateListWithElements.TryTranslateCollections( diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 73c9eca65..6d61707bd 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -779,5 +779,12 @@ public void Does_map_Uri() var toString = new ModelWithUriString().PopulateWithNonDefaultValues(dto); Assert.That(toString.Uri, Is.EqualTo(dto.Uri.AbsoluteUri)); } + + [Test] + public void Can_convert_string_to_collection() + { + Assert.That("a,b,c".ConvertTo(), Is.EquivalentTo(new[]{ "a", "b", "c" })); + Assert.That("1,2,3".ConvertTo(), Is.EquivalentTo(new[]{ 1, 2, 3 })); + } } } From 56de071b2503f1db6c383b3bd842816e1db326ea Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 12 Jan 2019 04:03:07 +0800 Subject: [PATCH 040/372] resolve null? auto mapping issue --- src/ServiceStack.Text/AutoMappingUtils.cs | 12 +++++---- .../AutoMappingTests.cs | 26 +++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index a619d951f..56e8303de 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -418,10 +418,10 @@ public static void SetProperty(this PropertyInfo propertyInfo, object obj, objec return; } - var propertySetMetodInfo = propertyInfo.GetSetMethod(nonPublic:true); - if (propertySetMetodInfo != null) + var propertySetMethodInfo = propertyInfo.GetSetMethod(nonPublic:true); + if (propertySetMethodInfo != null) { - propertySetMetodInfo.Invoke(obj, new[] { value }); + propertySetMethodInfo.Invoke(obj, new[] { value }); } } @@ -750,9 +750,11 @@ public void Populate(object to, object from, { var fromValue = assignmentEntry.GetValueFn(from); - if (valuePredicate != null) + if (valuePredicate != null + && fromType == toType) // don't short-circuit nullable <-> non-null values { - if (!valuePredicate(fromValue, fromMember.PropertyInfo.PropertyType)) continue; + if (!valuePredicate(fromValue, fromMember.PropertyInfo.PropertyType)) + continue; } if (assignmentEntry.ConvertValueFn != null) diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 325971584..c9cc8aa69 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -8,6 +8,7 @@ using System.Web.Script.Serialization; #endif using NUnit.Framework; +using ServiceStack.Common.Tests.Models; using ServiceStack.DataAnnotations; using ServiceStack.Text.Tests.DynamicModels; using ServiceStack.Web; @@ -831,5 +832,30 @@ public void Can_convert_string_to_collection() Assert.That("a,b,c".ConvertTo(), Is.EquivalentTo(new[]{ "a", "b", "c" })); Assert.That("1,2,3".ConvertTo(), Is.EquivalentTo(new[]{ 1, 2, 3 })); } + + [Test] + public void Translate_Between_Models_of_different_types_and_nullables() + { + var fromObj = ModelWithFieldsOfDifferentTypes.CreateConstant(1); + + var toObj = fromObj.ConvertTo(); + + Console.WriteLine(toObj.Dump()); + + ModelWithFieldsOfDifferentTypesAsNullables.AssertIsEqual(fromObj, toObj); + } + + [Test] + public void Translate_Between_Models_of_nullables_and_different_types() + { + var fromObj = ModelWithFieldsOfDifferentTypesAsNullables.CreateConstant(1); + + var toObj = fromObj.ConvertTo(); + + Console.WriteLine(toObj.Dump()); + + ModelWithFieldsOfDifferentTypesAsNullables.AssertIsEqual(toObj, fromObj); + } + } } From 0959603f8b4fb553d80603d890b400d770cca9b1 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 12 Jan 2019 05:30:38 +0800 Subject: [PATCH 041/372] Add AutoMappingUtils.RegisterConverter API for registering custom converter --- src/ServiceStack.Text/AutoMappingUtils.cs | 44 +++++- src/ServiceStack.Text/JsConfig.cs | 1 + .../AutoMappingCustomConverterTests.cs | 139 ++++++++++++++++++ 3 files changed, 178 insertions(+), 6 deletions(-) create mode 100644 tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 56e8303de..400fce79c 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -19,6 +19,32 @@ public class CustomHttpResult { } public static class AutoMappingUtils { + private static readonly ConcurrentDictionary, GetMemberDelegate> converters + = new ConcurrentDictionary, GetMemberDelegate>(); + + public static void Reset() + { + converters.Clear(); + AssignmentDefinitionCache.Clear(); + } + + public static void RegisterConverter(Func converter) + { + JsConfig.InitStatics(); + converters[Tuple.Create(typeof(From), typeof(To))] = x => converter((From)x); + } + + public static GetMemberDelegate GetConverter(Type fromType, Type toType) + { + if (converters.IsEmpty) + return null; + + var key = Tuple.Create(fromType, toType); + return converters.TryGetValue(key, out var converter) + ? converter + : null; + } + public static T ConvertTo(this object from) { if (from == null) @@ -546,17 +572,17 @@ public static object CreateDefaultValue(Type type, Dictionary recursi } } - public static void SetGenericCollection(Type realisedListType, object genericObj, Dictionary recursionInfo) + public static void SetGenericCollection(Type realizedListType, object genericObj, Dictionary recursionInfo) { - var args = realisedListType.GetGenericArguments(); + var args = realizedListType.GetGenericArguments(); if (args.Length != 1) { - Tracer.Instance.WriteError("Found a generic list that does not take one generic argument: {0}", realisedListType); + Tracer.Instance.WriteError("Found a generic list that does not take one generic argument: {0}", realizedListType); return; } - var methodInfo = realisedListType.GetMethodInfo("Add"); + var methodInfo = realizedListType.GetMethodInfo("Add"); if (methodInfo != null) { var argValues = CreateDefaultValues(args, recursionInfo); @@ -741,13 +767,15 @@ public void Populate(object to, object from, if (fromMember.PropertyInfo != null && propertyInfoPredicate != null) { - if (!propertyInfoPredicate(fromMember.PropertyInfo)) continue; + if (!propertyInfoPredicate(fromMember.PropertyInfo)) + continue; } var fromType = fromMember.Type; var toType = toMember.Type; try { + var fromValue = assignmentEntry.GetValueFn(from); if (valuePredicate != null @@ -756,7 +784,7 @@ public void Populate(object to, object from, if (!valuePredicate(fromValue, fromMember.PropertyInfo.PropertyType)) continue; } - + if (assignmentEntry.ConvertValueFn != null) { fromValue = assignmentEntry.ConvertValueFn(fromValue); @@ -790,6 +818,10 @@ public static GetMemberDelegate CreateTypeConverter(Type fromType, Type toType) if (fromType == toType) return null; + var converter = AutoMappingUtils.GetConverter(fromType, toType); + if (converter != null) + return converter; + if (fromType == typeof(string)) return fromValue => TypeSerializer.DeserializeFromString((string)fromValue, toType); diff --git a/src/ServiceStack.Text/JsConfig.cs b/src/ServiceStack.Text/JsConfig.cs index 250e45f1f..b0074e3ef 100644 --- a/src/ServiceStack.Text/JsConfig.cs +++ b/src/ServiceStack.Text/JsConfig.cs @@ -680,6 +680,7 @@ public static void Reset() Env.StrictMode = false; Config.Reset(); + AutoMappingUtils.Reset(); HasSerializeFn = new HashSet(); HasIncludeDefaultValue = new HashSet(); TreatValueAsRefTypes = new HashSet { typeof(KeyValuePair<,>) }; diff --git a/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs new file mode 100644 index 000000000..2d821686e --- /dev/null +++ b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using NUnit.Framework; + +namespace ServiceStack.Text.Tests +{ + public class AutoMappingCustomConverterTests + { + public class PersonWithWrappedDateOfBirth : User + { + public WrappedDateTimeOffset DateOfBirth { get; set; } + } + + public class PersonWithDateOfBirth : User + { + public DateTimeOffset DateOfBirth { get; set; } + } + + public class WrappedDateTimeOffset + { + private readonly DateTimeOffset dateTimeOffset; + + public WrappedDateTimeOffset(DateTimeOffset dateTimeOffset) + { + this.dateTimeOffset = dateTimeOffset; + } + + public DateTimeOffset ToDateTimeOffset() + { + return dateTimeOffset; + } + } + + [Test] + public void Can_convert_prop_with_CustomTypeConverter() + { + AutoMappingUtils.RegisterConverter((WrappedDateTimeOffset from) => from.ToDateTimeOffset()); + + var map = new Dictionary + { + { "FirstName", "Foo" }, + { "LastName", "Bar" }, + { "DateOfBirth", new WrappedDateTimeOffset( + new DateTimeOffset(1971, 3, 23, 4, 30, 0, TimeSpan.Zero)) } + }; + + var personWithDoB = map.FromObjectDictionary(); + + Assert.That(personWithDoB.FirstName, Is.EqualTo("Foo")); + Assert.That(personWithDoB.LastName, Is.EqualTo("Bar")); + Assert.That(personWithDoB.DateOfBirth, Is.Not.Null); + Assert.That(personWithDoB.DateOfBirth.Year, Is.EqualTo(1971)); + Assert.That(personWithDoB.DateOfBirth.Month, Is.EqualTo(3)); + Assert.That(personWithDoB.DateOfBirth.Day, Is.EqualTo(23)); + Assert.That(personWithDoB.DateOfBirth.Hour, Is.EqualTo(4)); + Assert.That(personWithDoB.DateOfBirth.Minute, Is.EqualTo(30)); + Assert.That(personWithDoB.DateOfBirth.Second, Is.EqualTo(0)); + + AutoMappingUtils.Reset(); + } + + [Test] + public void Can_Convert_Props_With_CustomTypeConverter() + { + AutoMappingUtils.RegisterConverter((WrappedDateTimeOffset from) => from.ToDateTimeOffset()); + + var personWithWrappedDateOfBirth = new PersonWithWrappedDateOfBirth + { + FirstName = "Foo", + LastName = "Bar", + DateOfBirth = new WrappedDateTimeOffset( + new DateTimeOffset(1971, 3, 23, 4, 30, 0, TimeSpan.Zero)) + }; + + var personWithDoB = personWithWrappedDateOfBirth.ConvertTo(); + + Assert.That(personWithDoB.FirstName, Is.EqualTo("Foo")); + Assert.That(personWithDoB.LastName, Is.EqualTo("Bar")); + Assert.That(personWithDoB.DateOfBirth, Is.Not.Null); + Assert.That(personWithDoB.DateOfBirth.Year, Is.EqualTo(1971)); + Assert.That(personWithDoB.DateOfBirth.Month, Is.EqualTo(3)); + Assert.That(personWithDoB.DateOfBirth.Day, Is.EqualTo(23)); + Assert.That(personWithDoB.DateOfBirth.Hour, Is.EqualTo(4)); + Assert.That(personWithDoB.DateOfBirth.Minute, Is.EqualTo(30)); + Assert.That(personWithDoB.DateOfBirth.Second, Is.EqualTo(0)); + + AutoMappingUtils.Reset(); + } + + [Test] + public void Can_Convert_Anonymous_Types_With_CustomTypeConverter() + { + AutoMappingUtils.RegisterConverter((DateTimeOffset from) => new WrappedDateTimeOffset(from)); + + var personWithDateOfBirth = new + { + FirstName = "Foo", + LastName = "Bar", + DateOfBirth = new DateTimeOffset(1971, 3, 23, 4, 30, 0, TimeSpan.Zero) + }; + + var personWithWrappedDoB = personWithDateOfBirth.ConvertTo(); + + Assert.That(personWithWrappedDoB.FirstName, Is.EqualTo("Foo")); + Assert.That(personWithWrappedDoB.LastName, Is.EqualTo("Bar")); + Assert.That(personWithWrappedDoB.DateOfBirth, Is.Not.Null); + var dto = personWithWrappedDoB.DateOfBirth.ToDateTimeOffset(); + Assert.That(dto, Is.Not.Null); + Assert.That(dto.Year, Is.EqualTo(1971)); + Assert.That(dto.Month, Is.EqualTo(3)); + Assert.That(dto.Day, Is.EqualTo(23)); + Assert.That(dto.Hour, Is.EqualTo(4)); + Assert.That(dto.Minute, Is.EqualTo(30)); + Assert.That(dto.Second, Is.EqualTo(0)); + + AutoMappingUtils.Reset(); + } + + // TODO: Work out a way we can capture and monitor the Trace log in the test, as exceptions are caught in Populate method + [Test] + public void Should_Not_Throw_Exception_When_Multiple_Same_Type_CustomTypeConverters_Found() + { + AutoMappingUtils.RegisterConverter((DateTimeOffset from) => new WrappedDateTimeOffset(from)); + + var personWithWrappedDateOfBirth = new PersonWithWrappedDateOfBirth + { + DateOfBirth = new WrappedDateTimeOffset( + new DateTimeOffset(1971, 3, 23, 4, 30, 0, TimeSpan.Zero)) + }; + + var personWithDoB = personWithWrappedDateOfBirth.ConvertTo(); + + // Object returned but mapping failed + Assert.That(personWithDoB.FirstName, Is.Null); + Assert.That(personWithDoB.LastName, Is.Null); + Assert.That(personWithDoB.DateOfBirth, Is.EqualTo(DateTimeOffset.MinValue)); + } + } +} \ No newline at end of file From 2e4b23185d6c37e0f215d8b7b64152e390805390 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 12 Jan 2019 06:00:15 +0800 Subject: [PATCH 042/372] Add missing AutoMappingUtils.Reset() --- .../ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs index 2d821686e..9ca561513 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs @@ -134,6 +134,8 @@ public void Should_Not_Throw_Exception_When_Multiple_Same_Type_CustomTypeConvert Assert.That(personWithDoB.FirstName, Is.Null); Assert.That(personWithDoB.LastName, Is.Null); Assert.That(personWithDoB.DateOfBirth, Is.EqualTo(DateTimeOffset.MinValue)); + + AutoMappingUtils.Reset(); } } } \ No newline at end of file From 6c86218ebd4ca3b1db3d882a6e5a4dc3dffc0352 Mon Sep 17 00:00:00 2001 From: Thibault Reigner Date: Mon, 14 Jan 2019 12:59:22 +0800 Subject: [PATCH 043/372] Fixed erroneous recursive call in JsvTypeSerializer.EatMapStartChar (#518) --- src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs b/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs index bf8ac24db..a1b92c4ba 100644 --- a/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs +++ b/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs @@ -280,7 +280,7 @@ public object UnescapeStringAsObject(ReadOnlySpan value) public ReadOnlySpan EatTypeValue(ReadOnlySpan value, ref int i) => EatValue(value, ref i); - public bool EatMapStartChar(string value, ref int i) => EatMapStartChar(value, ref i); + public bool EatMapStartChar(string value, ref int i) => EatMapStartChar(value.AsSpan(), ref i); public bool EatMapStartChar(ReadOnlySpan value, ref int i) { From 3b98719e974edf3023090a621aabeeed442a211f Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 22 Jan 2019 05:09:33 +0800 Subject: [PATCH 044/372] handle deserializaing escaped unicode chars --- .../Common/DeserializeBuiltin.cs | 5 ++-- .../Issues/EscapedCharIssues.cs | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 tests/ServiceStack.Text.Tests/Issues/EscapedCharIssues.cs diff --git a/src/ServiceStack.Text/Common/DeserializeBuiltin.cs b/src/ServiceStack.Text/Common/DeserializeBuiltin.cs index a2caa15e3..0889051c9 100644 --- a/src/ServiceStack.Text/Common/DeserializeBuiltin.cs +++ b/src/ServiceStack.Text/Common/DeserializeBuiltin.cs @@ -11,6 +11,7 @@ // using System; +using ServiceStack.Text.Json; namespace ServiceStack.Text.Common { @@ -64,7 +65,7 @@ private static ParseStringSpanDelegate GetParseStringSpanFn() case TypeCode.DateTime: return value => DateTimeSerializer.ParseShortestXsdDateTime(value.ToString()); case TypeCode.Char: - return value => value[0]; + return value => value.Length == 0 ? (char)0 : value.Length == 1 ? value[0] : JsonTypeSerializer.Unescape(value)[0]; } if (typeof(T) == typeof(Guid)) @@ -109,7 +110,7 @@ private static ParseStringSpanDelegate GetParseStringSpanFn() case TypeCode.DateTime: return value => DateTimeSerializer.ParseShortestNullableXsdDateTime(value.ToString()); case TypeCode.Char: - return value => value.IsEmpty ? (char?)null : value[0]; + return value => value.IsEmpty ? (char?)null : value.Length == 1 ? value[0] : JsonTypeSerializer.Unescape(value)[0]; } if (typeof(T) == typeof(TimeSpan?)) diff --git a/tests/ServiceStack.Text.Tests/Issues/EscapedCharIssues.cs b/tests/ServiceStack.Text.Tests/Issues/EscapedCharIssues.cs new file mode 100644 index 000000000..f57911b0c --- /dev/null +++ b/tests/ServiceStack.Text.Tests/Issues/EscapedCharIssues.cs @@ -0,0 +1,27 @@ +using NUnit.Framework; + +namespace ServiceStack.Text.Tests.Issues +{ + public class EscapedCharIssues + { + public class MyChar + { + public char Char { get; set; } + } + + + [Test] + public void Does_unescaped_unicode_char() + { + var dto = new MyChar(); + + var json = dto.ToJson(); + + Assert.That(json, Is.EqualTo("{\"Char\":\"\\u0000\"}")); + + var fromDto = json.FromJson(); + + Assert.That(fromDto.Char, Is.EqualTo(dto.Char)); + } + } +} \ No newline at end of file From 36313cfa5544cfc345bd1bfd030e27676d292bc4 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 24 Jan 2019 06:53:15 +0800 Subject: [PATCH 045/372] Guard HasAnyEscapeChars() against empty string --- src/ServiceStack.Text/CsvWriter.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ServiceStack.Text/CsvWriter.cs b/src/ServiceStack.Text/CsvWriter.cs index b163e3be3..c800e4a3f 100644 --- a/src/ServiceStack.Text/CsvWriter.cs +++ b/src/ServiceStack.Text/CsvWriter.cs @@ -122,9 +122,10 @@ public static class CsvWriter { public static bool HasAnyEscapeChars(string value) { - return CsvConfig.EscapeStrings.Any(value.Contains) - || value[0] == JsWriter.ListStartChar - || value[0] == JsWriter.MapStartChar; + return !string.IsNullOrEmpty(value) + && (CsvConfig.EscapeStrings.Any(value.Contains) + || value[0] == JsWriter.ListStartChar + || value[0] == JsWriter.MapStartChar); } internal static void WriteItemSeperatorIfRanOnce(TextWriter writer, ref bool ranOnce) From 942482fea5e0d3ccb58be1c1e0c22661a1c3a11d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 28 Jan 2019 06:49:06 +0930 Subject: [PATCH 046/372] Update ServiceStack.Text.Core.csproj --- src/ServiceStack.Text/ServiceStack.Text.Core.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index 7a11239e4..1d7976e84 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -2,6 +2,7 @@ ServiceStack.Text.Core ServiceStack.Text + ServiceStack.Text netstandard2.0;netcoreapp2.1 ServiceStack.Text .NET Standard 2.0 From 7758c49d3c49b7b848fb9372e7c0294604c26434 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 8 Feb 2019 11:26:51 +0930 Subject: [PATCH 047/372] Add support for NameValueCollection in ToObject/StringDictionary --- src/ServiceStack.Text/HttpUtils.cs | 4 ++-- src/ServiceStack.Text/PlatformExtensions.cs | 11 +++++++++++ src/ServiceStack.Text/TypeSerializer.cs | 11 +++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index a4aedf3b1..ed6bbe55d 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -46,9 +46,9 @@ public static string SetQueryParam(this string url, string key, string val) var qsPos = url.IndexOf('?'); if (qsPos != -1) { - var existingKeyPos = qsPos + 1 == url.IndexOf(key + "=", qsPos, PclExport.Instance.InvariantComparison) + var existingKeyPos = qsPos + 1 == url.IndexOf(key + "=", qsPos, StringComparison.Ordinal) ? qsPos - : url.IndexOf("&" + key, qsPos, PclExport.Instance.InvariantComparison); + : url.IndexOf("&" + key, qsPos, StringComparison.Ordinal); if (existingKeyPos != -1) { diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index e0d5069fb..f00521523 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Collections.Specialized; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; @@ -681,6 +682,16 @@ public static Dictionary ToObjectDictionary(this object obj) return to; } + if (obj is NameValueCollection nvc) + { + var to = new Dictionary(); + for (var i = 0; i < nvc.Count; i++) + { + to[nvc.GetKey(i)] = nvc.Get(i); + } + return to; + } + var type = obj.GetType(); if (!toObjectMapCache.TryGetValue(type, out var def)) diff --git a/src/ServiceStack.Text/TypeSerializer.cs b/src/ServiceStack.Text/TypeSerializer.cs index 0f3fb7d3a..88008ec96 100644 --- a/src/ServiceStack.Text/TypeSerializer.cs +++ b/src/ServiceStack.Text/TypeSerializer.cs @@ -13,6 +13,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Collections.Specialized; using System.Globalization; using System.IO; using System.Linq; @@ -256,6 +257,16 @@ public static Dictionary ToStringDictionary(this object obj) return to; } + if (obj is NameValueCollection nvc) + { + var to = new Dictionary(); + for (var i = 0; i < nvc.Count; i++) + { + to[nvc.GetKey(i)] = nvc.Get(i); + } + return to; + } + var jsv = SerializeToString(obj); var map = DeserializeFromString>(jsv); return map; From f0c45f122ca4c0963035f443a0b3061dbc36379c Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Sat, 9 Feb 2019 16:17:53 +1100 Subject: [PATCH 048/372] Issue using lenient scope with DataMember Name and SnakeCase. (#519) --- .../JsonTests/LowercaseUnderscoreTests.cs | 45 +++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/tests/ServiceStack.Text.Tests/JsonTests/LowercaseUnderscoreTests.cs b/tests/ServiceStack.Text.Tests/JsonTests/LowercaseUnderscoreTests.cs index 4ac1b8185..a5a648641 100644 --- a/tests/ServiceStack.Text.Tests/JsonTests/LowercaseUnderscoreTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonTests/LowercaseUnderscoreTests.cs @@ -51,6 +51,15 @@ class Person public int Id { get; set; } [DataMember] public string Name { get; set; } + + [DataMember(Name = "sur_name")] + public string LastName { get; set; } + + [DataMember(Name = "current_age")] + public int CurrentAge { get; set; } + + [DataMember(Name = "birth_day")] + public DateTime BirthDay { get; set; } } class WithUnderscore @@ -78,13 +87,43 @@ public void Can_override_name() var person = new Person { Id = 123, - Name = "Abc" + Name = "Abc", + LastName = "Xyz" }; Assert.That(TypeSerializer.SerializeToString(person), Is.EqualTo("{MyID:123,name:Abc}")); Assert.That(JsonSerializer.SerializeToString(person), Is.EqualTo("{\"MyID\":123,\"name\":\"Abc\"}")); } - - + + [Test] + public void Can_override_name_and_deserialize_with_lenient_scope() + { + var person = new Person + { + Id = 123, + Name = "Abc", + LastName = "Xyz", + BirthDay = new DateTime(2000,1,2,12,0,0), + CurrentAge = 19 + }; + + using (JsConfig.With(new Config { + TextCase = TextCase.SnakeCase, + PropertyConvention = PropertyConvention.Lenient })) + { + var test = new List(); + test.Add(person); + var personSerialized = test.ToJson(); + var personFromString = personSerialized.FromJson>(); + + Assert.That(person.Id, Is.EqualTo(personFromString[0].Id)); + Assert.That(person.Name, Is.EqualTo(personFromString[0].Name)); + Assert.That(person.LastName, Is.EqualTo(personFromString[0].LastName)); + Assert.That(person.BirthDay, Is.EqualTo(personFromString[0].BirthDay)); + Assert.That(person.CurrentAge, Is.EqualTo(personFromString[0].CurrentAge)); + } + } + + class WithUnderscoreSeveralDigits { public int? user_id_00_11 { get; set; } From d110ce009746fdb9ac286e09f27a89951e9703ca Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 9 Feb 2019 15:17:18 +0930 Subject: [PATCH 049/372] fix lenient test --- .../Common/DeserializeType.cs | 31 +++++++++++++++---- .../JsonTests/LowercaseUnderscoreTests.cs | 24 +++++++------- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/ServiceStack.Text/Common/DeserializeType.cs b/src/ServiceStack.Text/Common/DeserializeType.cs index eb80182af..52b4c753d 100644 --- a/src/ServiceStack.Text/Common/DeserializeType.cs +++ b/src/ServiceStack.Text/Common/DeserializeType.cs @@ -234,12 +234,6 @@ internal static class TypeAccessorUtils { internal static TypeAccessor Get(this KeyValuePair[] accessors, ReadOnlySpan propertyName, bool lenient) { - if (lenient) - { - //TODO: optimize - propertyName = propertyName.ToString().Replace("-", string.Empty).Replace("_", string.Empty).AsSpan(); - } - //Binary Search var lo = 0; var hi = accessors.Length - 1; @@ -259,6 +253,31 @@ internal static TypeAccessor Get(this KeyValuePair[] acces mid = (lo + hi + 1) / 2; } + + if (lenient) + { + lo = 0; + hi = accessors.Length - 1; + mid = (lo + hi + 1) / 2; + + var lenientName = propertyName.ToString().Replace("-", string.Empty).Replace("_", string.Empty).AsSpan(); + + while (lo <= hi) + { + var test = accessors[mid]; + var cmp = lenientName.CompareTo(test.Key.AsSpan(), StringComparison.OrdinalIgnoreCase); + if (cmp == 0) + return test.Value; + + if (cmp < 0) + hi = mid - 1; + else + lo = mid + 1; + + mid = (lo + hi + 1) / 2; + } + } + return null; } } diff --git a/tests/ServiceStack.Text.Tests/JsonTests/LowercaseUnderscoreTests.cs b/tests/ServiceStack.Text.Tests/JsonTests/LowercaseUnderscoreTests.cs index a5a648641..b0035f46f 100644 --- a/tests/ServiceStack.Text.Tests/JsonTests/LowercaseUnderscoreTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonTests/LowercaseUnderscoreTests.cs @@ -56,10 +56,10 @@ class Person public string LastName { get; set; } [DataMember(Name = "current_age")] - public int CurrentAge { get; set; } + public int? CurrentAge { get; set; } [DataMember(Name = "birth_day")] - public DateTime BirthDay { get; set; } + public DateTime? BirthDay { get; set; } } class WithUnderscore @@ -90,8 +90,8 @@ public void Can_override_name() Name = "Abc", LastName = "Xyz" }; - Assert.That(TypeSerializer.SerializeToString(person), Is.EqualTo("{MyID:123,name:Abc}")); - Assert.That(JsonSerializer.SerializeToString(person), Is.EqualTo("{\"MyID\":123,\"name\":\"Abc\"}")); + Assert.That(TypeSerializer.SerializeToString(person), Is.EqualTo("{MyID:123,name:Abc,sur_name:Xyz}")); + Assert.That(JsonSerializer.SerializeToString(person), Is.EqualTo("{\"MyID\":123,\"name\":\"Abc\",\"sur_name\":\"Xyz\"}")); } [Test] @@ -110,16 +110,16 @@ public void Can_override_name_and_deserialize_with_lenient_scope() TextCase = TextCase.SnakeCase, PropertyConvention = PropertyConvention.Lenient })) { - var test = new List(); - test.Add(person); + var test = new List {person}; var personSerialized = test.ToJson(); var personFromString = personSerialized.FromJson>(); - - Assert.That(person.Id, Is.EqualTo(personFromString[0].Id)); - Assert.That(person.Name, Is.EqualTo(personFromString[0].Name)); - Assert.That(person.LastName, Is.EqualTo(personFromString[0].LastName)); - Assert.That(person.BirthDay, Is.EqualTo(personFromString[0].BirthDay)); - Assert.That(person.CurrentAge, Is.EqualTo(personFromString[0].CurrentAge)); + + var fromJson = personFromString[0]; + Assert.That(person.Id, Is.EqualTo(fromJson.Id)); + Assert.That(person.Name, Is.EqualTo(fromJson.Name)); + Assert.That(person.LastName, Is.EqualTo(fromJson.LastName)); + Assert.That(person.BirthDay.Value, Is.EqualTo(fromJson.BirthDay.Value)); + Assert.That(person.CurrentAge.Value, Is.EqualTo(fromJson.CurrentAge.Value)); } } From 70416acda27d5fda22fd96afe4fae04d3622cdcb Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 11 Feb 2019 07:02:44 +0930 Subject: [PATCH 050/372] DRY BinarySearch impl --- .../Common/DeserializeType.cs | 45 +++++++------------ 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/src/ServiceStack.Text/Common/DeserializeType.cs b/src/ServiceStack.Text/Common/DeserializeType.cs index 52b4c753d..828b32a40 100644 --- a/src/ServiceStack.Text/Common/DeserializeType.cs +++ b/src/ServiceStack.Text/Common/DeserializeType.cs @@ -14,6 +14,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Runtime.CompilerServices; namespace ServiceStack.Text.Common { @@ -234,10 +235,23 @@ internal static class TypeAccessorUtils { internal static TypeAccessor Get(this KeyValuePair[] accessors, ReadOnlySpan propertyName, bool lenient) { - //Binary Search + var testValue = FindPropertyAccessor(accessors, propertyName); + if (testValue != null) + return testValue; + + if (lenient) + return FindPropertyAccessor(accessors, + propertyName.ToString().Replace("-", string.Empty).Replace("_", string.Empty).AsSpan()); + + return null; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] //Binary Search + private static TypeAccessor FindPropertyAccessor(KeyValuePair[] accessors, ReadOnlySpan propertyName) + { var lo = 0; var hi = accessors.Length - 1; - var mid = (lo + hi + 1) / 2; + var mid = (lo + hi + 1) / 2; while (lo <= hi) { @@ -251,33 +265,8 @@ internal static TypeAccessor Get(this KeyValuePair[] acces else lo = mid + 1; - mid = (lo + hi + 1) / 2; + mid = (lo + hi + 1) / 2; } - - if (lenient) - { - lo = 0; - hi = accessors.Length - 1; - mid = (lo + hi + 1) / 2; - - var lenientName = propertyName.ToString().Replace("-", string.Empty).Replace("_", string.Empty).AsSpan(); - - while (lo <= hi) - { - var test = accessors[mid]; - var cmp = lenientName.CompareTo(test.Key.AsSpan(), StringComparison.OrdinalIgnoreCase); - if (cmp == 0) - return test.Value; - - if (cmp < 0) - hi = mid - 1; - else - lo = mid + 1; - - mid = (lo + hi + 1) / 2; - } - } - return null; } } From 97656d8453b35503730de061e1c3d39f3ac06f0d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 11 Feb 2019 13:02:58 +0800 Subject: [PATCH 051/372] Exclude DBNull.Value in populating instances --- src/ServiceStack.Text/PlatformExtensions.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index f00521523..e441ca871 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -740,7 +740,8 @@ private static void PopulateInstanceInternal(IReadOnlyDictionary { if (!def.FieldsMap.TryGetValue(entry.Key, out var fieldDef) && !def.FieldsMap.TryGetValue(entry.Key.ToPascalCase(), out fieldDef) - || entry.Value == null) + || entry.Value == null + || entry.Value == DBNull.Value) continue; fieldDef.SetValue(to, entry.Value); From cb1d22fb28b2e33c09277a278b2f55dd92bf6829 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 12 Feb 2019 20:09:44 -0500 Subject: [PATCH 052/372] Add support for nested collection auto mapping + ignore converters --- src/ServiceStack.Text/AutoMappingUtils.cs | 54 ++++++++++++++++--- .../AutoMappingCustomConverterTests.cs | 52 ++++++++++++++++++ .../AutoMappingTests.cs | 16 ++++-- 3 files changed, 113 insertions(+), 9 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 400fce79c..8b0c54153 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -22,9 +22,13 @@ public static class AutoMappingUtils private static readonly ConcurrentDictionary, GetMemberDelegate> converters = new ConcurrentDictionary, GetMemberDelegate>(); + private static ConcurrentDictionary,bool> ignoreMappings + = new ConcurrentDictionary,bool>(); + public static void Reset() { converters.Clear(); + ignoreMappings.Clear(); AssignmentDefinitionCache.Clear(); } @@ -34,6 +38,21 @@ public static void RegisterConverter(Func converter) converters[Tuple.Create(typeof(From), typeof(To))] = x => converter((From)x); } + public static void IgnoreMapping() + { + JsConfig.InitStatics(); + ignoreMappings[Tuple.Create(typeof(From),typeof(To))] = true; + } + + public static void IgnoreMapping(Type fromType, Type toType) + { + JsConfig.InitStatics(); + ignoreMappings[Tuple.Create(fromType, toType)] = true; + } + + public static bool ShouldIgnoreMapping(Type fromType, Type toType) => + ignoreMappings.ContainsKey(Tuple.Create(fromType, toType)); + public static GetMemberDelegate GetConverter(Type fromType, Type toType) { if (converters.IsEmpty) @@ -724,6 +743,9 @@ public AssignmentDefinition() public void AddMatch(string name, AssignmentMember readMember, AssignmentMember writeMember) { + if (AutoMappingUtils.ShouldIgnoreMapping(readMember.Type,writeMember.Type)) + return; + this.AssignmentMemberMap[name] = new AssignmentEntry(name, readMember, writeMember); } @@ -817,7 +839,7 @@ public static GetMemberDelegate CreateTypeConverter(Type fromType, Type toType) { if (fromType == toType) return null; - + var converter = AutoMappingUtils.GetConverter(fromType, toType); if (converter != null) return converter; @@ -846,12 +868,32 @@ public static GetMemberDelegate CreateTypeConverter(Type fromType, Type toType) } else if (typeof(IEnumerable).IsAssignableFrom(fromType)) { - return fromValue => - { - var listResult = TranslateListWithElements.TryTranslateCollections( - fromType, underlyingToType, fromValue); + return fromValue => { + var fromElementType = fromType.GetCollectionType(); + var toElementType = underlyingToType.GetCollectionType(); + + if (fromElementType != null && toElementType != null && + fromElementType != toElementType && fromValue is IEnumerable values) + { + var to = new List(); + foreach (var item in values) + { + var toItem = item.ConvertTo(toElementType); + to.Add(toItem); + } - return listResult ?? fromValue; + var listResult = TranslateListWithElements.TryTranslateCollections( + to.GetType(), underlyingToType, to); + + return listResult ?? fromValue; + } + else + { + var listResult = TranslateListWithElements.TryTranslateCollections( + fromType, underlyingToType, fromValue); + + return listResult ?? fromValue; + } }; } else if (underlyingToType.IsValueType) diff --git a/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs index 9ca561513..ce9f81b2e 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs @@ -137,5 +137,57 @@ public void Should_Not_Throw_Exception_When_Multiple_Same_Type_CustomTypeConvert AutoMappingUtils.Reset(); } + + [Test] + public void Can_Convert_POCO_collections_with_custom_Converter() + { + AutoMappingUtils.RegisterConverter((User from) => from.ConvertTo()); + AutoMappingUtils.RegisterConverter((Car from) => $"{from.Name} ({from.Age})"); + + var users = new UsersData { + Id = 1, + Users = new List { + new User { + FirstName = "Demis", + LastName = "Bellot", + Car = new Car { Name = "BMW X6", Age = 3 } + } + } + }; + + var dtoUsers = users.ConvertTo(); + + Assert.That(dtoUsers.Id, Is.EqualTo(users.Id)); + Assert.That(dtoUsers.Users[0].FirstName, Is.EqualTo(users.Users[0].FirstName)); + Assert.That(dtoUsers.Users[0].LastName, Is.EqualTo(users.Users[0].LastName)); + Assert.That(dtoUsers.Users[0].Car, Is.EqualTo("BMW X6 (3)")); + + AutoMappingUtils.Reset(); + } + + [Test] + public void Can_ignore_converting_collections() + { + AutoMappingUtils.IgnoreMapping, List>(); + + var users = new UsersData { + Id = 1, + Users = new List { + new User { + FirstName = "Demis", + LastName = "Bellot", + Car = new Car { Name = "BMW X6", Age = 3 } + } + } + }; + + var dtoUsers = users.ConvertTo(); + + Assert.That(dtoUsers.Id, Is.EqualTo(users.Id)); + Assert.That(dtoUsers.Users, Is.Null); + + AutoMappingUtils.Reset(); + } + } } \ No newline at end of file diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index c9cc8aa69..e2770ef25 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -62,6 +62,17 @@ public class UserDto public string Car { get; set; } } + public class UsersData + { + public int Id { get; set; } + public List Users { get; set; } + } + public class UsersDto + { + public int Id { get; set; } + public List Users { get; set; } + } + public enum Color { Red, @@ -188,11 +199,10 @@ public class AutoMappingTests [Test] public void Does_populate() { - var user = new User() - { + var user = new User { FirstName = "Demis", LastName = "Bellot", - Car = new Car() { Name = "BMW X6", Age = 3 } + Car = new Car { Name = "BMW X6", Age = 3 } }; var userDto = new UserDto().PopulateWith(user); From 91985f1a1f5aa77a3bd7274b6a987e69de4ad720 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 12 Feb 2019 20:34:49 -0500 Subject: [PATCH 053/372] Fix dictionary automapping tests --- src/ServiceStack.Text/AutoMappingUtils.cs | 65 +++++++++++------------ 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 8b0c54153..2e4659371 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -83,9 +83,7 @@ public static T CreateCopy(this T from) if (typeof(IEnumerable).IsAssignableFrom(typeof(T))) { - var listResult = TranslateListWithElements.TryTranslateCollections( - from.GetType(), typeof(T), from); - + var listResult = TryConvertCollections(from.GetType(), typeof(T), from); return (T)listResult; } @@ -117,9 +115,7 @@ public static object ConvertTo(this object from, Type type) if (typeof(IEnumerable).IsAssignableFrom(type)) { - var listResult = TranslateListWithElements.TryTranslateCollections( - from.GetType(), type, from); - + var listResult = TryConvertCollections(from.GetType(), type, from); return listResult; } @@ -662,6 +658,35 @@ public static IEnumerable> GetPropertyAttributes(); + foreach (var item in values) + { + var toItem = item.ConvertTo(toElementType); + to.Add(toItem); + } + var ret = TranslateListWithElements.TryTranslateCollections( + to.GetType(), toType, to); + return ret ?? fromValue; + } + } + + var listResult = TranslateListWithElements.TryTranslateCollections( + fromType, toType, fromValue); + + return listResult ?? fromValue; + } } public class AssignmentEntry @@ -868,33 +893,7 @@ public static GetMemberDelegate CreateTypeConverter(Type fromType, Type toType) } else if (typeof(IEnumerable).IsAssignableFrom(fromType)) { - return fromValue => { - var fromElementType = fromType.GetCollectionType(); - var toElementType = underlyingToType.GetCollectionType(); - - if (fromElementType != null && toElementType != null && - fromElementType != toElementType && fromValue is IEnumerable values) - { - var to = new List(); - foreach (var item in values) - { - var toItem = item.ConvertTo(toElementType); - to.Add(toItem); - } - - var listResult = TranslateListWithElements.TryTranslateCollections( - to.GetType(), underlyingToType, to); - - return listResult ?? fromValue; - } - else - { - var listResult = TranslateListWithElements.TryTranslateCollections( - fromType, underlyingToType, fromValue); - - return listResult ?? fromValue; - } - }; + return fromValue => AutoMappingUtils.TryConvertCollections(fromType, underlyingToType, fromValue); } else if (underlyingToType.IsValueType) { From bbf0ae9a58bdb497f8c73a2d0323c24ac73f6d38 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 12 Feb 2019 20:43:40 -0500 Subject: [PATCH 054/372] change name in tests --- .../AutoMappingCustomConverterTests.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs index ce9f81b2e..0f8aabc7d 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs @@ -148,8 +148,8 @@ public void Can_Convert_POCO_collections_with_custom_Converter() Id = 1, Users = new List { new User { - FirstName = "Demis", - LastName = "Bellot", + FirstName = "John", + LastName = "Doe", Car = new Car { Name = "BMW X6", Age = 3 } } } @@ -157,6 +157,8 @@ public void Can_Convert_POCO_collections_with_custom_Converter() var dtoUsers = users.ConvertTo(); + dtoUsers.PrintDump(); + Assert.That(dtoUsers.Id, Is.EqualTo(users.Id)); Assert.That(dtoUsers.Users[0].FirstName, Is.EqualTo(users.Users[0].FirstName)); Assert.That(dtoUsers.Users[0].LastName, Is.EqualTo(users.Users[0].LastName)); @@ -174,15 +176,16 @@ public void Can_ignore_converting_collections() Id = 1, Users = new List { new User { - FirstName = "Demis", - LastName = "Bellot", + FirstName = "John", + LastName = "Doe", Car = new Car { Name = "BMW X6", Age = 3 } } } }; var dtoUsers = users.ConvertTo(); - + dtoUsers.PrintDump(); + Assert.That(dtoUsers.Id, Is.EqualTo(users.Id)); Assert.That(dtoUsers.Users, Is.Null); From fc1bd5c77d38765208fcdbcf48204a6b6d7ffad4 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 12 Feb 2019 21:24:35 -0500 Subject: [PATCH 055/372] Add better support for using converters everywhere --- src/ServiceStack.Text/AutoMappingUtils.cs | 36 +++++++++++------- .../AutoMappingCustomConverterTests.cs | 38 ++++++++++++------- .../AutoMappingTests.cs | 4 ++ 3 files changed, 52 insertions(+), 26 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 2e4659371..7136cfcb5 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -63,8 +63,9 @@ public static GetMemberDelegate GetConverter(Type fromType, Type toType) ? converter : null; } - - public static T ConvertTo(this object from) + + public static T ConvertTo(this object from) => from.ConvertTo(skipConverters:false); + public static T ConvertTo(this object from, bool skipConverters) { if (from == null) return default(T); @@ -73,7 +74,7 @@ public static T ConvertTo(this object from) if (fromType == typeof(T)) return (T)from; - return (T)ConvertTo(from, typeof(T)); + return (T)ConvertTo(from, typeof(T), skipConverters); } public static T CreateCopy(this T from) @@ -83,7 +84,7 @@ public static T CreateCopy(this T from) if (typeof(IEnumerable).IsAssignableFrom(typeof(T))) { - var listResult = TryConvertCollections(from.GetType(), typeof(T), from); + var listResult = TranslateListWithElements.TryTranslateCollections(from.GetType(), typeof(T), from); return (T)listResult; } @@ -97,29 +98,38 @@ public static To ThenDo(this To to, Action fn) return to; } - public static object ConvertTo(this object from, Type type) + public static object ConvertTo(this object from, Type toType) => from.ConvertTo(toType, skipConverters: false); + public static object ConvertTo(this object from, Type toType, bool skipConverters) { if (from == null) return null; - if (from.GetType() == type) + var fromType = from.GetType(); + if (fromType == toType) return from; - if (from.GetType().IsValueType || type.IsValueType) - return ChangeValueType(from, type); + if (!skipConverters) + { + var converter = GetConverter(fromType, toType); + if (converter != null) + return converter(from); + } + + if (fromType.IsValueType || toType.IsValueType) + return ChangeValueType(from, toType); if (from is string str) - return TypeSerializer.DeserializeFromString(str, type); + return TypeSerializer.DeserializeFromString(str, toType); if (from is ReadOnlyMemory rom) - return TypeSerializer.DeserializeFromSpan(type, rom.Span); + return TypeSerializer.DeserializeFromSpan(toType, rom.Span); - if (typeof(IEnumerable).IsAssignableFrom(type)) + if (typeof(IEnumerable).IsAssignableFrom(toType)) { - var listResult = TryConvertCollections(from.GetType(), type, from); + var listResult = TryConvertCollections(fromType, toType, from); return listResult; } - var to = type.CreateInstance(); + var to = toType.CreateInstance(); return to.PopulateWithNonDefaultValues(from); } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs index 0f8aabc7d..ec4d346c5 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs @@ -141,18 +141,23 @@ public void Should_Not_Throw_Exception_When_Multiple_Same_Type_CustomTypeConvert [Test] public void Can_Convert_POCO_collections_with_custom_Converter() { - AutoMappingUtils.RegisterConverter((User from) => from.ConvertTo()); + AutoMappingUtils.RegisterConverter((User from) => { + var to = from.ConvertTo(skipConverters:true); // avoid infinite recursion + to.FirstName += "!"; + to.LastName += "!"; + return to; + }); AutoMappingUtils.RegisterConverter((Car from) => $"{from.Name} ({from.Age})"); - + + var user = new User { + FirstName = "John", + LastName = "Doe", + Car = new Car { Name = "BMW X6", Age = 3 } + }; var users = new UsersData { Id = 1, - Users = new List { - new User { - FirstName = "John", - LastName = "Doe", - Car = new Car { Name = "BMW X6", Age = 3 } - } - } + User = user, + Users = new List { user } }; var dtoUsers = users.ConvertTo(); @@ -160,10 +165,17 @@ public void Can_Convert_POCO_collections_with_custom_Converter() dtoUsers.PrintDump(); Assert.That(dtoUsers.Id, Is.EqualTo(users.Id)); - Assert.That(dtoUsers.Users[0].FirstName, Is.EqualTo(users.Users[0].FirstName)); - Assert.That(dtoUsers.Users[0].LastName, Is.EqualTo(users.Users[0].LastName)); - Assert.That(dtoUsers.Users[0].Car, Is.EqualTo("BMW X6 (3)")); - + + void AssertUser(UserDto userDto) + { + Assert.That(userDto.FirstName, Is.EqualTo(user.FirstName + "!")); + Assert.That(userDto.LastName, Is.EqualTo(user.LastName + "!")); + Assert.That(userDto.Car, Is.EqualTo($"{user.Car.Name} ({user.Car.Age})")); + } + AssertUser(user.ConvertTo()); + AssertUser(dtoUsers.User); + AssertUser(dtoUsers.Users[0]); + AutoMappingUtils.Reset(); } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index e2770ef25..6c67b7f99 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -65,11 +65,15 @@ public class UserDto public class UsersData { public int Id { get; set; } + + public User User { get; set; } public List Users { get; set; } } public class UsersDto { public int Id { get; set; } + + public UserDto User { get; set; } public List Users { get; set; } } From 78bd6f15266648688fc68f4cf4ccce837fed7ea3 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 12 Feb 2019 23:53:46 -0500 Subject: [PATCH 056/372] Improve IgnoreMappings support w/ tests --- src/ServiceStack.Text/AutoMappingUtils.cs | 32 ++++++++++++++--- .../AutoMappingCustomConverterTests.cs | 35 +++++++++++++++---- .../AutoMappingTests.cs | 4 +-- 3 files changed, 58 insertions(+), 13 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 7136cfcb5..7f62cd818 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -38,11 +38,7 @@ public static void RegisterConverter(Func converter) converters[Tuple.Create(typeof(From), typeof(To))] = x => converter((From)x); } - public static void IgnoreMapping() - { - JsConfig.InitStatics(); - ignoreMappings[Tuple.Create(typeof(From),typeof(To))] = true; - } + public static void IgnoreMapping() => IgnoreMapping(typeof(From), typeof(To)); public static void IgnoreMapping(Type fromType, Type toType) { @@ -108,6 +104,9 @@ public static object ConvertTo(this object from, Type toType, bool skipConverter if (fromType == toType) return from; + if (ShouldIgnoreMapping(fromType, toType)) + return null; + if (!skipConverters) { var converter = GetConverter(fromType, toType); @@ -781,6 +780,29 @@ public void AddMatch(string name, AssignmentMember readMember, AssignmentMember if (AutoMappingUtils.ShouldIgnoreMapping(readMember.Type,writeMember.Type)) return; + // Ignore mapping collections if Element Types are ignored + if (typeof(IEnumerable).IsAssignableFrom(readMember.Type) && typeof(IEnumerable).IsAssignableFrom(writeMember.Type)) + { + var fromGenericDef = readMember.Type.GetTypeWithGenericTypeDefinitionOf(typeof(IDictionary<,>)); + var toGenericDef = readMember.Type.GetTypeWithGenericTypeDefinitionOf(typeof(IDictionary<,>)); + if (fromGenericDef != null && toGenericDef != null) + { + // Check if to/from Key or Value Types are ignored + if (AutoMappingUtils.ShouldIgnoreMapping(fromGenericDef.GetGenericArguments()[0],toGenericDef.GetGenericArguments()[0])) + return; + if (AutoMappingUtils.ShouldIgnoreMapping(fromGenericDef.GetGenericArguments()[1],toGenericDef.GetGenericArguments()[1])) + return; + } + else if (readMember.Type != typeof(string) && writeMember.Type != typeof(string)) + { + var elFromType = readMember.Type.GetCollectionType(); + var elToType = writeMember.Type.GetCollectionType(); + + if (AutoMappingUtils.ShouldIgnoreMapping(elFromType,elToType)) + return; + } + } + this.AssignmentMemberMap[name] = new AssignmentEntry(name, readMember, writeMember); } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs index ec4d346c5..be23e0306 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs @@ -157,13 +157,10 @@ public void Can_Convert_POCO_collections_with_custom_Converter() var users = new UsersData { Id = 1, User = user, - Users = new List { user } + Users = { user } }; var dtoUsers = users.ConvertTo(); - - dtoUsers.PrintDump(); - Assert.That(dtoUsers.Id, Is.EqualTo(users.Id)); void AssertUser(UserDto userDto) @@ -180,7 +177,33 @@ void AssertUser(UserDto userDto) } [Test] - public void Can_ignore_converting_collections() + public void Does_ignore_POCO_mappings() + { + AutoMappingUtils.IgnoreMapping(); + + var user = new User { + FirstName = "John", + LastName = "Doe", + Car = new Car { Name = "BMW X6", Age = 3 } + }; + var users = new UsersData { + Id = 1, + User = user, + Users = { user } + }; + + var dtoUsers = users.ConvertTo(); + Assert.That(dtoUsers.Id, Is.EqualTo(users.Id)); + + Assert.That(user.ConvertTo(), Is.Null); + Assert.That(dtoUsers.User, Is.Null); + Assert.That(dtoUsers.Users, Is.Empty); + + AutoMappingUtils.Reset(); + } + + [Test] + public void Does_ignore_collection_mappings() { AutoMappingUtils.IgnoreMapping, List>(); @@ -199,7 +222,7 @@ public void Can_ignore_converting_collections() dtoUsers.PrintDump(); Assert.That(dtoUsers.Id, Is.EqualTo(users.Id)); - Assert.That(dtoUsers.Users, Is.Null); + Assert.That(dtoUsers.Users, Is.Empty); AutoMappingUtils.Reset(); } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 6c67b7f99..6cb07b546 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -67,14 +67,14 @@ public class UsersData public int Id { get; set; } public User User { get; set; } - public List Users { get; set; } + public List Users { get; set; } = new List(); } public class UsersDto { public int Id { get; set; } public UserDto User { get; set; } - public List Users { get; set; } + public List Users { get; set; } = new List(); } public enum Color From 3410aa6bd317cea98f08925c52ca575229d8f035 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 13 Feb 2019 01:12:02 -0500 Subject: [PATCH 057/372] Add support for converters/ignored mappings in dictionaries --- src/ServiceStack.Text/AutoMappingUtils.cs | 55 ++++++++++++------- src/ServiceStack.Text/PlatformExtensions.cs | 38 ++++++++++++- .../AutoMappingCustomConverterTests.cs | 18 ++++-- .../AutoMappingTests.cs | 6 +- 4 files changed, 88 insertions(+), 29 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 7f62cd818..11c47ad02 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -670,30 +670,43 @@ public static IEnumerable> GetPropertyAttributes(); - foreach (var item in values) + var fromElementType = fromType.GetCollectionType(); + var toElementType = toType.GetCollectionType(); + + if (fromElementType != null && toElementType != null && fromElementType != toElementType) { - var toItem = item.ConvertTo(toElementType); - to.Add(toItem); + if (typeof(IDictionary).IsAssignableFrom(fromElementType) || typeof(IDictionary).IsAssignableFrom(toElementType)) + { + var from = fromValue.ToObjectDictionary(); + var to = from.FromObjectDictionary(toElementType); + return to; + } + else + { + var to = new List(); + foreach (var item in values) + { + var toItem = item.ConvertTo(toElementType); + to.Add(toItem); + } + var ret = TranslateListWithElements.TryTranslateCollections(to.GetType(), toType, to); + return ret ?? fromValue; + } } - var ret = TranslateListWithElements.TryTranslateCollections( - to.GetType(), toType, to); - return ret ?? fromValue; } } - var listResult = TranslateListWithElements.TryTranslateCollections( - fromType, toType, fromValue); - + var listResult = TranslateListWithElements.TryTranslateCollections(fromType, toType, fromValue); return listResult ?? fromValue; } } @@ -784,13 +797,15 @@ public void AddMatch(string name, AssignmentMember readMember, AssignmentMember if (typeof(IEnumerable).IsAssignableFrom(readMember.Type) && typeof(IEnumerable).IsAssignableFrom(writeMember.Type)) { var fromGenericDef = readMember.Type.GetTypeWithGenericTypeDefinitionOf(typeof(IDictionary<,>)); - var toGenericDef = readMember.Type.GetTypeWithGenericTypeDefinitionOf(typeof(IDictionary<,>)); + var toGenericDef = writeMember.Type.GetTypeWithGenericTypeDefinitionOf(typeof(IDictionary<,>)); if (fromGenericDef != null && toGenericDef != null) { // Check if to/from Key or Value Types are ignored - if (AutoMappingUtils.ShouldIgnoreMapping(fromGenericDef.GetGenericArguments()[0],toGenericDef.GetGenericArguments()[0])) + var fromArgs = fromGenericDef.GetGenericArguments(); + var toArgs = toGenericDef.GetGenericArguments(); + if (AutoMappingUtils.ShouldIgnoreMapping(fromArgs[0],toArgs[0])) return; - if (AutoMappingUtils.ShouldIgnoreMapping(fromGenericDef.GetGenericArguments()[1],toGenericDef.GetGenericArguments()[1])) + if (AutoMappingUtils.ShouldIgnoreMapping(fromArgs[1],toArgs[1])) return; } else if (readMember.Type != typeof(string) && writeMember.Type != typeof(string)) diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index e441ca871..6e7d75bc1 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -682,6 +682,16 @@ public static Dictionary ToObjectDictionary(this object obj) return to; } + if (obj is IDictionary d) + { + var to = new Dictionary(); + foreach (var key in d.Keys) + { + to[key.ToString()] = d[key]; + } + return to; + } + if (obj is NameValueCollection nvc) { var to = new Dictionary(); @@ -718,7 +728,33 @@ public static object FromObjectDictionary(this IReadOnlyDictionary)); + if (genericDef != null) + { + var toKeyType = genericDef.GetGenericArguments()[0]; + var toValueType = genericDef.GetGenericArguments()[1]; + + foreach (var entry in values) + { + var toKey = entry.Key.ConvertTo(toKeyType); + var toValue = entry.Value.ConvertTo(toValueType); + d[toKey] = toValue; + } + } + else + { + foreach (var entry in values) + { + d[entry.Key] = entry.Value; + } + } + } + else + { + PopulateInstanceInternal(values, to, type); + } return to; } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs index be23e0306..41444a9ce 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs @@ -157,7 +157,8 @@ public void Can_Convert_POCO_collections_with_custom_Converter() var users = new UsersData { Id = 1, User = user, - Users = { user } + UsersList = { user }, + UsersMap = { {1,user} } }; var dtoUsers = users.ConvertTo(); @@ -171,7 +172,8 @@ void AssertUser(UserDto userDto) } AssertUser(user.ConvertTo()); AssertUser(dtoUsers.User); - AssertUser(dtoUsers.Users[0]); + AssertUser(dtoUsers.UsersList[0]); + AssertUser(dtoUsers.UsersMap[1]); AutoMappingUtils.Reset(); } @@ -189,7 +191,8 @@ public void Does_ignore_POCO_mappings() var users = new UsersData { Id = 1, User = user, - Users = { user } + UsersList = { user }, + UsersMap = {{1,user}} }; var dtoUsers = users.ConvertTo(); @@ -197,7 +200,8 @@ public void Does_ignore_POCO_mappings() Assert.That(user.ConvertTo(), Is.Null); Assert.That(dtoUsers.User, Is.Null); - Assert.That(dtoUsers.Users, Is.Empty); + Assert.That(dtoUsers.UsersList, Is.Empty); + Assert.That(dtoUsers.UsersMap, Is.Empty); AutoMappingUtils.Reset(); } @@ -206,10 +210,11 @@ public void Does_ignore_POCO_mappings() public void Does_ignore_collection_mappings() { AutoMappingUtils.IgnoreMapping, List>(); + AutoMappingUtils.IgnoreMapping, Dictionary>(); var users = new UsersData { Id = 1, - Users = new List { + UsersList = new List { new User { FirstName = "John", LastName = "Doe", @@ -222,7 +227,8 @@ public void Does_ignore_collection_mappings() dtoUsers.PrintDump(); Assert.That(dtoUsers.Id, Is.EqualTo(users.Id)); - Assert.That(dtoUsers.Users, Is.Empty); + Assert.That(dtoUsers.UsersList, Is.Empty); + Assert.That(dtoUsers.UsersMap, Is.Empty); AutoMappingUtils.Reset(); } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 6cb07b546..0e37ad4ca 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -67,14 +67,16 @@ public class UsersData public int Id { get; set; } public User User { get; set; } - public List Users { get; set; } = new List(); + public List UsersList { get; set; } = new List(); + public Dictionary UsersMap { get; set; } = new Dictionary(); } public class UsersDto { public int Id { get; set; } public UserDto User { get; set; } - public List Users { get; set; } = new List(); + public List UsersList { get; set; } = new List(); + public Dictionary UsersMap { get; set; } = new Dictionary(); } public enum Color From df6dae2213767f6bc31120ce02818869cd14a73b Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 13 Feb 2019 01:19:41 -0500 Subject: [PATCH 058/372] fix Dictionary converter tests --- src/ServiceStack.Text/AutoMappingUtils.cs | 24 ++++++++--------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 11c47ad02..2f58a04df 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -683,25 +683,17 @@ public static object TryConvertCollections(Type fromType, Type toType, object fr var fromElementType = fromType.GetCollectionType(); var toElementType = toType.GetCollectionType(); - if (fromElementType != null && toElementType != null && fromElementType != toElementType) + if (fromElementType != null && toElementType != null && fromElementType != toElementType && + !(typeof(IDictionary).IsAssignableFrom(fromElementType) || typeof(IDictionary).IsAssignableFrom(toElementType))) { - if (typeof(IDictionary).IsAssignableFrom(fromElementType) || typeof(IDictionary).IsAssignableFrom(toElementType)) + var to = new List(); + foreach (var item in values) { - var from = fromValue.ToObjectDictionary(); - var to = from.FromObjectDictionary(toElementType); - return to; - } - else - { - var to = new List(); - foreach (var item in values) - { - var toItem = item.ConvertTo(toElementType); - to.Add(toItem); - } - var ret = TranslateListWithElements.TryTranslateCollections(to.GetType(), toType, to); - return ret ?? fromValue; + var toItem = item.ConvertTo(toElementType); + to.Add(toItem); } + var ret = TranslateListWithElements.TryTranslateCollections(to.GetType(), toType, to); + return ret ?? fromValue; } } } From 931560e274ffdc779867d60398d42d21fda21081 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 13 Feb 2019 01:53:14 -0500 Subject: [PATCH 059/372] Handle dictionaries with complex key types --- src/ServiceStack.Text/AutoMappingUtils.cs | 20 +++++++++++++++++--- src/ServiceStack.Text/PlatformExtensions.cs | 21 +++++++++++++++------ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 2f58a04df..32f465c92 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -674,9 +674,23 @@ public static object TryConvertCollections(Type fromType, Type toType, object fr { if (fromValue is IDictionary d) { - var from = fromValue.ToObjectDictionary(); - var to = from.FromObjectDictionary(toType); - return to; + if (toType.GetDictionaryEntryTypes(out var toKeyType, out var toValueType)) + { + var to = (IDictionary)toType.CreateInstance(); + foreach (var key in d.Keys) + { + var toKey = key.ConvertTo(toKeyType); + var toValue = d[key].ConvertTo(toValueType); + to[toKey] = toValue; + } + return to; + } + else + { + var from = fromValue.ToObjectDictionary(); + var to = from.FromObjectDictionary(toType); + return to; + } } else { diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index 6e7d75bc1..498f965da 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -717,6 +717,20 @@ public static Dictionary ToObjectDictionary(this object obj) return dict; } + public static bool GetDictionaryEntryTypes(this Type dictType, out Type keyType, out Type valueType) + { + var genericDef = dictType.GetTypeWithGenericTypeDefinitionOf(typeof(IReadOnlyDictionary<,>)); + if (genericDef != null) + { + var genericArgs = genericDef.GetGenericArguments(); + keyType = genericArgs[0]; + valueType = genericArgs[1]; + return true; + } + keyType = valueType = null; + return false; + } + public static object FromObjectDictionary(this IReadOnlyDictionary values, Type type) { if (values == null) @@ -727,15 +741,10 @@ public static object FromObjectDictionary(this IReadOnlyDictionary)); - if (genericDef != null) + if (type.GetDictionaryEntryTypes(out var toKeyType, out var toValueType)) { - var toKeyType = genericDef.GetGenericArguments()[0]; - var toValueType = genericDef.GetGenericArguments()[1]; - foreach (var entry in values) { var toKey = entry.Key.ConvertTo(toKeyType); From 3a0c87f6eb98cb1b7278a6af352ad9c0c606baf7 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 13 Feb 2019 02:03:56 -0500 Subject: [PATCH 060/372] Move to more ideal AutoMapping API --- src/ServiceStack.Text/AutoMappingUtils.cs | 50 +++++++++++++------ .../AutoMappingCustomConverterTests.cs | 18 +++---- 2 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 32f465c92..2134405df 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -17,34 +17,52 @@ namespace ServiceStack [DataContract(Namespace = "http://schemas.servicestack.net/types")] public class CustomHttpResult { } - public static class AutoMappingUtils + /// + /// Customize ServiceStack AutoMapping Behavior + /// + public static class AutoMapping { - private static readonly ConcurrentDictionary, GetMemberDelegate> converters - = new ConcurrentDictionary, GetMemberDelegate>(); - - private static ConcurrentDictionary,bool> ignoreMappings - = new ConcurrentDictionary,bool>(); - - public static void Reset() - { - converters.Clear(); - ignoreMappings.Clear(); - AssignmentDefinitionCache.Clear(); - } - + /// + /// Register Type to Type AutoMapping converter + /// public static void RegisterConverter(Func converter) { JsConfig.InitStatics(); - converters[Tuple.Create(typeof(From), typeof(To))] = x => converter((From)x); + AutoMappingUtils.converters[Tuple.Create(typeof(From), typeof(To))] = x => converter((From)x); } + /// + /// Ignore Type to Type Mapping (including collections containing them) + /// public static void IgnoreMapping() => IgnoreMapping(typeof(From), typeof(To)); + /// + /// Ignore Type to Type Mapping (including collections containing them) + /// public static void IgnoreMapping(Type fromType, Type toType) { JsConfig.InitStatics(); - ignoreMappings[Tuple.Create(fromType, toType)] = true; + AutoMappingUtils.ignoreMappings[Tuple.Create(fromType, toType)] = true; + } + } + + public static class AutoMappingUtils + { + internal static readonly ConcurrentDictionary, GetMemberDelegate> converters + = new ConcurrentDictionary, GetMemberDelegate>(); + + internal static readonly ConcurrentDictionary,bool> ignoreMappings + = new ConcurrentDictionary,bool>(); + + public static void Reset() + { + converters.Clear(); + ignoreMappings.Clear(); + AssignmentDefinitionCache.Clear(); } + + [Obsolete("Use AutoMapping.RegisterConverter")] + public static void RegisterConverter(Func converter) => throw new NotSupportedException("Deprecated: Use AutoMapping.RegisterConverter"); public static bool ShouldIgnoreMapping(Type fromType, Type toType) => ignoreMappings.ContainsKey(Tuple.Create(fromType, toType)); diff --git a/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs index 41444a9ce..6a730d415 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingCustomConverterTests.cs @@ -34,7 +34,7 @@ public DateTimeOffset ToDateTimeOffset() [Test] public void Can_convert_prop_with_CustomTypeConverter() { - AutoMappingUtils.RegisterConverter((WrappedDateTimeOffset from) => from.ToDateTimeOffset()); + AutoMapping.RegisterConverter((WrappedDateTimeOffset from) => from.ToDateTimeOffset()); var map = new Dictionary { @@ -62,7 +62,7 @@ public void Can_convert_prop_with_CustomTypeConverter() [Test] public void Can_Convert_Props_With_CustomTypeConverter() { - AutoMappingUtils.RegisterConverter((WrappedDateTimeOffset from) => from.ToDateTimeOffset()); + AutoMapping.RegisterConverter((WrappedDateTimeOffset from) => from.ToDateTimeOffset()); var personWithWrappedDateOfBirth = new PersonWithWrappedDateOfBirth { @@ -90,7 +90,7 @@ public void Can_Convert_Props_With_CustomTypeConverter() [Test] public void Can_Convert_Anonymous_Types_With_CustomTypeConverter() { - AutoMappingUtils.RegisterConverter((DateTimeOffset from) => new WrappedDateTimeOffset(from)); + AutoMapping.RegisterConverter((DateTimeOffset from) => new WrappedDateTimeOffset(from)); var personWithDateOfBirth = new { @@ -120,7 +120,7 @@ public void Can_Convert_Anonymous_Types_With_CustomTypeConverter() [Test] public void Should_Not_Throw_Exception_When_Multiple_Same_Type_CustomTypeConverters_Found() { - AutoMappingUtils.RegisterConverter((DateTimeOffset from) => new WrappedDateTimeOffset(from)); + AutoMapping.RegisterConverter((DateTimeOffset from) => new WrappedDateTimeOffset(from)); var personWithWrappedDateOfBirth = new PersonWithWrappedDateOfBirth { @@ -141,13 +141,13 @@ public void Should_Not_Throw_Exception_When_Multiple_Same_Type_CustomTypeConvert [Test] public void Can_Convert_POCO_collections_with_custom_Converter() { - AutoMappingUtils.RegisterConverter((User from) => { + AutoMapping.RegisterConverter((User from) => { var to = from.ConvertTo(skipConverters:true); // avoid infinite recursion to.FirstName += "!"; to.LastName += "!"; return to; }); - AutoMappingUtils.RegisterConverter((Car from) => $"{from.Name} ({from.Age})"); + AutoMapping.RegisterConverter((Car from) => $"{from.Name} ({from.Age})"); var user = new User { FirstName = "John", @@ -181,7 +181,7 @@ void AssertUser(UserDto userDto) [Test] public void Does_ignore_POCO_mappings() { - AutoMappingUtils.IgnoreMapping(); + AutoMapping.IgnoreMapping(); var user = new User { FirstName = "John", @@ -209,8 +209,8 @@ public void Does_ignore_POCO_mappings() [Test] public void Does_ignore_collection_mappings() { - AutoMappingUtils.IgnoreMapping, List>(); - AutoMappingUtils.IgnoreMapping, Dictionary>(); + AutoMapping.IgnoreMapping, List>(); + AutoMapping.IgnoreMapping, Dictionary>(); var users = new UsersData { Id = 1, From 1287e4c88e6eb225348940ce6729aebac6dfc099 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 14 Feb 2019 03:29:25 -0500 Subject: [PATCH 061/372] Fix [] covnert to string errpr --- src/ServiceStack.Text/AutoMappingUtils.cs | 9 +++++-- .../TranslateListWithElements.cs | 26 +++++++++---------- .../AutoMappingTests.cs | 6 +++++ 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 2134405df..650d7dfff 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -96,7 +96,7 @@ public static T CreateCopy(this T from) if (typeof(T).IsValueType) return (T)ChangeValueType(from, typeof(T)); - if (typeof(IEnumerable).IsAssignableFrom(typeof(T))) + if (typeof(IEnumerable).IsAssignableFrom(typeof(T)) && typeof(T) != typeof(string)) { var listResult = TranslateListWithElements.TryTranslateCollections(from.GetType(), typeof(T), from); return (T)listResult; @@ -140,6 +140,9 @@ public static object ConvertTo(this object from, Type toType, bool skipConverter if (from is ReadOnlyMemory rom) return TypeSerializer.DeserializeFromSpan(toType, rom.Span); + if (toType == typeof(string)) + return from.ToJsv(); + if (typeof(IEnumerable).IsAssignableFrom(toType)) { var listResult = TryConvertCollections(fromType, toType, from); @@ -962,7 +965,7 @@ public static GetMemberDelegate CreateTypeConverter(Type fromType, Type toType) if (underlyingToType.IsIntegerType()) return fromValue => Convert.ChangeType(fromValue, underlyingToType, null); } - else if (typeof(IEnumerable).IsAssignableFrom(fromType)) + else if (typeof(IEnumerable).IsAssignableFrom(fromType) && underlyingToType != typeof(string)) { return fromValue => AutoMappingUtils.TryConvertCollections(fromType, underlyingToType, fromValue); } @@ -976,6 +979,8 @@ public static GetMemberDelegate CreateTypeConverter(Type fromType, Type toType) { if (fromValue == null) return fromValue; + if (toType == typeof(string)) + return fromValue.ToJsv(); var toValue = toType.CreateInstance(); toValue.PopulateWith(fromValue); diff --git a/src/ServiceStack.Text/TranslateListWithElements.cs b/src/ServiceStack.Text/TranslateListWithElements.cs index 6daa032bc..e1b2f8518 100644 --- a/src/ServiceStack.Text/TranslateListWithElements.cs +++ b/src/ServiceStack.Text/TranslateListWithElements.cs @@ -27,8 +27,7 @@ private static Dictionary TranslateICollectionCac public static object TranslateToGenericICollectionCache(object from, Type toInstanceOfType, Type elementType) { - ConvertInstanceDelegate translateToFn; - if (TranslateICollectionCache.TryGetValue(toInstanceOfType, out translateToFn)) + if (TranslateICollectionCache.TryGetValue(toInstanceOfType, out var translateToFn)) return translateToFn(from, toInstanceOfType); var genericType = typeof(TranslateListWithElements<>).MakeGenericType(elementType); @@ -39,8 +38,9 @@ public static object TranslateToGenericICollectionCache(object from, Type toInst do { snapshot = TranslateICollectionCache; - newCache = new Dictionary(TranslateICollectionCache); - newCache[elementType] = translateToFn; + newCache = new Dictionary(TranslateICollectionCache) { + [elementType] = translateToFn + }; } while (!ReferenceEquals( Interlocked.CompareExchange(ref TranslateICollectionCache, newCache, snapshot), snapshot)); @@ -55,8 +55,7 @@ public static object TranslateToConvertibleGenericICollectionCache( object from, Type toInstanceOfType, Type fromElementType) { var typeKey = new ConvertibleTypeKey(toInstanceOfType, fromElementType); - ConvertInstanceDelegate translateToFn; - if (TranslateConvertibleICollectionCache.TryGetValue(typeKey, out translateToFn)) return translateToFn(from, toInstanceOfType); + if (TranslateConvertibleICollectionCache.TryGetValue(typeKey, out var translateToFn)) return translateToFn(from, toInstanceOfType); var toElementType = toInstanceOfType.FirstGenericType().GetGenericArguments()[0]; var genericType = typeof(TranslateListWithConvertibleElements<,>).MakeGenericType(fromElementType, toElementType); @@ -67,8 +66,9 @@ public static object TranslateToConvertibleGenericICollectionCache( do { snapshot = TranslateConvertibleICollectionCache; - newCache = new Dictionary(TranslateConvertibleICollectionCache); - newCache[typeKey] = translateToFn; + newCache = new Dictionary(TranslateConvertibleICollectionCache) { + [typeKey] = translateToFn + }; } while (!ReferenceEquals( Interlocked.CompareExchange(ref TranslateConvertibleICollectionCache, newCache, snapshot), snapshot)); @@ -109,23 +109,23 @@ public static object TryTranslateCollections(Type fromPropertyType, Type toPrope public class ConvertibleTypeKey { public Type ToInstanceType { get; set; } - public Type FromElemenetType { get; set; } + public Type FromElementType { get; set; } public ConvertibleTypeKey() { } - public ConvertibleTypeKey(Type toInstanceType, Type fromElemenetType) + public ConvertibleTypeKey(Type toInstanceType, Type fromElementType) { ToInstanceType = toInstanceType; - FromElemenetType = fromElemenetType; + FromElementType = fromElementType; } public bool Equals(ConvertibleTypeKey other) { if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; - return Equals(other.ToInstanceType, ToInstanceType) && Equals(other.FromElemenetType, FromElemenetType); + return other.ToInstanceType == ToInstanceType && other.FromElementType == FromElementType; } public override bool Equals(object obj) @@ -141,7 +141,7 @@ public override int GetHashCode() unchecked { return ((ToInstanceType != null ? ToInstanceType.GetHashCode() : 0) * 397) - ^ (FromElemenetType != null ? FromElemenetType.GetHashCode() : 0); + ^ (FromElementType != null ? FromElementType.GetHashCode() : 0); } } } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 0e37ad4ca..50d5b3a79 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -873,5 +873,11 @@ public void Translate_Between_Models_of_nullables_and_different_types() ModelWithFieldsOfDifferentTypesAsNullables.AssertIsEqual(toObj, fromObj); } + [Test] + public void Can_convert_to_array_to_string() + { + Assert.That(new []{ new ViewModel { Public = "A"} }.ConvertTo(), Is.Not.Empty); + Assert.That(new []{ DayOfWeek.Monday }.ConvertTo(), Is.Not.Empty); + } } } From c47206a9eb9d31da26d1dae1f9033d87363fd628 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 16 Feb 2019 22:20:25 -0500 Subject: [PATCH 062/372] Downgrade dict utils to use IEnum + allow converting any IEnum --- src/ServiceStack.Text/AutoMappingUtils.cs | 225 +++++++++++++++--- src/ServiceStack.Text/PlatformExtensions.cs | 48 ++-- .../TranslateListWithElements.cs | 2 +- src/ServiceStack.Text/TypeSerializer.cs | 9 +- .../AutoMappingTests.cs | 130 ++++++++++ 5 files changed, 362 insertions(+), 52 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 650d7dfff..35a1c8009 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -119,7 +119,7 @@ public static object ConvertTo(this object from, Type toType, bool skipConverter return null; var fromType = from.GetType(); - if (fromType == toType) + if (fromType == toType || toType == typeof(object)) return from; if (ShouldIgnoreMapping(fromType, toType)) @@ -196,6 +196,27 @@ public static object ChangeValueType(object from, Type toType) return Convert.ChangeType(from, toType, provider: null); } + var toKvpType = toType.GetTypeWithGenericTypeDefinitionOf(typeof(KeyValuePair<,>)); + if (toKvpType != null) + { + var fromKvpType = fromType.GetTypeWithGenericTypeDefinitionOf(typeof(KeyValuePair<,>)); + if (fromKvpType != null) + { + var fromProps = TypeProperties.Get(fromKvpType); + var fromKey = fromProps.GetPublicGetter("Key")(from); + var fromValue = fromProps.GetPublicGetter("Value")(from); + + var toKvpArgs = toKvpType.GetGenericArguments(); + var toKeyType = toKvpArgs[0]; + var toValueType = toKvpArgs[1]; + var toCtor = toKvpType.GetConstructor(toKvpArgs); + var toKey = fromKey.ConvertTo(toKeyType); + var toValue = fromValue.ConvertTo(toValueType); + var to = toCtor.Invoke(new[] {toKey,toValue}); + return to; + } + } + return TypeSerializer.DeserializeFromString(from.ToJsv(), toType); } @@ -688,48 +709,196 @@ public static IEnumerable> GetPropertyAttributes> toList: { + foreach (var key in d.Keys) + { + var toKey = key.ConvertTo(); + var toValue = d[key].ConvertTo(); + toList.Add(new KeyValuePair(toKey, toValue)); + } + return toList; + } + case List> toObjList: { + foreach (var key in d.Keys) + { + var toKey = key.ConvertTo(); + var toValue = d[key]; + toObjList.Add(new KeyValuePair(toKey, toValue)); + } + return toObjList; + } + case IDictionary toDict: { + if (toType.GetKeyValuePairsTypes(out var toKeyType, out var toValueType)) + { + foreach (var key in d.Keys) + { + var toKey = toKeyType != null + ? key.ConvertTo(toKeyType) + : key; + var toValue = d[key].ConvertTo(toValueType); + toDict[toKey] = toValue; + } + return toDict; + } + else + { + var from = fromValue.ToObjectDictionary(); + var to = from.FromObjectDictionary(toType); + return to; + } } - return to; - } - else - { - var from = fromValue.ToObjectDictionary(); - var to = from.FromObjectDictionary(toType); - return to; } } - else + + var genericDef = fromType.GetTypeWithGenericTypeDefinitionOf(typeof(IEnumerable<>)); + if (genericDef != null) { - var fromElementType = fromType.GetCollectionType(); - var toElementType = toType.GetCollectionType(); - - if (fromElementType != null && toElementType != null && fromElementType != toElementType && - !(typeof(IDictionary).IsAssignableFrom(fromElementType) || typeof(IDictionary).IsAssignableFrom(toElementType))) + var genericEnumType = genericDef.GetGenericArguments()[0]; + var genericKvps = genericEnumType.GetTypeWithGenericTypeDefinitionOf(typeof(KeyValuePair<,>)); + if (genericKvps != null) { - var to = new List(); - foreach (var item in values) + // Improve perf with Specialized handling of common KVP combinations + var obj = toType.CreateInstance(); + if (fromValue is IEnumerable> sKvps) { - var toItem = item.ConvertTo(toElementType); - to.Add(toItem); + switch (obj) { + case IDictionary toDict: { + toType.GetKeyValuePairsTypes(out var toKeyType, out var toValueType); + foreach (var entry in sKvps) + { + var toKey = toKeyType != null + ? entry.Key.ConvertTo(toKeyType) + : entry.Key; + toDict[toKey] = toValueType != null + ? entry.Value.ConvertTo(toValueType) + : entry.Value; + } + return toDict; + } + case List> toList: { + foreach (var entry in sKvps) + { + toList.Add(new KeyValuePair(entry.Key, entry.Value)); + } + return toList; + } + case List> toObjList: { + foreach (var entry in sKvps) + { + toObjList.Add(new KeyValuePair(entry.Key, entry.Value)); + } + return toObjList; + } + } } - var ret = TranslateListWithElements.TryTranslateCollections(to.GetType(), toType, to); - return ret ?? fromValue; + else if (fromValue is IEnumerable> oKvps) + { + switch (obj) { + case IDictionary toDict: + { + toType.GetKeyValuePairsTypes(out var toKeyType, out var toValueType); + foreach (var entry in oKvps) + { + var toKey = entry.Key.ConvertTo(); + toDict[toKey] = toValueType != null + ? entry.Value.ConvertTo(toValueType) + : entry.Value; + } + return toDict; + } + case List> toList: { + foreach (var entry in oKvps) + { + toList.Add(new KeyValuePair(entry.Key, entry.Value.ConvertTo())); + } + return toList; + } + case List> toObjList: { + foreach (var entry in oKvps) + { + toObjList.Add(new KeyValuePair(entry.Key, entry.Value)); + } + return toObjList; + } + } + } + + + // Fallback for handling any KVP combo + var toKvpDefType = toType.GetKeyValuePairTypeDef(); + switch (obj) { + case IDictionary toDict: + { + var keyProp = TypeProperties.Get(toKvpDefType).GetPublicGetter("Key"); + var valueProp = TypeProperties.Get(toKvpDefType).GetPublicGetter("Value"); + + foreach (var entry in values) + { + var toKvp = entry.ConvertTo(toKvpDefType); + var toKey = keyProp(toKvp); + var toValue = valueProp(toKvp); + toDict[toKey] = toValue; + } + return toDict; + } + case List> toStringList: { + foreach (var entry in values) + { + var toEntry = entry.ConvertTo(toKvpDefType); + toStringList.Add((KeyValuePair) toEntry); + } + return toStringList; + } + case List> toObjList: { + foreach (var entry in values) + { + var toEntry = entry.ConvertTo(toKvpDefType); + toObjList.Add((KeyValuePair) toEntry); + } + return toObjList; + } + case IEnumerable toList: + { + var addMethod = toType.GetMethod(nameof(IList.Add), new[] {toKvpDefType}); + if (addMethod != null) + { + foreach (var entry in values) + { + var toEntry = entry.ConvertTo(toKvpDefType); + addMethod.Invoke(toList, new[] { toEntry }); + } + return toList; + } + break; + } + } + } + } + + var fromElementType = fromType.GetCollectionType(); + var toElementType = toType.GetCollectionType(); + + if (fromElementType != null && toElementType != null && fromElementType != toElementType && + !(typeof(IDictionary).IsAssignableFrom(fromElementType) || typeof(IDictionary).IsAssignableFrom(toElementType))) + { + var to = new List(); + foreach (var item in values) + { + var toItem = item.ConvertTo(toElementType); + to.Add(toItem); } + var ret = TranslateListWithElements.TryTranslateCollections(to.GetType(), toType, to); + return ret ?? fromValue; } } diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index 498f965da..4cdbb2f3f 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -8,6 +8,7 @@ using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Threading; +using System.Xml; using ServiceStack.Text; namespace ServiceStack @@ -629,7 +630,7 @@ public void SetValue(object instance, object value) if (SetValueFn == null) return; - if (value is IReadOnlyDictionary dictionary) + if (value is IEnumerable> dictionary) { value = dictionary.FromObjectDictionary(Type); } @@ -717,33 +718,50 @@ public static Dictionary ToObjectDictionary(this object obj) return dict; } - public static bool GetDictionaryEntryTypes(this Type dictType, out Type keyType, out Type valueType) + public static Type GetKeyValuePairTypeDef(this Type dictType) { - var genericDef = dictType.GetTypeWithGenericTypeDefinitionOf(typeof(IReadOnlyDictionary<,>)); + //matches IDictionary<,>, IReadOnlyDictionary<,>, List> + var genericDef = dictType.GetTypeWithGenericTypeDefinitionOf(typeof(IEnumerable<>)); + if (genericDef == null) + return null; + + var genericEnumType = genericDef.GetGenericArguments()[0]; + return genericEnumType.GetTypeWithGenericTypeDefinitionOf(typeof(KeyValuePair<,>)); + } + + public static bool GetKeyValuePairsTypes(this Type dictType, out Type keyType, out Type valueType) + { + //matches IDictionary<,>, IReadOnlyDictionary<,>, List> + var genericDef = dictType.GetTypeWithGenericTypeDefinitionOf(typeof(IEnumerable<>)); if (genericDef != null) { - var genericArgs = genericDef.GetGenericArguments(); - keyType = genericArgs[0]; - valueType = genericArgs[1]; - return true; + var genericEnumType = genericDef.GetGenericArguments()[0]; + var genericKvps = genericEnumType.GetTypeWithGenericTypeDefinitionOf(typeof(KeyValuePair<,>)); + if (genericKvps != null) + { + var genericArgs = genericEnumType.GetGenericArguments(); + keyType = genericArgs[0]; + valueType = genericArgs[1]; + return true; + } } keyType = valueType = null; return false; } - public static object FromObjectDictionary(this IReadOnlyDictionary values, Type type) + public static object FromObjectDictionary(this IEnumerable> values, Type type) { if (values == null) return null; - var alreadyDict = typeof(IReadOnlyDictionary).IsAssignableFrom(type); + var alreadyDict = typeof(IEnumerable>).IsAssignableFrom(type); if (alreadyDict) return values; var to = type.CreateInstance(); if (to is IDictionary d) { - if (type.GetDictionaryEntryTypes(out var toKeyType, out var toValueType)) + if (type.GetKeyValuePairsTypes(out var toKeyType, out var toValueType)) { foreach (var entry in values) { @@ -768,7 +786,7 @@ public static object FromObjectDictionary(this IReadOnlyDictionary values, object instance) + public static void PopulateInstance(this IEnumerable> values, object instance) { if (values == null || instance == null) return; @@ -776,7 +794,7 @@ public static void PopulateInstance(this IReadOnlyDictionary val PopulateInstanceInternal(values, instance, instance.GetType()); } - private static void PopulateInstanceInternal(IReadOnlyDictionary values, object to, Type type) + private static void PopulateInstanceInternal(IEnumerable> values, object to, Type type) { if (!toObjectMapCache.TryGetValue(type, out var def)) toObjectMapCache[type] = def = CreateObjectDictionaryDefinition(type); @@ -793,7 +811,7 @@ private static void PopulateInstanceInternal(IReadOnlyDictionary } } - public static T FromObjectDictionary(this IReadOnlyDictionary values) + public static T FromObjectDictionary(this IEnumerable> values) { return (T)values.FromObjectDictionary(typeof(T)); } @@ -885,9 +903,9 @@ public static Dictionary MergeIntoObjectDictionary(this object o return to; } - public static Dictionary ToStringDictionary(this IReadOnlyDictionary from) => ToStringDictionary(from, null); + public static Dictionary ToStringDictionary(this IEnumerable> from) => ToStringDictionary(from, null); - public static Dictionary ToStringDictionary(this IReadOnlyDictionary from, IEqualityComparer comparer) + public static Dictionary ToStringDictionary(this IEnumerable> from, IEqualityComparer comparer) { var to = comparer != null ? new Dictionary(comparer) diff --git a/src/ServiceStack.Text/TranslateListWithElements.cs b/src/ServiceStack.Text/TranslateListWithElements.cs index e1b2f8518..b3613133d 100644 --- a/src/ServiceStack.Text/TranslateListWithElements.cs +++ b/src/ServiceStack.Text/TranslateListWithElements.cs @@ -195,7 +195,7 @@ public static ICollection TranslateToGenericICollection( var to = (ICollection)CreateInstance(toInstanceOfType); foreach (var item in fromList) { - if (item is IReadOnlyDictionary dictionary) + if (item is IEnumerable> dictionary) { var convertedItem = dictionary.FromObjectDictionary(); to.Add(convertedItem); diff --git a/src/ServiceStack.Text/TypeSerializer.cs b/src/ServiceStack.Text/TypeSerializer.cs index 88008ec96..cdcaacb14 100644 --- a/src/ServiceStack.Text/TypeSerializer.cs +++ b/src/ServiceStack.Text/TypeSerializer.cs @@ -248,14 +248,7 @@ public static Dictionary ToStringDictionary(this object obj) } if (obj is IEnumerable> kvps) - { - var to = new Dictionary(); - foreach (var kvp in kvps) - { - to[kvp.Key] = kvp.Value.ToJsv(); - } - return to; - } + return PlatformExtensions.ToStringDictionary(kvps); if (obj is NameValueCollection nvc) { diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 50d5b3a79..61e9de749 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -716,6 +716,136 @@ public void Can_create_Dictionary_default_value() var obj = (Dictionary)AutoMappingUtils.CreateDefaultValue(typeof(Dictionary), new Dictionary()); Assert.That(obj, Is.Not.Null); } + + [Test] + public void Can_get_generic_types_from_Dictionary_or_KVPs() + { + typeof(Dictionary).GetKeyValuePairsTypes(out var keyType, out var valueType); + Assert.That(keyType, Is.EqualTo(typeof(string))); + Assert.That(valueType, Is.EqualTo(typeof(object))); + + typeof(IEnumerable>).GetKeyValuePairsTypes(out keyType, out valueType); + Assert.That(keyType, Is.EqualTo(typeof(string))); + Assert.That(valueType, Is.EqualTo(typeof(object))); + + typeof(List>).GetKeyValuePairsTypes(out keyType, out valueType); + Assert.That(keyType, Is.EqualTo(typeof(string))); + Assert.That(valueType, Is.EqualTo(typeof(object))); + } + + [Test] + public void Can_convert_between_different_types_of_Dictionaries_and_KVP_values() + { + var genericMap = new Dictionary { + { "a", 1 } + }; + var stringMap = new Dictionary { + {"a", "1"} + }; + var intMap = new Dictionary { + {"a", 1} + }; + var kvps = new List> { + new KeyValuePair("a", 1) + }; + var stringKvps = new List> { + new KeyValuePair("a", "1") + }; + + var genericMapStringValue = new Dictionary { + { "a", "1" } + }; + var kvpsStringValue = new List> { + new KeyValuePair("a", "1") + }; + + Assert.That(genericMap.ConvertTo>(), Is.EquivalentTo(genericMap)); + Assert.That(genericMap.ConvertTo>(), Is.EquivalentTo(stringMap)); + Assert.That(genericMap.ConvertTo>(), Is.EquivalentTo(intMap)); + Assert.That(genericMap.ConvertTo>>(), Is.EquivalentTo(kvps)); + Assert.That(genericMap.ConvertTo>>(), Is.EquivalentTo(stringKvps)); + + Assert.That(stringMap.ConvertTo>(), Is.EquivalentTo(genericMapStringValue)); + Assert.That(stringMap.ConvertTo>(), Is.EquivalentTo(stringMap)); + Assert.That(stringMap.ConvertTo>(), Is.EquivalentTo(intMap)); + Assert.That(stringMap.ConvertTo>>(), Is.EquivalentTo(kvpsStringValue)); + Assert.That(stringMap.ConvertTo>>(), Is.EquivalentTo(stringKvps)); + + Assert.That(intMap.ConvertTo>(), Is.EquivalentTo(genericMap)); + Assert.That(intMap.ConvertTo>(), Is.EquivalentTo(stringMap)); + Assert.That(intMap.ConvertTo>(), Is.EquivalentTo(intMap)); + Assert.That(intMap.ConvertTo>>(), Is.EquivalentTo(kvps)); + Assert.That(intMap.ConvertTo>>(), Is.EquivalentTo(stringKvps)); + + Assert.That(kvps.ConvertTo>(), Is.EquivalentTo(genericMap)); + Assert.That(kvps.ConvertTo>(), Is.EquivalentTo(stringMap)); + Assert.That(kvps.ConvertTo>(), Is.EquivalentTo(intMap)); + Assert.That(kvps.ConvertTo>>(), Is.EquivalentTo(kvps)); + Assert.That(kvps.ConvertTo>>(), Is.EquivalentTo(stringKvps)); + + Assert.That(stringKvps.ConvertTo>(), Is.EquivalentTo(genericMapStringValue)); + Assert.That(stringKvps.ConvertTo>(), Is.EquivalentTo(stringMap)); + Assert.That(stringKvps.ConvertTo>(), Is.EquivalentTo(intMap)); + Assert.That(stringKvps.ConvertTo>>(), Is.EquivalentTo(kvpsStringValue)); + Assert.That(stringKvps.ConvertTo>>(), Is.EquivalentTo(stringKvps)); + } + + [Test] + public void Can_convert_between_different_types_of_Dictionaries_and_KVP_keys() + { + var genericMap = new Dictionary { + { 1, "a" } + }; + var stringMap = new Dictionary { + {"1","a"} + }; + var intMap = new Dictionary { + {1,"a"} + }; + var kvps = new List> { + new KeyValuePair(1, "a") + }; + var stringKvps = new List> { + new KeyValuePair("1","a") + }; + + var genericMapStringValue = new Dictionary { + { "1","a" } + }; + var kvpsStringValue = new List> { + new KeyValuePair("1","a") + }; + + Assert.That(genericMap.ConvertTo>(), Is.EquivalentTo(genericMap)); + Assert.That(genericMap.ConvertTo>(), Is.EquivalentTo(stringMap)); + Assert.That(genericMap.ConvertTo>(), Is.EquivalentTo(intMap)); + Assert.That(genericMap.ConvertTo>>(), Is.EquivalentTo(kvps)); + Assert.That(genericMap.ConvertTo>>(), Is.EquivalentTo(stringKvps)); + + Assert.That(stringMap.ConvertTo>(), Is.EquivalentTo(genericMapStringValue)); + Assert.That(stringMap.ConvertTo>(), Is.EquivalentTo(stringMap)); + Assert.That(stringMap.ConvertTo>(), Is.EquivalentTo(intMap)); + Assert.That(stringMap.ConvertTo>>(), Is.EquivalentTo(kvpsStringValue)); + Assert.That(stringMap.ConvertTo>>(), Is.EquivalentTo(stringKvps)); + + Assert.That(intMap.ConvertTo>(), Is.EquivalentTo(genericMap)); + Assert.That(intMap.ConvertTo>(), Is.EquivalentTo(stringMap)); + Assert.That(intMap.ConvertTo>(), Is.EquivalentTo(intMap)); + Assert.That(intMap.ConvertTo>>(), Is.EquivalentTo(kvps)); + Assert.That(intMap.ConvertTo>>(), Is.EquivalentTo(stringKvps)); + + Assert.That(kvps.ConvertTo>(), Is.EquivalentTo(genericMap)); + Assert.That(kvps.ConvertTo>(), Is.EquivalentTo(stringMap)); + Assert.That(kvps.ConvertTo>(), Is.EquivalentTo(intMap)); + Assert.That(kvps.ConvertTo>>(), Is.EquivalentTo(kvps)); + Assert.That(kvps.ConvertTo>>(), Is.EquivalentTo(stringKvps)); + + Assert.That(stringKvps.ConvertTo>(), Is.EquivalentTo(genericMapStringValue)); + Assert.That(stringKvps.ConvertTo>(), Is.EquivalentTo(stringMap)); + Assert.That(stringKvps.ConvertTo>(), Is.EquivalentTo(intMap)); + Assert.That(stringKvps.ConvertTo>>(), Is.EquivalentTo(kvpsStringValue)); + Assert.That(stringKvps.ConvertTo>>(), Is.EquivalentTo(stringKvps)); + } } public enum ClassWithEnumType From aa53ee5df45a734d30c00e596797eb46421fae02 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 17 Feb 2019 02:15:00 -0500 Subject: [PATCH 063/372] Add UX-friendly ObjectDictionary --- src/ServiceStack.Text/ObjectDictionary.cs | 19 +++++++++++++++++++ .../AutoMappingTests.cs | 11 +++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/ServiceStack.Text/ObjectDictionary.cs diff --git a/src/ServiceStack.Text/ObjectDictionary.cs b/src/ServiceStack.Text/ObjectDictionary.cs new file mode 100644 index 000000000..0a8b1890f --- /dev/null +++ b/src/ServiceStack.Text/ObjectDictionary.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace ServiceStack.Text +{ + /// + /// UX friendly alternative alias of Dictionary<string, object> + /// + public class ObjectDictionary : Dictionary + { + public ObjectDictionary() { } + public ObjectDictionary(int capacity) : base(capacity) { } + public ObjectDictionary(IEqualityComparer comparer) : base(comparer) { } + public ObjectDictionary(int capacity, IEqualityComparer comparer) : base(capacity, comparer) { } + public ObjectDictionary(IDictionary dictionary) : base(dictionary) { } + public ObjectDictionary(IDictionary dictionary, IEqualityComparer comparer) : base(dictionary, comparer) { } + protected ObjectDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { } + } +} \ No newline at end of file diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 61e9de749..17c999398 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -751,10 +751,16 @@ public void Can_convert_between_different_types_of_Dictionaries_and_KVP_values() var stringKvps = new List> { new KeyValuePair("a", "1") }; + var objDict = new ObjectDictionary { + { "a", 1 } + }; var genericMapStringValue = new Dictionary { { "a", "1" } }; + var objDictStringValue = new ObjectDictionary { + { "a", "1" } + }; var kvpsStringValue = new List> { new KeyValuePair("a", "1") }; @@ -764,30 +770,35 @@ public void Can_convert_between_different_types_of_Dictionaries_and_KVP_values() Assert.That(genericMap.ConvertTo>(), Is.EquivalentTo(intMap)); Assert.That(genericMap.ConvertTo>>(), Is.EquivalentTo(kvps)); Assert.That(genericMap.ConvertTo>>(), Is.EquivalentTo(stringKvps)); + Assert.That(genericMap.ConvertTo(), Is.EquivalentTo(objDict)); Assert.That(stringMap.ConvertTo>(), Is.EquivalentTo(genericMapStringValue)); Assert.That(stringMap.ConvertTo>(), Is.EquivalentTo(stringMap)); Assert.That(stringMap.ConvertTo>(), Is.EquivalentTo(intMap)); Assert.That(stringMap.ConvertTo>>(), Is.EquivalentTo(kvpsStringValue)); Assert.That(stringMap.ConvertTo>>(), Is.EquivalentTo(stringKvps)); + Assert.That(stringMap.ConvertTo(), Is.EquivalentTo(objDictStringValue)); Assert.That(intMap.ConvertTo>(), Is.EquivalentTo(genericMap)); Assert.That(intMap.ConvertTo>(), Is.EquivalentTo(stringMap)); Assert.That(intMap.ConvertTo>(), Is.EquivalentTo(intMap)); Assert.That(intMap.ConvertTo>>(), Is.EquivalentTo(kvps)); Assert.That(intMap.ConvertTo>>(), Is.EquivalentTo(stringKvps)); + Assert.That(intMap.ConvertTo(), Is.EquivalentTo(objDict)); Assert.That(kvps.ConvertTo>(), Is.EquivalentTo(genericMap)); Assert.That(kvps.ConvertTo>(), Is.EquivalentTo(stringMap)); Assert.That(kvps.ConvertTo>(), Is.EquivalentTo(intMap)); Assert.That(kvps.ConvertTo>>(), Is.EquivalentTo(kvps)); Assert.That(kvps.ConvertTo>>(), Is.EquivalentTo(stringKvps)); + Assert.That(kvps.ConvertTo(), Is.EquivalentTo(objDict)); Assert.That(stringKvps.ConvertTo>(), Is.EquivalentTo(genericMapStringValue)); Assert.That(stringKvps.ConvertTo>(), Is.EquivalentTo(stringMap)); Assert.That(stringKvps.ConvertTo>(), Is.EquivalentTo(intMap)); Assert.That(stringKvps.ConvertTo>>(), Is.EquivalentTo(kvpsStringValue)); Assert.That(stringKvps.ConvertTo>>(), Is.EquivalentTo(stringKvps)); + Assert.That(stringKvps.ConvertTo(), Is.EquivalentTo(objDictStringValue)); } [Test] From 3ee77c9516b868d6b7d2188c39be348ea11d0e3a Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 17 Feb 2019 17:13:19 -0500 Subject: [PATCH 064/372] Handle converting FromObjectDictionary to object property --- src/ServiceStack.Text/PlatformExtensions.cs | 41 ++++++++++--------- .../AutoMappingTests.cs | 28 +++++++++++++ 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index 4cdbb2f3f..97514a920 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -630,31 +630,34 @@ public void SetValue(object instance, object value) if (SetValueFn == null) return; - if (value is IEnumerable> dictionary) + if (Type != typeof(object)) { - value = dictionary.FromObjectDictionary(Type); - } + if (value is IEnumerable> dictionary) + { + value = dictionary.FromObjectDictionary(Type); + } - if (!Type.IsInstanceOfType(value)) - { - lock (this) + if (!Type.IsInstanceOfType(value)) { - //Only caches object converter used on first use - if (ConvertType == null) + lock (this) { - ConvertType = value.GetType(); - ConvertValueFn = TypeConverter.CreateTypeConverter(ConvertType, Type); + //Only caches object converter used on first use + if (ConvertType == null) + { + ConvertType = value.GetType(); + ConvertValueFn = TypeConverter.CreateTypeConverter(ConvertType, Type); + } } - } - if (ConvertType.IsInstanceOfType(value)) - { - value = ConvertValueFn(value); - } - else - { - var tempConvertFn = TypeConverter.CreateTypeConverter(value.GetType(), Type); - value = tempConvertFn(value); + if (ConvertType.IsInstanceOfType(value)) + { + value = ConvertValueFn(value); + } + else + { + var tempConvertFn = TypeConverter.CreateTypeConverter(value.GetType(), Type); + value = tempConvertFn(value); + } } } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 17c999398..ea06e3815 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -857,6 +857,34 @@ public void Can_convert_between_different_types_of_Dictionaries_and_KVP_keys() Assert.That(stringKvps.ConvertTo>>(), Is.EquivalentTo(kvpsStringValue)); Assert.That(stringKvps.ConvertTo>>(), Is.EquivalentTo(stringKvps)); } + + class HasObject + { + public object Value { get; set; } + } + + [Test] + public void Can_convert_dictionary_to_HasObject() + { + var objDict = new ObjectDictionary { + ["value"] = new ObjectDictionary { + ["a"] = 1 + } + }; + + var to = objDict.FromObjectDictionary(); + Assert.That(to.Value, Is.EqualTo(objDict["value"])); + + var kvps = new ObjectDictionary { + ["value"] = new List> { + new KeyValuePair("a",1) + } + }; + + to = objDict.FromObjectDictionary(); + Assert.That(to.Value, Is.EqualTo(objDict["value"])); + } + } public enum ClassWithEnumType From f0622bcebaf5900e6ee2b1cbe0cbcaa225f93dfb Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 17 Feb 2019 21:58:55 -0500 Subject: [PATCH 065/372] Add more ToObjectDictionary Tests --- .../AutoMappingTests.cs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index ea06e3815..c2273045a 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -1011,6 +1011,34 @@ public void Can_use_ToObjectDictionary_to_Remove_Property_with_Attribute() Assert.That(vm.Private, Is.Null); } + class DictionaryTest + { + public string A { get; set; } + public int B { get; set; } + public bool C { get; set; } + public double D { get; set; } + } + + [Test] + public void Can_convert_anonymous_object_to_ObjectDictionary() + { + var newObj = new { A = "a", B = 1, C = true, D = 2.0 }; + var type = new DictionaryTest { A = "a", B = 1, C = true, D = 2.0 }; + var expected = new Dictionary { + ["A"] = "a", + ["B"] = 1, + ["C"] = true, + ["D"] = 2.0 + }; + + var to = newObj.ToObjectDictionary(); + Assert.That(to, Is.EquivalentTo(expected)); + to = type.ToObjectDictionary(); + Assert.That(to, Is.EquivalentTo(expected)); + to = expected.ToObjectDictionary(); + Assert.That(to, Is.EquivalentTo(expected)); + } + [Test] public void Can_convert_string_to_collection() { From db287ae41d5282174a4c8f05a210792c7c0dd34f Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 17 Feb 2019 23:15:43 -0500 Subject: [PATCH 066/372] Add StringDictionary as UX friendly alias to Dictionary --- src/ServiceStack.Text/ObjectDictionary.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/ObjectDictionary.cs b/src/ServiceStack.Text/ObjectDictionary.cs index 0a8b1890f..4c0e2f4e9 100644 --- a/src/ServiceStack.Text/ObjectDictionary.cs +++ b/src/ServiceStack.Text/ObjectDictionary.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Runtime.Serialization; -namespace ServiceStack.Text +namespace ServiceStack { /// /// UX friendly alternative alias of Dictionary<string, object> @@ -16,4 +16,15 @@ public ObjectDictionary(IDictionary dictionary) : base(dictionar public ObjectDictionary(IDictionary dictionary, IEqualityComparer comparer) : base(dictionary, comparer) { } protected ObjectDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { } } + + public class StringDictionary : Dictionary + { + public StringDictionary() { } + public StringDictionary(int capacity) : base(capacity) { } + public StringDictionary(IEqualityComparer comparer) : base(comparer) { } + public StringDictionary(int capacity, IEqualityComparer comparer) : base(capacity, comparer) { } + public StringDictionary(IDictionary dictionary) : base(dictionary) { } + public StringDictionary(IDictionary dictionary, IEqualityComparer comparer) : base(dictionary, comparer) { } + protected StringDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { } + } } \ No newline at end of file From d51e76eb73b8f5e14db4428e11a690d55a4b1760 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 18 Feb 2019 21:05:18 -0500 Subject: [PATCH 067/372] Add ConvertTo overload with defaultValue --- src/ServiceStack.Text/AutoMappingUtils.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 35a1c8009..6d12d60bb 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -78,6 +78,11 @@ public static GetMemberDelegate GetConverter(Type fromType, Type toType) : null; } + public static T ConvertTo(this object from, T defaultValue) => + from == null || (from is string s && s == string.Empty) + ? defaultValue + : from.ConvertTo(); + public static T ConvertTo(this object from) => from.ConvertTo(skipConverters:false); public static T ConvertTo(this object from, bool skipConverters) { From f92fb847d0a4eafc4aa43a714c7c78343c262893 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 18 Feb 2019 23:40:47 -0500 Subject: [PATCH 068/372] Move ConvertTo tests to SS.Text + handle empty string to ValueType --- src/ServiceStack.Text/AutoMappingUtils.cs | 32 ++++++++++++------- src/ServiceStack.Text/DynamicNumber.cs | 12 +++++++ .../AutoMappingTests.cs | 22 +++++++++++++ 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 6d12d60bb..358078b9b 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -160,12 +160,15 @@ public static object ConvertTo(this object from, Type toType, bool skipConverter public static object ChangeValueType(object from, Type toType) { + var s = from as string; + var fromType = from.GetType(); if (!fromType.IsEnum && !toType.IsEnum) { - if (toType == typeof(char) && from is string s) + var toString = toType == typeof(string); + if (toType == typeof(char) && s != null) return s.Length > 0 ? (object) s[0] : null; - if (toType == typeof(string) && from is char c) + if (toString && from is char c) return c.ToString(); if (toType == typeof(TimeSpan) && from is long ticks) return new TimeSpan(ticks); @@ -173,25 +176,30 @@ public static object ChangeValueType(object from, Type toType) return time.Ticks; var destNumberType = DynamicNumber.GetNumber(toType); - var value = destNumberType?.ConvertFrom(from); - if (value != null) + if (destNumberType != null) { - if (toType == typeof(char)) - return value.ToString()[0]; - - return value; + if (s != null && s == string.Empty) + return destNumberType.DefaultValue; + + var value = destNumberType.ConvertFrom(from); + if (value != null) + { + return toType == typeof(char) + ? value.ToString()[0] + : value; + } } - if (toType == typeof(string)) + if (toString) { var srcNumberType = DynamicNumber.GetNumber(from.GetType()); if (srcNumberType != null) - return srcNumberType.ToString(@from); + return srcNumberType.ToString(from); } } - if (from is string strValue) - return TypeSerializer.DeserializeFromString(strValue, toType); + if (s != null) + return TypeSerializer.DeserializeFromString(s, toType); if (toType == typeof(string)) return from.ToJsv(); diff --git a/src/ServiceStack.Text/DynamicNumber.cs b/src/ServiceStack.Text/DynamicNumber.cs index 3d9b5ea02..f119c4f22 100644 --- a/src/ServiceStack.Text/DynamicNumber.cs +++ b/src/ServiceStack.Text/DynamicNumber.cs @@ -13,6 +13,7 @@ public interface IDynamicNumber object ConvertFrom(object value); bool TryParse(string str, out object result); string ToString(object value); + object DefaultValue { get; } object add(object lhs, object rhs); object sub(object lhs, object rhs); @@ -53,6 +54,7 @@ public bool TryParse(string str, out object result) } public string ToString(object value) => Convert(value).ToString(); + public object DefaultValue => default(sbyte); public object add(object lhs, object rhs) => Convert(lhs) + Convert(rhs); public object sub(object lhs, object rhs) => Convert(lhs) - Convert(rhs); @@ -93,6 +95,7 @@ public bool TryParse(string str, out object result) } public string ToString(object value) => Convert(value).ToString(); + public object DefaultValue => default(byte); public object add(object lhs, object rhs) => Convert(lhs) + Convert(rhs); public object sub(object lhs, object rhs) => Convert(lhs) - Convert(rhs); @@ -133,6 +136,7 @@ public bool TryParse(string str, out object result) } public string ToString(object value) => Convert(value).ToString(); + public object DefaultValue => default(short); public object add(object lhs, object rhs) => Convert(lhs) + Convert(rhs); public object sub(object lhs, object rhs) => Convert(lhs) - Convert(rhs); @@ -173,6 +177,7 @@ public bool TryParse(string str, out object result) } public string ToString(object value) => Convert(value).ToString(); + public object DefaultValue => default(ushort); public object add(object lhs, object rhs) => Convert(lhs) + Convert(rhs); public object sub(object lhs, object rhs) => Convert(lhs) - Convert(rhs); @@ -213,6 +218,7 @@ public bool TryParse(string str, out object result) } public string ToString(object value) => Convert(value).ToString(); + public object DefaultValue => default(int); public object add(object lhs, object rhs) => Convert(lhs) + Convert(rhs); public object sub(object lhs, object rhs) => Convert(lhs) - Convert(rhs); @@ -253,6 +259,7 @@ public bool TryParse(string str, out object result) } public string ToString(object value) => Convert(value).ToString(); + public object DefaultValue => default(uint); public object add(object lhs, object rhs) => Convert(lhs) + Convert(rhs); public object sub(object lhs, object rhs) => Convert(lhs) - Convert(rhs); @@ -293,6 +300,7 @@ public bool TryParse(string str, out object result) } public string ToString(object value) => Convert(value).ToString(); + public object DefaultValue => default(long); public object add(object lhs, object rhs) => Convert(lhs) + Convert(rhs); public object sub(object lhs, object rhs) => Convert(lhs) - Convert(rhs); @@ -333,6 +341,7 @@ public bool TryParse(string str, out object result) } public string ToString(object value) => Convert(value).ToString(); + public object DefaultValue => default(ulong); public object add(object lhs, object rhs) => Convert(lhs) + Convert(rhs); public object sub(object lhs, object rhs) => Convert(lhs) - Convert(rhs); @@ -373,6 +382,7 @@ public bool TryParse(string str, out object result) } public string ToString(object value) => Convert(value).ToString("r", CultureInfo.InvariantCulture); + public object DefaultValue => default(float); public object add(object lhs, object rhs) => Convert(lhs) + Convert(rhs); public object sub(object lhs, object rhs) => Convert(lhs) - Convert(rhs); @@ -413,6 +423,7 @@ public bool TryParse(string str, out object result) } public string ToString(object value) => Convert(value).ToString("r", CultureInfo.InvariantCulture); + public object DefaultValue => default(double); public object add(object lhs, object rhs) => Convert(lhs) + Convert(rhs); public object sub(object lhs, object rhs) => Convert(lhs) - Convert(rhs); @@ -453,6 +464,7 @@ public bool TryParse(string str, out object result) } public string ToString(object value) => Convert(value).ToString(CultureInfo.InvariantCulture); + public object DefaultValue => default(decimal); public object add(object lhs, object rhs) => Convert(lhs) + Convert(rhs); public object sub(object lhs, object rhs) => Convert(lhs) - Convert(rhs); diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index c2273045a..aeda4b8b7 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -1076,5 +1076,27 @@ public void Can_convert_to_array_to_string() Assert.That(new []{ new ViewModel { Public = "A"} }.ConvertTo(), Is.Not.Empty); Assert.That(new []{ DayOfWeek.Monday }.ConvertTo(), Is.Not.Empty); } + + [Test] + public void To_works_with_ValueTypes() + { + Assert.That(1.ToString().ConvertTo(), Is.EqualTo(1)); + } + + [Test] + public void To_on_null_or_empty_string_returns_default_value_supplied() + { + const string nullString = null; + Assert.That("".ConvertTo(1), Is.EqualTo(1)); + Assert.That("".ConvertTo(default(int)), Is.EqualTo(default(int))); + Assert.That(nullString.ConvertTo(1), Is.EqualTo(1)); + } + + [Test] + public void To_ValueType_on_null_or_empty_string_returns_default_value() + { + Assert.That("".ConvertTo(), Is.EqualTo(default(int))); + } + } } From 69d2c56e2c5fc77808e1ef077f13c1bed172e449 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 19 Feb 2019 12:12:36 -0500 Subject: [PATCH 069/372] don't by-pass string escaping for strings in Json ITypeSerializing --- src/ServiceStack.Text/JsonSerializer.Generic.cs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/ServiceStack.Text/JsonSerializer.Generic.cs b/src/ServiceStack.Text/JsonSerializer.Generic.cs index 16fa3809e..505762e32 100644 --- a/src/ServiceStack.Text/JsonSerializer.Generic.cs +++ b/src/ServiceStack.Text/JsonSerializer.Generic.cs @@ -46,7 +46,6 @@ public T DeserializeFromReader(TextReader reader) public string SerializeToString(T value) { if (value == null) return null; - if (typeof(T) == typeof(string)) return value as string; if (typeof(T) == typeof(object) || typeof(T).IsAbstract || typeof(T).IsInterface) { if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = true; @@ -63,11 +62,6 @@ public string SerializeToString(T value) public void SerializeToWriter(T value, TextWriter writer) { if (value == null) return; - if (typeof(T) == typeof(string)) - { - writer.Write(value); - return; - } if (typeof(T) == typeof(object) || typeof(T).IsAbstract || typeof(T).IsInterface) { if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = true; From e2cf86b1a22ab8696fb2bd5390a276b5a4b3876b Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 20 Feb 2019 16:34:56 -0500 Subject: [PATCH 070/372] Add KeyValuePairs / KeyValueStrings alias classes --- src/ServiceStack.Text/ObjectDictionary.cs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/ServiceStack.Text/ObjectDictionary.cs b/src/ServiceStack.Text/ObjectDictionary.cs index 4c0e2f4e9..d2e8893aa 100644 --- a/src/ServiceStack.Text/ObjectDictionary.cs +++ b/src/ServiceStack.Text/ObjectDictionary.cs @@ -17,6 +17,9 @@ public ObjectDictionary(IDictionary dictionary, IEqualityCompare protected ObjectDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { } } + /// + /// UX friendly alternative alias of Dictionary<string, string> + /// public class StringDictionary : Dictionary { public StringDictionary() { } @@ -27,4 +30,24 @@ public StringDictionary(IDictionary dictionary) : base(dictionar public StringDictionary(IDictionary dictionary, IEqualityComparer comparer) : base(dictionary, comparer) { } protected StringDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { } } + + /// + /// UX friendly alternative alias of List<KeyValuePair<string, object>gt; + /// + public class KeyValuePairs : List> + { + public KeyValuePairs() { } + public KeyValuePairs(int capacity) : base(capacity) { } + public KeyValuePairs(IEnumerable> collection) : base(collection) { } + } + + /// + /// UX friendly alternative alias of List<KeyValuePair<string, string>gt; + /// + public class KeyValueStrings : List> + { + public KeyValueStrings() { } + public KeyValueStrings(int capacity) : base(capacity) { } + public KeyValueStrings(IEnumerable> collection) : base(collection) { } + } } \ No newline at end of file From 7b705127bc938cebc647d97716e6dec88d053288 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 23 Feb 2019 02:49:37 -0500 Subject: [PATCH 071/372] Fix FromObjectDictionary conversion test --- src/ServiceStack.Text/AutoMappingUtils.cs | 3 ++ .../AutoMappingObjectDictionaryTests.cs | 37 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 358078b9b..6bd9b5788 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -154,6 +154,9 @@ public static object ConvertTo(this object from, Type toType, bool skipConverter return listResult; } + if (from is IEnumerable> objDict) + return objDict.FromObjectDictionary(toType); + var to = toType.CreateInstance(); return to.PopulateWithNonDefaultValues(from); } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs index c90e3b2e3..58f4455e3 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs @@ -129,6 +129,43 @@ public void Can_convert_from_ObjectDictionary_into_AutoQuery_DTO() Assert.That(request.Take, Is.EqualTo(5)); Assert.That(request.Meta, Is.EquivalentTo(new Dictionary {{"foo", "bar"}})); } + + public class PersonWithIdentities + { + public string Name { get; set; } + public List OtherNames { get;set; } + } + + public class OtherName + { + public string Name { get; set; } + } + + [Test] + public void Can_Convert_from_ObjectDictionary_Containing_Another_Object_Dictionary() + { + var map = new Dictionary + { + { "name", "Foo" }, + { "otherNames", new List + { + new Dictionary { { "name", "Fu" } }, + new Dictionary { { "name", "Fuey" } } + } + } + }; + + var fromDict = map.FromObjectDictionary(); + + Assert.That(fromDict.Name, Is.EqualTo("Foo")); + Assert.That(fromDict.OtherNames.Count, Is.EqualTo(2)); + Assert.That(fromDict.OtherNames.First().Name, Is.EqualTo("Fu")); + Assert.That(fromDict.OtherNames.Last().Name, Is.EqualTo("Fuey")); + + var toDict = fromDict.ToObjectDictionary(); + Assert.That(toDict["Name"], Is.EqualTo("Foo")); + Assert.That(toDict["OtherNames"], Is.EqualTo(fromDict.OtherNames)); + } public class Employee { From 80f0c9c933689e8c2277d4f9b8c803410cdbd42e Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 25 Feb 2019 18:31:12 -0500 Subject: [PATCH 072/372] Upgrade System.Memory to v4.5.2 --- src/ServiceStack.Text/ServiceStack.Text.Core.csproj | 4 ++-- src/ServiceStack.Text/ServiceStack.Text.csproj | 6 +++--- .../ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj | 2 +- .../ServiceStack.Text.TestsConsole.csproj | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index 1d7976e84..a3b83b9f1 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -18,13 +18,13 @@ - + - + \ No newline at end of file diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index 3cb503dce..bbbe85097 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -19,18 +19,18 @@ - + - + - + \ No newline at end of file diff --git a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj index fcac34893..238c34102 100644 --- a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj +++ b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj @@ -33,7 +33,7 @@ - + diff --git a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj index e6aa085a2..1817b9be2 100644 --- a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj +++ b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj @@ -18,7 +18,7 @@ - + From 592d63be70244fefa91163b092f3a9d845506e1d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 25 Feb 2019 20:42:33 -0500 Subject: [PATCH 073/372] bubble unrelated exceptions --- src/ServiceStack.Text/LicenseUtils.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ServiceStack.Text/LicenseUtils.cs b/src/ServiceStack.Text/LicenseUtils.cs index 517de8014..c1b93d0bb 100644 --- a/src/ServiceStack.Text/LicenseUtils.cs +++ b/src/ServiceStack.Text/LicenseUtils.cs @@ -241,6 +241,9 @@ public static void RegisterLicense(string licenseKeyText) } catch (Exception exFallback) { + if (exFallback is FileNotFoundException || exFallback is FileLoadException || exFallback is BadImageFormatException) + throw; + throw new LicenseException(msg, exFallback).Trace(); } } From 3c0c728be42f872fb0550e91d9e4784ac4393814 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 27 Feb 2019 22:32:25 -0500 Subject: [PATCH 074/372] Add support for using implicit/explicit casts of Value types in ConvertTo --- src/ServiceStack.Text/AutoMappingUtils.cs | 43 ++++++++++++++-- .../AutoMappingTests.cs | 49 +++++++++++++++++++ 2 files changed, 87 insertions(+), 5 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 6bd9b5788..24deb7991 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -87,11 +87,10 @@ public static T ConvertTo(this object from, T defaultValue) => public static T ConvertTo(this object from, bool skipConverters) { if (from == null) - return default(T); + return default; - var fromType = from.GetType(); - if (fromType == typeof(T)) - return (T)from; + if (from is T t) + return t; return (T)ConvertTo(from, typeof(T), skipConverters); } @@ -161,6 +160,32 @@ public static object ConvertTo(this object from, Type toType, bool skipConverter return to.PopulateWithNonDefaultValues(from); } + public static MethodInfo GetImplicitCastMethod(Type fromType, Type toType) + { + foreach (var mi in fromType.GetMethods(BindingFlags.Public | BindingFlags.Static)) + { + if (mi.Name == "op_Implicit" && mi.ReturnType == toType && + mi.GetParameters().FirstOrDefault()?.ParameterType == fromType) + { + return mi; + } + } + return null; + } + + public static MethodInfo GetExplicitCastMethod(Type fromType, Type toType) + { + foreach (var mi in toType.GetMethods(BindingFlags.Public | BindingFlags.Static)) + { + if (mi.Name == "op_Explicit" && mi.ReturnType == toType && + mi.GetParameters().FirstOrDefault()?.ParameterType == fromType) + { + return mi; + } + } + return null; + } + public static object ChangeValueType(object from, Type toType) { var s = from as string; @@ -200,7 +225,15 @@ public static object ChangeValueType(object from, Type toType) return srcNumberType.ToString(from); } } - + + var mi = GetImplicitCastMethod(fromType, toType); + if (mi != null) + return mi.Invoke(null, new[] { from }); + + mi = GetExplicitCastMethod(fromType, toType); + if (mi != null) + return mi.Invoke(null, new[] { from }); + if (s != null) return TypeSerializer.DeserializeFromString(s, toType); diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index aeda4b8b7..41d27f8fb 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -1098,5 +1098,54 @@ public void To_ValueType_on_null_or_empty_string_returns_default_value() Assert.That("".ConvertTo(), Is.EqualTo(default(int))); } + struct A + { + public int Id { get; } + public A(int id) => Id = id; + public static implicit operator B(A from) => new B(from.Id); + } + + struct B + { + public int Id { get; } + public B(int id) => Id = id; + public static implicit operator A(B from) => new A(from.Id); + } + + [Test] + public void Can_convert_between_structs_with_implicit_casts() + { + var a = new A(1); + var b = a; + Assert.That(b.Id, Is.EqualTo(a.Id)); + + b = a.ConvertTo(); + Assert.That(b.Id, Is.EqualTo(a.Id)); + } + + struct C + { + public int Id { get; } + public C(int id) => Id = id; + public static explicit operator C(D from) => new C(from.Id); + } + + struct D + { + public int Id { get; } + public D(int id) => Id = id; + public static explicit operator D(C from) => new D(from.Id); + } + + [Test] + public void Can_convert_between_structs_with_explicit_casts() + { + var c = new C(1); + var d = (D)c; + Assert.That(d.Id, Is.EqualTo(c.Id)); + + d = c.ConvertTo(); + Assert.That(d.Id, Is.EqualTo(c.Id)); + } } } From 96aa0191672c79ce28212db32e9ce94aa0cf95de Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 28 Feb 2019 21:07:13 -0500 Subject: [PATCH 075/372] Add more dictionary to Poco tests --- src/ServiceStack.Text/AutoMappingUtils.cs | 11 +++ .../AutoMappingTests.cs | 96 +++++++++++++++++++ 2 files changed, 107 insertions(+) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 24deb7991..3bc8a5075 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -156,6 +156,9 @@ public static object ConvertTo(this object from, Type toType, bool skipConverter if (from is IEnumerable> objDict) return objDict.FromObjectDictionary(toType); + if (from is IEnumerable> strDict) + return strDict.ToObjectDictionary().FromObjectDictionary(toType); + var to = toType.CreateInstance(); return to.PopulateWithNonDefaultValues(from); } @@ -950,6 +953,14 @@ public static object TryConvertCollections(Type fromType, Type toType, object fr return ret ?? fromValue; } } + else if (fromType.IsClass && + (typeof(IDictionary).IsAssignableFrom(toType) || + typeof(IEnumerable>).IsAssignableFrom(toType) || + typeof(IEnumerable>).IsAssignableFrom(toType))) + { + var fromDict = fromValue.ToObjectDictionary(); + return TryConvertCollections(fromType.GetType(), toType, fromDict); + } var listResult = TranslateListWithElements.TryTranslateCollections(fromType, toType, fromValue); return listResult ?? fromValue; diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 41d27f8fb..1bbdab713 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -1147,5 +1147,101 @@ public void Can_convert_between_structs_with_explicit_casts() d = c.ConvertTo(); Assert.That(d.Id, Is.EqualTo(c.Id)); } + + [Test] + public void Can_Convert_from_ObjectDictionary_Containing_Another_Object_Dictionary() + { + var map = new Dictionary + { + { "name", "Foo" }, + { "otherNames", new List + { + new Dictionary { { "name", "Fu" } }, + new Dictionary { { "name", "Fuey" } } + } + } + }; + + var fromDict = map.ConvertTo(); + + Assert.That(fromDict.Name, Is.EqualTo("Foo")); + Assert.That(fromDict.OtherNames.Count, Is.EqualTo(2)); + Assert.That(fromDict.OtherNames.First().Name, Is.EqualTo("Fu")); + Assert.That(fromDict.OtherNames.Last().Name, Is.EqualTo("Fuey")); + + var toDict = fromDict.ConvertTo>(); + Assert.That(toDict["Name"], Is.EqualTo("Foo")); + Assert.That(toDict["OtherNames"], Is.EqualTo(fromDict.OtherNames)); + + var toObjDict = fromDict.ConvertTo(); + Assert.That(toObjDict["Name"], Is.EqualTo("Foo")); + Assert.That(toObjDict["OtherNames"], Is.EqualTo(fromDict.OtherNames)); + } + + class Person + { + public int Id { get; set; } + public string Name { get; set; } + + protected bool Equals(Person other) => Id == other.Id && string.Equals(Name, other.Name); + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + return obj.GetType() == this.GetType() && Equals((Person) obj); + } + + public override int GetHashCode() + { + unchecked + { + return (Id * 397) ^ (Name != null ? Name.GetHashCode() : 0); + } + } + } + + [Test] + public void Can_convert_between_Poco_and_ObjectDictionary() + { + var person = new Person { Id = 1, Name = "foo" }; + + Assert.That(person.ConvertTo>(), Is.EqualTo(new Dictionary { + {"Id", 1}, + {"Name", "foo"}, + })); + Assert.That(new Dictionary { + {"Id", 1}, + {"Name", "foo"}, + }.ConvertTo(), Is.EqualTo(person)); + + Assert.That(person.ConvertTo(), Is.EqualTo(new ObjectDictionary { + {"Id", 1}, + {"Name", "foo"}, + })); + Assert.That(new ObjectDictionary { + {"Id", 1}, + {"Name", "foo"}, + }.ConvertTo(), Is.EqualTo(person)); + + Assert.That(person.ConvertTo>(), Is.EqualTo(new Dictionary { + {"Id", "1"}, + {"Name", "foo"}, + })); + + Assert.That(new Dictionary { + {"Id", "1"}, + {"Name", "foo"}, + }.ConvertTo(), Is.EqualTo(person)); + + Assert.That(person.ConvertTo(), Is.EqualTo(new StringDictionary { + {"Id", "1"}, + {"Name", "foo"}, + })); + Assert.That(new StringDictionary { + {"Id", "1"}, + {"Name", "foo"}, + }.ConvertTo(), Is.EqualTo(person)); + } } } From 23625fcd419875b2c803714852618ebc2d5080f4 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 3 Mar 2019 23:07:11 -0500 Subject: [PATCH 076/372] Better support for KVPs --- src/ServiceStack.Text/AutoMappingUtils.cs | 29 ++++-- src/ServiceStack.Text/PlatformExtensions.cs | 89 +++++++++++++++---- .../AutoMappingTests.cs | 40 +++++++++ 3 files changed, 132 insertions(+), 26 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 3bc8a5075..89331c1f8 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -248,15 +248,16 @@ public static object ChangeValueType(object from, Type toType) return Convert.ChangeType(from, toType, provider: null); } - var toKvpType = toType.GetTypeWithGenericTypeDefinitionOf(typeof(KeyValuePair<,>)); - if (toKvpType != null) + var fromKvpType = fromType.GetTypeWithGenericTypeDefinitionOf(typeof(KeyValuePair<,>)); + if (fromKvpType != null) { - var fromKvpType = fromType.GetTypeWithGenericTypeDefinitionOf(typeof(KeyValuePair<,>)); - if (fromKvpType != null) + var fromProps = TypeProperties.Get(fromKvpType); + var fromKey = fromProps.GetPublicGetter("Key")(from); + var fromValue = fromProps.GetPublicGetter("Value")(from); + + var toKvpType = toType.GetTypeWithGenericTypeDefinitionOf(typeof(KeyValuePair<,>)); + if (toKvpType != null) { - var fromProps = TypeProperties.Get(fromKvpType); - var fromKey = fromProps.GetPublicGetter("Key")(from); - var fromValue = fromProps.GetPublicGetter("Value")(from); var toKvpArgs = toKvpType.GetGenericArguments(); var toKeyType = toKvpArgs[0]; @@ -267,6 +268,18 @@ public static object ChangeValueType(object from, Type toType) var to = toCtor.Invoke(new[] {toKey,toValue}); return to; } + + if (typeof(IDictionary).IsAssignableFrom(toType)) + { + var genericDef = toType.GetTypeWithGenericTypeDefinitionOf(typeof(IDictionary<,>)); + var toArgs = genericDef.GetGenericArguments(); + var toKeyType = toArgs[0]; + var toValueType = toArgs[1]; + + var to = (IDictionary)toType.CreateInstance(); + to[fromKey.ConvertTo(toKeyType)] = fromValue.ConvertTo(toValueType); + return to; + } } return TypeSerializer.DeserializeFromString(from.ToJsv(), toType); @@ -887,7 +900,7 @@ public static object TryConvertCollections(Type fromType, Type toType, object fr // Fallback for handling any KVP combo - var toKvpDefType = toType.GetKeyValuePairTypeDef(); + var toKvpDefType = toType.GetKeyValuePairsTypeDef(); switch (obj) { case IDictionary toDict: { diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index 97514a920..bd8b793ae 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -676,9 +676,9 @@ public static Dictionary ToObjectDictionary(this object obj) if (obj is IDictionary interfaceDict) return new Dictionary(interfaceDict); + var to = new Dictionary(); if (obj is Dictionary stringDict) { - var to = new Dictionary(); foreach (var entry in stringDict) { to[entry.Key] = entry.Value; @@ -688,7 +688,6 @@ public static Dictionary ToObjectDictionary(this object obj) if (obj is IDictionary d) { - var to = new Dictionary(); foreach (var key in d.Keys) { to[key.ToString()] = d[key]; @@ -698,7 +697,6 @@ public static Dictionary ToObjectDictionary(this object obj) if (obj is NameValueCollection nvc) { - var to = new Dictionary(); for (var i = 0; i < nvc.Count; i++) { to[nvc.GetKey(i)] = nvc.Get(i); @@ -706,22 +704,63 @@ public static Dictionary ToObjectDictionary(this object obj) return to; } + if (obj is IEnumerable> objKvps) + { + foreach (var kvp in objKvps) + { + to[kvp.Key] = kvp.Value; + } + return to; + } + if (obj is IEnumerable> strKvps) + { + foreach (var kvp in strKvps) + { + to[kvp.Key] = kvp.Value; + } + return to; + } + var type = obj.GetType(); + if (type.GetKeyValuePairsTypes(out var keyType, out var valueType, out var kvpType) && obj is IEnumerable e) + { + var keyGetter = TypeProperties.Get(kvpType).GetPublicGetter("Key"); + var valueGetter = TypeProperties.Get(kvpType).GetPublicGetter("Value"); + + foreach (var entry in e) + { + var key = keyGetter(entry); + var value = valueGetter(entry); + to[key.ConvertTo()] = value; + } + return to; + } + + + if (obj is KeyValuePair objKvp) + return new Dictionary { {objKvp.Key, objKvp.Value} }; + if (obj is KeyValuePair strKvp) + return new Dictionary { {strKvp.Key, strKvp.Value} }; + + if (type.GetKeyValuePairTypes(out _, out var _)) + { + return new Dictionary { + { TypeProperties.Get(type).GetPublicGetter("Key")(obj).ConvertTo(), TypeProperties.Get(type).GetPublicGetter("Value")(obj) }, + }; + } if (!toObjectMapCache.TryGetValue(type, out var def)) toObjectMapCache[type] = def = CreateObjectDictionaryDefinition(type); - var dict = new Dictionary(); - foreach (var fieldDef in def.Fields) { - dict[fieldDef.Name] = fieldDef.GetValueFn(obj); + to[fieldDef.Name] = fieldDef.GetValueFn(obj); } - return dict; + return to; } - public static Type GetKeyValuePairTypeDef(this Type dictType) + public static Type GetKeyValuePairsTypeDef(this Type dictType) { //matches IDictionary<,>, IReadOnlyDictionary<,>, List> var genericDef = dictType.GetTypeWithGenericTypeDefinitionOf(typeof(IEnumerable<>)); @@ -729,25 +768,39 @@ public static Type GetKeyValuePairTypeDef(this Type dictType) return null; var genericEnumType = genericDef.GetGenericArguments()[0]; - return genericEnumType.GetTypeWithGenericTypeDefinitionOf(typeof(KeyValuePair<,>)); + return GetKeyValuePairTypeDef(genericEnumType); } + + public static Type GetKeyValuePairTypeDef(this Type genericEnumType) => genericEnumType.GetTypeWithGenericTypeDefinitionOf(typeof(KeyValuePair<,>)); + + public static bool GetKeyValuePairsTypes(this Type dictType, out Type keyType, out Type valueType) => + dictType.GetKeyValuePairsTypes(out keyType, out valueType, out _); - public static bool GetKeyValuePairsTypes(this Type dictType, out Type keyType, out Type valueType) + public static bool GetKeyValuePairsTypes(this Type dictType, out Type keyType, out Type valueType, out Type kvpType) { //matches IDictionary<,>, IReadOnlyDictionary<,>, List> var genericDef = dictType.GetTypeWithGenericTypeDefinitionOf(typeof(IEnumerable<>)); if (genericDef != null) { - var genericEnumType = genericDef.GetGenericArguments()[0]; - var genericKvps = genericEnumType.GetTypeWithGenericTypeDefinitionOf(typeof(KeyValuePair<,>)); - if (genericKvps != null) - { - var genericArgs = genericEnumType.GetGenericArguments(); - keyType = genericArgs[0]; - valueType = genericArgs[1]; + kvpType = genericDef.GetGenericArguments()[0]; + if (GetKeyValuePairTypes(kvpType, out keyType, out valueType)) return true; - } } + kvpType = keyType = valueType = null; + return false; + } + + private static bool GetKeyValuePairTypes(this Type kvpType, out Type keyType, out Type valueType) + { + var genericKvps = kvpType.GetTypeWithGenericTypeDefinitionOf(typeof(KeyValuePair<,>)); + if (genericKvps != null) + { + var genericArgs = kvpType.GetGenericArguments(); + keyType = genericArgs[0]; + valueType = genericArgs[1]; + return true; + } + keyType = valueType = null; return false; } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 1bbdab713..ae354f6a0 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -1243,5 +1243,45 @@ public void Can_convert_between_Poco_and_ObjectDictionary() {"Name", "foo"}, }.ConvertTo(), Is.EqualTo(person)); } + + [Test] + public void Can_ToObjectDictionary_KVPs() + { + var objKvp = new KeyValuePair("A", 1); + var strKvp = new KeyValuePair("A", "1"); + var intKvp = new KeyValuePair("A", 1); + + Assert.That(objKvp.ToObjectDictionary(), Is.EquivalentTo(new Dictionary { {"A", 1} })); + Assert.That(strKvp.ToObjectDictionary(), Is.EquivalentTo(new Dictionary { {"A", "1"} })); + Assert.That(intKvp.ToObjectDictionary(), Is.EquivalentTo(new Dictionary { {"A", 1} })); + + var objKvp2 = new KeyValuePair("B", 2); + var strKvp2 = new KeyValuePair("B", "2"); + var intKvp2 = new KeyValuePair("B", 2); + + Assert.That(new[] { objKvp, objKvp2 }.ToObjectDictionary(), Is.EquivalentTo(new Dictionary { {"A", 1}, {"B", 2} })); + Assert.That(new[] { strKvp, strKvp2 }.ToObjectDictionary(), Is.EquivalentTo(new Dictionary { {"A", "1"}, {"B", "2"} })); + Assert.That(new[] { intKvp, intKvp2 }.ToObjectDictionary(), Is.EquivalentTo(new Dictionary { {"A", 1}, {"B", 2} })); + } + + [Test] + public void Can_convert_KVPs_to_ObjectDictionary() + { + var objKvp = new KeyValuePair("A", 1); + var strKvp = new KeyValuePair("A", "1"); + var intKvp = new KeyValuePair("A", 1); + + Assert.That(objKvp.ConvertTo>(), Is.EquivalentTo(new Dictionary { {"A", 1} })); + Assert.That(strKvp.ConvertTo>(), Is.EquivalentTo(new Dictionary { {"A", "1"} })); + Assert.That(intKvp.ConvertTo>(), Is.EquivalentTo(new Dictionary { {"A", 1} })); + + var objKvp2 = new KeyValuePair("B", 2); + var strKvp2 = new KeyValuePair("B", "2"); + var intKvp2 = new KeyValuePair("B", 2); + + Assert.That(new[] { objKvp, objKvp2 }.ConvertTo>(), Is.EquivalentTo(new Dictionary { {"A", 1}, {"B", 2} })); + Assert.That(new[] { strKvp, strKvp2 }.ConvertTo>(), Is.EquivalentTo(new Dictionary { {"A", "1"}, {"B", "2"} })); + Assert.That(new[] { intKvp, intKvp2 }.ConvertTo>(), Is.EquivalentTo(new Dictionary { {"A", 1}, {"B", 2} })); + } } } From fcac204226949c082f9d9de16dc9ebf5f954d251 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 4 Mar 2019 02:05:27 -0500 Subject: [PATCH 077/372] restore KVP > Dictionary behavior --- src/ServiceStack.Text/AutoMappingUtils.cs | 9 +++------ src/ServiceStack.Text/PlatformExtensions.cs | 7 ++++--- tests/ServiceStack.Text.Tests/AutoMappingTests.cs | 12 ++++++------ 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 89331c1f8..0a118d5bf 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -260,12 +260,8 @@ public static object ChangeValueType(object from, Type toType) { var toKvpArgs = toKvpType.GetGenericArguments(); - var toKeyType = toKvpArgs[0]; - var toValueType = toKvpArgs[1]; var toCtor = toKvpType.GetConstructor(toKvpArgs); - var toKey = fromKey.ConvertTo(toKeyType); - var toValue = fromValue.ConvertTo(toValueType); - var to = toCtor.Invoke(new[] {toKey,toValue}); + var to = toCtor.Invoke(new[] { fromKey.ConvertTo(toKvpArgs[0]), fromValue.ConvertTo(toKvpArgs[1]) }); return to; } @@ -277,7 +273,8 @@ public static object ChangeValueType(object from, Type toType) var toValueType = toArgs[1]; var to = (IDictionary)toType.CreateInstance(); - to[fromKey.ConvertTo(toKeyType)] = fromValue.ConvertTo(toValueType); + to["Key"] = fromKey.ConvertTo(toKeyType); + to["Value"] = fromValue.ConvertTo(toValueType); return to; } } diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index bd8b793ae..c2f883ff6 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -738,14 +738,15 @@ public static Dictionary ToObjectDictionary(this object obj) if (obj is KeyValuePair objKvp) - return new Dictionary { {objKvp.Key, objKvp.Value} }; + return new Dictionary { { nameof(objKvp.Key), objKvp.Key }, { nameof(objKvp.Value), objKvp.Value } }; if (obj is KeyValuePair strKvp) - return new Dictionary { {strKvp.Key, strKvp.Value} }; + return new Dictionary { { nameof(strKvp.Key), strKvp.Key }, { nameof(strKvp.Value), strKvp.Value } }; if (type.GetKeyValuePairTypes(out _, out var _)) { return new Dictionary { - { TypeProperties.Get(type).GetPublicGetter("Key")(obj).ConvertTo(), TypeProperties.Get(type).GetPublicGetter("Value")(obj) }, + { "Key", TypeProperties.Get(type).GetPublicGetter("Key")(obj).ConvertTo() }, + { "Value", TypeProperties.Get(type).GetPublicGetter("Value")(obj) }, }; } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index ae354f6a0..0ef7a7d69 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -1251,9 +1251,9 @@ public void Can_ToObjectDictionary_KVPs() var strKvp = new KeyValuePair("A", "1"); var intKvp = new KeyValuePair("A", 1); - Assert.That(objKvp.ToObjectDictionary(), Is.EquivalentTo(new Dictionary { {"A", 1} })); - Assert.That(strKvp.ToObjectDictionary(), Is.EquivalentTo(new Dictionary { {"A", "1"} })); - Assert.That(intKvp.ToObjectDictionary(), Is.EquivalentTo(new Dictionary { {"A", 1} })); + Assert.That(objKvp.ToObjectDictionary(), Is.EquivalentTo(new Dictionary { {"Key", "A" }, { "Value", 1 } } )); + Assert.That(strKvp.ToObjectDictionary(), Is.EquivalentTo(new Dictionary { {"Key", "A" }, { "Value", "1"} } )); + Assert.That(intKvp.ToObjectDictionary(), Is.EquivalentTo(new Dictionary { {"Key", "A" }, { "Value", 1 } } )); var objKvp2 = new KeyValuePair("B", 2); var strKvp2 = new KeyValuePair("B", "2"); @@ -1271,9 +1271,9 @@ public void Can_convert_KVPs_to_ObjectDictionary() var strKvp = new KeyValuePair("A", "1"); var intKvp = new KeyValuePair("A", 1); - Assert.That(objKvp.ConvertTo>(), Is.EquivalentTo(new Dictionary { {"A", 1} })); - Assert.That(strKvp.ConvertTo>(), Is.EquivalentTo(new Dictionary { {"A", "1"} })); - Assert.That(intKvp.ConvertTo>(), Is.EquivalentTo(new Dictionary { {"A", 1} })); + Assert.That(objKvp.ConvertTo>(), Is.EquivalentTo(new Dictionary { {"Key", "A" }, { "Value", 1 } } )); + Assert.That(strKvp.ConvertTo>(), Is.EquivalentTo(new Dictionary { {"Key", "A" }, { "Value", "1"} } )); + Assert.That(intKvp.ConvertTo>(), Is.EquivalentTo(new Dictionary { {"Key", "A" }, { "Value", 1 } } )); var objKvp2 = new KeyValuePair("B", 2); var strKvp2 = new KeyValuePair("B", "2"); From 53a1fdab86625e044eaad4bf3a40f61bc0ab677e Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 4 Mar 2019 23:36:31 -0500 Subject: [PATCH 078/372] Improve KVP ConvertTo support --- src/ServiceStack.Text/AutoMappingUtils.cs | 27 +++++++-- src/ServiceStack.Text/PlatformExtensions.cs | 2 +- .../AutoMappingTests.cs | 57 +++++++++++++++++++ 3 files changed, 79 insertions(+), 7 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 0a118d5bf..cd18f7828 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -776,6 +776,25 @@ public static object TryConvertCollections(Type fromType, Type toType, object fr { if (fromValue is IEnumerable values) { + var toEnumObjs = toType == typeof(IEnumerable); + if (typeof(IList).IsAssignableFrom(toType) || toEnumObjs) + { + var to = (IList) (toType.IsArray || toEnumObjs ? new List() : toType.CreateInstance()); + var elType = toType.GetCollectionType(); + foreach (var item in values) + { + to.Add(elType != null ? item.ConvertTo(elType) : item); + } + if (elType != null && toType.IsArray) + { + var arr = Array.CreateInstance(elType, to.Count); + to.CopyTo(arr, 0); + return arr; + } + + return to; + } + if (fromValue is IDictionary d) { var obj = toType.CreateInstance(); @@ -784,18 +803,14 @@ public static object TryConvertCollections(Type fromType, Type toType, object fr case List> toList: { foreach (var key in d.Keys) { - var toKey = key.ConvertTo(); - var toValue = d[key].ConvertTo(); - toList.Add(new KeyValuePair(toKey, toValue)); + toList.Add(new KeyValuePair(key.ConvertTo(), d[key].ConvertTo())); } return toList; } case List> toObjList: { foreach (var key in d.Keys) { - var toKey = key.ConvertTo(); - var toValue = d[key]; - toObjList.Add(new KeyValuePair(toKey, toValue)); + toObjList.Add(new KeyValuePair(key.ConvertTo(), d[key])); } return toObjList; } diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index c2f883ff6..237e321a5 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -791,7 +791,7 @@ public static bool GetKeyValuePairsTypes(this Type dictType, out Type keyType, o return false; } - private static bool GetKeyValuePairTypes(this Type kvpType, out Type keyType, out Type valueType) + public static bool GetKeyValuePairTypes(this Type kvpType, out Type keyType, out Type valueType) { var genericKvps = kvpType.GetTypeWithGenericTypeDefinitionOf(typeof(KeyValuePair<,>)); if (genericKvps != null) diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 0ef7a7d69..cd4953298 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -1283,5 +1283,62 @@ public void Can_convert_KVPs_to_ObjectDictionary() Assert.That(new[] { strKvp, strKvp2 }.ConvertTo>(), Is.EquivalentTo(new Dictionary { {"A", "1"}, {"B", "2"} })); Assert.That(new[] { intKvp, intKvp2 }.ConvertTo>(), Is.EquivalentTo(new Dictionary { {"A", 1}, {"B", 2} })); } + + [Test] + public void Can_convert_between_KVP_Objects_and_IEnumerable() + { + var kvps = new List> { + new KeyValuePair("A", 1), + new KeyValuePair("B", 2), + new KeyValuePair("C", 3), + }; + + Assert.That(kvps.ConvertTo>(), Is.EqualTo(kvps)); + Assert.That(kvps.ConvertTo>(), Is.EqualTo(kvps)); + Assert.That(kvps.ConvertTo(), Is.EqualTo(kvps)); + + List listObjs = kvps.Cast().ToList(); + Assert.That(listObjs.ConvertTo>>(), Is.EquivalentTo(listObjs)); + object[] arrayObjs = kvps.Cast().ToArray(); + Assert.That(arrayObjs.ConvertTo>>(), Is.EquivalentTo(arrayObjs)); + } + + [Test] + public void Can_convert_between_KVP_Strings_and_IEnumerable() + { + var kvps = new List> { + new KeyValuePair("A", "1"), + new KeyValuePair("B", "2"), + new KeyValuePair("C", "3"), + }; + + Assert.That(kvps.ConvertTo>(), Is.EqualTo(kvps)); + Assert.That(kvps.ConvertTo>(), Is.EqualTo(kvps)); + Assert.That(kvps.ConvertTo(), Is.EqualTo(kvps)); + + List listObjs = kvps.Cast().ToList(); + Assert.That(listObjs.ConvertTo>>(), Is.EquivalentTo(listObjs)); + object[] arrayObjs = kvps.Cast().ToArray(); + Assert.That(arrayObjs.ConvertTo>>(), Is.EquivalentTo(arrayObjs)); + } + + [Test] + public void Can_convert_between_KVP_ints_and_IEnumerable() + { + var kvps = new List> { + new KeyValuePair("A", 1), + new KeyValuePair("B", 2), + new KeyValuePair("C", 3), + }; + + Assert.That(kvps.ConvertTo>(), Is.EqualTo(kvps)); + Assert.That(kvps.ConvertTo>(), Is.EqualTo(kvps)); + Assert.That(kvps.ConvertTo(), Is.EqualTo(kvps)); + + List listObjs = kvps.Cast().ToList(); + Assert.That(listObjs.ConvertTo>>(), Is.EquivalentTo(listObjs)); + object[] arrayObjs = kvps.Cast().ToArray(); + Assert.That(arrayObjs.ConvertTo>>(), Is.EquivalentTo(arrayObjs)); + } } } From 995e2f8b2c3f7bd38c361e6c734a718381542f9d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 5 Mar 2019 01:40:55 -0500 Subject: [PATCH 079/372] More convertTo tests --- src/ServiceStack.Text/PlatformExtensions.cs | 5 +- .../AutoMappingTests.cs | 82 +++++++++++++++++++ 2 files changed, 85 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index 237e321a5..04fc112a5 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -554,8 +554,9 @@ public static Delegate CreateDelegate(this MethodInfo methodInfo, Type delegateT public static Type GetCollectionType(this Type type) { - return type.GetElementType() - ?? type.GetGenericArguments().LastOrDefault(); //new[] { str }.Select(x => new Type()) => WhereSelectArrayIterator + return type.GetElementType() + ?? type.GetGenericArguments().LastOrDefault() //new[] { str }.Select(x => new Type()) => WhereSelectArrayIterator + ?? (type.BaseType != null && type.BaseType != typeof(object) ? type.BaseType.GetCollectionType() : null); //e.g. ArrayOfString : List } static Dictionary GenericTypeCache = new Dictionary(); diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index cd4953298..c2e668e4e 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -1340,5 +1340,87 @@ public void Can_convert_between_KVP_ints_and_IEnumerable() object[] arrayObjs = kvps.Cast().ToArray(); Assert.That(arrayObjs.ConvertTo>>(), Is.EquivalentTo(arrayObjs)); } + + public enum TestEnum { A, B, C } + + [Test] + public void Can_convert_between_list_of_value_types() + { + var enumArrays = new[]{ TestEnum.A, TestEnum.B, TestEnum.C }; + var strArrays = new List {"A","B","C"}; + Assert.That(enumArrays.ConvertTo>(), Is.EquivalentTo(enumArrays.ToList())); + Assert.That(enumArrays.ConvertTo>(), Is.EquivalentTo(strArrays)); + + var strNums = new List {"1","2","3"}; + var intNums = new List {1,2,3}; + Assert.That(strNums.ConvertTo>(), Is.EquivalentTo(intNums)); + Assert.That(intNums.ConvertTo>(), Is.EquivalentTo(strNums)); + } + + public class TestClassA + { + public IList IListStrings { get; set; } + public ArrayOfString ListStrings { get; set; } + public IList ListEnums { get; set; } + } + public class TestClassB + { + public ArrayOfString IListStrings { get; set; } + public IList ListStrings { get; set; } + public ArrayOfString ListEnums { get; set; } + } + public class TestClassC + { + public IList ListStrings { get; protected set; } + } + + [Test] + public void Can_translate_generic_lists() + { + + var values = new[] { "A", "B", "C" }; + var testA = new TestClassA + { + IListStrings = new List(values), + ListStrings = new ArrayOfString(values), + ListEnums = new List { TestEnum.A, TestEnum.B, TestEnum.C }, + }; + + var fromTestA = testA.ConvertTo(); + + AssertAreEqual(testA, fromTestA); + + var userFileTypeValues = testA.ListEnums.Map(x => x.ToString()); + var testB = new TestClassB + { + IListStrings = new ArrayOfString(values), + ListStrings = new List(values), + ListEnums = new ArrayOfString(userFileTypeValues), + }; + + var fromTestB = testB.ConvertTo(); + AssertAreEqual(fromTestB, testB); + } + + private static void AssertAreEqual(TestClassA testA, TestClassB testB) + { + Assert.That(testA, Is.Not.Null); + Assert.That(testB, Is.Not.Null); + + Assert.That(testA.IListStrings, Is.Not.Null); + Assert.That(testB.IListStrings, Is.Not.Null); + Assert.That(testA.IListStrings, + Is.EquivalentTo(new List(testB.IListStrings))); + + Assert.That(testA.ListStrings, Is.Not.Null); + Assert.That(testB.ListStrings, Is.Not.Null); + Assert.That(testA.ListStrings, Is.EquivalentTo(testB.ListStrings)); + + Assert.That(testA.ListEnums, Is.Not.Null); + Assert.That(testB.ListEnums, Is.Not.Null); + Assert.That(testA.ListEnums, + Is.EquivalentTo(testB.ListEnums.ConvertAll(x => x.ToEnum()))); + } + } } From e43d901802a27f0e23c547c4439b49443784aaf5 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 5 Mar 2019 11:52:00 -0500 Subject: [PATCH 080/372] Add nested populate test --- src/ServiceStack.Text/AutoMappingUtils.cs | 6 +- .../AutoMappingTests.cs | 56 ++++++++++++++++++- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index cd18f7828..47b4d36a5 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -123,9 +123,6 @@ public static object ConvertTo(this object from, Type toType, bool skipConverter return null; var fromType = from.GetType(); - if (fromType == toType || toType == typeof(object)) - return from; - if (ShouldIgnoreMapping(fromType, toType)) return null; @@ -136,6 +133,9 @@ public static object ConvertTo(this object from, Type toType, bool skipConverter return converter(from); } + if (fromType == toType || toType == typeof(object)) + return from; + if (fromType.IsValueType || toType.IsValueType) return ChangeValueType(from, toType); diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index c2e668e4e..00d4ccf7b 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -1421,6 +1421,60 @@ private static void AssertAreEqual(TestClassA testA, TestClassB testB) Assert.That(testA.ListEnums, Is.EquivalentTo(testB.ListEnums.ConvertAll(x => x.ToEnum()))); } - + + class Company + { + public string Name { get; set; } + public Address Address { get; set; } + } + + class Address + { + public string City { get; set; } + public string PostCode { get; set; } + } + + [Test] + public void Can_register_converters_to_PopulateWithNonDefaultValues() + { + Company Create() + { + return new Company { + Name = "Compnay1", + Address = new Address { + City = "NY", + PostCode = "1234", + } + }; + } + + var defaults = Create(); + var original = Create(); + + original.PopulateWithNonDefaultValues(new Company { + Address = new Address { + PostCode = "4321" + } + }); + + Assert.That(original.Name, Is.EqualTo(defaults.Name)); + Assert.That(original.Address.City, Is.Null); + Assert.That(original.Address.PostCode, Is.EqualTo("4321")); + + original = Create(); + + var updated = new Company { + Address = new Address { + PostCode = "4321" + } + }; + original.Address.PopulateWithNonDefaultValues(updated.Address); + updated.Address = null; + original.PopulateWithNonDefaultValues(updated); + + Assert.That(original.Name, Is.EqualTo(defaults.Name)); + Assert.That(original.Address.City, Is.EqualTo(defaults.Address.City)); + Assert.That(original.Address.PostCode, Is.EqualTo("4321")); + } } } From 3d79b222be001c819928ae2be13894d0b163babc Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 6 Mar 2019 10:47:20 -0500 Subject: [PATCH 081/372] Add support for deserializing List and Dictionary with #Script --- .../Common/DeserializeDictionary.cs | 22 +++++----- .../Common/DeserializeListWithElements.cs | 3 ++ .../JsonTests/JsonObjectTests.cs | 40 ++++++++++++++++++- 3 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/ServiceStack.Text/Common/DeserializeDictionary.cs b/src/ServiceStack.Text/Common/DeserializeDictionary.cs index 0efedba49..5e8685676 100644 --- a/src/ServiceStack.Text/Common/DeserializeDictionary.cs +++ b/src/ServiceStack.Text/Common/DeserializeDictionary.cs @@ -14,7 +14,6 @@ using System.Collections; using System.Collections.Generic; using System.Threading; -using ServiceStack.Text.Json; namespace ServiceStack.Text.Common { @@ -51,13 +50,11 @@ public static ParseStringSpanDelegate GetParseStringSpanMethod(Type type) //optimized access for regularly used types if (type == typeof(Dictionary)) - { return ParseStringDictionary; - } + if (type == typeof(Dictionary) && Json.JsonTypeSerializer.Instance.ObjectDeserializer != null) + return s => Json.JsonTypeSerializer.Instance.ObjectDeserializer(s); if (type == typeof(JsonObject)) - { return ParseJsonObject; - } if (typeof(JsonObject).IsAssignableFrom(type)) { var method = typeof(DeserializeDictionary).GetMethod("ParseInheritedJsonObject"); @@ -89,7 +86,7 @@ public static ParseStringSpanDelegate GetParseStringSpanMethod(Type type) var result = new T(); - if (JsonTypeSerializer.IsEmptyMap(value, index)) return result; + if (Json.JsonTypeSerializer.IsEmptyMap(value, index)) return result; var valueLength = value.Length; while (index < valueLength) @@ -119,7 +116,7 @@ public static JsonObject ParseJsonObject(ReadOnlySpan value) var result = new JsonObject(); - if (JsonTypeSerializer.IsEmptyMap(value, index)) return result; + if (Json.JsonTypeSerializer.IsEmptyMap(value, index)) return result; var valueLength = value.Length; while (index < valueLength) @@ -151,7 +148,7 @@ public static Dictionary ParseStringDictionary(ReadOnlySpan(); - if (JsonTypeSerializer.IsEmptyMap(value, index)) return result; + if (Json.JsonTypeSerializer.IsEmptyMap(value, index)) return result; var valueLength = value.Length; while (index < valueLength) @@ -185,7 +182,7 @@ public static IDictionary ParseIDictionary(ReadOnlySpan value, Type dictTy var to = (IDictionary)dictType.CreateInstance(); - if (JsonTypeSerializer.IsEmptyMap(value, index)) return to; + if (Json.JsonTypeSerializer.IsEmptyMap(value, index)) return to; var valueLength = value.Length; while (index < valueLength) @@ -245,7 +242,7 @@ public static IDictionary ParseDictionary( ? new Dictionary() : (IDictionary)createMapType.CreateInstance(); - if (JsonTypeSerializer.IsEmptyMap(value, index)) return to; + if (Json.JsonTypeSerializer.IsEmptyMap(value, index)) return to; var valueLength = value.Length; while (index < valueLength) @@ -339,8 +336,9 @@ public static object ParseDictionaryType(ReadOnlySpan value, Type createMa do { snapshot = ParseDelegateCache; - newCache = new Dictionary(ParseDelegateCache); - newCache[key] = parseDelegate; + newCache = new Dictionary(ParseDelegateCache) { + [key] = parseDelegate + }; } while (!ReferenceEquals( Interlocked.CompareExchange(ref ParseDelegateCache, newCache, snapshot), snapshot)); diff --git a/src/ServiceStack.Text/Common/DeserializeListWithElements.cs b/src/ServiceStack.Text/Common/DeserializeListWithElements.cs index c10480a18..06bd08834 100644 --- a/src/ServiceStack.Text/Common/DeserializeListWithElements.cs +++ b/src/ServiceStack.Text/Common/DeserializeListWithElements.cs @@ -269,6 +269,9 @@ public static ParseStringSpanDelegate GetParseStringSpanFn() if (typeof(T) == typeof(List)) return DeserializeListWithElements.ParseIntList; + + if (typeof(T) == typeof(List) && Json.JsonTypeSerializer.Instance.ObjectDeserializer != null) + return s => Json.JsonTypeSerializer.Instance.ObjectDeserializer(s); var elementType = listInterface.GetGenericArguments()[0]; diff --git a/tests/ServiceStack.Text.Tests/JsonTests/JsonObjectTests.cs b/tests/ServiceStack.Text.Tests/JsonTests/JsonObjectTests.cs index 49339a93d..6360a6847 100644 --- a/tests/ServiceStack.Text.Tests/JsonTests/JsonObjectTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonTests/JsonObjectTests.cs @@ -505,7 +505,45 @@ public void Can_deserialize_custom_JsonObject_with_incorrect_payload() } catch (FormatException) {} } - + + class HasObjectDictionary + { + public Dictionary Properties { get; set; } + } + + [Test] + public void Can_deserialize_unknown_ObjectDictionary() + { + JS.Configure(); + + Assert.That("{\"Properties\":{\"a\":1}}".FromJson().Properties["a"], Is.EqualTo(1)); + Assert.That("{\"Properties\":{\"a\":\"1\"}}".FromJson().Properties["a"], Is.EqualTo("1")); + Assert.That("{\"Properties\":{\"a\":[\"1\",\"2\"]}}".FromJson().Properties["a"], Is.EquivalentTo(new[]{"1","2"})); + Assert.That("{\"Properties\":{\"a\":[1,2]}}".FromJson().Properties["a"], Is.EquivalentTo(new[]{1,2})); + + JS.UnConfigure(); + } + + class HasObjectList + { + public List Properties { get; set; } + } + + [Test] + public void Can_deserialize_unknown_ObjectList() + { + JS.Configure(); + + Assert.That("{\"Properties\":[\"1\"]}".FromJson().Properties[0], Is.EqualTo("1")); + Assert.That("{\"Properties\":[1]}".FromJson().Properties[0], Is.EqualTo(1)); + Assert.That("{\"Properties\":[[\"1\",\"2\"]]}".FromJson().Properties[0], Is.EquivalentTo(new[]{"1","2"})); + Assert.That("{\"Properties\":[[1,2]]}".FromJson().Properties[0], Is.EquivalentTo(new[]{1,2})); + Assert.That("{\"Properties\":[{\"a\":1}]".FromJson().Properties[0], Is.EquivalentTo(new Dictionary { + ["a"] = 1 + })); + + JS.UnConfigure(); + } } } From d28ba5892e05424b59c02cc87bafe0149ba7f99c Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 6 Mar 2019 11:58:32 -0500 Subject: [PATCH 082/372] workaround dirty tests by only checking objSerializer in cached generic parse fn --- .../Common/DeserializeDictionary.cs | 16 +++++++++------- .../Common/DeserializeListWithElements.cs | 17 ++++++++--------- .../JsonTests/DictionaryDeserializationTests.cs | 15 +++++---------- .../JsonTests/JsonObjectTests.cs | 3 +-- 4 files changed, 23 insertions(+), 28 deletions(-) diff --git a/src/ServiceStack.Text/Common/DeserializeDictionary.cs b/src/ServiceStack.Text/Common/DeserializeDictionary.cs index 5e8685676..75be7d5a0 100644 --- a/src/ServiceStack.Text/Common/DeserializeDictionary.cs +++ b/src/ServiceStack.Text/Common/DeserializeDictionary.cs @@ -45,14 +45,12 @@ public static ParseStringSpanDelegate GetParseStringSpanMethod(Type type) return s => ParseIDictionary(s, type); } - throw new ArgumentException(string.Format("Type {0} is not of type IDictionary<,>", type.FullName)); + throw new ArgumentException($"Type {type.FullName} is not of type IDictionary<,>"); } //optimized access for regularly used types if (type == typeof(Dictionary)) return ParseStringDictionary; - if (type == typeof(Dictionary) && Json.JsonTypeSerializer.Instance.ObjectDeserializer != null) - return s => Json.JsonTypeSerializer.Instance.ObjectDeserializer(s); if (type == typeof(JsonObject)) return ParseJsonObject; if (typeof(JsonObject).IsAssignableFrom(type)) @@ -229,6 +227,14 @@ public static IDictionary ParseDictionary( { if (value.IsEmpty) return null; + var to = (createMapType == null) + ? new Dictionary() + : (IDictionary)createMapType.CreateInstance(); + + var objDeserializer = Json.JsonTypeSerializer.Instance.ObjectDeserializer; + if (to is Dictionary && objDeserializer != null) + return (IDictionary) objDeserializer(value); + var config = JsConfig.GetConfig(); var tryToParseItemsAsDictionaries = @@ -238,10 +244,6 @@ public static IDictionary ParseDictionary( var index = VerifyAndGetStartIndex(value, createMapType); - var to = (createMapType == null) - ? new Dictionary() - : (IDictionary)createMapType.CreateInstance(); - if (Json.JsonTypeSerializer.IsEmptyMap(value, index)) return to; var valueLength = value.Length; diff --git a/src/ServiceStack.Text/Common/DeserializeListWithElements.cs b/src/ServiceStack.Text/Common/DeserializeListWithElements.cs index 06bd08834..6590871b8 100644 --- a/src/ServiceStack.Text/Common/DeserializeListWithElements.cs +++ b/src/ServiceStack.Text/Common/DeserializeListWithElements.cs @@ -161,16 +161,18 @@ public static ICollection ParseGenericList(string value, Type createListType, public static ICollection ParseGenericList(ReadOnlySpan value, Type createListType, ParseStringSpanDelegate parseFn) { - if ((value = DeserializeListWithElements.StripList(value)).IsEmpty) - return null; - - var isReadOnly = createListType != null - && (createListType.IsGenericType && createListType.GetGenericTypeDefinition() == typeof(ReadOnlyCollection<>)); - + var isReadOnly = createListType != null && (createListType.IsGenericType && createListType.GetGenericTypeDefinition() == typeof(ReadOnlyCollection<>)); var to = (createListType == null || isReadOnly) ? new List() : (ICollection)createListType.CreateInstance(); + var objSerializer = Json.JsonTypeSerializer.Instance.ObjectDeserializer; + if (to is List && objSerializer != null) + return (ICollection)objSerializer(value); + + if ((value = DeserializeListWithElements.StripList(value)).IsEmpty) + return null; + if (value.IsNullOrEmpty()) return isReadOnly ? (ICollection)Activator.CreateInstance(createListType, to) : to; @@ -270,9 +272,6 @@ public static ParseStringSpanDelegate GetParseStringSpanFn() if (typeof(T) == typeof(List)) return DeserializeListWithElements.ParseIntList; - if (typeof(T) == typeof(List) && Json.JsonTypeSerializer.Instance.ObjectDeserializer != null) - return s => Json.JsonTypeSerializer.Instance.ObjectDeserializer(s); - var elementType = listInterface.GetGenericArguments()[0]; var supportedTypeParseMethod = DeserializeListWithElements.Serializer.GetParseStringSpanFn(elementType); diff --git a/tests/ServiceStack.Text.Tests/JsonTests/DictionaryDeserializationTests.cs b/tests/ServiceStack.Text.Tests/JsonTests/DictionaryDeserializationTests.cs index 598179b9d..7cd3df292 100644 --- a/tests/ServiceStack.Text.Tests/JsonTests/DictionaryDeserializationTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonTests/DictionaryDeserializationTests.cs @@ -12,18 +12,13 @@ public void CanDeserializeDictionaryOfComplexTypes() { JsConfig.ConvertObjectTypesIntoStringDictionary = true; - var dict = new Dictionary(); - - dict["ChildDict"] = new Dictionary - { - {"age", 12}, - {"name", "mike"} + var dict = new Dictionary { + ["ChildDict"] = new Dictionary {{"age", 12}, {"name", "mike"}}, + ["ChildIntList"] = new List {1, 2, 3}, + ["ChildStringList"] = new List {"a", "b", "c"}, + ["ChildObjectList"] = new List {1, "cat", new Dictionary {{"s", "s"}, {"n", 1}}} }; - dict["ChildIntList"] = new List {1, 2, 3}; - dict["ChildStringList"] = new List {"a", "b", "c"}; - dict["ChildObjectList"] = new List {1, "cat", new Dictionary {{"s", "s"}, {"n", 1}}}; - var serialized = JsonSerializer.SerializeToString(dict); var deserialized = JsonSerializer.DeserializeFromString>(serialized); diff --git a/tests/ServiceStack.Text.Tests/JsonTests/JsonObjectTests.cs b/tests/ServiceStack.Text.Tests/JsonTests/JsonObjectTests.cs index 6360a6847..642887ee0 100644 --- a/tests/ServiceStack.Text.Tests/JsonTests/JsonObjectTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonTests/JsonObjectTests.cs @@ -505,7 +505,7 @@ public void Can_deserialize_custom_JsonObject_with_incorrect_payload() } catch (FormatException) {} } - + class HasObjectDictionary { public Dictionary Properties { get; set; } @@ -544,6 +544,5 @@ public void Can_deserialize_unknown_ObjectList() JS.UnConfigure(); } - } } From 1a71363a93f36f5a50284c7daa1014c870a5070c Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 9 Mar 2019 20:33:16 -0500 Subject: [PATCH 083/372] Add guards against empy spans --- src/ServiceStack.Text/CharMemoryExtensions.cs | 5 ++++- src/ServiceStack.Text/StringSpanExtensions.cs | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/CharMemoryExtensions.cs b/src/ServiceStack.Text/CharMemoryExtensions.cs index 18f341b1b..8bda5e0f5 100644 --- a/src/ServiceStack.Text/CharMemoryExtensions.cs +++ b/src/ServiceStack.Text/CharMemoryExtensions.cs @@ -388,6 +388,7 @@ public static ReadOnlyMemory Trim(this ReadOnlyMemory span) public static ReadOnlyMemory TrimStart(this ReadOnlyMemory value) { + if (value.IsEmpty) return TypeConstants.NullStringMemory; var span = value.Span; int start = 0; for (; start < span.Length; start++) @@ -400,6 +401,7 @@ public static ReadOnlyMemory TrimStart(this ReadOnlyMemory value) public static ReadOnlyMemory TrimEnd(this ReadOnlyMemory value) { + if (value.IsEmpty) return TypeConstants.NullStringMemory; var span = value.Span; int end = span.Length - 1; for (; end >= 0; end--) @@ -425,9 +427,10 @@ public static ReadOnlyMemory SafeSlice(this ReadOnlyMemory value, in public static string SubstringWithEllipsis(this ReadOnlyMemory value, int startIndex, int length) { + if (value.IsEmpty) return string.Empty; var str = value.Slice(startIndex, length); return str.Length == length - ? str.ToString() + "..." + ? str + "..." : str.ToString(); } diff --git a/src/ServiceStack.Text/StringSpanExtensions.cs b/src/ServiceStack.Text/StringSpanExtensions.cs index e78eb7685..941ae3ba3 100644 --- a/src/ServiceStack.Text/StringSpanExtensions.cs +++ b/src/ServiceStack.Text/StringSpanExtensions.cs @@ -459,6 +459,7 @@ public static ReadOnlySpan ParentDirectory(this ReadOnlySpan filePat public static ReadOnlySpan TrimEnd(this ReadOnlySpan value, params char[] trimChars) { + if (value.IsEmpty) return TypeConstants.NullStringSpan; if (trimChars == null || trimChars.Length == 0) return value.TrimHelper(1); return value.TrimHelper(trimChars, 1); @@ -466,6 +467,7 @@ public static ReadOnlySpan TrimEnd(this ReadOnlySpan value, params c private static ReadOnlySpan TrimHelper(this ReadOnlySpan value, int trimType) { + if (value.IsEmpty) return TypeConstants.NullStringSpan; int end = value.Length - 1; int start = 0; if (trimType != 1) @@ -485,6 +487,7 @@ private static ReadOnlySpan TrimHelper(this ReadOnlySpan value, int private static ReadOnlySpan TrimHelper(this ReadOnlySpan value, char[] trimChars, int trimType) { + if (value.IsEmpty) return TypeConstants.NullStringSpan; int end = value.Length - 1; int start = 0; if (trimType != 1) @@ -516,6 +519,7 @@ private static ReadOnlySpan TrimHelper(this ReadOnlySpan value, char private static ReadOnlySpan CreateTrimmedString(this ReadOnlySpan value, int start, int end) { + if (value.IsEmpty) return TypeConstants.NullStringSpan; int length = end - start + 1; if (length == value.Length) return value; @@ -539,6 +543,7 @@ public static ReadOnlySpan SafeSlice(this ReadOnlySpan value, int st public static string SubstringWithEllipsis(this ReadOnlySpan value, int startIndex, int length) { + if (value.IsEmpty) return string.Empty; var str = value.Slice(startIndex, length); return str.Length == length ? str.ToString() + "..." @@ -656,6 +661,5 @@ public static int CountOccurrencesOf(this ReadOnlySpan value, char needle) } return count; } - } } From 7b71e762b1dc73d389010a40d6990433f9730434 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 9 Mar 2019 20:48:05 -0500 Subject: [PATCH 084/372] Update StringSpanExtensions.cs --- src/ServiceStack.Text/StringSpanExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/StringSpanExtensions.cs b/src/ServiceStack.Text/StringSpanExtensions.cs index 941ae3ba3..ec0f8bea9 100644 --- a/src/ServiceStack.Text/StringSpanExtensions.cs +++ b/src/ServiceStack.Text/StringSpanExtensions.cs @@ -544,7 +544,7 @@ public static ReadOnlySpan SafeSlice(this ReadOnlySpan value, int st public static string SubstringWithEllipsis(this ReadOnlySpan value, int startIndex, int length) { if (value.IsEmpty) return string.Empty; - var str = value.Slice(startIndex, length); + var str = value.SafeSlice(startIndex, length); return str.Length == length ? str.ToString() + "..." : str.ToString(); From 824510aa40adce005334863f528fec0a6de67c43 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 11 Mar 2019 16:46:59 -0400 Subject: [PATCH 085/372] resolve NRE in ToPascalCase --- src/ServiceStack.Text/StringExtensions.cs | 8 ++++++-- tests/ServiceStack.Text.Tests/StringExtensionsTests.cs | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 047a261b7..428473a0c 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -705,7 +705,8 @@ public static string StripMarkdownMarkup(this string markdown) private const int LowerCaseOffset = 'a' - 'A'; public static string ToCamelCase(this string value) { - if (String.IsNullOrEmpty(value)) return value; + if (string.IsNullOrEmpty(value)) + return value; var len = value.Length; var newValue = new char[len]; @@ -731,7 +732,8 @@ public static string ToCamelCase(this string value) public static string ToPascalCase(this string value) { - if (String.IsNullOrEmpty(value)) return value; + if (string.IsNullOrEmpty(value)) + return value; if (value.IndexOf('_') >= 0) { @@ -739,6 +741,8 @@ public static string ToPascalCase(this string value) var sb = StringBuilderThreadStatic.Allocate(); foreach (var part in parts) { + if (string.IsNullOrEmpty(part)) + continue; var str = part.ToCamelCase(); sb.Append(char.ToUpper(str[0]) + str.SafeSubstring(1, str.Length)); } diff --git a/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs b/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs index e6f5f7df1..7df322481 100644 --- a/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs +++ b/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs @@ -237,6 +237,7 @@ public void Can_ToCamelCase_String() Assert.That("lllUlllUlll".ToCamelCase(), Is.EqualTo("lllUlllUlll")); Assert.That("".ToCamelCase(), Is.EqualTo("")); Assert.That(((string)null).ToCamelCase(), Is.EqualTo((string)null)); + Assert.That("__type".ToCamelCase(), Is.EqualTo("__type")); } [Test] @@ -343,6 +344,7 @@ public void Can_convert_ToPascalCase() Assert.That("aa_bb".ToPascalCase(), Is.EqualTo("AaBb")); Assert.That("Aa_Bb".ToPascalCase(), Is.EqualTo("AaBb")); Assert.That("AA_BB".ToPascalCase(), Is.EqualTo("AaBb")); + Assert.That("__type".ToPascalCase(), Is.EqualTo("Type")); } [Test] From 138e097753efb59f9ec43f35d9b4999328318dc8 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 12 Mar 2019 00:13:43 -0400 Subject: [PATCH 086/372] improve querystring handling --- src/ServiceStack.Text/HttpUtils.cs | 34 +++++++++++++++---- src/ServiceStack.Text/StringExtensions.cs | 3 +- .../ServiceStack.Text.Tests/HttpUtilsTests.cs | 14 ++++++++ 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index ed6bbe55d..f164a98f6 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -21,17 +21,22 @@ public static class HttpUtils public static string AddQueryParam(this string url, string key, object val, bool encode = true) { - return url.AddQueryParam(key, val.ToString(), encode); + return url.AddQueryParam(key, val?.ToString(), encode); } public static string AddQueryParam(this string url, object key, string val, bool encode = true) { - return AddQueryParam(url, (key ?? "").ToString(), val, encode); + return AddQueryParam(url, key?.ToString(), val, encode); } public static string AddQueryParam(this string url, string key, string val, bool encode = true) { - if (string.IsNullOrEmpty(url)) return null; + if (url == null) + url = ""; + + if (key == null || val == null) + return url; + var prefix = string.Empty; if (!url.EndsWith("?") && !url.EndsWith("&")) { @@ -42,7 +47,12 @@ public static string AddQueryParam(this string url, string key, string val, bool public static string SetQueryParam(this string url, string key, string val) { - if (string.IsNullOrEmpty(url)) return null; + if (url == null) + url = ""; + + if (key == null || val == null) + return url; + var qsPos = url.IndexOf('?'); if (qsPos != -1) { @@ -69,19 +79,29 @@ public static string SetQueryParam(this string url, string key, string val) public static string AddHashParam(this string url, string key, object val) { - return url.AddHashParam(key, val.ToString()); + return url.AddHashParam(key, val?.ToString()); } public static string AddHashParam(this string url, string key, string val) { - if (string.IsNullOrEmpty(url)) return null; + if (url == null) + url = ""; + + if (key == null || val == null) + return url; + var prefix = url.IndexOf('#') == -1 ? "#" : "/"; return url + prefix + key + "=" + val.UrlEncode(); } public static string SetHashParam(this string url, string key, string val) { - if (string.IsNullOrEmpty(url)) return null; + if (url == null) + url = ""; + + if (key == null || val == null) + return url; + var hPos = url.IndexOf('#'); if (hPos != -1) { diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 428473a0c..86f654abc 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -107,7 +107,8 @@ public static string DecodeJsv(this string value) public static string UrlEncode(this string text, bool upperCase=false) { - if (String.IsNullOrEmpty(text)) return text; + if (string.IsNullOrEmpty(text)) + return text; var sb = StringBuilderThreadStatic.Allocate(); var fmt = upperCase ? "X2" : "x2"; diff --git a/tests/ServiceStack.Text.Tests/HttpUtilsTests.cs b/tests/ServiceStack.Text.Tests/HttpUtilsTests.cs index 2c651b3d4..8e7f640e1 100644 --- a/tests/ServiceStack.Text.Tests/HttpUtilsTests.cs +++ b/tests/ServiceStack.Text.Tests/HttpUtilsTests.cs @@ -16,6 +16,13 @@ public void Can_AddQueryParam() Assert.That("http://example.com?".AddQueryParam("f", "1"), Is.EqualTo("http://example.com?f=1")); Assert.That("http://example.com?f=1&".AddQueryParam("f", "2"), Is.EqualTo("http://example.com?f=1&f=2")); Assert.That("http://example.com?ab=0".AddQueryParam("a", "1"), Is.EqualTo("http://example.com?ab=0&a=1")); + + Assert.That("".AddQueryParam("a", ""), Is.EqualTo("?a=")); + Assert.That("".AddQueryParam("a", null), Is.EqualTo("")); + Assert.That("/".AddQueryParam("a", null), Is.EqualTo("/")); + Assert.That("/".AddQueryParam("a", ""), Is.EqualTo("/?a=")); + Assert.That("/".AddQueryParam("a", "b"), Is.EqualTo("/?a=b")); + Assert.That((null as string).AddQueryParam("a", "b"), Is.EqualTo("?a=b")); } [Test] @@ -38,6 +45,13 @@ public void Can_AddHashParam() Assert.That("http://example.com#s=0/f=1/s=1".AddHashParam("f", "2"), Is.EqualTo("http://example.com#s=0/f=1/s=1/f=2")); Assert.That("http://example.com#s=rf/f=1".AddHashParam("f", "2"), Is.EqualTo("http://example.com#s=rf/f=1/f=2")); Assert.That("http://example.com#ab=0".AddHashParam("a", "1"), Is.EqualTo("http://example.com#ab=0/a=1")); + + Assert.That("".AddHashParam("a", ""), Is.EqualTo("#a=")); + Assert.That("".AddHashParam("a", null), Is.EqualTo("")); + Assert.That("/".AddHashParam("a", null), Is.EqualTo("/")); + Assert.That("/".AddHashParam("a", ""), Is.EqualTo("/#a=")); + Assert.That("/".AddHashParam("a", "b"), Is.EqualTo("/#a=b")); + Assert.That((null as string).AddHashParam("a", "b"), Is.EqualTo("#a=b")); } [Test] From fc9ff45b7c91083d2102887ad8673784a4e9f97d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 17 Mar 2019 00:05:42 -0400 Subject: [PATCH 087/372] Add KVPs.Create --- src/ServiceStack.Text/ObjectDictionary.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ServiceStack.Text/ObjectDictionary.cs b/src/ServiceStack.Text/ObjectDictionary.cs index d2e8893aa..20b2444ab 100644 --- a/src/ServiceStack.Text/ObjectDictionary.cs +++ b/src/ServiceStack.Text/ObjectDictionary.cs @@ -29,6 +29,8 @@ public StringDictionary(int capacity, IEqualityComparer comparer) : base public StringDictionary(IDictionary dictionary) : base(dictionary) { } public StringDictionary(IDictionary dictionary, IEqualityComparer comparer) : base(dictionary, comparer) { } protected StringDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { } + + } /// @@ -49,5 +51,8 @@ public class KeyValueStrings : List> public KeyValueStrings() { } public KeyValueStrings(int capacity) : base(capacity) { } public KeyValueStrings(IEnumerable> collection) : base(collection) { } + + public static KeyValuePair Create(string key, object value) => + new KeyValuePair(key, value); } } \ No newline at end of file From 8b9a1100733ce99d7254ea20a9104036c507f638 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 20 Mar 2019 17:41:31 -0400 Subject: [PATCH 088/372] Update ObjectDictionary.cs --- src/ServiceStack.Text/ObjectDictionary.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ServiceStack.Text/ObjectDictionary.cs b/src/ServiceStack.Text/ObjectDictionary.cs index 20b2444ab..94b08b4fa 100644 --- a/src/ServiceStack.Text/ObjectDictionary.cs +++ b/src/ServiceStack.Text/ObjectDictionary.cs @@ -29,8 +29,6 @@ public StringDictionary(int capacity, IEqualityComparer comparer) : base public StringDictionary(IDictionary dictionary) : base(dictionary) { } public StringDictionary(IDictionary dictionary, IEqualityComparer comparer) : base(dictionary, comparer) { } protected StringDictionary(SerializationInfo info, StreamingContext context) : base(info, context) { } - - } /// @@ -41,6 +39,9 @@ public class KeyValuePairs : List> public KeyValuePairs() { } public KeyValuePairs(int capacity) : base(capacity) { } public KeyValuePairs(IEnumerable> collection) : base(collection) { } + + public static KeyValuePair Create(string key, object value) => + new KeyValuePair(key, value); } /// @@ -52,7 +53,7 @@ public KeyValueStrings() { } public KeyValueStrings(int capacity) : base(capacity) { } public KeyValueStrings(IEnumerable> collection) : base(collection) { } - public static KeyValuePair Create(string key, object value) => - new KeyValuePair(key, value); + public static KeyValuePair Create(string key, string value) => + new KeyValuePair(key, value); } } \ No newline at end of file From 2535566afbb7477d719dc383cd857c595d445d13 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 27 Mar 2019 03:57:34 -0400 Subject: [PATCH 089/372] add build-deps.csproj --- build/build-deps.proj | 85 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 build/build-deps.proj diff --git a/build/build-deps.proj b/build/build-deps.proj new file mode 100644 index 000000000..0ee59f3d1 --- /dev/null +++ b/build/build-deps.proj @@ -0,0 +1,85 @@ + + + + + + 5 + 0 + $(BUILD_NUMBER) + + + + $(MSBuildProjectDirectory)/.. + $(BuildSolutionDir)/src + Release + $(BuildSolutionDir)/NuGet/ + $(MajorVersion).$(MinorVersion).$(PatchVersion) + + + + + BeforeBuildSolutions; + BuildSolutions + + + + + + + + + + + + + + + + + + + + + + + ServiceStackVersion = \d+\.\d+m; + ServiceStackVersion = $(MajorVersion).$(MinorVersion)$(PatchVersion)m; + + + + new DateTime.* + new DateTime($([System.DateTime]::Now.ToString(`yyyy,MM,dd`))); + + + + + <Version>[^<]* + <Version>$(PackageVersion) + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From c8c5c50e6736f2ce6dd442240c9e59c978a77cb2 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 27 Mar 2019 15:54:41 -0400 Subject: [PATCH 090/372] Update build-deps.proj --- build/build-deps.proj | 1 + 1 file changed, 1 insertion(+) diff --git a/build/build-deps.proj b/build/build-deps.proj index 0ee59f3d1..c36735aa1 100644 --- a/build/build-deps.proj +++ b/build/build-deps.proj @@ -31,6 +31,7 @@ + From 3434a7d66cfc1fa4c43286c745f4691ef3df337d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 1 Apr 2019 08:55:20 -0400 Subject: [PATCH 091/372] Update README.md --- README.md | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index b7c81f19c..2c6405d35 100644 --- a/README.md +++ b/README.md @@ -366,8 +366,7 @@ The JSON/JSV and CSV serialization can be customized globally by configuring the JsConfig.Init(new Config { DateHandler = DateHandler.ISO8601, AlwaysUseUtc = true, - EmitLowercaseUnderscoreNames = false, - EmitCamelCaseNames = false, + TextCase = TextCase.CamelCase, ExcludeDefaultValues = true, }); ``` @@ -437,30 +436,17 @@ using property initializers: ```csharp using (JsConfig.With(new Config { - EmitLowercaseUnderscoreNames = true, - EmitCamelCaseNames = false, - PropertyConvention = PropertyConvention.Lenient)) + TextCase == TextCase.CamelCase, + PropertyConvention = PropertyConvention.Lenient +})) { return text.FromJson(); } ``` -Or if preferred you use `JsConfig.BeginScope()` to populate scoped configuration properties individually: - -```csharp -using (var scope = JsConfig.BeginScope()) -{ - scope.EmitLowercaseUnderscoreNames = true; - scope.EmitCamelCaseNames = false; - scope.PropertyConvention = PropertyConvention.Lenient; - - return text.FromJson(); -} -``` - #### Create Custom Scopes using String config -You can also create a custion config scope from a string manually using `JsConfig.CreateScope()` where you can use the full config name or their aliases, e.g: +You can also create a custom config scope from a string manually using `JsConfig.CreateScope()` where you can use the full config name or their aliases, e.g: ```csharp using (JsConfig.CreateScope("EmitLowercaseUnderscoreNames,EDV,dh:ut")) From b5d04fd68dac1175413296bf37208fcd86ed49b0 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 1 Apr 2019 09:19:50 -0400 Subject: [PATCH 092/372] Update README.md --- README.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2c6405d35..2b02920c5 100644 --- a/README.md +++ b/README.md @@ -377,8 +377,6 @@ The following is a list of `bool` options you can use to configure many popular NameAlias - EmitCamelCaseNameseccn - EmitLowercaseUnderscoreNameselun IncludeNullValuesinv IncludeNullValuesInDictionariesinvid IncludeDefaultEnumside @@ -400,6 +398,8 @@ The following is a list of `bool` options you can use to configure many popular AppendUtcOffsetauo EscapeHtmlCharsehc EscapeUnicodeeu + EmitCamelCaseNameseccn + EmitLowercaseUnderscoreNameselun ### DateHandler (dh) @@ -422,6 +422,15 @@ The following is a list of `bool` options you can use to configure many popular StandardFormatsf +### TextCase (tc) + + + + + + +
Defaultd
PascalCasepc
CamelCasecc
SnakeCasesc
+ ### PropertyConvention (pc) @@ -449,7 +458,7 @@ using (JsConfig.With(new Config { You can also create a custom config scope from a string manually using `JsConfig.CreateScope()` where you can use the full config name or their aliases, e.g: ```csharp -using (JsConfig.CreateScope("EmitLowercaseUnderscoreNames,EDV,dh:ut")) +using (JsConfig.CreateScope("IncludeNullValues,EDV,dh:ut")) { var json = dto.ToJson(); } From 85482b01caaccd1bf6eb1862232385971380b86b Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 1 Apr 2019 14:29:41 -0400 Subject: [PATCH 093/372] Bump to v5.5.1 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index f64b397c8..8dc9ddc19 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.4.1 + 5.5.1 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 33f3fcfd4..100bce767 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.4.1 + 5.5.1 latest false From cc03cd390101f4b7581e6d2968c79b3af024374d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 10 Apr 2019 14:05:21 -0400 Subject: [PATCH 094/372] Resolve issue with deserializing List in JSV --- .../Common/DeserializeDictionary.cs | 2 +- .../Common/DeserializeListWithElements.cs | 2 +- .../Common/DeserializeType.cs | 2 +- .../JsonTests/JsonObjectTests.cs | 38 +++++++++++++++++++ 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/ServiceStack.Text/Common/DeserializeDictionary.cs b/src/ServiceStack.Text/Common/DeserializeDictionary.cs index 75be7d5a0..5a18031b3 100644 --- a/src/ServiceStack.Text/Common/DeserializeDictionary.cs +++ b/src/ServiceStack.Text/Common/DeserializeDictionary.cs @@ -232,7 +232,7 @@ public static IDictionary ParseDictionary( : (IDictionary)createMapType.CreateInstance(); var objDeserializer = Json.JsonTypeSerializer.Instance.ObjectDeserializer; - if (to is Dictionary && objDeserializer != null) + if (to is Dictionary && objDeserializer != null && typeof(TSerializer) == typeof(Json.JsonTypeSerializer)) return (IDictionary) objDeserializer(value); var config = JsConfig.GetConfig(); diff --git a/src/ServiceStack.Text/Common/DeserializeListWithElements.cs b/src/ServiceStack.Text/Common/DeserializeListWithElements.cs index 6590871b8..bb1f0a575 100644 --- a/src/ServiceStack.Text/Common/DeserializeListWithElements.cs +++ b/src/ServiceStack.Text/Common/DeserializeListWithElements.cs @@ -167,7 +167,7 @@ public static ICollection ParseGenericList(ReadOnlySpan value, Type cre : (ICollection)createListType.CreateInstance(); var objSerializer = Json.JsonTypeSerializer.Instance.ObjectDeserializer; - if (to is List && objSerializer != null) + if (to is List && objSerializer != null && typeof(TSerializer) == typeof(Json.JsonTypeSerializer)) return (ICollection)objSerializer(value); if ((value = DeserializeListWithElements.StripList(value)).IsEmpty) diff --git a/src/ServiceStack.Text/Common/DeserializeType.cs b/src/ServiceStack.Text/Common/DeserializeType.cs index 828b32a40..d18c33b28 100644 --- a/src/ServiceStack.Text/Common/DeserializeType.cs +++ b/src/ServiceStack.Text/Common/DeserializeType.cs @@ -93,7 +93,7 @@ public static object ObjectStringToType(ReadOnlySpan strType) if (primitiveType != null) return primitiveType; - if (Serializer.ObjectDeserializer != null) + if (Serializer.ObjectDeserializer != null && typeof(TSerializer) == typeof(Json.JsonTypeSerializer)) return Serializer.ObjectDeserializer(strType); return Serializer.UnescapeString(strType).Value(); diff --git a/tests/ServiceStack.Text.Tests/JsonTests/JsonObjectTests.cs b/tests/ServiceStack.Text.Tests/JsonTests/JsonObjectTests.cs index 642887ee0..8d0bb3343 100644 --- a/tests/ServiceStack.Text.Tests/JsonTests/JsonObjectTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonTests/JsonObjectTests.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.Runtime.Serialization; using System.Threading; using NUnit.Framework; @@ -544,5 +545,42 @@ public void Can_deserialize_unknown_ObjectList() JS.UnConfigure(); } + + [DataContract] + public class BrowseProtocolTemplateResponseLight + { + [DataMember(Name = "ProtocolTemplateId")] + public Guid Oid { get; set; } + + [DataMember] + public string Name { get; set; } + + [DataMember] + public string Title { get; set; } + + [DataMember] + public string Description { get; set; } + + [DataMember] + public List ProtocolBusinessObjects { get; set; } + + [DataMember] + public ResponseStatus ResponseStatus { get; set; } + } + + [Test] + public void Can_deserialize_JSV_List_object_when_ObjectDeserializer_is_configured() + { + JS.Configure(); + + var json = @"{ ProtocolTemplateId:d7f0aa3afd834e90aaa9a97b7efd0c03,Name: RendezvĂ©nyszervezĂ©s,Title: Test,Description: RendezvĂ©nyszervezĂ©s,ProtocolBusinessObjects:[[{ Oid: 3c229e70345f11e9bf726dd67bf32ebd,ObjectType: AwaitObject,Flags: 18,Name: AwaitObject1,Title: AwaitObject1,SecondaryTitle: AwaitObject1,Description: "",OwnerType: 1,Owner: { UserId: 2,DisplayName: System},DeadlineType: 2,DeadlineOffsetDays: 1,Priority: 2,PriorityToData: False,DeadlineToData: False,CompletedDateToData: False,OwnerToData: False,Visible: False,ProtocolTemplateId: d7f0aa3afd834e90aaa9a97b7efd0c03,ProtocolTemplateGroupId: e44dfc5da20942fe8532d6446ef0b76c,CreatedBy: { UserId: 4,DisplayName: Wiszt MátĂ©},CreatedDateTime: 2019 - 03 - 21T15: 05:41.0929542 + 01:00}]]}"; + + var ret = json.FromJsv(); + + Assert.That(ret.ProtocolBusinessObjects.Count, Is.GreaterThan(0)); + + JS.UnConfigure(); + } + } } From 8eb8e1af886f3a7586473bef1388f2227c0179fc Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 20 Apr 2019 01:28:15 -0400 Subject: [PATCH 095/372] Add MemoryProvider ToMemoryStream(ROS) API --- src/ServiceStack.Text/DefaultMemory.cs | 9 ++++++--- src/ServiceStack.Text/MemoryProvider.cs | 1 + src/ServiceStack.Text/NetCoreMemory.cs | 6 ++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/ServiceStack.Text/DefaultMemory.cs b/src/ServiceStack.Text/DefaultMemory.cs index 9549bce69..2f1f6c4f6 100644 --- a/src/ServiceStack.Text/DefaultMemory.cs +++ b/src/ServiceStack.Text/DefaultMemory.cs @@ -559,6 +559,9 @@ public override int FromUtf8(ReadOnlySpan source, Span destination) public override byte[] ToUtf8Bytes(ReadOnlySpan source) => Encoding.UTF8.GetBytes(source.ToArray()); public override string FromUtf8Bytes(ReadOnlySpan source) => Encoding.UTF8.GetString(source.ToArray()); + + public override MemoryStream ToMemoryStream(ReadOnlySpan source) => + MemoryStreamFactory.GetStream(source.ToArray()); private static Guid ParseGeneralStyleGuid(ReadOnlySpan value, out int len) { @@ -567,7 +570,7 @@ private static Guid ParseGeneralStyleGuid(ReadOnlySpan value, out int len) int dash = 0; len = 32; - bool hasParentesis = false; + bool hasParenthesis = false; if (value.Length < len) throw new FormatException(BadFormat); @@ -577,7 +580,7 @@ private static Guid ParseGeneralStyleGuid(ReadOnlySpan value, out int len) { n++; len += 2; - hasParentesis = true; + hasParenthesis = true; if (buf[8 + n] != '-') throw new FormatException(BadFormat); @@ -597,7 +600,7 @@ private static Guid ParseGeneralStyleGuid(ReadOnlySpan value, out int len) if (value.Length < len) throw new FormatException(BadFormat); - if (hasParentesis) + if (hasParenthesis) { var ce = buf[len - 1]; diff --git a/src/ServiceStack.Text/MemoryProvider.cs b/src/ServiceStack.Text/MemoryProvider.cs index 3f5f94005..e46522670 100644 --- a/src/ServiceStack.Text/MemoryProvider.cs +++ b/src/ServiceStack.Text/MemoryProvider.cs @@ -69,5 +69,6 @@ public abstract Task DeserializeAsync(Stream stream, Type type, public abstract byte[] ToUtf8Bytes(ReadOnlySpan source); public abstract string FromUtf8Bytes(ReadOnlySpan source); + public abstract MemoryStream ToMemoryStream(ReadOnlySpan source); } } \ No newline at end of file diff --git a/src/ServiceStack.Text/NetCoreMemory.cs b/src/ServiceStack.Text/NetCoreMemory.cs index fe8a758ea..ae76ef1f5 100644 --- a/src/ServiceStack.Text/NetCoreMemory.cs +++ b/src/ServiceStack.Text/NetCoreMemory.cs @@ -189,6 +189,12 @@ public override ReadOnlyMemory FromUtf8(ReadOnlySpan source) public override byte[] ToUtf8Bytes(ReadOnlySpan source) => ToUtf8(source).ToArray(); public override string FromUtf8Bytes(ReadOnlySpan source) => FromUtf8(source).ToString(); + public override MemoryStream ToMemoryStream(ReadOnlySpan source) + { + var ms = MemoryStreamFactory.GetStream(source.Length); + ms.Write(source); + return ms; + } } } From ea31fcf47a684eb525509e7adce2bf4a67ec7ec2 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 22 Apr 2019 01:39:04 -0400 Subject: [PATCH 096/372] fix build --- src/ServiceStack.Memory/NetCoreMemory.cs | 7 +++++++ src/ServiceStack.Text/NetCoreMemory.cs | 1 + 2 files changed, 8 insertions(+) diff --git a/src/ServiceStack.Memory/NetCoreMemory.cs b/src/ServiceStack.Memory/NetCoreMemory.cs index fe8a758ea..5d0987791 100644 --- a/src/ServiceStack.Memory/NetCoreMemory.cs +++ b/src/ServiceStack.Memory/NetCoreMemory.cs @@ -189,6 +189,13 @@ public override ReadOnlyMemory FromUtf8(ReadOnlySpan source) public override byte[] ToUtf8Bytes(ReadOnlySpan source) => ToUtf8(source).ToArray(); public override string FromUtf8Bytes(ReadOnlySpan source) => FromUtf8(source).ToString(); + + public override MemoryStream ToMemoryStream(ReadOnlySpan source) + { + var ms = MemoryStreamFactory.GetStream(source.Length); + ms.Write(source); + return ms; + } } } diff --git a/src/ServiceStack.Text/NetCoreMemory.cs b/src/ServiceStack.Text/NetCoreMemory.cs index ae76ef1f5..5d0987791 100644 --- a/src/ServiceStack.Text/NetCoreMemory.cs +++ b/src/ServiceStack.Text/NetCoreMemory.cs @@ -189,6 +189,7 @@ public override ReadOnlyMemory FromUtf8(ReadOnlySpan source) public override byte[] ToUtf8Bytes(ReadOnlySpan source) => ToUtf8(source).ToArray(); public override string FromUtf8Bytes(ReadOnlySpan source) => FromUtf8(source).ToString(); + public override MemoryStream ToMemoryStream(ReadOnlySpan source) { var ms = MemoryStreamFactory.GetStream(source.Length); From b7f2b366e9475fe04e84eeb5952b3e5b28e6626e Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 24 Apr 2019 19:08:01 -0400 Subject: [PATCH 097/372] Resolve issue with empty string when using custom DeSerializeFn --- src/ServiceStack.Text/Json/JsonTypeSerializer.cs | 4 +++- .../JsonTests/BasicJsonTests.cs | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Json/JsonTypeSerializer.cs b/src/ServiceStack.Text/Json/JsonTypeSerializer.cs index 770884aa4..7101a82fc 100644 --- a/src/ServiceStack.Text/Json/JsonTypeSerializer.cs +++ b/src/ServiceStack.Text/Json/JsonTypeSerializer.cs @@ -421,7 +421,9 @@ internal static ReadOnlySpan ParseJsonString(ReadOnlySpan json, ref private static string UnescapeJsonString(string json, ref int index) { - return UnescapeJsonString(json.AsSpan(), ref index).ToString(); + return json != null + ? UnescapeJsonString(json.AsSpan(), ref index).ToString() + : null; } private static ReadOnlySpan UnescapeJsonString(ReadOnlySpan json, ref int index) => diff --git a/tests/ServiceStack.Text.Tests/JsonTests/BasicJsonTests.cs b/tests/ServiceStack.Text.Tests/JsonTests/BasicJsonTests.cs index 66b7d1285..25a787f36 100644 --- a/tests/ServiceStack.Text.Tests/JsonTests/BasicJsonTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonTests/BasicJsonTests.cs @@ -655,5 +655,21 @@ public void Can_deserialize_ThrowValidation_with_null_values() Assert.That(dto.Email, Is.EqualTo("invalidemail")); } + class TestTrim + { + public string Description { get; set; } + } + + [Test] + public void Can_deserialize_custom_string_deserializer() + { + JsConfig.DeSerializeFn = str => str.Trim(); + var json = "{\"description\":null}"; + var dto = json.FromJson(); + Assert.That(dto.Description, Is.Null); + JsConfig.DeSerializeFn = null; + } + + } } From d5987e222bb2ea1cbf0102494e32a97a16f31ee5 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 10 May 2019 05:18:05 -0400 Subject: [PATCH 098/372] Update AutoMappingTests.cs --- .../AutoMappingTests.cs | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 00d4ccf7b..5daed40e8 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -1476,5 +1476,57 @@ Company Create() Assert.That(original.Address.City, Is.EqualTo(defaults.Address.City)); Assert.That(original.Address.PostCode, Is.EqualTo("4321")); } + + public class NavItem : IMeta + { + public string Label { get; set; } + public string Path { get; set; } + + /// + /// Whether Active class should only be added when paths are exact match + /// otherwise checks if ActivePath starts with Path + /// + public bool Exact { get; set; } + + public string Id { get; set; } // Emit id="{Id}" + public string Class { get; set; } // Override class="{Class}" + + public List Children { get; set; } = new List(); + + public Dictionary Meta { get; set; } = new Dictionary(); + } + + [Test] + public void Does_convert_nested_collections() + { + var to = new[] { + new Dictionary { + ["id"] = "A1", + ["children"] = new List + { + new Dictionary + { + ["id"] = "B1", + }, + new Dictionary + { + ["id"] = "B2", + ["children"] = new List { + new Dictionary + { + ["id"] = "C1", + }, + } + }, + } + } + }; + + var navItems = to.ConvertTo>(); + Assert.That(navItems[0].Id, Is.EqualTo("A1")); + Assert.That(navItems[0].Children[0].Id, Is.EqualTo("B1")); + Assert.That(navItems[0].Children[1].Id, Is.EqualTo("B2")); + Assert.That(navItems[0].Children[1].Children[0].Id, Is.EqualTo("C1")); + } } } From ffd83a65b13775b0ad2308f00e1d2ec2cf0f8c94 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 15 May 2019 12:42:18 -0400 Subject: [PATCH 099/372] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2b02920c5..9d9d7991b 100644 --- a/README.md +++ b/README.md @@ -154,7 +154,7 @@ project. It provides a dynamic, but more succinct API than the above options. ### JS Utils ServiceStack.Text APIs for deserializing arbitrary JSON requires specifying the the Type to deserialize into. An alternative flexible approach to read any arbitrary JavaScript or JSON data structures is to use the high-performance and memory efficient JSON utils in -[ServiceStack Templates](http://templates.servicestack.net) implementation of JavaScript. +[#Script](https://sharpscript.net/) implementation of JavaScript. ```csharp JSON.parse("1") //= int 1 @@ -165,18 +165,18 @@ JSON.parse("{a:1}") //= new Dictionary { {"a", 1 } } #### Eval -Since JS Utils is an essential part of [ServiceStack Template language](http://templates.servicestack.net) it allows for advanced scenarios like implementing a text DSL or scripting language for executing custom logic or business rules you want to be able to change without having to compile or redeploy your App. It uses [Templates Sandbox](http://templates.servicestack.net/docs/sandbox) which lets you evaluate the script within a custom scope that defines what functions +Since JS Utils is an essential part of [#Script](https://sharpscript.net/) it allows for advanced scenarios like implementing a text DSL or scripting language for executing custom logic or business rules you want to be able to change without having to compile or redeploy your App. It uses [#Script Context](https://sharpscript.net/docs/methods) which lets you evaluate the script within a custom scope that defines what functions and arguments it has access to, e.g: ```csharp -public class CustomFilter : TemplateFilter +public class CustomMethods : ScriptMethods { public string reverse(string text) => new string(text.Reverse().ToArray()); } var scope = JS.CreateScope( args: new Dictionary { { "arg", "value"} }, - functions: new CustomFilter()); + functions: new CustomMethods()); JS.eval("arg", scope) //= "value" JS.eval("reverse(arg)", scope) //= "eulav" From 9c2a8adca539e8d85082612819e1cebb8f99be51 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 15 May 2019 12:51:41 -0400 Subject: [PATCH 100/372] Update README.md --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9d9d7991b..010b4de34 100644 --- a/README.md +++ b/README.md @@ -157,10 +157,11 @@ ServiceStack.Text APIs for deserializing arbitrary JSON requires specifying the [#Script](https://sharpscript.net/) implementation of JavaScript. ```csharp -JSON.parse("1") //= int 1 -JSON.parse("1.1") //= double 1.1 -JSON.parse("'a'") //= string "a" -JSON.parse("{a:1}") //= new Dictionary { {"a", 1 } } +JSON.parse("1") //= int 1 +JSON.parse("1.1") //= double 1.1 +JSON.parse("'a'") //= string "a" +JSON.parse("{a:1}") //= new Dictionary { {"a", 1 } } +JSON.parse("[{a:1}]") //= new List { new Dictionary { { "a", 1 } } } ``` #### Eval From f6ff8730364cdee510bd65a18988d76130b03149 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 17 May 2019 18:17:05 -0400 Subject: [PATCH 101/372] Add MimeTypes.Css --- src/ServiceStack.Text/HttpUtils.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index f164a98f6..121586dec 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1217,6 +1217,7 @@ public static class MimeTypes public const string Html = "text/html"; public const string HtmlUtf8 = Html + Utf8Suffix; + public const string Css = "text/css"; public const string Xml = "application/xml"; public const string XmlText = "text/xml"; public const string Json = "application/json"; From 22969480339cdfc365d9c135bedc6e797d4cc1cd Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 4 Jun 2019 19:37:03 -0400 Subject: [PATCH 102/372] Strip BOM when converting From UTF8 or deserializing C# string --- src/ServiceStack.Memory/NetCoreMemory.cs | 5 +++-- src/ServiceStack.Text/DefaultMemory.cs | 6 +++--- .../Json/JsonReader.Generic.cs | 2 ++ .../Jsv/JsvReader.Generic.cs | 2 ++ src/ServiceStack.Text/NetCoreMemory.cs | 5 +++-- src/ServiceStack.Text/StringExtensions.cs | 4 +++- src/ServiceStack.Text/StringSpanExtensions.cs | 15 ++++++++++++++ tests/ServiceStack.Text.Tests/SpanTests.cs | 20 +++++++++++++++++++ 8 files changed, 51 insertions(+), 8 deletions(-) diff --git a/src/ServiceStack.Memory/NetCoreMemory.cs b/src/ServiceStack.Memory/NetCoreMemory.cs index 5d0987791..e2380f8a0 100644 --- a/src/ServiceStack.Memory/NetCoreMemory.cs +++ b/src/ServiceStack.Memory/NetCoreMemory.cs @@ -177,6 +177,7 @@ public override ReadOnlyMemory ToUtf8(ReadOnlySpan source) public override ReadOnlyMemory FromUtf8(ReadOnlySpan source) { + source = source.WithoutBom(); Memory chars = new char[Encoding.UTF8.GetCharCount(source)]; var charsWritten = Encoding.UTF8.GetChars(source, chars.Span); return chars.Slice(0, charsWritten); @@ -184,11 +185,11 @@ public override ReadOnlyMemory FromUtf8(ReadOnlySpan source) public override int ToUtf8(ReadOnlySpan source, Span destination) => Encoding.UTF8.GetBytes(source, destination); - public override int FromUtf8(ReadOnlySpan source, Span destination) => Encoding.UTF8.GetChars(source, destination); + public override int FromUtf8(ReadOnlySpan source, Span destination) => Encoding.UTF8.GetChars(source.WithoutBom(), destination); public override byte[] ToUtf8Bytes(ReadOnlySpan source) => ToUtf8(source).ToArray(); - public override string FromUtf8Bytes(ReadOnlySpan source) => FromUtf8(source).ToString(); + public override string FromUtf8Bytes(ReadOnlySpan source) => FromUtf8(source.WithoutBom()).ToString(); public override MemoryStream ToMemoryStream(ReadOnlySpan source) { diff --git a/src/ServiceStack.Text/DefaultMemory.cs b/src/ServiceStack.Text/DefaultMemory.cs index 2f1f6c4f6..13e1afb52 100644 --- a/src/ServiceStack.Text/DefaultMemory.cs +++ b/src/ServiceStack.Text/DefaultMemory.cs @@ -532,7 +532,7 @@ public override ReadOnlyMemory ToUtf8(ReadOnlySpan source) public override ReadOnlyMemory FromUtf8(ReadOnlySpan source) { - var bytes = source.ToArray(); + var bytes = source.WithoutBom().ToArray(); var chars = new char[Encoding.UTF8.GetCharCount(bytes)]; var charsWritten = Encoding.UTF8.GetChars(bytes, 0, source.Length, chars, 0); return new ReadOnlyMemory(chars, 0, charsWritten); @@ -549,7 +549,7 @@ public override int ToUtf8(ReadOnlySpan source, Span destination) public override int FromUtf8(ReadOnlySpan source, Span destination) { - var bytes = source.ToArray(); + var bytes = source.WithoutBom().ToArray(); var chars = destination.ToArray(); var charsWritten = Encoding.UTF8.GetChars(bytes, 0, source.Length, chars, 0); new ReadOnlySpan(chars, 0, charsWritten).CopyTo(destination); @@ -558,7 +558,7 @@ public override int FromUtf8(ReadOnlySpan source, Span destination) public override byte[] ToUtf8Bytes(ReadOnlySpan source) => Encoding.UTF8.GetBytes(source.ToArray()); - public override string FromUtf8Bytes(ReadOnlySpan source) => Encoding.UTF8.GetString(source.ToArray()); + public override string FromUtf8Bytes(ReadOnlySpan source) => Encoding.UTF8.GetString(source.WithoutBom().ToArray()); public override MemoryStream ToMemoryStream(ReadOnlySpan source) => MemoryStreamFactory.GetStream(source.ToArray()); diff --git a/src/ServiceStack.Text/Json/JsonReader.Generic.cs b/src/ServiceStack.Text/Json/JsonReader.Generic.cs index 0f93289cd..108421c81 100644 --- a/src/ServiceStack.Text/Json/JsonReader.Generic.cs +++ b/src/ServiceStack.Text/Json/JsonReader.Generic.cs @@ -88,6 +88,8 @@ public static object Parse(ReadOnlySpan value) { TypeConfig.Init(); + value = value.WithoutBom(); + if (ReadFn == null) { if (typeof(T).IsAbstract || typeof(T).IsInterface) diff --git a/src/ServiceStack.Text/Jsv/JsvReader.Generic.cs b/src/ServiceStack.Text/Jsv/JsvReader.Generic.cs index c96f8df50..a714a9aa6 100644 --- a/src/ServiceStack.Text/Jsv/JsvReader.Generic.cs +++ b/src/ServiceStack.Text/Jsv/JsvReader.Generic.cs @@ -85,6 +85,8 @@ public static object Parse(ReadOnlySpan value) { TypeConfig.Init(); + value = value.WithoutBom(); + if (ReadFn == null) { if (typeof(T).IsInterface) diff --git a/src/ServiceStack.Text/NetCoreMemory.cs b/src/ServiceStack.Text/NetCoreMemory.cs index 5d0987791..e2380f8a0 100644 --- a/src/ServiceStack.Text/NetCoreMemory.cs +++ b/src/ServiceStack.Text/NetCoreMemory.cs @@ -177,6 +177,7 @@ public override ReadOnlyMemory ToUtf8(ReadOnlySpan source) public override ReadOnlyMemory FromUtf8(ReadOnlySpan source) { + source = source.WithoutBom(); Memory chars = new char[Encoding.UTF8.GetCharCount(source)]; var charsWritten = Encoding.UTF8.GetChars(source, chars.Span); return chars.Slice(0, charsWritten); @@ -184,11 +185,11 @@ public override ReadOnlyMemory FromUtf8(ReadOnlySpan source) public override int ToUtf8(ReadOnlySpan source, Span destination) => Encoding.UTF8.GetBytes(source, destination); - public override int FromUtf8(ReadOnlySpan source, Span destination) => Encoding.UTF8.GetChars(source, destination); + public override int FromUtf8(ReadOnlySpan source, Span destination) => Encoding.UTF8.GetChars(source.WithoutBom(), destination); public override byte[] ToUtf8Bytes(ReadOnlySpan source) => ToUtf8(source).ToArray(); - public override string FromUtf8Bytes(ReadOnlySpan source) => FromUtf8(source).ToString(); + public override string FromUtf8Bytes(ReadOnlySpan source) => FromUtf8(source.WithoutBom()).ToString(); public override MemoryStream ToMemoryStream(ReadOnlySpan source) { diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 86f654abc..94e027b87 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -270,7 +270,9 @@ public static string AppendUrlPathsRaw(this string uri, params string[] uriCompo public static string FromUtf8Bytes(this byte[] bytes) { return bytes == null ? null - : Encoding.UTF8.GetString(bytes, 0, bytes.Length); + : bytes.Length > 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF + ? Encoding.UTF8.GetString(bytes, 3, bytes.Length - 3) + : Encoding.UTF8.GetString(bytes, 0, bytes.Length); } public static byte[] ToUtf8Bytes(this string value) diff --git a/src/ServiceStack.Text/StringSpanExtensions.cs b/src/ServiceStack.Text/StringSpanExtensions.cs index ec0f8bea9..060e37d05 100644 --- a/src/ServiceStack.Text/StringSpanExtensions.cs +++ b/src/ServiceStack.Text/StringSpanExtensions.cs @@ -661,5 +661,20 @@ public static int CountOccurrencesOf(this ReadOnlySpan value, char needle) } return count; } + + public static ReadOnlySpan WithoutBom(this ReadOnlySpan value) + { + return value.Length > 0 && value[0] == 65279 + ? value.Slice(1) + : value; + } + + public static ReadOnlySpan WithoutBom(this ReadOnlySpan value) + { + return value.Length > 3 && value[0] == 0xEF && value[1] == 0xBB && value[2] == 0xBF + ? value.Slice(3) + : value; + } + } } diff --git a/tests/ServiceStack.Text.Tests/SpanTests.cs b/tests/ServiceStack.Text.Tests/SpanTests.cs index a4fa0197b..4e94b6bbe 100644 --- a/tests/ServiceStack.Text.Tests/SpanTests.cs +++ b/tests/ServiceStack.Text.Tests/SpanTests.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Threading.Tasks; using NUnit.Framework; using ServiceStack.Text.Pools; @@ -149,6 +150,25 @@ public async Task Can_deserialize_from_MemoryStream_using_Memory() Assert.That(to, Is.EqualTo(from)); } + + [Test] + public void Can_deserialize_JSON_with_UTF8_BOM() + { + var from = new Person { Id = 1, Name = "Foo" }; + var json = from.ToJson(); + var jsonBytes = json.ToUtf8Bytes(); + + var bytes = new List(new byte[] { 0xEF, 0xBB, 0xBF }); + bytes.AddRange(jsonBytes); + + var mergedBytes = bytes.ToArray(); + + var jsonWithBOM = mergedBytes.FromUtf8Bytes(); + + var fromJsonWithBOM = jsonWithBOM.FromJson(); + + Assert.That(fromJsonWithBOM, Is.EqualTo(from)); + } } public class Utf8Case From 4b3540d1b49fbc2cde7ebb448e8f8946a46e2fd6 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 4 Jun 2019 20:11:22 -0400 Subject: [PATCH 103/372] Fix UTF8 BOM tests --- src/ServiceStack.Text/DefaultMemory.cs | 4 ++-- src/ServiceStack.Text/StringExtensions.cs | 7 +++++++ tests/ServiceStack.Text.Tests/SpanMemoryTests.cs | 6 ++++-- tests/ServiceStack.Text.Tests/SpanTests.cs | 12 ++++++++---- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/ServiceStack.Text/DefaultMemory.cs b/src/ServiceStack.Text/DefaultMemory.cs index 13e1afb52..1946faa89 100644 --- a/src/ServiceStack.Text/DefaultMemory.cs +++ b/src/ServiceStack.Text/DefaultMemory.cs @@ -534,7 +534,7 @@ public override ReadOnlyMemory FromUtf8(ReadOnlySpan source) { var bytes = source.WithoutBom().ToArray(); var chars = new char[Encoding.UTF8.GetCharCount(bytes)]; - var charsWritten = Encoding.UTF8.GetChars(bytes, 0, source.Length, chars, 0); + var charsWritten = Encoding.UTF8.GetChars(bytes, 0, bytes.Length, chars, 0); return new ReadOnlyMemory(chars, 0, charsWritten); } @@ -551,7 +551,7 @@ public override int FromUtf8(ReadOnlySpan source, Span destination) { var bytes = source.WithoutBom().ToArray(); var chars = destination.ToArray(); - var charsWritten = Encoding.UTF8.GetChars(bytes, 0, source.Length, chars, 0); + var charsWritten = Encoding.UTF8.GetChars(bytes, 0, bytes.Length, chars, 0); new ReadOnlySpan(chars, 0, charsWritten).CopyTo(destination); return charsWritten; } diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 94e027b87..9b8bed537 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -305,6 +305,13 @@ public static byte[] ToUtf8Bytes(this double doubleVal) return FastToUtf8Bytes(doubleStr); } + public static string WithoutBom(this string value) + { + return value.Length > 0 && value[0] == 65279 + ? value.Substring(1) + : value; + } + // from JWT spec public static string ToBase64UrlSafe(this byte[] input) { diff --git a/tests/ServiceStack.Text.Tests/SpanMemoryTests.cs b/tests/ServiceStack.Text.Tests/SpanMemoryTests.cs index d1a8add51..298c3f0bc 100644 --- a/tests/ServiceStack.Text.Tests/SpanMemoryTests.cs +++ b/tests/ServiceStack.Text.Tests/SpanMemoryTests.cs @@ -118,8 +118,10 @@ public void Can_ToUtf8_and_FromUtf8_using_Memory() Assert.That(bytes.ToArray(), Is.EquivalentTo(test.expectedBytes)); ReadOnlyMemory chars = bytes.FromUtf8(); - Assert.That(chars.Length, Is.EqualTo(test.expectedString.Length)); - Assert.That(chars.ToString(), Is.EqualTo(test.expectedString)); + Assert.That(chars.Length, Is.EqualTo(test.expectedString.Length) + .Or.EqualTo(test.expectedString.WithoutBom().Length)); + Assert.That(chars.ToString(), Is.EqualTo(test.expectedString) + .Or.EqualTo(test.expectedString.WithoutBom())); } } diff --git a/tests/ServiceStack.Text.Tests/SpanTests.cs b/tests/ServiceStack.Text.Tests/SpanTests.cs index 4e94b6bbe..a5393552e 100644 --- a/tests/ServiceStack.Text.Tests/SpanTests.cs +++ b/tests/ServiceStack.Text.Tests/SpanTests.cs @@ -111,8 +111,10 @@ public void Can_ToUtf8_and_FromUtf8_using_Span() Assert.That(bytes.ToArray(), Is.EquivalentTo(test.expectedBytes)); ReadOnlyMemory chars = bytes.FromUtf8(); - Assert.That(chars.Length, Is.EqualTo(test.expectedString.Length)); - Assert.That(chars.ToString(), Is.EqualTo(test.expectedString)); + Assert.That(chars.Length, Is.EqualTo(test.expectedString.Length) + .Or.EqualTo(test.expectedString.WithoutBom().Length)); + Assert.That(chars.ToString(), Is.EqualTo(test.expectedString) + .Or.EqualTo(test.expectedString.WithoutBom())); } } @@ -133,8 +135,10 @@ public void Can_ToUtf8_and_FromUtf8_in_place_using_Span() var charsWritten = MemoryProvider.Instance.FromUtf8(bytes.Span, charBuff.Span); chars = charBuff.Slice(0, charsWritten).Span; - Assert.That(chars.Length, Is.EqualTo(test.expectedString.Length)); - Assert.That(chars.ToString(), Is.EqualTo(test.expectedString)); + Assert.That(chars.Length, Is.EqualTo(test.expectedString.Length) + .Or.EqualTo(test.expectedString.WithoutBom().Length)); + Assert.That(chars.ToString(), Is.EqualTo(test.expectedString) + .Or.EqualTo(test.expectedString.WithoutBom())); } } From 1dfe78c69a9c5947324c244e950f7d59a64182e6 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 5 Jun 2019 06:21:54 -0400 Subject: [PATCH 104/372] Remove UTF8 BOM when deserializing as well --- src/ServiceStack.Text/DefaultMemory.cs | 2 +- src/ServiceStack.Text/NetCoreMemory.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/DefaultMemory.cs b/src/ServiceStack.Text/DefaultMemory.cs index 1946faa89..1d95aefd3 100644 --- a/src/ServiceStack.Text/DefaultMemory.cs +++ b/src/ServiceStack.Text/DefaultMemory.cs @@ -494,7 +494,7 @@ private static object Deserialize(MemoryStream ms, bool fromPool, Type type, try { var charsWritten = Encoding.UTF8.GetChars(bytes, 0, (int) ms.Length, utf8, 0); - var ret = deserializer(type, new ReadOnlySpan(utf8, 0, charsWritten)); + var ret = deserializer(type, new ReadOnlySpan(utf8, 0, charsWritten).WithoutBom()); return ret; } finally diff --git a/src/ServiceStack.Text/NetCoreMemory.cs b/src/ServiceStack.Text/NetCoreMemory.cs index e2380f8a0..c80902e96 100644 --- a/src/ServiceStack.Text/NetCoreMemory.cs +++ b/src/ServiceStack.Text/NetCoreMemory.cs @@ -141,7 +141,7 @@ public override async Task DeserializeAsync(Stream stream, Type type, De private static object Deserialize(MemoryStream memoryStream, bool fromPool, Type type, DeserializeStringSpanDelegate deserializer) { - var bytes = memoryStream.GetBufferAsSpan(); + var bytes = memoryStream.GetBufferAsSpan().WithoutBom(); var chars = CharPool.GetBuffer(Encoding.UTF8.GetCharCount(bytes)); try { From 6f5e256a0d3cf8de2d57597154773349da091540 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 5 Jun 2019 18:43:25 -0400 Subject: [PATCH 105/372] Use Tuple Key with Type in HasAttributeCached --- src/ServiceStack.Text/PlatformExtensions.cs | 11 ++++++----- .../ReflectionExtensionTests.cs | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index 04fc112a5..791d9ab8b 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -133,10 +133,11 @@ public static MethodInfo GetInstanceMethod(this Type type, string methodName) => [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool HasAttribute(this MethodInfo mi) => mi.AllAttributes().Any(x => x.GetType() == typeof(T)); - private static Dictionary hasAttributeCache = new Dictionary(); + private static Dictionary, bool> hasAttributeCache = new Dictionary, bool>(); public static bool HasAttributeCached(this MemberInfo memberInfo) { - if (hasAttributeCache.TryGetValue(memberInfo, out var hasAttr)) + var key = new Tuple(memberInfo, typeof(T)); + if (hasAttributeCache.TryGetValue(key , out var hasAttr)) return hasAttr; hasAttr = memberInfo is Type t @@ -149,12 +150,12 @@ public static bool HasAttributeCached(this MemberInfo memberInfo) ? mi.AllAttributes().Any(x => x.GetType() == typeof(T)) : throw new NotSupportedException(memberInfo.GetType().Name); - Dictionary snapshot, newCache; + Dictionary, bool> snapshot, newCache; do { snapshot = hasAttributeCache; - newCache = new Dictionary(hasAttributeCache) { - [memberInfo] = hasAttr + newCache = new Dictionary, bool>(hasAttributeCache) { + [key ] = hasAttr }; } while (!ReferenceEquals( diff --git a/tests/ServiceStack.Text.Tests/ReflectionExtensionTests.cs b/tests/ServiceStack.Text.Tests/ReflectionExtensionTests.cs index b366a1ef8..f30720e75 100644 --- a/tests/ServiceStack.Text.Tests/ReflectionExtensionTests.cs +++ b/tests/ServiceStack.Text.Tests/ReflectionExtensionTests.cs @@ -4,6 +4,7 @@ using System.Text; using NUnit.Framework; using ServiceStack; +using ServiceStack.DataAnnotations; namespace ServiceStack.Text.Tests { @@ -130,6 +131,21 @@ public void Does_GetCollectionType() Assert.That(new[] { "" }.Select(x => new TestModel()).GetType().GetCollectionType(), Is.EqualTo(typeof(TestModel))); } + [EnumAsChar] + public enum CharEnum : int + { + Value1 = 'A', + Value2 = 'B', + Value3 = 'C', + Value4 = 'D' + } + + [Test] + public void Can_use_HasAttributeCached() + { + Assert.That(typeof(CharEnum).HasAttributeCached()); + Assert.That(typeof(CharEnum).HasAttribute()); + } } public class GenericType { } From c6e4e2af1da59985c2fe7cabf6fc7a2e0db0b14d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 11 Jun 2019 17:52:53 -0400 Subject: [PATCH 106/372] Remove explicit reference to System.Threading in .NET v4.5 builds To resolve "The package 'ServiceStack.Text' tried to add a framework reference to 'System.Threading' which was not found in the GAC" --- src/ServiceStack.Text/ServiceStack.Text.csproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index bbbe85097..c253cf9b6 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -16,8 +16,6 @@ - - From d9921a3f9ee410b057b7291cca630cc56959870e Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 19 Jun 2019 00:04:26 -0400 Subject: [PATCH 107/372] Update System.Runtime/Memory versions --- src/ServiceStack.Text/ServiceStack.Text.Core.csproj | 8 ++++---- src/ServiceStack.Text/ServiceStack.Text.csproj | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index a3b83b9f1..d420cbbe2 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -16,15 +16,15 @@ $(DefineConstants);NETSTANDARD2_0;NETCORE2_1 - + - + - + - + \ No newline at end of file diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index c253cf9b6..290b5a9b3 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -17,18 +17,18 @@ - + - + - + - + - + \ No newline at end of file From 3336e8ca60c7ac2f692aaaff76b0700c123fdcba Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 19 Jun 2019 05:36:30 -0400 Subject: [PATCH 108/372] Upgrade deps --- tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj | 2 +- .../ServiceStack.Text.TestsConsole.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj index 238c34102..c78fabf9f 100644 --- a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj +++ b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj @@ -33,7 +33,7 @@ - + diff --git a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj index 1817b9be2..110c5e3a8 100644 --- a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj +++ b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj @@ -18,7 +18,7 @@ - + From 5dd7e0d32397ad7be65db27a59277faa9207549e Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 19 Jun 2019 05:40:21 -0400 Subject: [PATCH 109/372] moar deps --- tests/Northwind.Common/Northwind.Common.csproj | 2 +- tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Northwind.Common/Northwind.Common.csproj b/tests/Northwind.Common/Northwind.Common.csproj index b4ab3ca8f..f9648df05 100644 --- a/tests/Northwind.Common/Northwind.Common.csproj +++ b/tests/Northwind.Common/Northwind.Common.csproj @@ -44,7 +44,7 @@ - + diff --git a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj index c78fabf9f..1be2e2f51 100644 --- a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj +++ b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj @@ -30,7 +30,7 @@ - + From 7d41a68abd12b08a0fb2c5e53c1b6e66a3c2e0d0 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 19 Jun 2019 23:01:13 -0400 Subject: [PATCH 110/372] Add RegisterPopulator AutoMapping API --- src/ServiceStack.Text/AutoMappingUtils.cs | 28 ++++++- src/ServiceStack.Text/Common/JsWriter.cs | 2 +- .../AutoMappingPopulatorTests.cs | 77 +++++++++++++++++++ 3 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 tests/ServiceStack.Text.Tests/AutoMappingPopulatorTests.cs diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 47b4d36a5..df4f7fb42 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -44,6 +44,12 @@ public static void IgnoreMapping(Type fromType, Type toType) JsConfig.InitStatics(); AutoMappingUtils.ignoreMappings[Tuple.Create(fromType, toType)] = true; } + + public static void RegisterPopulator(Action populator) + { + JsConfig.InitStatics(); + AutoMappingUtils.populators[Tuple.Create(typeof(Target), typeof(Source))] = (a,b) => populator((Target)a,(Source)b); + } } public static class AutoMappingUtils @@ -51,6 +57,9 @@ public static class AutoMappingUtils internal static readonly ConcurrentDictionary, GetMemberDelegate> converters = new ConcurrentDictionary, GetMemberDelegate>(); + internal static readonly ConcurrentDictionary, PopulateMemberDelegate> populators + = new ConcurrentDictionary, PopulateMemberDelegate>(); + internal static readonly ConcurrentDictionary,bool> ignoreMappings = new ConcurrentDictionary,bool>(); @@ -60,9 +69,6 @@ public static void Reset() ignoreMappings.Clear(); AssignmentDefinitionCache.Clear(); } - - [Obsolete("Use AutoMapping.RegisterConverter")] - public static void RegisterConverter(Func converter) => throw new NotSupportedException("Deprecated: Use AutoMapping.RegisterConverter"); public static bool ShouldIgnoreMapping(Type fromType, Type toType) => ignoreMappings.ContainsKey(Tuple.Create(fromType, toType)); @@ -78,6 +84,17 @@ public static GetMemberDelegate GetConverter(Type fromType, Type toType) : null; } + public static PopulateMemberDelegate GetPopulator(Type targetType, Type sourceType) + { + if (populators.IsEmpty) + return null; + + var key = Tuple.Create(targetType, sourceType); + return populators.TryGetValue(key, out var populator) + ? populator + : null; + } + public static T ConvertTo(this object from, T defaultValue) => from == null || (from is string s && s == string.Empty) ? defaultValue @@ -1175,12 +1192,17 @@ public void Populate(object to, object from, ToType.FullName, toType.Name, ex); } } + + var populator = AutoMappingUtils.GetPopulator(to.GetType(), from.GetType()); + populator?.Invoke(to, from); } } public delegate object GetMemberDelegate(object instance); public delegate object GetMemberDelegate(T instance); + public delegate void PopulateMemberDelegate(object target, object source); + public delegate void SetMemberDelegate(object instance, object value); public delegate void SetMemberDelegate(T instance, object value); public delegate void SetMemberRefDelegate(ref object instance, object propertyValue); diff --git a/src/ServiceStack.Text/Common/JsWriter.cs b/src/ServiceStack.Text/Common/JsWriter.cs index 984c25d4f..9184d955e 100644 --- a/src/ServiceStack.Text/Common/JsWriter.cs +++ b/src/ServiceStack.Text/Common/JsWriter.cs @@ -42,7 +42,7 @@ static JsWriter() { EscapeCharFlags[escapeChar] = true; } - var loadConfig = JsConfig.EmitCamelCaseNames; //force load + var loadConfig = JsConfig.TextCase; //force load } public static void WriteDynamic(Action callback) diff --git a/tests/ServiceStack.Text.Tests/AutoMappingPopulatorTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingPopulatorTests.cs new file mode 100644 index 000000000..7352d9293 --- /dev/null +++ b/tests/ServiceStack.Text.Tests/AutoMappingPopulatorTests.cs @@ -0,0 +1,77 @@ +using NUnit.Framework; + +namespace ServiceStack.Text.Tests +{ + public class AutoMappingPopulatorTests + { + private static User CreateUser() => + new User { + FirstName = "John", + LastName = "Doe", + Car = new Car {Name = "BMW X6", Age = 3} + }; + + private static UsersData CreateUserData() + { + var user = CreateUser(); + return new UsersData { + Id = 1, + User = user, + UsersList = {user}, + UsersMap = {{1, user}} + }; + } + + [Test] + public void Does_call_populator_for_PopulateWith() + { + AutoMapping.RegisterPopulator((UserDto target, User source) => + target.LastName += "?!"); + + var user = CreateUser(); + var dtoUser = new UserDto().PopulateWith(user); + + Assert.That(dtoUser.FirstName, Is.EqualTo(user.FirstName)); + Assert.That(dtoUser.LastName, Is.EqualTo(user.LastName + "?!")); + } + + [Test] + public void Does_call_populator_for_PopulateWithNonDefaultValues() + { + AutoMapping.RegisterPopulator((UserDto target, User source) => + target.LastName += "?!"); + + var user = CreateUser(); + var dtoUser = new UserDto().PopulateWithNonDefaultValues(user); + + Assert.That(dtoUser.FirstName, Is.EqualTo(user.FirstName)); + Assert.That(dtoUser.LastName, Is.EqualTo(user.LastName + "?!")); + } + + [Test] + public void Does_call_populator_for_PopulateFromPropertiesWithoutAttribute() + { + AutoMapping.RegisterPopulator((UserDto target, User source) => + target.LastName += "?!"); + + var user = CreateUser(); + var dtoUser = new UserDto().PopulateFromPropertiesWithoutAttribute(user, typeof(IgnoreAttribute)); + + Assert.That(dtoUser.FirstName, Is.EqualTo(user.FirstName)); + Assert.That(dtoUser.LastName, Is.EqualTo(user.LastName + "?!")); + } + + [Test] + public void Does_call_populator_for_ConvertTo() + { + AutoMapping.RegisterPopulator((UserDto target, User source) => + target.LastName += "?!"); + + var user = CreateUser(); + var dtoUser = user.ConvertTo(); + + Assert.That(dtoUser.FirstName, Is.EqualTo(user.FirstName)); + Assert.That(dtoUser.LastName, Is.EqualTo(user.LastName + "?!")); + } + } +} \ No newline at end of file From fe37d51e01f84b3272d0765dfe16e0b5a0cdf732 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 19 Jun 2019 23:11:52 -0400 Subject: [PATCH 111/372] Fix dirty tests --- src/ServiceStack.Text/AutoMappingUtils.cs | 1 + .../AutoMappingPopulatorTests.cs | 30 ++++++++----------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index df4f7fb42..a6485d20e 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -66,6 +66,7 @@ internal static readonly ConcurrentDictionary,bool> ignoreMapp public static void Reset() { converters.Clear(); + populators.Clear(); ignoreMappings.Clear(); AssignmentDefinitionCache.Clear(); } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingPopulatorTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingPopulatorTests.cs index 7352d9293..54aca58dd 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingPopulatorTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingPopulatorTests.cs @@ -4,28 +4,24 @@ namespace ServiceStack.Text.Tests { public class AutoMappingPopulatorTests { - private static User CreateUser() => - new User { + public class UserData + { + public string FirstName { get; set; } + public string LastName { get; set; } + public Car Car { get; set; } + } + + private static UserData CreateUser() => + new UserData { FirstName = "John", LastName = "Doe", Car = new Car {Name = "BMW X6", Age = 3} }; - private static UsersData CreateUserData() - { - var user = CreateUser(); - return new UsersData { - Id = 1, - User = user, - UsersList = {user}, - UsersMap = {{1, user}} - }; - } - [Test] public void Does_call_populator_for_PopulateWith() { - AutoMapping.RegisterPopulator((UserDto target, User source) => + AutoMapping.RegisterPopulator((UserDto target, UserData source) => target.LastName += "?!"); var user = CreateUser(); @@ -38,7 +34,7 @@ public void Does_call_populator_for_PopulateWith() [Test] public void Does_call_populator_for_PopulateWithNonDefaultValues() { - AutoMapping.RegisterPopulator((UserDto target, User source) => + AutoMapping.RegisterPopulator((UserDto target, UserData source) => target.LastName += "?!"); var user = CreateUser(); @@ -51,7 +47,7 @@ public void Does_call_populator_for_PopulateWithNonDefaultValues() [Test] public void Does_call_populator_for_PopulateFromPropertiesWithoutAttribute() { - AutoMapping.RegisterPopulator((UserDto target, User source) => + AutoMapping.RegisterPopulator((UserDto target, UserData source) => target.LastName += "?!"); var user = CreateUser(); @@ -64,7 +60,7 @@ public void Does_call_populator_for_PopulateFromPropertiesWithoutAttribute() [Test] public void Does_call_populator_for_ConvertTo() { - AutoMapping.RegisterPopulator((UserDto target, User source) => + AutoMapping.RegisterPopulator((UserDto target, UserData source) => target.LastName += "?!"); var user = CreateUser(); From 523be85761de120f274febc4eab22767df3ed7cf Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 29 Jun 2019 01:14:24 -0400 Subject: [PATCH 112/372] Add GetRealContentType,MatchesContentType+IsBinary to MimeType --- src/ServiceStack.Text/HttpUtils.cs | 95 ++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 121586dec..07816e422 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1265,6 +1265,98 @@ public static string GetExtension(string mimeType) throw new NotSupportedException("Unknown mimeType: " + mimeType); } + + //lowercases and trims left part of content-type prior ';' + public static string GetRealContentType(string contentType) + { + if (contentType == null) + return null; + + int start = -1, end = -1; + + for(int i=0; i < contentType.Length; i++) + { + if (!char.IsWhiteSpace(contentType[i])) + { + if (contentType[i] == ';') + break; + if (start == -1) + { + start = i; + } + end = i; + } + } + + return start != -1 + ? contentType.Substring(start, end - start + 1).ToLowerInvariant() + : null; + } + + //Compares two string from start to ';' char, case-insensitive, + //ignoring (trimming) spaces at start and end + public static bool MatchesContentType(string contentType, string matchesContentType) + { + if (contentType == null || matchesContentType == null) + return false; + + int start = -1, matchStart = -1, matchEnd = -1; + + for (var i=0; i < contentType.Length; i++) + { + if (char.IsWhiteSpace(contentType[i])) + continue; + start = i; + break; + } + + for (var i=0; i < matchesContentType.Length; i++) + { + if (char.IsWhiteSpace(matchesContentType[i])) + continue; + if (matchesContentType[i] == ';') + break; + if (matchStart == -1) + matchStart = i; + matchEnd = i; + } + + return start != -1 && matchStart != -1 && matchEnd != -1 + && string.Compare(contentType, start, + matchesContentType, matchStart, matchEnd - matchStart + 1, + StringComparison.OrdinalIgnoreCase) == 0; + } + + public static Func IsBinaryFilter { get; set; } + + public static bool IsBinary(string contentType) + { + var userFilter = IsBinaryFilter?.Invoke(contentType); + if (userFilter != null) + return userFilter.Value; + + var realContentType = GetRealContentType(contentType); + switch (realContentType) + { + case ProtoBuf: + case MsgPack: + case Binary: + case Bson: + case Wire: + return true; + } + + var primaryType = realContentType.LeftPart('/'); + switch (primaryType) + { + case "image": + case "audio": + case "video": + return true; + } + + return false; + } public static string GetMimeType(string fileNameOrExt) { @@ -1297,6 +1389,9 @@ public static string GetMimeType(string fileNameOrExt) case "svg": return "image/svg+xml"; + + case "ico": + return "image/x-icon"; case "htm": case "html": From d66ee36fee8c5828970f6831e1a003eba035d1fc Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 4 Jul 2019 18:27:53 -0400 Subject: [PATCH 113/372] Fix TimeSpanConverter overflow --- .../Support/TimeSpanConverter.cs | 32 ++++++++----------- .../TimeSpanConverterTests.cs | 13 ++++++++ 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/ServiceStack.Text/Support/TimeSpanConverter.cs b/src/ServiceStack.Text/Support/TimeSpanConverter.cs index c604020ad..f11a9f511 100644 --- a/src/ServiceStack.Text/Support/TimeSpanConverter.cs +++ b/src/ServiceStack.Text/Support/TimeSpanConverter.cs @@ -14,12 +14,12 @@ public static string ToXsdDuration(TimeSpan timeSpan) double ticks = Math.Abs(timeSpan.Ticks); double totalSeconds = ticks / TimeSpan.TicksPerSecond; - int wholeSeconds = (int) totalSeconds; - int seconds = wholeSeconds; - int sec = (seconds >= 60 ? seconds % 60 : seconds); - int min = (seconds = (seconds / 60)) >= 60 ? seconds % 60 : seconds; - int hours = (seconds = (seconds / 60)) >= 24 ? seconds % 24 : seconds; - int days = seconds / 24; + long wholeSeconds = (long) totalSeconds; + long seconds = wholeSeconds; + long sec = (seconds >= 60 ? seconds % 60 : seconds); + long min = (seconds = (seconds / 60)) >= 60 ? seconds % 60 : seconds; + long hours = (seconds = (seconds / 60)) >= 24 ? seconds % 24 : seconds; + long days = seconds / 24; double remainingSecs = sec + (totalSeconds - wholeSeconds); if (days > 0) @@ -51,11 +51,11 @@ public static string ToXsdDuration(TimeSpan timeSpan) public static TimeSpan FromXsdDuration(string xsdDuration) { - int days = 0; - int hours = 0; - int minutes = 0; + long days = 0; + long hours = 0; + long minutes = 0; decimal seconds = 0; - int sign = 1; + long sign = 1; if (xsdDuration.StartsWith("-", StringComparison.Ordinal)) { @@ -70,8 +70,7 @@ public static TimeSpan FromXsdDuration(string xsdDuration) string[] d = t[0].SplitOnFirst('D'); if (d.Length == 2) { - int day; - if (int.TryParse(d[0], out day)) + if (long.TryParse(d[0], out var day)) days = day; } if (hasTime) @@ -79,24 +78,21 @@ public static TimeSpan FromXsdDuration(string xsdDuration) string[] h = t[1].SplitOnFirst('H'); if (h.Length == 2) { - int hour; - if (int.TryParse(h[0], out hour)) + if (long.TryParse(h[0], out var hour)) hours = hour; } string[] m = h[h.Length - 1].SplitOnFirst('M'); if (m.Length == 2) { - int min; - if (int.TryParse(m[0], out min)) + if (long.TryParse(m[0], out var min)) minutes = min; } string[] s = m[m.Length - 1].SplitOnFirst('S'); if (s.Length == 2) { - decimal millis; - if (decimal.TryParse(s[0], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out millis)) + if (decimal.TryParse(s[0], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var millis)) seconds = millis; } } diff --git a/tests/ServiceStack.Text.Tests/TimeSpanConverterTests.cs b/tests/ServiceStack.Text.Tests/TimeSpanConverterTests.cs index f9b1711c7..db7298ca9 100644 --- a/tests/ServiceStack.Text.Tests/TimeSpanConverterTests.cs +++ b/tests/ServiceStack.Text.Tests/TimeSpanConverterTests.cs @@ -17,6 +17,7 @@ public class TimeSpanConverterTests private readonly TimeSpan oneMilliSecond = new TimeSpan(0, 0, 0, 0, 1); private readonly TimeSpan oneDayHourMinuteSecondMilliSecond = new TimeSpan(1, 1, 1, 1, 1); private readonly TimeSpan threeThousandSixHundredAndFiveDays = TimeSpan.FromDays(3605); + private readonly TimeSpan ninetyThousandDays = TimeSpan.FromDays(90000); private readonly TimeSpan arbitraryTimeSpan = new TimeSpan(1, 2, 3, 4, 567).Add(TimeSpan.FromTicks(1)); [Test] @@ -48,6 +49,9 @@ public void Can_Serialize_TimeSpan() Assert.That(TimeSpanConverter.ToXsdDuration(threeThousandSixHundredAndFiveDays), Is.EqualTo("P3605D")); Assert.That(TimeSpanConverter.ToXsdDuration(-threeThousandSixHundredAndFiveDays), Is.EqualTo("-P3605D")); + + Assert.That(TimeSpanConverter.ToXsdDuration(ninetyThousandDays), Is.EqualTo("P90000D")); + Assert.That(TimeSpanConverter.ToXsdDuration(-ninetyThousandDays), Is.EqualTo("-P90000D")); } [Test] @@ -80,6 +84,9 @@ public void Can_deserialize_TimeSpan() Assert.That(TimeSpanConverter.FromXsdDuration("P3605D"), Is.EqualTo(threeThousandSixHundredAndFiveDays)); Assert.That(TimeSpanConverter.FromXsdDuration("-P3605D"), Is.EqualTo(-threeThousandSixHundredAndFiveDays)); + + Assert.That(TimeSpanConverter.FromXsdDuration("P90000D"), Is.EqualTo(ninetyThousandDays)); + Assert.That(TimeSpanConverter.FromXsdDuration("-P90000D"), Is.EqualTo(-ninetyThousandDays)); } [Test] @@ -111,6 +118,9 @@ public void Can_Serialize_TimeSpan_DifferentCulture() Assert.That(TimeSpanConverter.ToXsdDuration(threeThousandSixHundredAndFiveDays), Is.EqualTo("P3605D")); Assert.That(TimeSpanConverter.ToXsdDuration(-threeThousandSixHundredAndFiveDays), Is.EqualTo("-P3605D")); + + Assert.That(TimeSpanConverter.ToXsdDuration(ninetyThousandDays), Is.EqualTo("P90000D")); + Assert.That(TimeSpanConverter.ToXsdDuration(-ninetyThousandDays), Is.EqualTo("-P90000D")); } [Test] @@ -143,6 +153,9 @@ public void Can_deserialize_TimeSpan_DifferentCulture() Assert.That(TimeSpanConverter.FromXsdDuration("P3605D"), Is.EqualTo(threeThousandSixHundredAndFiveDays)); Assert.That(TimeSpanConverter.FromXsdDuration("-P3605D"), Is.EqualTo(-threeThousandSixHundredAndFiveDays)); + + Assert.That(TimeSpanConverter.FromXsdDuration("P90000D"), Is.EqualTo(ninetyThousandDays)); + Assert.That(TimeSpanConverter.FromXsdDuration("-P90000D"), Is.EqualTo(-ninetyThousandDays)); } } } From e341f85284286ab1a8d5caf78dc73949571556f4 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 5 Jul 2019 04:57:19 -0400 Subject: [PATCH 114/372] Update HttpUtils.cs --- src/ServiceStack.Text/HttpUtils.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 07816e422..f512a030e 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1363,9 +1363,7 @@ public static string GetMimeType(string fileNameOrExt) if (string.IsNullOrEmpty(fileNameOrExt)) throw new ArgumentNullException(nameof(fileNameOrExt)); - var parts = fileNameOrExt.Split('.'); - var fileExt = parts[parts.Length - 1]; - + var fileExt = fileNameOrExt.LastRightPart('.'); if (ExtensionMimeTypes.TryGetValue(fileExt, out var mimeType)) { return mimeType; From 9409f780c183eb9d8ab906b43d4764e0967dcab3 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 1 Aug 2019 17:30:40 -0400 Subject: [PATCH 115/372] Add ToBase64() to MemoryProvider --- src/ServiceStack.Memory/NetCoreMemory.cs | 5 +++++ src/ServiceStack.Text/DefaultMemory.cs | 8 ++++++++ src/ServiceStack.Text/MemoryProvider.cs | 2 ++ src/ServiceStack.Text/NetCoreMemory.cs | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/src/ServiceStack.Memory/NetCoreMemory.cs b/src/ServiceStack.Memory/NetCoreMemory.cs index e2380f8a0..ea65642c2 100644 --- a/src/ServiceStack.Memory/NetCoreMemory.cs +++ b/src/ServiceStack.Memory/NetCoreMemory.cs @@ -90,6 +90,11 @@ public override byte[] ParseBase64(ReadOnlySpan value) } } + public override string ToBase64(ReadOnlyMemory value) + { + return Convert.ToBase64String(value.Span); + } + public override Task WriteAsync(Stream stream, ReadOnlySpan value, CancellationToken token=default) { using (var writer = new BinaryWriter(stream, Encoding.UTF8, leaveOpen:true)) diff --git a/src/ServiceStack.Text/DefaultMemory.cs b/src/ServiceStack.Text/DefaultMemory.cs index 1d95aefd3..330bdd6e9 100644 --- a/src/ServiceStack.Text/DefaultMemory.cs +++ b/src/ServiceStack.Text/DefaultMemory.cs @@ -2,6 +2,7 @@ using System.Globalization; using System.IO; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -511,6 +512,13 @@ public override byte[] ParseBase64(ReadOnlySpan value) return Convert.FromBase64String(value.ToString()); } + public override string ToBase64(ReadOnlyMemory value) + { + return MemoryMarshal.TryGetArray(value, out var segment) + ? Convert.ToBase64String(segment.Array, 0, segment.Count) + : Convert.ToBase64String(value.ToArray()); + } + public override StringBuilder Append(StringBuilder sb, ReadOnlySpan value) { return sb.Append(value.ToArray()); diff --git a/src/ServiceStack.Text/MemoryProvider.cs b/src/ServiceStack.Text/MemoryProvider.cs index e46522670..4bd0e7bb7 100644 --- a/src/ServiceStack.Text/MemoryProvider.cs +++ b/src/ServiceStack.Text/MemoryProvider.cs @@ -48,6 +48,8 @@ public abstract class MemoryProvider public abstract byte[] ParseBase64(ReadOnlySpan value); + public abstract string ToBase64(ReadOnlyMemory value); + public abstract Task WriteAsync(Stream stream, ReadOnlySpan value, CancellationToken token = default); public abstract Task WriteAsync(Stream stream, ReadOnlyMemory value, CancellationToken token = default); diff --git a/src/ServiceStack.Text/NetCoreMemory.cs b/src/ServiceStack.Text/NetCoreMemory.cs index c80902e96..47b785f9f 100644 --- a/src/ServiceStack.Text/NetCoreMemory.cs +++ b/src/ServiceStack.Text/NetCoreMemory.cs @@ -90,6 +90,11 @@ public override byte[] ParseBase64(ReadOnlySpan value) } } + public override string ToBase64(ReadOnlyMemory value) + { + return Convert.ToBase64String(value.Span); + } + public override Task WriteAsync(Stream stream, ReadOnlySpan value, CancellationToken token=default) { using (var writer = new BinaryWriter(stream, Encoding.UTF8, leaveOpen:true)) From d487844879102dbbcd339969613a952438d207a9 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 1 Aug 2019 22:19:48 -0400 Subject: [PATCH 116/372] Expand MimeTypes to include better binary detection support --- src/ServiceStack.Text/HttpUtils.cs | 124 +++++++++++++++++++++++++---- 1 file changed, 110 insertions(+), 14 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index f512a030e..e1e1f3df7 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1240,7 +1240,11 @@ public static class MimeTypes public const string MarkdownText = "text/markdown"; public const string MsgPack = "application/x-msgpack"; public const string Wire = "application/x-wire"; + public const string Compressed = "application/x-compressed"; public const string NetSerializer = "application/x-netserializer"; + public const string Excel = "application/excel"; + public const string MsWord = "application/msword"; + public const string Cert = "application/x-x509-ca-cert"; public const string ImagePng = "image/png"; public const string ImageGif = "image/gif"; @@ -1343,10 +1347,21 @@ public static bool IsBinary(string contentType) case Binary: case Bson: case Wire: + case Cert: + case Excel: + case MsWord: return true; } + // Text format exceptions to below heuristics + switch (realContentType) + { + case ImageSvg: + return false; + } + var primaryType = realContentType.LeftPart('/'); + var secondaryType = realContentType.RightPart('/'); switch (primaryType) { case "image": @@ -1355,6 +1370,12 @@ public static bool IsBinary(string contentType) return true; } + if (secondaryType.StartsWith("pkc") + || secondaryType.StartsWith("x-pkc") + || secondaryType.StartsWith("font") + || secondaryType.StartsWith("vnd.ms-")) + return true; + return false; } @@ -1386,7 +1407,7 @@ public static string GetMimeType(string fileNameOrExt) return "image/tiff"; case "svg": - return "image/svg+xml"; + return ImageSvg; case "ico": return "image/x-icon"; @@ -1406,21 +1427,33 @@ public static string GetMimeType(string fileNameOrExt) return "text/jsx"; case "csv": + return Csv; case "css": + return Css; + case "sgml": return "text/" + fileExt; case "txt": return "text/plain"; - case "wav": - return "audio/wav"; - case "mp3": return "audio/mpeg3"; + case "au": + case "snd": + return "audio/basic"; + + case "aac": + case "ac3": + case "aiff": + case "m4a": + case "m4b": + case "m4p": case "mid": - return "audio/midi"; + case "midi": + case "wav": + return "audio/" + fileExt; case "qt": case "mov": @@ -1429,22 +1462,25 @@ public static string GetMimeType(string fileNameOrExt) case "mpg": return "video/mpeg"; + case "ogv": + return "video/ogg"; + + case "3gpp": case "avi": - case "mp4": + case "dv": + case "divx": case "ogg": + case "mp4": case "webm": return "video/" + fileExt; - case "ogv": - return "video/ogg"; - case "rtf": return "application/" + fileExt; case "xls": case "xlt": case "xla": - return "application/x-excel"; + return Excel; case "xlsx": return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; @@ -1453,7 +1489,7 @@ public static string GetMimeType(string fileNameOrExt) case "doc": case "dot": - return "application/msword"; + return MsWord; case "docx": return "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; @@ -1475,10 +1511,36 @@ public static string GetMimeType(string fileNameOrExt) case "mdb": return "application/vnd.ms-access"; - + + case "cer": + case "crt": + case "der": + return Cert; + + case "p10": + return "application/pkcs10"; + case "p12": + return "application/x-pkcs12"; + case "p7b": + case "spc": + return "application/x-pkcs7-certificates"; + case "p7c": + case "p7m": + return "application/pkcs7-mime"; + case "p7r": + return "application/x-pkcs7-certreqresp"; + case "p7s": + return "application/pkcs7-signature"; + case "sst": + return "application/vnd.ms-pki.certstore"; + case "gz": case "tgz": - return "application/x-compressed"; + case "zip": + case "rar": + case "lzh": + case "z": + return Compressed; case "eot": return "application/vnd.ms-fontobject"; @@ -1491,8 +1553,42 @@ public static string GetMimeType(string fileNameOrExt) case "woff2": return "application/font-woff2"; + case "aaf": + case "aca": + case "asd": + case "bin": + case "cab": + case "chm": + case "class": + case "cur": + case "dat": + case "deploy": case "dll": - return "application/octet-stream"; + case "dsp": + case "exe": + case "fla": + case "ics": + case "inf": + case "java": + case "mix": + case "msi": + case "mso": + case "obj": + case "ocx": + case "prm": + case "prx": + case "psd": + case "psp": + case "qxd": + case "sea": + case "snp": + case "so": + case "toc": + case "u32": + case "xmp": + case "xsn": + case "xtp": + return Binary; case "wasm": return "application/wasm"; From 58874ba6e7178fd3533d18a11168c9af0b112d8a Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 1 Aug 2019 22:20:58 -0400 Subject: [PATCH 117/372] Update HttpUtils.cs --- src/ServiceStack.Text/HttpUtils.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index e1e1f3df7..b90063f50 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1350,6 +1350,7 @@ public static bool IsBinary(string contentType) case Cert: case Excel: case MsWord: + case WebAssembly: return true; } @@ -1591,7 +1592,7 @@ public static string GetMimeType(string fileNameOrExt) return Binary; case "wasm": - return "application/wasm"; + return WebAssembly; default: return "application/" + fileExt; From c75de69372722421ef9780683103a3c3ba95f849 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 1 Aug 2019 22:21:46 -0400 Subject: [PATCH 118/372] Update HttpUtils.cs --- src/ServiceStack.Text/HttpUtils.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index b90063f50..7bca42bbc 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1350,6 +1350,7 @@ public static bool IsBinary(string contentType) case Cert: case Excel: case MsWord: + case Compressed: case WebAssembly: return true; } From b07bd02b108955bc040abacffa83a184f1c2b036 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 1 Aug 2019 22:54:54 -0400 Subject: [PATCH 119/372] Update ReadFully to use BufferPool + add more efficient ReadFullyAsMemory --- src/ServiceStack.Text/StreamExtensions.cs | 59 ++++++++++++++++++++--- 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/src/ServiceStack.Text/StreamExtensions.cs b/src/ServiceStack.Text/StreamExtensions.cs index 0ee8bbcc9..41620cc14 100644 --- a/src/ServiceStack.Text/StreamExtensions.cs +++ b/src/ServiceStack.Text/StreamExtensions.cs @@ -2,6 +2,7 @@ //License: https://raw.github.com/ServiceStack/ServiceStack/master/license.txt using System; +using System.Buffers.Text; using System.Collections.Generic; using System.IO; using System.Linq; @@ -10,6 +11,7 @@ using System.Threading; using System.Threading.Tasks; using ServiceStack.Text; +using ServiceStack.Text.Pools; namespace ServiceStack { @@ -58,13 +60,9 @@ public static IEnumerable ReadLines(this Stream stream) public const int DefaultBufferSize = 8 * 1024; /// - /// Reads the given stream up to the end, returning the data as a byte - /// array. + /// Reads the given stream up to the end, returning the data as a byte array. /// - public static byte[] ReadFully(this Stream input) - { - return ReadFully(input, DefaultBufferSize); - } + public static byte[] ReadFully(this Stream input) => ReadFully(input, DefaultBufferSize); /// /// Reads the given stream up to the end, returning the data as a byte @@ -75,7 +73,15 @@ public static byte[] ReadFully(this Stream input, int bufferSize) if (bufferSize < 1) throw new ArgumentOutOfRangeException(nameof(bufferSize)); - return ReadFully(input, new byte[bufferSize]); + byte[] buffer = BufferPool.GetBuffer(bufferSize); + try + { + return ReadFully(input, buffer); + } + finally + { + BufferPool.ReleaseBufferToPool(ref buffer); + } } /// @@ -110,6 +116,45 @@ public static byte[] ReadFully(this Stream input, byte[] buffer) } } + /// + /// Reads the given stream up to the end, returning the MemoryStream Buffer as ReadOnlyMemory<byte>. + /// + public static ReadOnlyMemory ReadFullyAsMemory(this Stream input) => + ReadFullyAsMemory(input, DefaultBufferSize); + + /// + /// Reads the given stream up to the end, returning the MemoryStream Buffer as ReadOnlyMemory<byte>. + /// + public static ReadOnlyMemory ReadFullyAsMemory(this Stream input, int bufferSize) + { + byte[] buffer = BufferPool.GetBuffer(bufferSize); + try + { + return ReadFullyAsMemory(input, buffer); + } + finally + { + BufferPool.ReleaseBufferToPool(ref buffer); + } + } + + public static ReadOnlyMemory ReadFullyAsMemory(this Stream input, byte[] buffer) + { + if (buffer == null) + throw new ArgumentNullException(nameof(buffer)); + + if (input == null) + throw new ArgumentNullException(nameof(input)); + + if (buffer.Length == 0) + throw new ArgumentException("Buffer has length of 0"); + + var ms = new MemoryStream(); + CopyTo(input, ms, buffer); + return ms.GetBufferAsMemory(); + } + + /// /// Copies all the data from one stream into another. /// From 04bd32f2b6f796b188334ed0d12468d7552fde8f Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 3 Aug 2019 16:30:44 -0400 Subject: [PATCH 120/372] Fix JSV encoding to always encode strings --- src/ServiceStack.Text/TypeSerializer.cs | 15 +++++++-------- .../JsvTests/JsvBasicDataTests.cs | 9 +++++++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/ServiceStack.Text/TypeSerializer.cs b/src/ServiceStack.Text/TypeSerializer.cs index cdcaacb14..362fd1cfc 100644 --- a/src/ServiceStack.Text/TypeSerializer.cs +++ b/src/ServiceStack.Text/TypeSerializer.cs @@ -126,8 +126,8 @@ public static string SerializeToString(T value) public static string SerializeToString(object value, Type type) { if (value == null) return null; - if (type == typeof(string)) - return value as string; + if (value is string str) + return str.EncodeJsv(); var writer = StringWriterThreadStatic.Allocate(); JsvWriter.GetWriteFn(type)(writer, value); @@ -137,9 +137,9 @@ public static string SerializeToString(object value, Type type) public static void SerializeToWriter(T value, TextWriter writer) { if (value == null) return; - if (typeof(T) == typeof(string)) + if (value is string str) { - writer.Write(value); + writer.Write(str.EncodeJsv()); } else if (typeof(T) == typeof(object)) { @@ -160,9 +160,9 @@ public static void SerializeToWriter(T value, TextWriter writer) public static void SerializeToWriter(object value, Type type, TextWriter writer) { if (value == null) return; - if (type == typeof(string)) + if (value is string str) { - writer.Write(value); + writer.Write(str.EncodeJsv()); return; } @@ -305,8 +305,7 @@ public static void Print(this long longValue) public static string SerializeAndFormat(this T instance) { - var fn = instance as Delegate; - if (fn != null) + if (instance is Delegate fn) return Dump(fn); var dtoStr = !HasCircularReferences(instance) diff --git a/tests/ServiceStack.Text.Tests/JsvTests/JsvBasicDataTests.cs b/tests/ServiceStack.Text.Tests/JsvTests/JsvBasicDataTests.cs index ae955b02b..293599587 100644 --- a/tests/ServiceStack.Text.Tests/JsvTests/JsvBasicDataTests.cs +++ b/tests/ServiceStack.Text.Tests/JsvTests/JsvBasicDataTests.cs @@ -102,5 +102,14 @@ public void Can_serialize_ModelWithNullableFloatTypes_From_String() fromJsv = jsv.FromJsv(); Assert.That(fromJsv, Is.EqualTo(dto)); } + + [Test] + public void Does_encode_object_string_values_with_escaped_chars() + { + var url = "https://url.com"; + Assert.That(url.ToJsv(), Is.EqualTo("\"https://url.com\"")); + Assert.That(((object)url).ToJsv(), Is.EqualTo("\"https://url.com\"")); + } + } } \ No newline at end of file From e91e67899e084b3363094b99d87effbd6aeb2404 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 4 Aug 2019 00:36:52 -0400 Subject: [PATCH 121/372] Update HttpUtils.cs --- src/ServiceStack.Text/HttpUtils.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 7bca42bbc..864f0607a 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1563,6 +1563,7 @@ public static string GetMimeType(string fileNameOrExt) case "chm": case "class": case "cur": + case "db": case "dat": case "deploy": case "dll": @@ -1585,6 +1586,7 @@ public static string GetMimeType(string fileNameOrExt) case "sea": case "snp": case "so": + case "sqlite": case "toc": case "u32": case "xmp": From f4763bf74a9cc0c9a727fc5cad447aed3d71c08a Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 7 Aug 2019 11:46:57 -0400 Subject: [PATCH 122/372] Fix CopyTo --- src/ServiceStack.Text/HttpUtils.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 864f0607a..20477bf4b 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -801,7 +801,7 @@ public static Stream SendStreamToUrl(this string url, string method = null, { using (var req = PclExport.Instance.GetRequestStream(webReq)) { - req.CopyTo(requestBody); + requestBody.CopyTo(req); } } @@ -839,7 +839,7 @@ public static async Task SendStreamToUrlAsync(this string url, string me { using (var req = PclExport.Instance.GetRequestStream(webReq)) { - await req.CopyToAsync(requestBody); + await requestBody.CopyToAsync(req); } } From 4fd136c87b048b5afac9e89eff593a4a2c3b99d6 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 8 Aug 2019 08:28:48 -0400 Subject: [PATCH 123/372] Upgrade to v5.6.1 --- src/Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 8dc9ddc19..c4e232aca 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.5.1 + 5.6.1 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc From 1661c6150ef842ace14ec1b0a72f951974a95197 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 8 Aug 2019 09:04:04 -0400 Subject: [PATCH 124/372] Update deprecated usage --- tests/ServiceStack.Text.Tests/DictionaryTests.cs | 2 +- tests/ServiceStack.Text.Tests/EnumTests.cs | 2 +- tests/ServiceStack.Text.Tests/ExpandoTests.cs | 2 +- tests/ServiceStack.Text.Tests/JsConfigTests.cs | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/ServiceStack.Text.Tests/DictionaryTests.cs b/tests/ServiceStack.Text.Tests/DictionaryTests.cs index 1574a6442..d20ccdd3f 100644 --- a/tests/ServiceStack.Text.Tests/DictionaryTests.cs +++ b/tests/ServiceStack.Text.Tests/DictionaryTests.cs @@ -529,7 +529,7 @@ public void Can_serialize_string_string_Dictionary_with_UTF8() public void Can_Deserialize_Object_To_Dictionary() { const string json = "{\"Id\":1}"; - var d = json.To>(); + var d = json.ConvertTo>(); Assert.That(d.ContainsKey("Id")); Assert.That(d["Id"], Is.EqualTo("1")); } diff --git a/tests/ServiceStack.Text.Tests/EnumTests.cs b/tests/ServiceStack.Text.Tests/EnumTests.cs index e14d282cb..bfe4b1705 100644 --- a/tests/ServiceStack.Text.Tests/EnumTests.cs +++ b/tests/ServiceStack.Text.Tests/EnumTests.cs @@ -152,7 +152,7 @@ public void Can_serialize_different_enum_styles() Assert.That("DoubleWord".FromJson(), Is.EqualTo(EnumStyles.DoubleWord)); Assert.That("Underscore_Words".FromJson(), Is.EqualTo(EnumStyles.Underscore_Words)); - using (JsConfig.With(new Config { EmitLowercaseUnderscoreNames = true})) + using (JsConfig.With(new Config { TextCase = TextCase.SnakeCase })) { Assert.That("Double_Word".FromJson(), Is.EqualTo(EnumStyles.DoubleWord)); Assert.That("Underscore_Words".FromJson(), Is.EqualTo(EnumStyles.Underscore_Words)); diff --git a/tests/ServiceStack.Text.Tests/ExpandoTests.cs b/tests/ServiceStack.Text.Tests/ExpandoTests.cs index 250c93ca4..41544e8d5 100644 --- a/tests/ServiceStack.Text.Tests/ExpandoTests.cs +++ b/tests/ServiceStack.Text.Tests/ExpandoTests.cs @@ -176,7 +176,7 @@ public void Can_Deserialize_Object_To_ExpandoObject() { JsConfig.TryToParsePrimitiveTypeValues = true; const string json = "{\"Id\":1}"; - dynamic d = json.To(); + dynamic d = json.ConvertTo(); Assert.That(d.Id, Is.Not.Null); Assert.That(d.Id, Is.EqualTo(1)); } diff --git a/tests/ServiceStack.Text.Tests/JsConfigTests.cs b/tests/ServiceStack.Text.Tests/JsConfigTests.cs index 9d9f35b32..dc1627c18 100644 --- a/tests/ServiceStack.Text.Tests/JsConfigTests.cs +++ b/tests/ServiceStack.Text.Tests/JsConfigTests.cs @@ -210,7 +210,7 @@ public class JsConfigCreateTests public void Does_create_scope_from_string() { var scope = JsConfig.CreateScope("emitlowercaseunderscorenames,IncludeNullValues:false,ExcludeDefaultValues:0,IncludeDefaultEnums:1"); - Assert.That(scope.EmitLowercaseUnderscoreNames); + Assert.That(scope.TextCase, Is.EqualTo(TextCase.SnakeCase)); Assert.That(!scope.IncludeNullValues); Assert.That(!scope.ExcludeDefaultValues); Assert.That(scope.IncludeDefaultEnums); @@ -228,7 +228,7 @@ public void Does_create_scope_from_string() public void Does_create_scope_from_string_using_CamelCaseHumps() { var scope = JsConfig.CreateScope("eccn,inv:false,edv:0,ide:1"); - Assert.That(scope.EmitCamelCaseNames); + Assert.That(scope.TextCase, Is.EqualTo(TextCase.CamelCase)); Assert.That(!scope.IncludeNullValues); Assert.That(!scope.ExcludeDefaultValues); Assert.That(scope.IncludeDefaultEnums); From b24905abec2518ae9d71db65587f2809583435bf Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 8 Aug 2019 09:15:34 -0400 Subject: [PATCH 125/372] Update Directory.Build.props --- tests/Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 100bce767..a6a00041b 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.5.1 + 5.6.1 latest false From 02eba76f532e75a795d3a043cf8458c02df8f6fb Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 12 Aug 2019 16:25:44 -0400 Subject: [PATCH 126/372] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 010b4de34..0320e14dc 100644 --- a/README.md +++ b/README.md @@ -181,10 +181,10 @@ var scope = JS.CreateScope( JS.eval("arg", scope) //= "value" JS.eval("reverse(arg)", scope) //= "eulav" -JS.eval("itemsOf(3, padRight(reverse(arg), 8, '_'))", scope) //= ["eulav___", "eulav___", "eulav___"] +JS.eval("3.itemsOf(arg.reverse().padRight(8, '_'))", scope) //= ["eulav___", "eulav___", "eulav___"] //= { a: ["eulav___", "eulav___", "eulav___"] } -JS.eval("{a: itemsOf(3, padRight(reverse(arg), 8, '_')) }", scope) +JS.eval("{a: 3.itemsOf(arg.reverse().padRight(8, '_')) }", scope) ``` ServiceStack's JS Utils is available in the [ServiceStack.Common](https://www.nuget.org/packages/ServiceStack.Common) NuGet package. From 9c4b9da640ccc4d04e705dafb6f576a1122d1b08 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 13 Aug 2019 18:07:36 -0400 Subject: [PATCH 127/372] Update README.md --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0320e14dc..f60aa455a 100644 --- a/README.md +++ b/README.md @@ -318,7 +318,7 @@ All C# boolean and numeric data types are stored as-is without quotes. For the most compact output null values are omitted from the serialized by default. If you want to include null values set the global configuration: ```csharp -JsConfig.IncludeNullValues = true; +JsConfig.Init(new Config { IncludeNullValues = true }); ``` ### string type @@ -481,6 +481,16 @@ JsConfig.SerializeFn = time => (time.Ticks < 0 ? "-" : "") + time.ToString("hh':'mm':'ss'.'fffffff"); ``` +## Strict Parsing + +By default ServiceStack Serializers will try to deserialize as much as possible without error, if you prefer you can opt-in to stricter parsing with: + +```csharp +Env.StrictMode = true; +``` + +Where it will fail fast and throw Exceptions on deserialization errors. + ## Custom Serialization Although JsonSerializer is optimized for serializing .NET POCO types, it still provides some options to change the convention-based serialization routine. From 3c8daf0923c07b80a163e3db57f05e8549ff65ab Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 13 Aug 2019 18:20:12 -0400 Subject: [PATCH 128/372] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f60aa455a..dbdb4ac4f 100644 --- a/README.md +++ b/README.md @@ -489,7 +489,7 @@ By default ServiceStack Serializers will try to deserialize as much as possible Env.StrictMode = true; ``` -Where it will fail fast and throw Exceptions on deserialization errors. +Where it will instead fail fast and throw Exceptions on deserialization errors. ## Custom Serialization From 4fb6cd65c4db1d6ba00b8cbdca8ff7603f49224b Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 17 Aug 2019 18:53:50 -0400 Subject: [PATCH 129/372] bump to v5.61 --- src/ServiceStack.Text/Env.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index aa20104e7..577ac6fea 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -104,7 +104,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.41m; + public static decimal ServiceStackVersion = 5.61m; public static bool IsLinux { get; set; } From 99b1a0b6d49437019dd0861be5e840da935dbc7d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 19 Aug 2019 15:37:10 -0400 Subject: [PATCH 130/372] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index dbdb4ac4f..19200ad3c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ -Follow [@ServiceStack](https://twitter.com/servicestack) or join the [Google+ Community](https://plus.google.com/communities/112445368900682590445) -for updates, or [StackOverflow](http://stackoverflow.com/questions/ask) or the [Customer Forums](https://forums.servicestack.net/) for support. +Follow [@ServiceStack](https://twitter.com/servicestack) or [view the docs](https://docs.servicestack.net), use [StackOverflow](http://stackoverflow.com/questions/ask) or the [Customer Forums](https://forums.servicestack.net/) for support. ## FREE high-perf Text Serializers and Core Utils powering [servicestack.net](https://servicestack.net) From 1dfebd96852a502d3c69c395009f55e832dba9bd Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 20 Aug 2019 11:23:47 -0400 Subject: [PATCH 131/372] ConvertTo should copy default values as well --- src/ServiceStack.Text/AutoMappingUtils.cs | 2 +- .../AutoMappingTests.cs | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index a6485d20e..1d15ef4f1 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -178,7 +178,7 @@ public static object ConvertTo(this object from, Type toType, bool skipConverter return strDict.ToObjectDictionary().FromObjectDictionary(toType); var to = toType.CreateInstance(); - return to.PopulateWithNonDefaultValues(from); + return to.PopulateWith(from); } public static MethodInfo GetImplicitCastMethod(Type fromType, Type toType) diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 5daed40e8..0b4886ea3 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -198,10 +198,37 @@ public class ModelWithIgnoredFields } public class ReadOnlyAttribute : AttributeBase { } + + [EnumAsInt] + public enum MyEnumAsInt + { + ZeroValue = 0, + OneValue = 1, + DefaultValue = 2, + }; + + class MyEnumAsIntSource + { + public MyEnumAsInt MyEnumAsInt { get; set; } = MyEnumAsInt.DefaultValue; + } + + class MyEnumAsIntTarget + { + public MyEnumAsInt MyEnumAsInt { get; set; } = MyEnumAsInt.DefaultValue; + } [TestFixture] public class AutoMappingTests { + [Test] + public void Can_convert_Default_Enum_Values() + { + var from = new MyEnumAsIntSource { MyEnumAsInt = MyEnumAsInt.ZeroValue }; + var to = from.ConvertTo(); + + Assert.That(to.MyEnumAsInt, Is.EqualTo(from.MyEnumAsInt)); + } + [Test] public void Does_populate() { From b0eb64631006bbe7ebecfb253c3a4a5a8e0e5916 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 20 Aug 2019 20:14:54 -0400 Subject: [PATCH 132/372] Update LicenseUtils.cs --- src/ServiceStack.Text/LicenseUtils.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ServiceStack.Text/LicenseUtils.cs b/src/ServiceStack.Text/LicenseUtils.cs index c1b93d0bb..0e6579f81 100644 --- a/src/ServiceStack.Text/LicenseUtils.cs +++ b/src/ServiceStack.Text/LicenseUtils.cs @@ -219,6 +219,11 @@ public static void RegisterLicense(string licenseKeyText) var key = VerifyLicenseKeyText(licenseKeyText); ValidateLicenseKey(key); } + catch (PlatformNotSupportedException pse) + { + // Allow usage in environments like dotnet script + __activatedLicense = new __ActivatedLicense(new LicenseKey { Type = LicenseType.Indie }); + } catch (Exception ex) { //bubble unrelated project Exceptions From 980ffee1f711f202e7576a8a3ebdc8b977cefeed Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 22 Aug 2019 14:11:17 -0400 Subject: [PATCH 133/372] Update StringExtensions.cs --- src/ServiceStack.Text/StringExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 9b8bed537..75d8e73b7 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -1153,7 +1153,7 @@ public static Dictionary ParseKeyValueText(this string text, stri var to = new Dictionary(); if (text == null) return to; - foreach (var parts in text.ReadLines().Select(line => line.SplitOnFirst(delimiter))) + foreach (var parts in text.ReadLines().Select(line => line.Trim().SplitOnFirst(delimiter))) { var key = parts[0].Trim(); if (key.Length == 0 || key.StartsWith("#")) continue; From 745383d959280c96690fa4dd4b75e4a02e892197 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 22 Aug 2019 14:26:12 -0400 Subject: [PATCH 134/372] Update StringExtensionsTests.cs --- tests/ServiceStack.Text.Tests/StringExtensionsTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs b/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs index 7df322481..9db4ca48c 100644 --- a/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs +++ b/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs @@ -301,7 +301,7 @@ public void Can_ParseKeyValueText() Assert.That("a".ParseKeyValueText().Count, Is.EqualTo(1)); Assert.That("a".ParseKeyValueText()["a"], Is.Null); Assert.That("a ".ParseKeyValueText().Count, Is.EqualTo(1)); - Assert.That("a ".ParseKeyValueText()["a"], Is.EqualTo("")); + Assert.That("a ".ParseKeyValueText()["a"], Is.Null); Assert.That("a b".ParseKeyValueText()["a"], Is.EqualTo("b")); Assert.That("a b c".ParseKeyValueText()["a"], Is.EqualTo("b c")); Assert.That("a b c ".ParseKeyValueText()["a"], Is.EqualTo("b c")); From 778ea9ee33178ace340f8c7bab01b252198337eb Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 23 Aug 2019 20:54:19 -0400 Subject: [PATCH 135/372] Update PclExport.NetStandard.cs --- src/ServiceStack.Text/PclExport.NetStandard.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/PclExport.NetStandard.cs b/src/ServiceStack.Text/PclExport.NetStandard.cs index c75e1b34c..966bfc9e8 100644 --- a/src/ServiceStack.Text/PclExport.NetStandard.cs +++ b/src/ServiceStack.Text/PclExport.NetStandard.cs @@ -162,7 +162,7 @@ public override void AddHeader(WebRequest webReq, string name, string value) public override Assembly[] GetAllAssemblies() { - return new Assembly[0]; + return AppDomain.CurrentDomain.GetAssemblies(); } public override string GetAssemblyCodeBase(Assembly assembly) From d211483da171ffb0c53a49d1a4073a34d9362d20 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 24 Aug 2019 17:46:41 -0400 Subject: [PATCH 136/372] Add ParseAsKeyValues to return KVP's --- src/ServiceStack.Text/StringExtensions.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 75d8e73b7..677f8c3d8 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -1163,6 +1163,21 @@ public static Dictionary ParseKeyValueText(this string text, stri return to; } + public static List> ParseAsKeyValues(this string text, string delimiter=" ") + { + var to = new List>(); + if (text == null) return to; + + foreach (var parts in text.ReadLines().Select(line => line.Trim().SplitOnFirst(delimiter))) + { + var key = parts[0].Trim(); + if (key.Length == 0 || key.StartsWith("#")) continue; + to.Add(new KeyValuePair(key, parts.Length == 2 ? parts[1].Trim() : null)); + } + + return to; + } + public static IEnumerable ReadLines(this string text) { string line; From aeb03f9bbfae1766304e5c17a161f629db5fb016 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 24 Aug 2019 23:01:40 -0400 Subject: [PATCH 137/372] cleanup --- src/ServiceStack.Text/AssemblyUtils.cs | 5 ++--- src/ServiceStack.Text/AutoMappingUtils.cs | 2 +- src/ServiceStack.Text/DateTimeExtensions.cs | 2 +- src/ServiceStack.Text/JsonObject.cs | 4 ++-- .../QueryStringSerializer.cs | 3 +-- .../RecyclableMemoryStream.cs | 2 +- .../ReflectionOptimizer.Emit.cs | 6 ++--- .../RuntimeSerializableAttribute.cs | 4 ++-- src/ServiceStack.Text/StringBuilderCache.cs | 2 +- src/ServiceStack.Text/StringExtensions.cs | 22 +++++++++---------- src/ServiceStack.Text/StringSpanExtensions.cs | 2 +- src/ServiceStack.Text/TaskUtils.cs | 3 +-- src/ServiceStack.Text/TypeProperties.cs | 2 +- 13 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/ServiceStack.Text/AssemblyUtils.cs b/src/ServiceStack.Text/AssemblyUtils.cs index 02208ef6d..e22e260e5 100644 --- a/src/ServiceStack.Text/AssemblyUtils.cs +++ b/src/ServiceStack.Text/AssemblyUtils.cs @@ -26,8 +26,7 @@ public static class AssemblyUtils /// public static Type FindType(string typeName) { - Type type = null; - if (TypeCache.TryGetValue(typeName, out type)) return type; + if (TypeCache.TryGetValue(typeName, out var type)) return type; type = Type.GetType(typeName); if (type == null) @@ -62,7 +61,7 @@ public static Type MainInterface() var interfaceType = t.GetInterfaces().FirstOrDefault(i => !t.GetInterfaces().Any(i2 => i2.GetInterfaces().Contains(i))); if (interfaceType != null) return interfaceType; } - return t; // not safe to use interface, as it might be a superclass's one. + return t; // not safe to use interface, as it might be a superclass one. } /// diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 1d15ef4f1..b9e7dafc9 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -374,7 +374,7 @@ public static object PopulateWith(object obj) private static object PopulateObjectInternal(object obj, Dictionary recursionInfo) { if (obj == null) return null; - if (obj is string) return obj; // prevents it from dropping into the char[] Chars property. Sheesh + if (obj is string) return obj; // prevents it from dropping into the char[] Chars property. var type = obj.GetType(); var members = type.GetPublicMembers(); diff --git a/src/ServiceStack.Text/DateTimeExtensions.cs b/src/ServiceStack.Text/DateTimeExtensions.cs index f564d04fd..a11dedb4d 100644 --- a/src/ServiceStack.Text/DateTimeExtensions.cs +++ b/src/ServiceStack.Text/DateTimeExtensions.cs @@ -17,7 +17,7 @@ namespace ServiceStack.Text { /// - /// A fast, standards-based, serialization-issue free DateTime serailizer. + /// A fast, standards-based, serialization-issue free DateTime serializer. /// public static class DateTimeExtensions { diff --git a/src/ServiceStack.Text/JsonObject.cs b/src/ServiceStack.Text/JsonObject.cs index 9367fafb0..6ff57e813 100644 --- a/src/ServiceStack.Text/JsonObject.cs +++ b/src/ServiceStack.Text/JsonObject.cs @@ -78,8 +78,8 @@ public class JsonObject : Dictionary /// public new string this[string key] { - get { return this.Get(key); } - set { base[key] = value; } + get => this.Get(key); + set => base[key] = value; } public static JsonObject Parse(string json) diff --git a/src/ServiceStack.Text/QueryStringSerializer.cs b/src/ServiceStack.Text/QueryStringSerializer.cs index 01de2f168..e990afd93 100644 --- a/src/ServiceStack.Text/QueryStringSerializer.cs +++ b/src/ServiceStack.Text/QueryStringSerializer.cs @@ -45,8 +45,7 @@ internal static WriteObjectDelegate GetWriteFn(Type type) { try { - WriteObjectDelegate writeFn; - if (WriteFnCache.TryGetValue(type, out writeFn)) return writeFn; + if (WriteFnCache.TryGetValue(type, out var writeFn)) return writeFn; var genericType = typeof(QueryStringWriter<>).MakeGenericType(type); var mi = genericType.GetStaticMethod("WriteFn"); diff --git a/src/ServiceStack.Text/RecyclableMemoryStream.cs b/src/ServiceStack.Text/RecyclableMemoryStream.cs index 685110634..2d89f8631 100644 --- a/src/ServiceStack.Text/RecyclableMemoryStream.cs +++ b/src/ServiceStack.Text/RecyclableMemoryStream.cs @@ -689,7 +689,7 @@ public MemoryStream GetStream(string tag, byte[] buffer, int offset, int count) /// buffers. /// /// - /// This class works in tandem with the RecylableMemoryStreamManager to supply MemoryStream + /// This class works in tandem with the RecyclableMemoryStreamManager to supply MemoryStream /// objects to callers, while avoiding these specific problems: /// 1. LOH allocations - since all large buffers are pooled, they will never incur a Gen2 GC /// 2. Memory waste - A standard memory stream doubles its size when it runs out of room. This diff --git a/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs b/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs index ac1efa794..0dacd49a8 100644 --- a/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs +++ b/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs @@ -247,9 +247,9 @@ public override bool IsDynamic(Assembly assembly) { try { - var isDyanmic = assembly is AssemblyBuilder - || string.IsNullOrEmpty(assembly.Location); - return isDyanmic; + var isDynamic = assembly is AssemblyBuilder + || string.IsNullOrEmpty(assembly.Location); + return isDynamic; } catch (NotSupportedException) { diff --git a/src/ServiceStack.Text/RuntimeSerializableAttribute.cs b/src/ServiceStack.Text/RuntimeSerializableAttribute.cs index 165653781..ccd155802 100644 --- a/src/ServiceStack.Text/RuntimeSerializableAttribute.cs +++ b/src/ServiceStack.Text/RuntimeSerializableAttribute.cs @@ -3,13 +3,13 @@ namespace ServiceStack.Text { /// - /// Allow Type to be deserialized into late-bould object Types using __type info + /// Allow Type to be deserialized into late-bound object Types using __type info /// [AttributeUsage(AttributeTargets.Class)] public class RuntimeSerializableAttribute : Attribute {} /// - /// Allow Type to be deserialized into late-bould object Types using __type info + /// Allow Type to be deserialized into late-bound object Types using __type info /// public interface IRuntimeSerializable { } } \ No newline at end of file diff --git a/src/ServiceStack.Text/StringBuilderCache.cs b/src/ServiceStack.Text/StringBuilderCache.cs index bfa501022..27d5712ea 100644 --- a/src/ServiceStack.Text/StringBuilderCache.cs +++ b/src/ServiceStack.Text/StringBuilderCache.cs @@ -67,7 +67,7 @@ public static string ReturnAndFree(StringBuilder sb) } } - //Use separate cache internally to avoid reallocations and cache misses + //Use separate cache internally to avoid re-allocations and cache misses internal static class StringBuilderThreadStatic { [ThreadStatic] diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 677f8c3d8..dc91662c7 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -38,19 +38,19 @@ public static string BaseConvert(this string source, int from, int to) var chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; var len = source.Length; if (len == 0) - throw new Exception(Format("Parameter: '{0}' is not valid integer (in base {1}).", source, from)); + throw new Exception($"Parameter: '{source}' is not valid integer (in base {@from})."); var minus = source[0] == '-' ? "-" : ""; var src = minus == "" ? source : source.Substring(1); len = src.Length; if (len == 0) - throw new Exception(Format("Parameter: '{0}' is not valid integer (in base {1}).", source, from)); + throw new Exception($"Parameter: '{source}' is not valid integer (in base {@from})."); var d = 0; for (int i = 0; i < len; i++) // Convert to decimal { int c = chars.IndexOf(src[i]); if (c >= from) - throw new Exception(Format("Parameter: '{0}' is not valid integer (in base {1}).", source, from)); + throw new Exception($"Parameter: '{source}' is not valid integer (in base {@from})."); d = d * from + c; } if (to == 10 || d == 0) @@ -227,7 +227,7 @@ public static string ToRot13(this string value) public static string WithTrailingSlash(this string path) { if (String.IsNullOrEmpty(path)) - throw new ArgumentNullException("path"); + throw new ArgumentNullException(nameof(path)); if (path[path.Length - 1] != '/') { @@ -650,22 +650,22 @@ public static string ExtractContents(this string fromText, string startAfter, st public static string ExtractContents(this string fromText, string uniqueMarker, string startAfter, string endAt) { if (String.IsNullOrEmpty(uniqueMarker)) - throw new ArgumentNullException("uniqueMarker"); + throw new ArgumentNullException(nameof(uniqueMarker)); if (String.IsNullOrEmpty(startAfter)) - throw new ArgumentNullException("startAfter"); + throw new ArgumentNullException(nameof(startAfter)); if (String.IsNullOrEmpty(endAt)) - throw new ArgumentNullException("endAt"); + throw new ArgumentNullException(nameof(endAt)); if (String.IsNullOrEmpty(fromText)) return null; - var markerPos = fromText.IndexOf(uniqueMarker); + var markerPos = fromText.IndexOf(uniqueMarker, StringComparison.Ordinal); if (markerPos == -1) return null; - var startPos = fromText.IndexOf(startAfter, markerPos); + var startPos = fromText.IndexOf(startAfter, markerPos, StringComparison.Ordinal); if (startPos == -1) return null; startPos += startAfter.Length; - var endPos = fromText.IndexOf(endAt, startPos); + var endPos = fromText.IndexOf(endAt, startPos, StringComparison.Ordinal); if (endPos == -1) endPos = fromText.Length; return fromText.Substring(startPos, endPos - startPos); @@ -881,7 +881,7 @@ public static string ToHttps(this string url) { if (url == null) { - throw new ArgumentNullException("url"); + throw new ArgumentNullException(nameof(url)); } return HttpRegex.Replace(url.Trim(), "https://"); } diff --git a/src/ServiceStack.Text/StringSpanExtensions.cs b/src/ServiceStack.Text/StringSpanExtensions.cs index 060e37d05..bb7d76555 100644 --- a/src/ServiceStack.Text/StringSpanExtensions.cs +++ b/src/ServiceStack.Text/StringSpanExtensions.cs @@ -15,7 +15,7 @@ namespace ServiceStack.Text public static class StringSpanExtensions { /// - /// Returns null if Length == 0, string.Empty if value[0] == NonWidthWhitespace, otherise returns value.ToString() + /// Returns null if Length == 0, string.Empty if value[0] == NonWidthWhitespace, otherwise returns value.ToString() /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string Value(this ReadOnlySpan value) => value.IsEmpty diff --git a/src/ServiceStack.Text/TaskUtils.cs b/src/ServiceStack.Text/TaskUtils.cs index 9a8dd4c3c..e67fd8093 100644 --- a/src/ServiceStack.Text/TaskUtils.cs +++ b/src/ServiceStack.Text/TaskUtils.cs @@ -149,8 +149,7 @@ static void StartNextIteration(TaskCompletionSource tcs, i++; - if (iterationTask != null) - iterationTask.ContinueWith(next, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default); + iterationTask?.ContinueWith(next, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default); } public static void Sleep(int timeMs) diff --git a/src/ServiceStack.Text/TypeProperties.cs b/src/ServiceStack.Text/TypeProperties.cs index 16d3258ec..05c12c760 100644 --- a/src/ServiceStack.Text/TypeProperties.cs +++ b/src/ServiceStack.Text/TypeProperties.cs @@ -68,7 +68,7 @@ public abstract class TypeProperties { static Dictionary CacheMap = new Dictionary(); - public static Type FactoryType = typeof(TypeProperties<>); + public static readonly Type FactoryType = typeof(TypeProperties<>); public static TypeProperties Get(Type type) { From fee0f6716111281f14939e9cb4bc0e72e18234c4 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 27 Aug 2019 14:40:28 -0400 Subject: [PATCH 138/372] Write sync to MemoryStream + switch to AsyncLocal in NETStd --- src/ServiceStack.Text/DefaultMemory.cs | 10 +++++++- src/ServiceStack.Text/JsConfigScope.cs | 29 ++++++++++++++++------- src/ServiceStack.Text/LicenseUtils.cs | 2 +- src/ServiceStack.Text/NetCoreMemory.cs | 9 ++++++- src/ServiceStack.Text/StreamExtensions.cs | 3 ++- 5 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/ServiceStack.Text/DefaultMemory.cs b/src/ServiceStack.Text/DefaultMemory.cs index 330bdd6e9..17d8afc6d 100644 --- a/src/ServiceStack.Text/DefaultMemory.cs +++ b/src/ServiceStack.Text/DefaultMemory.cs @@ -444,7 +444,15 @@ public override Task WriteAsync(Stream stream, ReadOnlyMemory value, Cance try { value.CopyTo(bytes); - return stream.WriteAsync(bytes, 0, value.Length, token); + if (stream is MemoryStream ms) + { + ms.Write(bytes, 0, value.Length); + return TypeConstants.EmptyTask; + } + else + { + return stream.WriteAsync(bytes, 0, value.Length, token); + } } finally { diff --git a/src/ServiceStack.Text/JsConfigScope.cs b/src/ServiceStack.Text/JsConfigScope.cs index 477e4db91..dbed75cd4 100644 --- a/src/ServiceStack.Text/JsConfigScope.cs +++ b/src/ServiceStack.Text/JsConfigScope.cs @@ -1,4 +1,5 @@ using System; +using System.Threading; using System.Collections.Generic; using ServiceStack.Text.Json; using ServiceStack.Text.Jsv; @@ -11,30 +12,42 @@ public sealed class JsConfigScope : Config, IDisposable bool disposed; readonly JsConfigScope parent; - [ThreadStatic] - private static JsConfigScope head; +#if NETSTANDARD2_0 + private static AsyncLocal head = new AsyncLocal(); +#else + [ThreadStatic] private static JsConfigScope head; +#endif internal JsConfigScope() { PclExport.Instance.BeginThreadAffinity(); +#if NETSTANDARD2_0 + parent = head.Value; + head.Value = this; +#else parent = head; head = this; +#endif } - internal static JsConfigScope Current => head; - - public static void DisposeCurrent() - { - head?.Dispose(); - } + internal static JsConfigScope Current => +#if NETSTANDARD2_0 + head.Value; +#else + head; +#endif public void Dispose() { if (!disposed) { disposed = true; +#if NETSTANDARD2_0 + head.Value = parent; +#else head = parent; +#endif PclExport.Instance.EndThreadAffinity(); } diff --git a/src/ServiceStack.Text/LicenseUtils.cs b/src/ServiceStack.Text/LicenseUtils.cs index 0e6579f81..315cc44ec 100644 --- a/src/ServiceStack.Text/LicenseUtils.cs +++ b/src/ServiceStack.Text/LicenseUtils.cs @@ -219,7 +219,7 @@ public static void RegisterLicense(string licenseKeyText) var key = VerifyLicenseKeyText(licenseKeyText); ValidateLicenseKey(key); } - catch (PlatformNotSupportedException pse) + catch (PlatformNotSupportedException) { // Allow usage in environments like dotnet script __activatedLicense = new __ActivatedLicense(new LicenseKey { Type = LicenseType.Indie }); diff --git a/src/ServiceStack.Text/NetCoreMemory.cs b/src/ServiceStack.Text/NetCoreMemory.cs index 47b785f9f..c28557695 100644 --- a/src/ServiceStack.Text/NetCoreMemory.cs +++ b/src/ServiceStack.Text/NetCoreMemory.cs @@ -107,7 +107,14 @@ public override Task WriteAsync(Stream stream, ReadOnlySpan value, Cancell public override async Task WriteAsync(Stream stream, ReadOnlyMemory value, CancellationToken token = default) { - await stream.WriteAsync(value, token); + if (stream is MemoryStream ms) + { + ms.Write(value.Span); + } + else + { + await stream.WriteAsync(value, token); + } } public override object Deserialize(Stream stream, Type type, DeserializeStringSpanDelegate deserializer) diff --git a/src/ServiceStack.Text/StreamExtensions.cs b/src/ServiceStack.Text/StreamExtensions.cs index 41620cc14..7ffd2b70a 100644 --- a/src/ServiceStack.Text/StreamExtensions.cs +++ b/src/ServiceStack.Text/StreamExtensions.cs @@ -317,7 +317,8 @@ public static Task WriteAsync(this Stream stream, ReadOnlyMemory value, Ca MemoryProvider.Instance.WriteAsync(stream, value, token); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Task WriteAsync(this Stream stream, byte[] bytes, CancellationToken token = default) => stream.WriteAsync(bytes, 0, bytes.Length, token); + public static Task WriteAsync(this Stream stream, byte[] bytes, CancellationToken token = default) => + MemoryProvider.Instance.WriteAsync(stream, bytes, token); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Task CopyToAsync(this Stream input, Stream output, CancellationToken token = default) => input.CopyToAsync(output, AsyncBufferSize, token); From 923e66623d5573367a72a441e886926b990a482a Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 28 Aug 2019 09:38:16 -0400 Subject: [PATCH 139/372] Fix ReplaceAll --- src/ServiceStack.Text/StringExtensions.cs | 5 +++-- tests/ServiceStack.Text.Tests/StringExtensionsTests.cs | 7 +++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index dc91662c7..652f63d17 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -913,8 +913,9 @@ public static string ReplaceAll(this string haystack, string needle, string repl { int pos; // Avoid a possible infinite loop - if (needle == replacement) return haystack; - while ((pos = haystack.IndexOf(needle, StringComparison.Ordinal)) > 0) + if (needle == replacement) + return haystack; + while ((pos = haystack.IndexOf(needle, StringComparison.Ordinal)) >= 0) { haystack = haystack.Substring(0, pos) + replacement diff --git a/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs b/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs index 9db4ca48c..67397f212 100644 --- a/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs +++ b/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs @@ -355,5 +355,12 @@ public void Does_ContainsAny_Return_CaseInsensitive_Matches() Assert.That(input.ContainsAny(testMatches, StringComparison.OrdinalIgnoreCase)); } + + [Test] + public void Does_ReplaceAll_from_Start() + { + Assert.That("/images".ReplaceAll("/",""), Is.EqualTo("images")); + } + } } From 112e7d51f8ccdbaba545dec03525e55dba27daa9 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 1 Sep 2019 18:18:16 -0400 Subject: [PATCH 140/372] Fix TimeSpan.MinValue overflow --- .../Support/TimeSpanConverter.cs | 2 +- .../Issues/StackOverflowIssues.cs | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 tests/ServiceStack.Text.Tests/Issues/StackOverflowIssues.cs diff --git a/src/ServiceStack.Text/Support/TimeSpanConverter.cs b/src/ServiceStack.Text/Support/TimeSpanConverter.cs index f11a9f511..ee5a918c4 100644 --- a/src/ServiceStack.Text/Support/TimeSpanConverter.cs +++ b/src/ServiceStack.Text/Support/TimeSpanConverter.cs @@ -12,7 +12,7 @@ public static string ToXsdDuration(TimeSpan timeSpan) sb.Append(timeSpan.Ticks < 0 ? "-P" : "P"); - double ticks = Math.Abs(timeSpan.Ticks); + double ticks = timeSpan.Ticks > 0 ? timeSpan.Ticks : timeSpan.Ticks * -1L; double totalSeconds = ticks / TimeSpan.TicksPerSecond; long wholeSeconds = (long) totalSeconds; long seconds = wholeSeconds; diff --git a/tests/ServiceStack.Text.Tests/Issues/StackOverflowIssues.cs b/tests/ServiceStack.Text.Tests/Issues/StackOverflowIssues.cs new file mode 100644 index 000000000..a17922e97 --- /dev/null +++ b/tests/ServiceStack.Text.Tests/Issues/StackOverflowIssues.cs @@ -0,0 +1,24 @@ +using System; +using NUnit.Framework; + +namespace ServiceStack.Text.Tests.Issues +{ + public class StackOverflowIssues + { + public class MinTypes + { + public TimeSpan TimeSpan { get; set; } + } + + [Test] + public void Can_convert_min_TimeSpan() + { + var c1 = new MinTypes { + TimeSpan = TimeSpan.MinValue, + }; + var json = JsonSerializer.SerializeToString(c1, typeof(MinTypes)); + var dto = JsonSerializer.SerializeToString(c1, typeof(MinTypes)); + Assert.That(json, Is.EqualTo(dto)); + } + } +} \ No newline at end of file From e0b9860a8a0720ae12f23fe3539eab7710f0447d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 1 Sep 2019 19:43:55 -0400 Subject: [PATCH 141/372] Fix Min/Max DateTimeOffset/TimeSpan precision issues --- .../Common/DateTimeSerializer.cs | 10 ++- .../Support/TimeSpanConverter.cs | 18 +++++- .../Issues/SerializationPrecisionIssues.cs | 62 +++++++++++++++++++ .../Issues/StackOverflowIssues.cs | 24 ------- 4 files changed, 88 insertions(+), 26 deletions(-) create mode 100644 tests/ServiceStack.Text.Tests/Issues/SerializationPrecisionIssues.cs delete mode 100644 tests/ServiceStack.Text.Tests/Issues/StackOverflowIssues.cs diff --git a/src/ServiceStack.Text/Common/DateTimeSerializer.cs b/src/ServiceStack.Text/Common/DateTimeSerializer.cs index 7c03f500c..44c1c718e 100644 --- a/src/ServiceStack.Text/Common/DateTimeSerializer.cs +++ b/src/ServiceStack.Text/Common/DateTimeSerializer.cs @@ -487,6 +487,9 @@ public static string ToShortestXsdDateTimeString(DateTime dateTime) static readonly char[] TimeZoneChars = new[] { '+', '-' }; + private const string MinDateTimeOffsetWcfValue = "\\/Date(-62135596800000)\\/"; + private const string MaxDateTimeOffsetWcfValue = "\\/Date(253402300799999)\\/"; + /// /// WCF Json format: /Date(unixts+0000)/ /// @@ -494,6 +497,11 @@ public static string ToShortestXsdDateTimeString(DateTime dateTime) /// public static DateTimeOffset ParseWcfJsonDateOffset(string wcfJsonDate) { + if (wcfJsonDate == MinDateTimeOffsetWcfValue) + return DateTimeOffset.MinValue; + if (wcfJsonDate == MaxDateTimeOffsetWcfValue) + return DateTimeOffset.MaxValue; + if (wcfJsonDate[0] == '\\') { wcfJsonDate = wcfJsonDate.Substring(1); @@ -655,7 +663,7 @@ public static string ToWcfJsonDate(DateTime dateTime) return StringBuilderThreadStatic.ReturnAndFree(sb); } } - + public static void WriteWcfJsonDateTimeOffset(TextWriter writer, DateTimeOffset dateTimeOffset) { if (JsConfig.DateHandler == DateHandler.ISO8601) diff --git a/src/ServiceStack.Text/Support/TimeSpanConverter.cs b/src/ServiceStack.Text/Support/TimeSpanConverter.cs index ee5a918c4..940a9fcf8 100644 --- a/src/ServiceStack.Text/Support/TimeSpanConverter.cs +++ b/src/ServiceStack.Text/Support/TimeSpanConverter.cs @@ -6,13 +6,24 @@ namespace ServiceStack.Text.Support { public class TimeSpanConverter { + private const string MinSerializedValue = "-P10675199DT2H48M5.4775391S"; + private const string MaxSerializedValue = "P10675199DT2H48M5.4775391S"; + public static string ToXsdDuration(TimeSpan timeSpan) { + if (timeSpan == TimeSpan.MinValue) + return MinSerializedValue; + if (timeSpan == TimeSpan.MaxValue) + return MaxSerializedValue; + var sb = StringBuilderThreadStatic.Allocate(); sb.Append(timeSpan.Ticks < 0 ? "-P" : "P"); - double ticks = timeSpan.Ticks > 0 ? timeSpan.Ticks : timeSpan.Ticks * -1L; + double ticks = timeSpan.Ticks; + if (ticks < 0) + ticks = -ticks; + double totalSeconds = ticks / TimeSpan.TicksPerSecond; long wholeSeconds = (long) totalSeconds; long seconds = wholeSeconds; @@ -51,6 +62,11 @@ public static string ToXsdDuration(TimeSpan timeSpan) public static TimeSpan FromXsdDuration(string xsdDuration) { + if (xsdDuration == MinSerializedValue) + return TimeSpan.MinValue; + if (xsdDuration == MaxSerializedValue) + return TimeSpan.MaxValue; + long days = 0; long hours = 0; long minutes = 0; diff --git a/tests/ServiceStack.Text.Tests/Issues/SerializationPrecisionIssues.cs b/tests/ServiceStack.Text.Tests/Issues/SerializationPrecisionIssues.cs new file mode 100644 index 000000000..cdafc371c --- /dev/null +++ b/tests/ServiceStack.Text.Tests/Issues/SerializationPrecisionIssues.cs @@ -0,0 +1,62 @@ +using System; +using NUnit.Framework; + +namespace ServiceStack.Text.Tests.Issues +{ + public class SerializationPrecisionIssues + { + public class TimeSpanWrapper + { + public TimeSpan TimeSpan { get; set; } + } + + [Test] + public void Can_convert_min_TimeSpan() + { + var dto = new TimeSpanWrapper { + TimeSpan = TimeSpan.MinValue, + }; + var json = JsonSerializer.SerializeToString(dto, typeof(TimeSpanWrapper)); + var fromJson = JsonSerializer.DeserializeFromString(json); + Assert.That(fromJson.TimeSpan, Is.EqualTo(dto.TimeSpan)); + } + + [Test] + public void Can_convert_max_TimeSpan() + { + var dto = new TimeSpanWrapper { + TimeSpan = TimeSpan.MaxValue, + }; + var json = JsonSerializer.SerializeToString(dto, typeof(TimeSpanWrapper)); + var fromJson = JsonSerializer.DeserializeFromString(json); + Assert.That(fromJson.TimeSpan, Is.EqualTo(dto.TimeSpan)); + } + + class DateTimeOffsetWrapper + { + public DateTimeOffset DateTimeOffset { get; set; } + } + + [Test] + public void Can_convert_min_DateTimeOffset() + { + var dto = new DateTimeOffsetWrapper { + DateTimeOffset = DateTimeOffset.MinValue, + }; + var json = JsonSerializer.SerializeToString(dto, typeof(DateTimeOffsetWrapper)); + var fromJson = JsonSerializer.DeserializeFromString(json); + Assert.That(fromJson.DateTimeOffset, Is.EqualTo(dto.DateTimeOffset)); + } + + [Test] + public void Can_convert_max_DateTimeOffset() + { + var dto = new DateTimeOffsetWrapper { + DateTimeOffset = DateTimeOffset.MaxValue, + }; + var json = JsonSerializer.SerializeToString(dto, typeof(DateTimeOffsetWrapper)); + var fromJson = JsonSerializer.DeserializeFromString(json); + Assert.That(fromJson.DateTimeOffset, Is.EqualTo(dto.DateTimeOffset)); + } + } +} \ No newline at end of file diff --git a/tests/ServiceStack.Text.Tests/Issues/StackOverflowIssues.cs b/tests/ServiceStack.Text.Tests/Issues/StackOverflowIssues.cs deleted file mode 100644 index a17922e97..000000000 --- a/tests/ServiceStack.Text.Tests/Issues/StackOverflowIssues.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using NUnit.Framework; - -namespace ServiceStack.Text.Tests.Issues -{ - public class StackOverflowIssues - { - public class MinTypes - { - public TimeSpan TimeSpan { get; set; } - } - - [Test] - public void Can_convert_min_TimeSpan() - { - var c1 = new MinTypes { - TimeSpan = TimeSpan.MinValue, - }; - var json = JsonSerializer.SerializeToString(c1, typeof(MinTypes)); - var dto = JsonSerializer.SerializeToString(c1, typeof(MinTypes)); - Assert.That(json, Is.EqualTo(dto)); - } - } -} \ No newline at end of file From 659d17d9973c83642a137dd76294a230af28b925 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 5 Sep 2019 01:03:47 -0400 Subject: [PATCH 142/372] Add compareTo to DynamicNumber --- src/ServiceStack.Text/DynamicNumber.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/ServiceStack.Text/DynamicNumber.cs b/src/ServiceStack.Text/DynamicNumber.cs index f119c4f22..9ccde7581 100644 --- a/src/ServiceStack.Text/DynamicNumber.cs +++ b/src/ServiceStack.Text/DynamicNumber.cs @@ -22,6 +22,7 @@ public interface IDynamicNumber object mod(object lhs, object rhs); object pow(object lhs, object rhs); object log(object lhs, object rhs); + int compareTo(object lhs, object rhs); object bitwiseAnd(object lhs, object rhs); object bitwiseOr(object lhs, object rhs); @@ -63,6 +64,7 @@ public bool TryParse(string str, out object result) public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); + public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); public object bitwiseAnd(object lhs, object rhs) => Convert(lhs) & Convert(rhs); public object bitwiseOr(object lhs, object rhs) => Convert(lhs) | Convert(rhs); @@ -104,6 +106,7 @@ public bool TryParse(string str, out object result) public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); + public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); public object bitwiseAnd(object lhs, object rhs) => Convert(lhs) & Convert(rhs); public object bitwiseOr(object lhs, object rhs) => Convert(lhs) | Convert(rhs); @@ -145,6 +148,7 @@ public bool TryParse(string str, out object result) public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); + public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); public object bitwiseAnd(object lhs, object rhs) => Convert(lhs) & Convert(rhs); public object bitwiseOr(object lhs, object rhs) => Convert(lhs) | Convert(rhs); @@ -186,6 +190,7 @@ public bool TryParse(string str, out object result) public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); + public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); public object bitwiseAnd(object lhs, object rhs) => Convert(lhs) & Convert(rhs); public object bitwiseOr(object lhs, object rhs) => Convert(lhs) | Convert(rhs); @@ -227,6 +232,7 @@ public bool TryParse(string str, out object result) public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); + public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); public object bitwiseAnd(object lhs, object rhs) => Convert(lhs) & Convert(rhs); public object bitwiseOr(object lhs, object rhs) => Convert(lhs) | Convert(rhs); @@ -268,6 +274,7 @@ public bool TryParse(string str, out object result) public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); + public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); public object bitwiseAnd(object lhs, object rhs) => Convert(lhs) & Convert(rhs); public object bitwiseOr(object lhs, object rhs) => Convert(lhs) | Convert(rhs); @@ -309,6 +316,7 @@ public bool TryParse(string str, out object result) public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); + public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); public object bitwiseAnd(object lhs, object rhs) => Convert(lhs) & Convert(rhs); public object bitwiseOr(object lhs, object rhs) => Convert(lhs) | Convert(rhs); @@ -350,6 +358,7 @@ public bool TryParse(string str, out object result) public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); + public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); public object bitwiseAnd(object lhs, object rhs) => Convert(lhs) & Convert(rhs); public object bitwiseOr(object lhs, object rhs) => Convert(lhs) | Convert(rhs); @@ -391,6 +400,7 @@ public bool TryParse(string str, out object result) public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); + public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); public object bitwiseAnd(object lhs, object rhs) => throw new NotSupportedException("Bitwise operators only supported on integer types"); public object bitwiseOr(object lhs, object rhs) => throw new NotSupportedException("Bitwise operators only supported on integer types"); @@ -432,6 +442,7 @@ public bool TryParse(string str, out object result) public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); + public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); public object bitwiseAnd(object lhs, object rhs) => throw new NotSupportedException("Bitwise operators only supported on integer types"); public object bitwiseOr(object lhs, object rhs) => throw new NotSupportedException("Bitwise operators only supported on integer types"); @@ -473,6 +484,7 @@ public bool TryParse(string str, out object result) public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); public object pow(object lhs, object rhs) => Math.Pow((double) Convert(lhs), (double) Convert(rhs)); public object log(object lhs, object rhs) => Math.Log((double) Convert(lhs), (double) Convert(rhs)); + public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); public object bitwiseAnd(object lhs, object rhs) => throw new NotSupportedException("Bitwise operators only supported on integer types"); public object bitwiseOr(object lhs, object rhs) => throw new NotSupportedException("Bitwise operators only supported on integer types"); @@ -629,6 +641,9 @@ public static IDynamicNumber AssertNumbers(string name, object lhs, object rhs) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static object Log(object lhs, object rhs) => AssertNumbers(nameof(Log), lhs, rhs).log(lhs, rhs); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static object CompareTo(object lhs, object rhs) => AssertNumbers(nameof(CompareTo), lhs, rhs).compareTo(lhs, rhs); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static object BitwiseAnd(object lhs, object rhs) => AssertNumbers(nameof(BitwiseAnd), lhs, rhs).bitwiseAnd(lhs, rhs); From 88d1ad6c9435371a2a53041640f62922e2b14d38 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 5 Sep 2019 01:24:07 -0400 Subject: [PATCH 143/372] Update DynamicNumber.cs --- src/ServiceStack.Text/DynamicNumber.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/DynamicNumber.cs b/src/ServiceStack.Text/DynamicNumber.cs index 9ccde7581..0bfb2b918 100644 --- a/src/ServiceStack.Text/DynamicNumber.cs +++ b/src/ServiceStack.Text/DynamicNumber.cs @@ -642,7 +642,7 @@ public static IDynamicNumber AssertNumbers(string name, object lhs, object rhs) public static object Log(object lhs, object rhs) => AssertNumbers(nameof(Log), lhs, rhs).log(lhs, rhs); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static object CompareTo(object lhs, object rhs) => AssertNumbers(nameof(CompareTo), lhs, rhs).compareTo(lhs, rhs); + public static int CompareTo(object lhs, object rhs) => AssertNumbers(nameof(CompareTo), lhs, rhs).compareTo(lhs, rhs); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static object BitwiseAnd(object lhs, object rhs) => AssertNumbers(nameof(BitwiseAnd), lhs, rhs).bitwiseAnd(lhs, rhs); From a3445e6b71734bd8648d4456fbf160338d7d2bcd Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 5 Sep 2019 03:58:09 -0400 Subject: [PATCH 144/372] does validate single digit numbers --- src/ServiceStack.Text/DynamicNumber.cs | 2 +- tests/ServiceStack.Text.Tests/DynamicNumberTests.cs | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/DynamicNumber.cs b/src/ServiceStack.Text/DynamicNumber.cs index 0bfb2b918..e662bff27 100644 --- a/src/ServiceStack.Text/DynamicNumber.cs +++ b/src/ServiceStack.Text/DynamicNumber.cs @@ -674,7 +674,7 @@ public static bool TryParse(string strValue, out object result) if (strValue.Length == 1) { int singleDigit = strValue[0]; - if (singleDigit >= 48 || singleDigit <= 57) // 0 - 9 + if (singleDigit >= 48 && singleDigit <= 57) // 0 - 9 { result = singleDigit - 48; // 0 return true; diff --git a/tests/ServiceStack.Text.Tests/DynamicNumberTests.cs b/tests/ServiceStack.Text.Tests/DynamicNumberTests.cs index 61fb8f8ba..8cc1ba5a9 100644 --- a/tests/ServiceStack.Text.Tests/DynamicNumberTests.cs +++ b/tests/ServiceStack.Text.Tests/DynamicNumberTests.cs @@ -203,5 +203,13 @@ public void Can_get_Nullable_number() Assert.That(number.ToString(null1), Is.EqualTo("1")); } + [Test] + public void Can_text_for_numbers() + { + object x = null; + Assert.That(DynamicNumber.TryParse("(", out x), Is.False); + } + + } } \ No newline at end of file From ed4a23662c721be107454244a340d665c2fa914f Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 5 Sep 2019 15:54:27 -0400 Subject: [PATCH 145/372] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 19200ad3c..d93f63c5c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ Follow [@ServiceStack](https://twitter.com/servicestack) or [view the docs](https://docs.servicestack.net), use [StackOverflow](http://stackoverflow.com/questions/ask) or the [Customer Forums](https://forums.servicestack.net/) for support. -## FREE high-perf Text Serializers and Core Utils powering [servicestack.net](https://servicestack.net) +## [FREE high-perf Text Serializers](https://docs.servicestack.net/releases/v4.0.62#servicestacktext-is-now-free) and Core Utils powering [servicestack.net](https://servicestack.net) ServiceStack.Text is an **independent, dependency-free** serialization library containing ServiceStack's core high-performance utils and text processing functionality, including: From 4a2407e7b53773cba3c76e50bccde3a960d91015 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 6 Sep 2019 15:02:40 -0400 Subject: [PATCH 146/372] fix single digits test --- src/ServiceStack.Text/DynamicNumber.cs | 3 ++- tests/ServiceStack.Text.Tests/DynamicNumberTests.cs | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/DynamicNumber.cs b/src/ServiceStack.Text/DynamicNumber.cs index e662bff27..b6105089b 100644 --- a/src/ServiceStack.Text/DynamicNumber.cs +++ b/src/ServiceStack.Text/DynamicNumber.cs @@ -674,11 +674,12 @@ public static bool TryParse(string strValue, out object result) if (strValue.Length == 1) { int singleDigit = strValue[0]; - if (singleDigit >= 48 && singleDigit <= 57) // 0 - 9 + if (singleDigit >= '0' && singleDigit <= '9') { result = singleDigit - 48; // 0 return true; } + return false; } var hasDecimal = strValue.IndexOf('.') >= 0; diff --git a/tests/ServiceStack.Text.Tests/DynamicNumberTests.cs b/tests/ServiceStack.Text.Tests/DynamicNumberTests.cs index 8cc1ba5a9..0bf524e75 100644 --- a/tests/ServiceStack.Text.Tests/DynamicNumberTests.cs +++ b/tests/ServiceStack.Text.Tests/DynamicNumberTests.cs @@ -208,6 +208,7 @@ public void Can_text_for_numbers() { object x = null; Assert.That(DynamicNumber.TryParse("(", out x), Is.False); + Assert.That(DynamicNumber.TryParse("-", out x), Is.False); } From b7a1c3c7a008d1da5fb204b6f765ac71921879d8 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 16 Sep 2019 00:50:19 -0400 Subject: [PATCH 147/372] Add Min/Max to dynamic number --- src/ServiceStack.Text/DynamicNumber.cs | 30 ++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/ServiceStack.Text/DynamicNumber.cs b/src/ServiceStack.Text/DynamicNumber.cs index b6105089b..33a637061 100644 --- a/src/ServiceStack.Text/DynamicNumber.cs +++ b/src/ServiceStack.Text/DynamicNumber.cs @@ -22,6 +22,8 @@ public interface IDynamicNumber object mod(object lhs, object rhs); object pow(object lhs, object rhs); object log(object lhs, object rhs); + object min(object lhs, object rhs); + object max(object lhs, object rhs); int compareTo(object lhs, object rhs); object bitwiseAnd(object lhs, object rhs); @@ -62,6 +64,8 @@ public bool TryParse(string str, out object result) public object mul(object lhs, object rhs) => Convert(lhs) * Convert(rhs); public object div(object lhs, object rhs) => Convert(lhs) / Convert(rhs); public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); + public object min(object lhs, object rhs) => Math.Min(Convert(lhs), Convert(rhs)); + public object max(object lhs, object rhs) => Math.Max(Convert(lhs), Convert(rhs)); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); @@ -104,6 +108,8 @@ public bool TryParse(string str, out object result) public object mul(object lhs, object rhs) => Convert(lhs) * Convert(rhs); public object div(object lhs, object rhs) => Convert(lhs) / Convert(rhs); public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); + public object min(object lhs, object rhs) => Math.Min(Convert(lhs), Convert(rhs)); + public object max(object lhs, object rhs) => Math.Max(Convert(lhs), Convert(rhs)); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); @@ -146,6 +152,8 @@ public bool TryParse(string str, out object result) public object mul(object lhs, object rhs) => Convert(lhs) * Convert(rhs); public object div(object lhs, object rhs) => Convert(lhs) / Convert(rhs); public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); + public object min(object lhs, object rhs) => Math.Min(Convert(lhs), Convert(rhs)); + public object max(object lhs, object rhs) => Math.Max(Convert(lhs), Convert(rhs)); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); @@ -188,6 +196,8 @@ public bool TryParse(string str, out object result) public object mul(object lhs, object rhs) => Convert(lhs) * Convert(rhs); public object div(object lhs, object rhs) => Convert(lhs) / Convert(rhs); public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); + public object min(object lhs, object rhs) => Math.Min(Convert(lhs), Convert(rhs)); + public object max(object lhs, object rhs) => Math.Max(Convert(lhs), Convert(rhs)); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); @@ -230,6 +240,8 @@ public bool TryParse(string str, out object result) public object mul(object lhs, object rhs) => Convert(lhs) * Convert(rhs); public object div(object lhs, object rhs) => Convert(lhs) / Convert(rhs); public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); + public object min(object lhs, object rhs) => Math.Min(Convert(lhs), Convert(rhs)); + public object max(object lhs, object rhs) => Math.Max(Convert(lhs), Convert(rhs)); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); @@ -272,6 +284,8 @@ public bool TryParse(string str, out object result) public object mul(object lhs, object rhs) => Convert(lhs) * Convert(rhs); public object div(object lhs, object rhs) => Convert(lhs) / Convert(rhs); public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); + public object min(object lhs, object rhs) => Math.Min(Convert(lhs), Convert(rhs)); + public object max(object lhs, object rhs) => Math.Max(Convert(lhs), Convert(rhs)); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); @@ -314,6 +328,8 @@ public bool TryParse(string str, out object result) public object mul(object lhs, object rhs) => Convert(lhs) * Convert(rhs); public object div(object lhs, object rhs) => Convert(lhs) / Convert(rhs); public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); + public object min(object lhs, object rhs) => Math.Min(Convert(lhs), Convert(rhs)); + public object max(object lhs, object rhs) => Math.Max(Convert(lhs), Convert(rhs)); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); @@ -356,6 +372,8 @@ public bool TryParse(string str, out object result) public object mul(object lhs, object rhs) => Convert(lhs) * Convert(rhs); public object div(object lhs, object rhs) => Convert(lhs) / Convert(rhs); public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); + public object min(object lhs, object rhs) => Math.Min(Convert(lhs), Convert(rhs)); + public object max(object lhs, object rhs) => Math.Max(Convert(lhs), Convert(rhs)); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); @@ -398,6 +416,8 @@ public bool TryParse(string str, out object result) public object mul(object lhs, object rhs) => Convert(lhs) * Convert(rhs); public object div(object lhs, object rhs) => Convert(lhs) / Convert(rhs); public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); + public object min(object lhs, object rhs) => Math.Min(Convert(lhs), Convert(rhs)); + public object max(object lhs, object rhs) => Math.Max(Convert(lhs), Convert(rhs)); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); @@ -440,6 +460,8 @@ public bool TryParse(string str, out object result) public object mul(object lhs, object rhs) => Convert(lhs) * Convert(rhs); public object div(object lhs, object rhs) => Convert(lhs) / Convert(rhs); public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); + public object min(object lhs, object rhs) => Math.Min(Convert(lhs), Convert(rhs)); + public object max(object lhs, object rhs) => Math.Max(Convert(lhs), Convert(rhs)); public object pow(object lhs, object rhs) => Math.Pow(Convert(lhs), Convert(rhs)); public object log(object lhs, object rhs) => Math.Log(Convert(lhs), Convert(rhs)); public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); @@ -482,6 +504,8 @@ public bool TryParse(string str, out object result) public object mul(object lhs, object rhs) => Convert(lhs) * Convert(rhs); public object div(object lhs, object rhs) => Convert(lhs) / Convert(rhs); public object mod(object lhs, object rhs) => Convert(lhs) % Convert(rhs); + public object min(object lhs, object rhs) => Math.Min(Convert(lhs), Convert(rhs)); + public object max(object lhs, object rhs) => Math.Max(Convert(lhs), Convert(rhs)); public object pow(object lhs, object rhs) => Math.Pow((double) Convert(lhs), (double) Convert(rhs)); public object log(object lhs, object rhs) => Math.Log((double) Convert(lhs), (double) Convert(rhs)); public int compareTo(object lhs, object rhs) => Convert(lhs).CompareTo(Convert(rhs)); @@ -635,6 +659,12 @@ public static IDynamicNumber AssertNumbers(string name, object lhs, object rhs) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static object Mod(object lhs, object rhs) => AssertNumbers(nameof(Mod), lhs, rhs).mod(lhs, rhs); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static object Min(object lhs, object rhs) => AssertNumbers(nameof(Min), lhs, rhs).min(lhs, rhs); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static object Max(object lhs, object rhs) => AssertNumbers(nameof(Max), lhs, rhs).max(lhs, rhs); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static object Pow(object lhs, object rhs) => AssertNumbers(nameof(Pow), lhs, rhs).pow(lhs, rhs); From 67ffcf88acd92710c72c2361d762c800d1907e07 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 16 Sep 2019 18:04:27 -0400 Subject: [PATCH 148/372] Add MemoryProvider Stream Write overloads --- src/ServiceStack.Memory/NetCoreMemory.cs | 208 ------------------ .../ServiceStack.Memory.csproj | 5 + src/ServiceStack.Text/DefaultMemory.cs | 42 +++- src/ServiceStack.Text/MemoryProvider.cs | 7 +- src/ServiceStack.Text/NetCoreMemory.cs | 35 ++- 5 files changed, 77 insertions(+), 220 deletions(-) delete mode 100644 src/ServiceStack.Memory/NetCoreMemory.cs diff --git a/src/ServiceStack.Memory/NetCoreMemory.cs b/src/ServiceStack.Memory/NetCoreMemory.cs deleted file mode 100644 index ea65642c2..000000000 --- a/src/ServiceStack.Memory/NetCoreMemory.cs +++ /dev/null @@ -1,208 +0,0 @@ -#if NETCORE2_1 - -using System; -using System.Buffers.Text; -using System.Globalization; -using System.IO; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using ServiceStack.Text; -using ServiceStack.Text.Common; -using ServiceStack.Text.Pools; - -namespace ServiceStack.Memory -{ - public sealed class NetCoreMemory : MemoryProvider - { - private static NetCoreMemory provider; - public static NetCoreMemory Provider => provider ?? (provider = new NetCoreMemory()); - private NetCoreMemory() { } - - public static void Configure() => Instance = Provider; - - public override bool ParseBoolean(ReadOnlySpan value) => bool.Parse(value); - - public override bool TryParseBoolean(ReadOnlySpan value, out bool result) => - bool.TryParse(value, out result); - - public override bool TryParseDecimal(ReadOnlySpan value, out decimal result) => - decimal.TryParse(value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out result); - - public override decimal ParseDecimal(ReadOnlySpan value, bool allowThousands) => - decimal.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture); - - public override bool TryParseFloat(ReadOnlySpan value, out float result) => - float.TryParse(value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out result); - - public override bool TryParseDouble(ReadOnlySpan value, out double result) => - double.TryParse(value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out result); - - public override decimal ParseDecimal(ReadOnlySpan value) => - decimal.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture); - - public override float ParseFloat(ReadOnlySpan value) => - float.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture); - - public override double ParseDouble(ReadOnlySpan value) => - double.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture); - - public override sbyte ParseSByte(ReadOnlySpan value) => sbyte.Parse(value); - - public override byte ParseByte(ReadOnlySpan value) => byte.Parse(value); - - public override short ParseInt16(ReadOnlySpan value) => short.Parse(value); - - public override ushort ParseUInt16(ReadOnlySpan value) => ushort.Parse(value); - - public override int ParseInt32(ReadOnlySpan value) => int.Parse(value); - - public override uint ParseUInt32(ReadOnlySpan value) => uint.Parse(value); - - public override uint ParseUInt32(ReadOnlySpan value, NumberStyles style) => uint.Parse(value.ToString(), NumberStyles.HexNumber); - - public override long ParseInt64(ReadOnlySpan value) => long.Parse(value); - - public override ulong ParseUInt64(ReadOnlySpan value) => ulong.Parse(value); - - public override Guid ParseGuid(ReadOnlySpan value) => Guid.Parse(value); - - public override byte[] ParseBase64(ReadOnlySpan value) - { - byte[] bytes = BufferPool.GetBuffer(Base64.GetMaxDecodedFromUtf8Length(value.Length)); - try - { - if (Convert.TryFromBase64Chars(value, bytes, out var bytesWritten)) - { - var ret = new byte[bytesWritten]; - Buffer.BlockCopy(bytes, 0, ret, 0, bytesWritten); - return ret; - } - else - { - var chars = value.ToArray(); - return Convert.FromBase64CharArray(chars, 0, chars.Length); - } - } - finally - { - BufferPool.ReleaseBufferToPool(ref bytes); - } - } - - public override string ToBase64(ReadOnlyMemory value) - { - return Convert.ToBase64String(value.Span); - } - - public override Task WriteAsync(Stream stream, ReadOnlySpan value, CancellationToken token=default) - { - using (var writer = new BinaryWriter(stream, Encoding.UTF8, leaveOpen:true)) - { - writer.Write(value); - } - - return TypeConstants.EmptyTask; - } - - public override async Task WriteAsync(Stream stream, ReadOnlyMemory value, CancellationToken token = default) - { - await stream.WriteAsync(value, token); - } - - public override object Deserialize(Stream stream, Type type, DeserializeStringSpanDelegate deserializer) - { - var fromPool = false; - - if (!(stream is MemoryStream ms)) - { - fromPool = true; - - if (stream.CanSeek) - stream.Position = 0; - - ms = stream.CopyToNewMemoryStream(); - } - - return Deserialize(ms, fromPool, type, deserializer); - } - - public override async Task DeserializeAsync(Stream stream, Type type, DeserializeStringSpanDelegate deserializer) - { - var fromPool = false; - - if (!(stream is MemoryStream ms)) - { - fromPool = true; - - if (stream.CanSeek) - stream.Position = 0; - - ms = await stream.CopyToNewMemoryStreamAsync(); - } - - return Deserialize(ms, fromPool, type, deserializer); - } - - private static object Deserialize(MemoryStream memoryStream, bool fromPool, Type type, DeserializeStringSpanDelegate deserializer) - { - var bytes = memoryStream.GetBufferAsSpan(); - var chars = CharPool.GetBuffer(Encoding.UTF8.GetCharCount(bytes)); - try - { - var charsWritten = Encoding.UTF8.GetChars(bytes, chars); - ReadOnlySpan charsSpan = chars; - var ret = deserializer(type, charsSpan.Slice(0, charsWritten)); - return ret; - } - finally - { - CharPool.ReleaseBufferToPool(ref chars); - - if (fromPool) - memoryStream.Dispose(); - } - } - - public override StringBuilder Append(StringBuilder sb, ReadOnlySpan value) - { - return sb.Append(value); - } - - public override int GetUtf8CharCount(ReadOnlySpan bytes) => Encoding.UTF8.GetCharCount(bytes); - - public override int GetUtf8ByteCount(ReadOnlySpan chars) => Encoding.UTF8.GetByteCount(chars); - - public override ReadOnlyMemory ToUtf8(ReadOnlySpan source) - { - Memory bytes = new byte[Encoding.UTF8.GetByteCount(source)]; - var bytesWritten = Encoding.UTF8.GetBytes(source, bytes.Span); - return bytes.Slice(0, bytesWritten); - } - - public override ReadOnlyMemory FromUtf8(ReadOnlySpan source) - { - source = source.WithoutBom(); - Memory chars = new char[Encoding.UTF8.GetCharCount(source)]; - var charsWritten = Encoding.UTF8.GetChars(source, chars.Span); - return chars.Slice(0, charsWritten); - } - - public override int ToUtf8(ReadOnlySpan source, Span destination) => Encoding.UTF8.GetBytes(source, destination); - - public override int FromUtf8(ReadOnlySpan source, Span destination) => Encoding.UTF8.GetChars(source.WithoutBom(), destination); - - public override byte[] ToUtf8Bytes(ReadOnlySpan source) => ToUtf8(source).ToArray(); - - public override string FromUtf8Bytes(ReadOnlySpan source) => FromUtf8(source.WithoutBom()).ToString(); - - public override MemoryStream ToMemoryStream(ReadOnlySpan source) - { - var ms = MemoryStreamFactory.GetStream(source.Length); - ms.Write(source); - return ms; - } - } -} - -#endif diff --git a/src/ServiceStack.Memory/ServiceStack.Memory.csproj b/src/ServiceStack.Memory/ServiceStack.Memory.csproj index a53bbc20f..c8abc9832 100644 --- a/src/ServiceStack.Memory/ServiceStack.Memory.csproj +++ b/src/ServiceStack.Memory/ServiceStack.Memory.csproj @@ -8,4 +8,9 @@ + + + NetCoreMemory.cs + + \ No newline at end of file diff --git a/src/ServiceStack.Text/DefaultMemory.cs b/src/ServiceStack.Text/DefaultMemory.cs index 17d8afc6d..246f875d8 100644 --- a/src/ServiceStack.Text/DefaultMemory.cs +++ b/src/ServiceStack.Text/DefaultMemory.cs @@ -422,8 +422,43 @@ public override Guid ParseGuid(ReadOnlySpan value) return result; } - public override Task WriteAsync(Stream stream, ReadOnlySpan value, - CancellationToken token = default(CancellationToken)) + public override void Write(Stream stream, ReadOnlyMemory value) + { + var bytes = BufferPool.GetBuffer(Encoding.UTF8.GetMaxByteCount(value.Length)); + try + { + var chars = value.ToArray(); + int bytesCount = Encoding.UTF8.GetBytes(chars, 0, chars.Length, bytes, 0); + stream.Write(bytes, 0, bytesCount); + } + finally + { + BufferPool.ReleaseBufferToPool(ref bytes); + } + } + + public override void Write(Stream stream, ReadOnlyMemory value) + { + if (MemoryMarshal.TryGetArray(value, out var segment) && segment.Array != null) + { + byte[] bytes = BufferPool.GetBuffer(segment.Count); + try + { + stream.Write(segment.Array, 0, segment.Count); + } + finally + { + BufferPool.ReleaseBufferToPool(ref bytes); + } + } + else + { + var bytes = value.ToArray(); + stream.Write(bytes, 0, value.Length); + } + } + + public override Task WriteAsync(Stream stream, ReadOnlySpan value, CancellationToken token = default) { byte[] bytes = BufferPool.GetBuffer(Encoding.UTF8.GetMaxByteCount(value.Length)); try @@ -438,6 +473,9 @@ public override Task WriteAsync(Stream stream, ReadOnlySpan value, } } + public override Task WriteAsync(Stream stream, ReadOnlyMemory value, CancellationToken token = default) => + WriteAsync(stream, value.Span, token); + public override Task WriteAsync(Stream stream, ReadOnlyMemory value, CancellationToken token = default) { byte[] bytes = BufferPool.GetBuffer(value.Length); diff --git a/src/ServiceStack.Text/MemoryProvider.cs b/src/ServiceStack.Text/MemoryProvider.cs index 4bd0e7bb7..fd5c47aa4 100644 --- a/src/ServiceStack.Text/MemoryProvider.cs +++ b/src/ServiceStack.Text/MemoryProvider.cs @@ -50,9 +50,14 @@ public abstract class MemoryProvider public abstract string ToBase64(ReadOnlyMemory value); - public abstract Task WriteAsync(Stream stream, ReadOnlySpan value, CancellationToken token = default); + public abstract void Write(Stream stream, ReadOnlyMemory value); + public abstract void Write(Stream stream, ReadOnlyMemory value); + + public abstract Task WriteAsync(Stream stream, ReadOnlyMemory value, CancellationToken token = default); public abstract Task WriteAsync(Stream stream, ReadOnlyMemory value, CancellationToken token = default); + public abstract Task WriteAsync(Stream stream, ReadOnlySpan value, CancellationToken token = default); + public abstract object Deserialize(Stream stream, Type type, DeserializeStringSpanDelegate deserializer); public abstract Task DeserializeAsync(Stream stream, Type type, diff --git a/src/ServiceStack.Text/NetCoreMemory.cs b/src/ServiceStack.Text/NetCoreMemory.cs index c28557695..ea6593b13 100644 --- a/src/ServiceStack.Text/NetCoreMemory.cs +++ b/src/ServiceStack.Text/NetCoreMemory.cs @@ -95,26 +95,43 @@ public override string ToBase64(ReadOnlyMemory value) return Convert.ToBase64String(value.Span); } - public override Task WriteAsync(Stream stream, ReadOnlySpan value, CancellationToken token=default) + public override void Write(Stream stream, ReadOnlyMemory value) { - using (var writer = new BinaryWriter(stream, Encoding.UTF8, leaveOpen:true)) - { - writer.Write(value); - } + var utf8 = ToUtf8(value.Span); + if (stream is MemoryStream ms) + ms.Write(utf8.Span); + else + stream.Write(utf8.Span); + } + + public override void Write(Stream stream, ReadOnlyMemory value) + { + if (stream is MemoryStream ms) + ms.Write(value.Span); + else + stream.Write(value.Span); + } + + public override Task WriteAsync(Stream stream, ReadOnlyMemory value, CancellationToken token = default) => + WriteAsync(stream, value.Span, token); + public override Task WriteAsync(Stream stream, ReadOnlySpan value, CancellationToken token=default) + { + var utf8 = ToUtf8(value); + if (stream is MemoryStream ms) + ms.Write(utf8.Span); + else + return Task.FromResult(stream.WriteAsync(utf8, token)); + return TypeConstants.EmptyTask; } public override async Task WriteAsync(Stream stream, ReadOnlyMemory value, CancellationToken token = default) { if (stream is MemoryStream ms) - { ms.Write(value.Span); - } else - { await stream.WriteAsync(value, token); - } } public override object Deserialize(Stream stream, Type type, DeserializeStringSpanDelegate deserializer) From e9a159c51d0c8c195f3ec66e4d611bffc9d648cf Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 19 Sep 2019 04:13:01 -0400 Subject: [PATCH 149/372] Add IsNetCore3 check --- src/ServiceStack.Text/Env.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 577ac6fea..7055f347a 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -21,6 +21,7 @@ static Env() IsLinux = System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Linux); IsWindows = System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows); IsOSX = System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.OSX); + IsNetCore3 = System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription.StartsWith(".NET Core 3"); var fxDesc = System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription; IsMono = fxDesc.Contains("Mono"); @@ -129,6 +130,8 @@ static Env() public static bool IsNetFramework { get; set; } public static bool IsNetCore { get; set; } + + public static bool IsNetCore3 { get; set; } public static bool SupportsExpressions { get; private set; } From b3d4b650363614683c24da6c2618384236adc4ea Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 20 Sep 2019 07:23:34 -0400 Subject: [PATCH 150/372] Check for implicit casts in ConvertTo --- src/ServiceStack.Text/AutoMappingUtils.cs | 20 +++++++++++++++++++ .../AutoMappingTests.cs | 8 ++++++++ 2 files changed, 28 insertions(+) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index b9e7dafc9..1b4a90beb 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -157,6 +157,10 @@ public static object ConvertTo(this object from, Type toType, bool skipConverter if (fromType.IsValueType || toType.IsValueType) return ChangeValueType(from, toType); + var mi = GetImplicitCastMethod(fromType, toType); + if (mi != null) + return mi.Invoke(null, new[] { from }); + if (from is string str) return TypeSerializer.DeserializeFromString(str, toType); if (from is ReadOnlyMemory rom) @@ -191,6 +195,14 @@ public static MethodInfo GetImplicitCastMethod(Type fromType, Type toType) return mi; } } + foreach (var mi in toType.GetMethods(BindingFlags.Public | BindingFlags.Static)) + { + if (mi.Name == "op_Implicit" && mi.ReturnType == toType && + mi.GetParameters().FirstOrDefault()?.ParameterType == fromType) + { + return mi; + } + } return null; } @@ -204,6 +216,14 @@ public static MethodInfo GetExplicitCastMethod(Type fromType, Type toType) return mi; } } + foreach (var mi in fromType.GetMethods(BindingFlags.Public | BindingFlags.Static)) + { + if (mi.Name == "op_Explicit" && mi.ReturnType == toType && + mi.GetParameters().FirstOrDefault()?.ParameterType == fromType) + { + return mi; + } + } return null; } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 0b4886ea3..e6dc7d25e 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Linq.Expressions; using System.Runtime.Serialization; +using System.Xml.Linq; #if !NETCORE using System.Web.Script.Serialization; #endif @@ -1150,6 +1151,13 @@ public void Can_convert_between_structs_with_implicit_casts() Assert.That(b.Id, Is.EqualTo(a.Id)); } + [Test] + public void Can_convert_from_class_implicit_Casts() + { + var to = "test".ConvertTo(); + Assert.That(to.LocalName, Is.EqualTo("test")); + } + struct C { public int Id { get; } From 106f2a25e849a7584ba10cbbd358bddd5b6c6514 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 26 Sep 2019 00:49:51 -0400 Subject: [PATCH 151/372] don't attempt to serialize reflection types by default --- src/ServiceStack.Text/JsConfig.cs | 7 +++++ .../CyclicalDependencyTests.cs | 31 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/ServiceStack.Text/JsConfig.cs b/src/ServiceStack.Text/JsConfig.cs index b0074e3ef..e0b4a256a 100644 --- a/src/ServiceStack.Text/JsConfig.cs +++ b/src/ServiceStack.Text/JsConfig.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Text; @@ -18,6 +19,12 @@ static JsConfig() //In-built default serialization, to Deserialize Color struct do: //JsConfig.SerializeFn = c => c.ToString().Replace("Color ", "").Replace("[", "").Replace("]", ""); //JsConfig.DeSerializeFn = System.Drawing.Color.FromName; + JsConfig.SerializeFn = x => x.ToString(); + JsConfig.SerializeFn = x => x.ToString(); + JsConfig.SerializeFn = x => x.ToString(); + JsConfig.SerializeFn = x => x.ToString(); + JsConfig.SerializeFn = x => x.ToString(); + Reset(); LicenseUtils.Init(); } diff --git a/tests/ServiceStack.Text.Tests/CyclicalDependencyTests.cs b/tests/ServiceStack.Text.Tests/CyclicalDependencyTests.cs index 9cba8eaa8..f76d48815 100644 --- a/tests/ServiceStack.Text.Tests/CyclicalDependencyTests.cs +++ b/tests/ServiceStack.Text.Tests/CyclicalDependencyTests.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; +using System.Reflection; using System.Runtime.Serialization; using NUnit.Framework; @@ -213,5 +214,35 @@ public void Ignore_Cyclical_dependencies() JsConfig.OnDeserializedFn = null; JsConfig.Reset(); } + + public class ReflectionType + { + public string Name { get; set; } = "A"; + public Type Type { get; set; } + public MethodInfo MethodInfo { get; set; } + public PropertyInfo PropertyInfo { get; set; } + public FieldInfo FieldInfo; + public MemberInfo MemberInfo { get; set; } + + public void Method() {} + } + + [Test] + public void Can_serialize_POCO_with_Type() + { + var dto = new ReflectionType { + Type = typeof(ReflectionType), + MethodInfo = typeof(ReflectionType).GetMethod(nameof(ReflectionType.Method)), + PropertyInfo = typeof(ReflectionType).GetProperty(nameof(ReflectionType.PropertyInfo)), + FieldInfo = typeof(ReflectionType).GetPublicFields().FirstOrDefault(), + MemberInfo = typeof(ReflectionType).GetMembers().FirstOrDefault(), + }; + + dto.Name.Print(); + dto.ToJson().Print(); + dto.ToJsv().Print(); + dto.PrintDump(); + } + } } From 0f77da2280cceb50ee0b2a7dcea985d57d00eaaf Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 26 Sep 2019 00:51:56 -0400 Subject: [PATCH 152/372] Update JsConfig.cs --- src/ServiceStack.Text/JsConfig.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ServiceStack.Text/JsConfig.cs b/src/ServiceStack.Text/JsConfig.cs index e0b4a256a..37395cdf1 100644 --- a/src/ServiceStack.Text/JsConfig.cs +++ b/src/ServiceStack.Text/JsConfig.cs @@ -24,6 +24,7 @@ static JsConfig() JsConfig.SerializeFn = x => x.ToString(); JsConfig.SerializeFn = x => x.ToString(); JsConfig.SerializeFn = x => x.ToString(); + JsConfig.SerializeFn = x => x.ToString(); Reset(); LicenseUtils.Init(); From 12ab8c69c137bd2832947fb7fb7ea06445fe2874 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 26 Sep 2019 01:50:28 -0400 Subject: [PATCH 153/372] fix tests --- src/ServiceStack.Text/JsConfig.cs | 10 ---------- src/ServiceStack.Text/JsConfigScope.cs | 1 + src/ServiceStack.Text/ReflectionExtensions.cs | 7 +++++++ 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/ServiceStack.Text/JsConfig.cs b/src/ServiceStack.Text/JsConfig.cs index 37395cdf1..bad0e495c 100644 --- a/src/ServiceStack.Text/JsConfig.cs +++ b/src/ServiceStack.Text/JsConfig.cs @@ -16,16 +16,6 @@ public static class JsConfig { static JsConfig() { - //In-built default serialization, to Deserialize Color struct do: - //JsConfig.SerializeFn = c => c.ToString().Replace("Color ", "").Replace("[", "").Replace("]", ""); - //JsConfig.DeSerializeFn = System.Drawing.Color.FromName; - JsConfig.SerializeFn = x => x.ToString(); - JsConfig.SerializeFn = x => x.ToString(); - JsConfig.SerializeFn = x => x.ToString(); - JsConfig.SerializeFn = x => x.ToString(); - JsConfig.SerializeFn = x => x.ToString(); - JsConfig.SerializeFn = x => x.ToString(); - Reset(); LicenseUtils.Init(); } diff --git a/src/ServiceStack.Text/JsConfigScope.cs b/src/ServiceStack.Text/JsConfigScope.cs index dbed75cd4..54f917361 100644 --- a/src/ServiceStack.Text/JsConfigScope.cs +++ b/src/ServiceStack.Text/JsConfigScope.cs @@ -1,6 +1,7 @@ using System; using System.Threading; using System.Collections.Generic; +using System.Reflection; using ServiceStack.Text.Json; using ServiceStack.Text.Jsv; using ServiceStack.Text.Common; diff --git a/src/ServiceStack.Text/ReflectionExtensions.cs b/src/ServiceStack.Text/ReflectionExtensions.cs index 9b89fdcf8..66c1306f1 100644 --- a/src/ServiceStack.Text/ReflectionExtensions.cs +++ b/src/ServiceStack.Text/ReflectionExtensions.cs @@ -594,6 +594,13 @@ internal static void Reset() "IgnoreDataMemberAttribute", "JsonIgnoreAttribute" }; + + JsConfig.SerializeFn = x => x?.ToString(); + JsConfig.SerializeFn = x => x?.ToString(); + JsConfig.SerializeFn = x => x?.ToString(); + JsConfig.SerializeFn = x => x?.ToString(); + JsConfig.SerializeFn = x => x?.ToString(); + JsConfig.SerializeFn = x => x?.ToString(); } public static PropertyInfo[] GetSerializableProperties(this Type type) From 63939b86fb0a1aa82b3fcb0d003f3ad1f9333c09 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 26 Sep 2019 02:05:34 -0400 Subject: [PATCH 154/372] Update ReflectionExtensions.cs --- src/ServiceStack.Text/ReflectionExtensions.cs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/ServiceStack.Text/ReflectionExtensions.cs b/src/ServiceStack.Text/ReflectionExtensions.cs index 66c1306f1..f8d18387a 100644 --- a/src/ServiceStack.Text/ReflectionExtensions.cs +++ b/src/ServiceStack.Text/ReflectionExtensions.cs @@ -595,12 +595,19 @@ internal static void Reset() "JsonIgnoreAttribute" }; - JsConfig.SerializeFn = x => x?.ToString(); - JsConfig.SerializeFn = x => x?.ToString(); - JsConfig.SerializeFn = x => x?.ToString(); - JsConfig.SerializeFn = x => x?.ToString(); - JsConfig.SerializeFn = x => x?.ToString(); - JsConfig.SerializeFn = x => x?.ToString(); + try + { + JsConfig.SerializeFn = x => x?.ToString(); + JsConfig.SerializeFn = x => x?.ToString(); + JsConfig.SerializeFn = x => x?.ToString(); + JsConfig.SerializeFn = x => x?.ToString(); + JsConfig.SerializeFn = x => x?.ToString(); + JsConfig.SerializeFn = x => x?.ToString(); + } + catch (Exception e) + { + Tracer.Instance.WriteError("ReflectionExtensions JsConfig", e); + } } public static PropertyInfo[] GetSerializableProperties(this Type type) From 3c57b04038bdeef91173052ab2d14ae901048bcc Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 30 Sep 2019 01:58:16 -0400 Subject: [PATCH 155/372] bump to v5.7 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index c4e232aca..4b332f4b8 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.6.1 + 5.7.0 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index a6a00041b..d35bfe834 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.6.1 + 5.7.0 latest false From 1deaac560b316cd09a2cce5c96b913bc2b2d1c8c Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 30 Sep 2019 05:47:51 -0400 Subject: [PATCH 156/372] bump to v5.7 --- src/ServiceStack.Text/Env.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 7055f347a..8cfd3fc5a 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -105,7 +105,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.61m; + public static decimal ServiceStackVersion = 5.7m; public static bool IsLinux { get; set; } From 43f4c1d70842dea1f8df961856cdbfa6857effc7 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 2 Oct 2019 04:18:35 -0400 Subject: [PATCH 157/372] bump to v5.7.1 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 4b332f4b8..8c7adab2e 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.7.0 + 5.7.1 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index d35bfe834..794d9e12f 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.7.0 + 5.7.1 latest false From 628a4a181ec09c0f68daa91332d7feccf776fc59 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 6 Oct 2019 07:21:13 -0400 Subject: [PATCH 158/372] Update PlatformExtensions.cs --- src/ServiceStack.Text/PlatformExtensions.cs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index 791d9ab8b..6dd119d09 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -133,7 +133,7 @@ public static MethodInfo GetInstanceMethod(this Type type, string methodName) => [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool HasAttribute(this MethodInfo mi) => mi.AllAttributes().Any(x => x.GetType() == typeof(T)); - private static Dictionary, bool> hasAttributeCache = new Dictionary, bool>(); + private static readonly ConcurrentDictionary, bool> hasAttributeCache = new ConcurrentDictionary, bool>(); public static bool HasAttributeCached(this MemberInfo memberInfo) { var key = new Tuple(memberInfo, typeof(T)); @@ -149,17 +149,8 @@ public static bool HasAttributeCached(this MemberInfo memberInfo) : memberInfo is MethodInfo mi ? mi.AllAttributes().Any(x => x.GetType() == typeof(T)) : throw new NotSupportedException(memberInfo.GetType().Name); - - Dictionary, bool> snapshot, newCache; - do - { - snapshot = hasAttributeCache; - newCache = new Dictionary, bool>(hasAttributeCache) { - [key ] = hasAttr - }; - } while (!ReferenceEquals( - Interlocked.CompareExchange(ref hasAttributeCache, newCache, snapshot), snapshot)); + hasAttributeCache[key] = hasAttr; return hasAttr; } From e02f7ca7fe83c3ca2eb36e30c4f75caf2daf6007 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 9 Oct 2019 18:18:43 -0400 Subject: [PATCH 159/372] Add .NET Standard 2.1 builds to remove ambiguous ext methods --- src/Directory.Build.props | 2 +- .../ServiceStack.Memory.csproj | 7 +++++-- src/ServiceStack.Text/CharMemoryExtensions.cs | 4 ++++ src/ServiceStack.Text/Env.cs | 18 ++++++++++++++++-- src/ServiceStack.Text/JsConfigScope.cs | 8 ++++---- src/ServiceStack.Text/NetCoreMemory.cs | 2 +- src/ServiceStack.Text/PathUtils.cs | 2 +- src/ServiceStack.Text/Pcl.Dynamic.cs | 6 ------ .../PclExport.NetStandard.cs | 2 +- .../ReflectionOptimizer.Emit.cs | 4 ++-- .../ServiceStack.Text.csproj | 19 ++++++++++++++----- src/ServiceStack.Text/TypeFields.cs | 6 ------ src/ServiceStack.Text/TypeProperties.cs | 6 ------ .../MiniProfiler/MiniProfiler.cs | 2 +- .../ServiceStack.Text.Benchmarks.csproj | 5 +---- 15 files changed, 51 insertions(+), 42 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 8c7adab2e..adb97451f 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -33,7 +33,7 @@ - $(DefineConstants);NETSTANDARD2_0 + $(DefineConstants);NETSTANDARD;NETSTANDARD2_0 diff --git a/src/ServiceStack.Memory/ServiceStack.Memory.csproj b/src/ServiceStack.Memory/ServiceStack.Memory.csproj index c8abc9832..9129a8f1a 100644 --- a/src/ServiceStack.Memory/ServiceStack.Memory.csproj +++ b/src/ServiceStack.Memory/ServiceStack.Memory.csproj @@ -1,9 +1,12 @@  - netcoreapp2.1 + netcoreapp2.1;netstandard2.1 - $(DefineConstants);NETCORE2_1 + $(DefineConstants);NETSTANDARD;NETCORE2_1 + + + $(DefineConstants);NETSTANDARD;NETSTANDARD2_1 diff --git a/src/ServiceStack.Text/CharMemoryExtensions.cs b/src/ServiceStack.Text/CharMemoryExtensions.cs index 8bda5e0f5..d1e3b9f5b 100644 --- a/src/ServiceStack.Text/CharMemoryExtensions.cs +++ b/src/ServiceStack.Text/CharMemoryExtensions.cs @@ -381,6 +381,9 @@ public static int LastIndexOf(this ReadOnlyMemory value, string needle, in [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool EqualsOrdinal(this ReadOnlyMemory value, ReadOnlyMemory other) => value.Span.Equals(other.Span, StringComparison.Ordinal); +#if !NETSTANDARD2_1 + //Ambiguous definitions in .NET Core 3.0 System MemoryExtensions.cs + public static ReadOnlyMemory Trim(this ReadOnlyMemory span) { return span.TrimStart().TrimEnd(); @@ -411,6 +414,7 @@ public static ReadOnlyMemory TrimEnd(this ReadOnlyMemory value) } return value.Slice(0, end + 1); } +#endif [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ReadOnlyMemory SafeSlice(this ReadOnlyMemory value, int startIndex) => SafeSlice(value, startIndex, value.Length); diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 8cfd3fc5a..ed96da649 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -14,7 +14,7 @@ static Env() if (PclExport.Instance == null) throw new ArgumentException("PclExport.Instance needs to be initialized"); -#if NETSTANDARD2_0 || NETCORE2_1 +#if NETSTANDARD IsNetStandard = true; try { @@ -64,6 +64,16 @@ static Env() #if NETCORE2_1 IsNetStandard = false; IsNetCore = true; + IsNetCore21 = true; + SupportsDynamic = true; +#endif + +#if NETSTANDARD2_0 + IsNetStandard20 = true; +#endif + +#if NETSTANDARD2_1 + IsNetStandard21 = true; SupportsDynamic = true; #endif @@ -127,6 +137,10 @@ static Env() public static bool IsNetStandard { get; set; } + public static bool IsNetCore21 { get; set; } + public static bool IsNetStandard20 { get; set; } + public static bool IsNetStandard21 { get; set; } + public static bool IsNetFramework { get; set; } public static bool IsNetCore { get; set; } @@ -203,7 +217,7 @@ public static string ReferenceAssemblyPath set => referenceAssemblyPath = value; } -#if NETSTANDARD2_0 +#if NETSTANDARD private static bool IsRunningAsUwp() { try diff --git a/src/ServiceStack.Text/JsConfigScope.cs b/src/ServiceStack.Text/JsConfigScope.cs index 54f917361..e0eec2d22 100644 --- a/src/ServiceStack.Text/JsConfigScope.cs +++ b/src/ServiceStack.Text/JsConfigScope.cs @@ -13,7 +13,7 @@ public sealed class JsConfigScope : Config, IDisposable bool disposed; readonly JsConfigScope parent; -#if NETSTANDARD2_0 +#if NETSTANDARD private static AsyncLocal head = new AsyncLocal(); #else [ThreadStatic] private static JsConfigScope head; @@ -23,7 +23,7 @@ internal JsConfigScope() { PclExport.Instance.BeginThreadAffinity(); -#if NETSTANDARD2_0 +#if NETSTANDARD parent = head.Value; head.Value = this; #else @@ -33,7 +33,7 @@ internal JsConfigScope() } internal static JsConfigScope Current => -#if NETSTANDARD2_0 +#if NETSTANDARD head.Value; #else head; @@ -44,7 +44,7 @@ public void Dispose() if (!disposed) { disposed = true; -#if NETSTANDARD2_0 +#if NETSTANDARD head.Value = parent; #else head = parent; diff --git a/src/ServiceStack.Text/NetCoreMemory.cs b/src/ServiceStack.Text/NetCoreMemory.cs index ea6593b13..2ee1cf000 100644 --- a/src/ServiceStack.Text/NetCoreMemory.cs +++ b/src/ServiceStack.Text/NetCoreMemory.cs @@ -1,4 +1,4 @@ -#if NETCORE2_1 +#if NETCORE2_1 || NETSTANDARD2_1 using System; using System.Buffers.Text; diff --git a/src/ServiceStack.Text/PathUtils.cs b/src/ServiceStack.Text/PathUtils.cs index e4775d059..e4ebc1299 100644 --- a/src/ServiceStack.Text/PathUtils.cs +++ b/src/ServiceStack.Text/PathUtils.cs @@ -66,7 +66,7 @@ public static string MapAbsolutePath(this string relativePath) public static string MapHostAbsolutePath(this string relativePath) { var sep = PclExport.Instance.DirSep; -#if !NETSTANDARD2_0 +#if !NETSTANDARD return PclExport.Instance.MapAbsolutePath(relativePath, $"{sep}.."); #else return PclExport.Instance.MapAbsolutePath(relativePath, $"{sep}..{sep}..{sep}.."); diff --git a/src/ServiceStack.Text/Pcl.Dynamic.cs b/src/ServiceStack.Text/Pcl.Dynamic.cs index 41b86e0fb..0a3a84451 100644 --- a/src/ServiceStack.Text/Pcl.Dynamic.cs +++ b/src/ServiceStack.Text/Pcl.Dynamic.cs @@ -1,8 +1,6 @@ //Copyright (c) ServiceStack, Inc. All Rights Reserved. //License: https://raw.github.com/ServiceStack/ServiceStack/master/license.txt -#if NET45 || NETCORE2_1 - using System; using System.Collections.Generic; using System.Dynamic; @@ -90,8 +88,6 @@ private static int VerifyAndGetStartIndex(ReadOnlySpan value, Type createM } } -//TODO: Workout how to fix broken CoreCLR SL5 build that uses dynamic - public class DynamicJson : DynamicObject { private readonly IDictionary _hash = new Dictionary(); @@ -184,6 +180,4 @@ internal static string Underscored(IEnumerable pascalCase) return StringBuilderCache.ReturnAndFree(sb).ToLowerInvariant(); } } - } -#endif diff --git a/src/ServiceStack.Text/PclExport.NetStandard.cs b/src/ServiceStack.Text/PclExport.NetStandard.cs index 966bfc9e8..b24672468 100644 --- a/src/ServiceStack.Text/PclExport.NetStandard.cs +++ b/src/ServiceStack.Text/PclExport.NetStandard.cs @@ -1,7 +1,7 @@ //Copyright (c) ServiceStack, Inc. All Rights Reserved. //License: https://raw.github.com/ServiceStack/ServiceStack/master/license.txt -#if NETSTANDARD2_0 +#if NETSTANDARD using System; using System.Collections.Generic; using System.IO; diff --git a/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs b/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs index 0dacd49a8..2800ce38a 100644 --- a/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs +++ b/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs @@ -320,7 +320,7 @@ static string ProxyName(Type targetType) static DynamicProxy() { var assemblyName = new AssemblyName("DynImpl"); -#if NETSTANDARD2_0 +#if NETSTANDARD DynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); #else DynamicAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); @@ -344,7 +344,7 @@ static Type GetConstructedType(Type targetType) foreach (var face in targetType.GetInterfaces()) IncludeType(face, typeBuilder); -#if NETSTANDARD2_0 +#if NETSTANDARD return typeBuilder.CreateTypeInfo().AsType(); #else return typeBuilder.CreateType(); diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index 290b5a9b3..8aab3481b 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -2,7 +2,7 @@ ServiceStack.Text ServiceStack.Text - net45;netstandard2.0;netcoreapp2.1 + net45;netstandard2.0;netcoreapp2.1;netstandard2.1 .NET's fastest JSON Serializer by ServiceStack .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. @@ -12,23 +12,32 @@ JSON;Text;Serializer;CSV;JSV;HTTP;Auto Mapping;Dump;Reflection;JS;Utils;Fast - $(DefineConstants);NETSTANDARD2_0;NETCORE2_1 + $(DefineConstants);NETSTANDARD;NETCORE2_1 + + $(DefineConstants);NETSTANDARD;NETSTANDARD2_1 + + + + - - - + + + + + + \ No newline at end of file diff --git a/src/ServiceStack.Text/TypeFields.cs b/src/ServiceStack.Text/TypeFields.cs index 3d14f40f9..6a82b52f4 100644 --- a/src/ServiceStack.Text/TypeFields.cs +++ b/src/ServiceStack.Text/TypeFields.cs @@ -4,12 +4,6 @@ using System.Threading; using ServiceStack.Text; -using System.Linq.Expressions; - -#if NET45 || NETSTANDARD2_0 -using System.Reflection.Emit; -#endif - namespace ServiceStack { public class FieldAccessor diff --git a/src/ServiceStack.Text/TypeProperties.cs b/src/ServiceStack.Text/TypeProperties.cs index 05c12c760..1fc0fdbfd 100644 --- a/src/ServiceStack.Text/TypeProperties.cs +++ b/src/ServiceStack.Text/TypeProperties.cs @@ -4,12 +4,6 @@ using System.Threading; using ServiceStack.Text; -using System.Linq.Expressions; - -#if NET45 || NETSTANDARD2_0 -using System.Reflection.Emit; -#endif - namespace ServiceStack { public class PropertyAccessor diff --git a/tests/ServiceStack.Text.Benchmarks/MiniProfiler/MiniProfiler.cs b/tests/ServiceStack.Text.Benchmarks/MiniProfiler/MiniProfiler.cs index 33ca4df4e..7eda2d50d 100644 --- a/tests/ServiceStack.Text.Benchmarks/MiniProfiler/MiniProfiler.cs +++ b/tests/ServiceStack.Text.Benchmarks/MiniProfiler/MiniProfiler.cs @@ -280,7 +280,7 @@ public IEnumerable GetTimingHierarchy() } } -#if !NETSTANDARD2_0 +#if !NETSTANDARD /// /// Create a DEEP clone of this MiniProfiler. /// diff --git a/tests/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj b/tests/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj index 55389b384..108b74af4 100644 --- a/tests/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj +++ b/tests/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj @@ -10,10 +10,7 @@ - - $(DefineConstants);NET45;NET47 - - $(DefineConstants);NETSTANDARD2_0;NETCORE + $(DefineConstants);NETSTANDARD;NETCORE2_1 \ No newline at end of file From a15afd49208ade81b001287b8b7d2c2d97ef5317 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 9 Oct 2019 18:42:34 -0400 Subject: [PATCH 160/372] Update ServiceStack.Text.Core.csproj --- .../ServiceStack.Text.Core.csproj | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index d420cbbe2..5ca1cf8df 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -3,7 +3,7 @@ ServiceStack.Text.Core ServiceStack.Text ServiceStack.Text - netstandard2.0;netcoreapp2.1 + netstandard2.0;netcoreapp2.1;netstandard2.1 ServiceStack.Text .NET Standard 2.0 .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. @@ -13,18 +13,28 @@ JSON;Text;Serializer;CSV;JSV;HTTP;Auto Mapping;Dump;Reflection;JS;Utils;Fast - $(DefineConstants);NETSTANDARD2_0;NETCORE2_1 + $(DefineConstants);NETSTANDARD;NETCORE2_1 + + $(DefineConstants);NETSTANDARD;NETSTANDARD2_1 + + + + - - + + + + + + \ No newline at end of file From b8d149eb707de5366e306ca02604a030beea6a12 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 10 Oct 2019 16:33:38 -0400 Subject: [PATCH 161/372] Add XPoweredBy --- src/ServiceStack.Text/HttpUtils.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 20477bf4b..707855c44 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1629,6 +1629,8 @@ public static class HttpHeaders public const string XStatus = "X-Status"; + public const string XPoweredBy = "X-Powered-By"; + public const string Referer = "Referer"; public const string CacheControl = "Cache-Control"; From 599e10c259d5d7bfd7f5c4d3c557ade38f780552 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 11 Oct 2019 00:35:27 -0400 Subject: [PATCH 162/372] Create MurmurHash2.cs --- src/ServiceStack.Text/MurmurHash2.cs | 65 ++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/ServiceStack.Text/MurmurHash2.cs diff --git a/src/ServiceStack.Text/MurmurHash2.cs b/src/ServiceStack.Text/MurmurHash2.cs new file mode 100644 index 000000000..807f51b3f --- /dev/null +++ b/src/ServiceStack.Text/MurmurHash2.cs @@ -0,0 +1,65 @@ +using System; + +namespace ServiceStack.Text +{ + // https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed#answer-145633 + // https://github.com/jitbit/MurmurHash.net + public class MurmurHash2 + { + public static uint Hash(string data) + { + return Hash(System.Text.Encoding.UTF8.GetBytes(data)); + } + + public static uint Hash(byte[] data) + { + return Hash(data, 0xc58f1a7a); + } + const uint m = 0x5bd1e995; + const int r = 24; + + public static uint Hash(byte[] data, uint seed) + { + int length = data.Length; + if (length == 0) + return 0; + uint h = seed ^ (uint)length; + int currentIndex = 0; + while (length >= 4) + { + uint k = (uint)(data[currentIndex++] | data[currentIndex++] << 8 | data[currentIndex++] << 16 | data[currentIndex++] << 24); + k *= m; + k ^= k >> r; + k *= m; + + h *= m; + h ^= k; + length -= 4; + } + switch (length) + { + case 3: + h ^= (UInt16)(data[currentIndex++] | data[currentIndex++] << 8); + h ^= (uint)(data[currentIndex] << 16); + h *= m; + break; + case 2: + h ^= (UInt16)(data[currentIndex++] | data[currentIndex] << 8); + h *= m; + break; + case 1: + h ^= data[currentIndex]; + h *= m; + break; + default: + break; + } + + h ^= h >> 13; + h *= m; + h ^= h >> 15; + + return h; + } + } +} \ No newline at end of file From c3f132f353911fdc91d59335ca48ea03625e4123 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 13 Oct 2019 17:41:07 -0400 Subject: [PATCH 163/372] remove .netstandard2.1 build + move ambiguous ext methods to SS.Extensions --- .../ServiceStack.Memory.csproj | 5 +-- src/ServiceStack.Text/CharMemoryExtensions.cs | 35 --------------- src/ServiceStack.Text/Env.cs | 6 --- .../Extensions/ServiceStackExtensions.cs | 44 +++++++++++++++++++ src/ServiceStack.Text/NetCoreMemory.cs | 2 +- .../ServiceStack.Text.Core.csproj | 11 +---- .../ServiceStack.Text.csproj | 11 +---- 7 files changed, 48 insertions(+), 66 deletions(-) create mode 100644 src/ServiceStack.Text/Extensions/ServiceStackExtensions.cs diff --git a/src/ServiceStack.Memory/ServiceStack.Memory.csproj b/src/ServiceStack.Memory/ServiceStack.Memory.csproj index 9129a8f1a..392bcfe59 100644 --- a/src/ServiceStack.Memory/ServiceStack.Memory.csproj +++ b/src/ServiceStack.Memory/ServiceStack.Memory.csproj @@ -1,13 +1,10 @@  - netcoreapp2.1;netstandard2.1 + netcoreapp2.1 $(DefineConstants);NETSTANDARD;NETCORE2_1 - - $(DefineConstants);NETSTANDARD;NETSTANDARD2_1 - diff --git a/src/ServiceStack.Text/CharMemoryExtensions.cs b/src/ServiceStack.Text/CharMemoryExtensions.cs index d1e3b9f5b..75b13f8b9 100644 --- a/src/ServiceStack.Text/CharMemoryExtensions.cs +++ b/src/ServiceStack.Text/CharMemoryExtensions.cs @@ -381,41 +381,6 @@ public static int LastIndexOf(this ReadOnlyMemory value, string needle, in [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool EqualsOrdinal(this ReadOnlyMemory value, ReadOnlyMemory other) => value.Span.Equals(other.Span, StringComparison.Ordinal); -#if !NETSTANDARD2_1 - //Ambiguous definitions in .NET Core 3.0 System MemoryExtensions.cs - - public static ReadOnlyMemory Trim(this ReadOnlyMemory span) - { - return span.TrimStart().TrimEnd(); - } - - public static ReadOnlyMemory TrimStart(this ReadOnlyMemory value) - { - if (value.IsEmpty) return TypeConstants.NullStringMemory; - var span = value.Span; - int start = 0; - for (; start < span.Length; start++) - { - if (!char.IsWhiteSpace(span[start])) - break; - } - return value.Slice(start); - } - - public static ReadOnlyMemory TrimEnd(this ReadOnlyMemory value) - { - if (value.IsEmpty) return TypeConstants.NullStringMemory; - var span = value.Span; - int end = span.Length - 1; - for (; end >= 0; end--) - { - if (!char.IsWhiteSpace(span[end])) - break; - } - return value.Slice(0, end + 1); - } -#endif - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ReadOnlyMemory SafeSlice(this ReadOnlyMemory value, int startIndex) => SafeSlice(value, startIndex, value.Length); diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index ed96da649..a3ee471fa 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -72,11 +72,6 @@ static Env() IsNetStandard20 = true; #endif -#if NETSTANDARD2_1 - IsNetStandard21 = true; - SupportsDynamic = true; -#endif - if (!IsUWP) { try @@ -139,7 +134,6 @@ static Env() public static bool IsNetCore21 { get; set; } public static bool IsNetStandard20 { get; set; } - public static bool IsNetStandard21 { get; set; } public static bool IsNetFramework { get; set; } diff --git a/src/ServiceStack.Text/Extensions/ServiceStackExtensions.cs b/src/ServiceStack.Text/Extensions/ServiceStackExtensions.cs new file mode 100644 index 000000000..6fdd3b1ab --- /dev/null +++ b/src/ServiceStack.Text/Extensions/ServiceStackExtensions.cs @@ -0,0 +1,44 @@ +using System; + +namespace ServiceStack.Extensions +{ + /// + /// Move conflicting extension methods into 'ServiceStack.Extensions' namespace + /// + public static class ServiceStackExtensions + { + //Ambiguous definitions in .NET Core 3.0 System MemoryExtensions.cs + + public static ReadOnlyMemory Trim(this ReadOnlyMemory span) + { + return span.TrimStart().TrimEnd(); + } + + public static ReadOnlyMemory TrimStart(this ReadOnlyMemory value) + { + if (value.IsEmpty) return TypeConstants.NullStringMemory; + var span = value.Span; + int start = 0; + for (; start < span.Length; start++) + { + if (!char.IsWhiteSpace(span[start])) + break; + } + return value.Slice(start); + } + + public static ReadOnlyMemory TrimEnd(this ReadOnlyMemory value) + { + if (value.IsEmpty) return TypeConstants.NullStringMemory; + var span = value.Span; + int end = span.Length - 1; + for (; end >= 0; end--) + { + if (!char.IsWhiteSpace(span[end])) + break; + } + return value.Slice(0, end + 1); + } + + } +} \ No newline at end of file diff --git a/src/ServiceStack.Text/NetCoreMemory.cs b/src/ServiceStack.Text/NetCoreMemory.cs index 2ee1cf000..ea6593b13 100644 --- a/src/ServiceStack.Text/NetCoreMemory.cs +++ b/src/ServiceStack.Text/NetCoreMemory.cs @@ -1,4 +1,4 @@ -#if NETCORE2_1 || NETSTANDARD2_1 +#if NETCORE2_1 using System; using System.Buffers.Text; diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index 5ca1cf8df..d7ad0bebc 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -3,7 +3,7 @@ ServiceStack.Text.Core ServiceStack.Text ServiceStack.Text - netstandard2.0;netcoreapp2.1;netstandard2.1 + netstandard2.0;netcoreapp2.1 ServiceStack.Text .NET Standard 2.0 .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. @@ -15,9 +15,6 @@ $(DefineConstants);NETSTANDARD;NETCORE2_1 - - $(DefineConstants);NETSTANDARD;NETSTANDARD2_1 - @@ -31,10 +28,4 @@ - - - - - - \ No newline at end of file diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index 8aab3481b..b9869932e 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -2,7 +2,7 @@ ServiceStack.Text ServiceStack.Text - net45;netstandard2.0;netcoreapp2.1;netstandard2.1 + net45;netstandard2.0;netcoreapp2.1 .NET's fastest JSON Serializer by ServiceStack .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. @@ -14,9 +14,6 @@ $(DefineConstants);NETSTANDARD;NETCORE2_1 - - $(DefineConstants);NETSTANDARD;NETSTANDARD2_1 - @@ -34,10 +31,4 @@ - - - - - - \ No newline at end of file From c4bbb235c2d344eb0fae10d512003bc70469d907 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 13 Oct 2019 17:45:46 -0400 Subject: [PATCH 164/372] move off deprecated APIs --- tests/ServiceStack.Text.Tests/JsonTests/CamelCaseTests.cs | 2 +- .../ServiceStack.Text.Tests/JsonTests/JsonArrayObjectTests.cs | 2 +- tests/ServiceStack.Text.Tests/StringConverterUtilsTests.cs | 2 +- tests/ServiceStack.Text.Tests/StructTests.cs | 2 +- tests/ServiceStack.Text.Tests/UseCases/StripeGateway.cs | 3 +-- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/ServiceStack.Text.Tests/JsonTests/CamelCaseTests.cs b/tests/ServiceStack.Text.Tests/JsonTests/CamelCaseTests.cs index 104274b3f..244cbb71a 100644 --- a/tests/ServiceStack.Text.Tests/JsonTests/CamelCaseTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonTests/CamelCaseTests.cs @@ -12,7 +12,7 @@ public class CamelCaseTests : TestBase [SetUp] public void SetUp() { - JsConfig.EmitCamelCaseNames = true; + JsConfig.TextCase = TextCase.CamelCase; } [TearDown] diff --git a/tests/ServiceStack.Text.Tests/JsonTests/JsonArrayObjectTests.cs b/tests/ServiceStack.Text.Tests/JsonTests/JsonArrayObjectTests.cs index 734721706..30d554e3e 100644 --- a/tests/ServiceStack.Text.Tests/JsonTests/JsonArrayObjectTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonTests/JsonArrayObjectTests.cs @@ -115,7 +115,7 @@ public void Can_parse_custom_AuthResponse() dto.PrintDump(); using (JsConfig.With(new Config { - EmitLowercaseUnderscoreNames = true, + TextCase = TextCase.SnakeCase, PropertyConvention = PropertyConvention.Lenient })) { diff --git a/tests/ServiceStack.Text.Tests/StringConverterUtilsTests.cs b/tests/ServiceStack.Text.Tests/StringConverterUtilsTests.cs index 0432a86c6..a84f32d4d 100644 --- a/tests/ServiceStack.Text.Tests/StringConverterUtilsTests.cs +++ b/tests/ServiceStack.Text.Tests/StringConverterUtilsTests.cs @@ -28,7 +28,7 @@ public static StringEnumerable ParseJsv(string value) { return new StringEnumerable { - Items = value.To>() + Items = value.ConvertTo>() }; } diff --git a/tests/ServiceStack.Text.Tests/StructTests.cs b/tests/ServiceStack.Text.Tests/StructTests.cs index 156613f31..87e210aaf 100644 --- a/tests/ServiceStack.Text.Tests/StructTests.cs +++ b/tests/ServiceStack.Text.Tests/StructTests.cs @@ -118,7 +118,7 @@ public class Person [Test] public void Test_enum_overloads() { - JsConfig.EmitCamelCaseNames = true; + JsConfig.TextCase = TextCase.CamelCase; JsConfig.IncludeNullValues = true; JsConfig.SerializeFn = text => text.ToString().ToCamelCase(); diff --git a/tests/ServiceStack.Text.Tests/UseCases/StripeGateway.cs b/tests/ServiceStack.Text.Tests/UseCases/StripeGateway.cs index bf8744856..d65035b02 100644 --- a/tests/ServiceStack.Text.Tests/UseCases/StripeGateway.cs +++ b/tests/ServiceStack.Text.Tests/UseCases/StripeGateway.cs @@ -680,8 +680,7 @@ public ConfigScope() jsConfigScope = JsConfig.With(new Config { DateHandler = DateHandler.UnixTime, PropertyConvention = PropertyConvention.Lenient, - EmitLowercaseUnderscoreNames = true, - EmitCamelCaseNames = false + TextCase = TextCase.SnakeCase, }); holdQsStrategy = QueryStringSerializer.ComplexTypeStrategy; From c6db4b4011f655c9e01e4def63b65910005c4967 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 13 Oct 2019 18:19:48 -0400 Subject: [PATCH 165/372] Move ToHashSet to ServiceStack.Extensions --- src/ServiceStack.Text/Extensions/ServiceStackExtensions.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/Extensions/ServiceStackExtensions.cs b/src/ServiceStack.Text/Extensions/ServiceStackExtensions.cs index 6fdd3b1ab..a748cd444 100644 --- a/src/ServiceStack.Text/Extensions/ServiceStackExtensions.cs +++ b/src/ServiceStack.Text/Extensions/ServiceStackExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace ServiceStack.Extensions { @@ -8,7 +9,6 @@ namespace ServiceStack.Extensions public static class ServiceStackExtensions { //Ambiguous definitions in .NET Core 3.0 System MemoryExtensions.cs - public static ReadOnlyMemory Trim(this ReadOnlyMemory span) { return span.TrimStart().TrimEnd(); @@ -39,6 +39,8 @@ public static ReadOnlyMemory TrimEnd(this ReadOnlyMemory value) } return value.Slice(0, end + 1); } - + + // Ambiguous with System.Linq v4.7.2 + public static HashSet ToHashSet(this IEnumerable items) => new HashSet(items); } } \ No newline at end of file From fd9fd3d027664d576a75a8b80216edb7797c916d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 13 Oct 2019 19:04:58 -0400 Subject: [PATCH 166/372] remove ToHashSet() to disruptive to move --- src/ServiceStack.Text/Extensions/ServiceStackExtensions.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/ServiceStack.Text/Extensions/ServiceStackExtensions.cs b/src/ServiceStack.Text/Extensions/ServiceStackExtensions.cs index a748cd444..14c422526 100644 --- a/src/ServiceStack.Text/Extensions/ServiceStackExtensions.cs +++ b/src/ServiceStack.Text/Extensions/ServiceStackExtensions.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; namespace ServiceStack.Extensions { @@ -39,8 +38,5 @@ public static ReadOnlyMemory TrimEnd(this ReadOnlyMemory value) } return value.Slice(0, end + 1); } - - // Ambiguous with System.Linq v4.7.2 - public static HashSet ToHashSet(this IEnumerable items) => new HashSet(items); } } \ No newline at end of file From 1c680280b1190a85cf239c3745f1d5e5d065ca77 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 15 Oct 2019 16:37:41 -0400 Subject: [PATCH 167/372] Add Defer --- src/ServiceStack.Text/Defer.cs | 15 +++++++++++++++ ...ztionTests.cs => RuntimeSerializationTests.cs} | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/ServiceStack.Text/Defer.cs rename tests/ServiceStack.Text.Tests/{RuntimeSerializtionTests.cs => RuntimeSerializationTests.cs} (99%) diff --git a/src/ServiceStack.Text/Defer.cs b/src/ServiceStack.Text/Defer.cs new file mode 100644 index 000000000..2e29db4e4 --- /dev/null +++ b/src/ServiceStack.Text/Defer.cs @@ -0,0 +1,15 @@ +using System; + +namespace ServiceStack +{ + /// + /// Useful class for C# 8 using declaration to defer action til outside of scope, e.g: + /// using var defer = new Defer(() => response.Close()); + /// + public struct Defer : IDisposable + { + private readonly Action fn; + public Defer(Action fn) => this.fn = fn ?? throw new ArgumentNullException(nameof(fn)); + public void Dispose() => fn(); + } +} \ No newline at end of file diff --git a/tests/ServiceStack.Text.Tests/RuntimeSerializtionTests.cs b/tests/ServiceStack.Text.Tests/RuntimeSerializationTests.cs similarity index 99% rename from tests/ServiceStack.Text.Tests/RuntimeSerializtionTests.cs rename to tests/ServiceStack.Text.Tests/RuntimeSerializationTests.cs index 188ddd5ca..09fd1fc1d 100644 --- a/tests/ServiceStack.Text.Tests/RuntimeSerializtionTests.cs +++ b/tests/ServiceStack.Text.Tests/RuntimeSerializationTests.cs @@ -57,7 +57,7 @@ public class RuntimeObjects public object[] Objects { get; set; } } - public class RuntimeSerializtionTests + public class RuntimeSerializationTests { string CreateJson(Type type) => CreateJson(type.AssemblyQualifiedName); string CreateJson(string typeInfo) => "{\"Object\":{\"__type\":\"" + typeInfo + "\"}}"; From 4df456983e9ce3ad7918f30c311e21b0df812e8b Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 20 Oct 2019 15:20:22 -0400 Subject: [PATCH 168/372] clean up proj refs --- src/ServiceStack.Text/ServiceStack.Text.Core.csproj | 3 +-- src/ServiceStack.Text/ServiceStack.Text.csproj | 4 +--- src/ServiceStack.Text/StringExtensions.cs | 10 ++++------ 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index d7ad0bebc..28bea2a4e 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -17,15 +17,14 @@ + - - \ No newline at end of file diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index b9869932e..4b319d075 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -16,19 +16,17 @@ + - - - \ No newline at end of file diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 652f63d17..58f2b3977 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -226,14 +226,12 @@ public static string ToRot13(this string value) public static string WithTrailingSlash(this string path) { - if (String.IsNullOrEmpty(path)) + if (path == null) throw new ArgumentNullException(nameof(path)); + if (path == "") + return "/"; - if (path[path.Length - 1] != '/') - { - return path + "/"; - } - return path; + return path[path.Length - 1] != '/' ? path + "/" : path; } public static string AppendPath(this string uri, params string[] uriComponents) From af29d77fd1a40e31d8d18c8148fca8df56b80a2f Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 20 Oct 2019 15:20:36 -0400 Subject: [PATCH 169/372] Add UrlWithTrailingSlash --- src/ServiceStack.Text/StringExtensions.cs | 10 ++++++ .../StringExtensionsTests.cs | 34 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 58f2b3977..8605dc2ab 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -224,6 +224,16 @@ public static string ToRot13(this string value) return new string(array); } + private static char[] UrlPathDelims = new[] {'?', '#'}; + + public static string UrlWithTrailingSlash(this string url) + { + var endPos = url?.IndexOfAny(UrlPathDelims) ?? -1; + return endPos >= 0 + ? url.Substring(0, endPos).WithTrailingSlash() + url.Substring(endPos) + : url.WithTrailingSlash(); + } + public static string WithTrailingSlash(this string path) { if (path == null) diff --git a/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs b/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs index 67397f212..c2f8333bf 100644 --- a/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs +++ b/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs @@ -362,5 +362,39 @@ public void Does_ReplaceAll_from_Start() Assert.That("/images".ReplaceAll("/",""), Is.EqualTo("images")); } + [TestCase("", ExpectedResult = "/")] + [TestCase("/", ExpectedResult = "/")] + [TestCase("?p1=asdf", ExpectedResult = "/?p1=asdf")] + [TestCase("/page", ExpectedResult = "/page/")] + [TestCase("/page/", ExpectedResult = "/page/")] + [TestCase("/page?p1=asdf", ExpectedResult = "/page/?p1=asdf")] + [TestCase("/page?p1=asdf&p2=asdf", ExpectedResult = "/page/?p1=asdf&p2=asdf")] + [TestCase("/page/?p1=asdf&p2=asdf", ExpectedResult = "/page/?p1=asdf&p2=asdf")] + + [TestCase("#here", ExpectedResult = "/#here")] + [TestCase("?p1=asdf#here", ExpectedResult = "/?p1=asdf#here")] + [TestCase("/page#here", ExpectedResult = "/page/#here")] + [TestCase("/page/#here", ExpectedResult = "/page/#here")] + [TestCase("/page?p1=asdf#here", ExpectedResult = "/page/?p1=asdf#here")] + [TestCase("/page?p1=asdf&p2=asdf#here", ExpectedResult = "/page/?p1=asdf&p2=asdf#here")] + [TestCase("/page/?p1=asdf&p2=asdf#here", ExpectedResult = "/page/?p1=asdf&p2=asdf#here")] + + [TestCase("domain.com", ExpectedResult = "domain.com/")] + [TestCase("domain.com/", ExpectedResult = "domain.com/")] + [TestCase("domain.com?p1=asdf", ExpectedResult = "domain.com/?p1=asdf")] + [TestCase("domain.com/page?p1=asdf", ExpectedResult = "domain.com/page/?p1=asdf")] + [TestCase("domain.com/page?p1=asdf&p2=asdf", ExpectedResult = "domain.com/page/?p1=asdf&p2=asdf")] + [TestCase("domain.com/page/?p1=asdf&p2=asdf", ExpectedResult = "domain.com/page/?p1=asdf&p2=asdf")] + + [TestCase("domain.com#here", ExpectedResult = "domain.com/#here")] + [TestCase("domain.com/#here", ExpectedResult = "domain.com/#here")] + [TestCase("domain.com?p1=asdf#here", ExpectedResult = "domain.com/?p1=asdf#here")] + [TestCase("domain.com/page?p1=asdf#here", ExpectedResult = "domain.com/page/?p1=asdf#here")] + [TestCase("domain.com/page?p1=asdf&p2=asdf#here", ExpectedResult = "domain.com/page/?p1=asdf&p2=asdf#here")] + [TestCase("domain.com/page/?p1=asdf&p2=asdf#here", ExpectedResult = "domain.com/page/?p1=asdf&p2=asdf#here")] + public string Does_UrlWithTrailingSlash(string url) + { + return url.UrlWithTrailingSlash(); + } } } From 6b32fb4adee16267a15cf7c201b13235cd6bcc9a Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 2 Nov 2019 23:26:09 -0400 Subject: [PATCH 170/372] Use InvariantCultuer in ServerUserAgent UserAgent string --- src/ServiceStack.Text/Env.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index a3ee471fa..4404af6e4 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -96,16 +96,16 @@ static Env() ReflectionOptimizer.Instance = ExpressionReflectionOptimizer.Provider; } - ServerUserAgent = "ServiceStack/" + - ServiceStackVersion + " " + VersionString = ServiceStackVersion.ToString(CultureInfo.InvariantCulture); + + ServerUserAgent = "ServiceStack/" + + VersionString + " " + PclExport.Instance.PlatformName + (IsMono ? "/Mono" : "") + (IsLinux ? "/Linux" : IsOSX ? "/OSX" : IsUnix ? "/Unix" : IsWindows ? "/Windows" : "/UnknownOS") + (IsIOS ? "/iOS" : IsAndroid ? "/Android" : IsUWP ? "/UWP" : ""); - VersionString = ServiceStackVersion.ToString(CultureInfo.InvariantCulture); - - __releaseDate = new DateTime(2018,12,16); + __releaseDate = new DateTime(2001,01,01); } public static string VersionString { get; set; } From 8e83147fe879f3075c20527db09805d33a81fa08 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 6 Nov 2019 15:24:57 -0500 Subject: [PATCH 171/372] Auto trim headers with leading/trailing whitespace --- src/ServiceStack.Text/CsvReader.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ServiceStack.Text/CsvReader.cs b/src/ServiceStack.Text/CsvReader.cs index 1fb4bcaf8..b737e2726 100644 --- a/src/ServiceStack.Text/CsvReader.cs +++ b/src/ServiceStack.Text/CsvReader.cs @@ -59,7 +59,8 @@ public static List ParseLines(string csv) return rows; } - public static List ParseFields(string line) + public static List ParseFields(string line) => ParseFields(line, null); + public static List ParseFields(string line, Func parseFn) { var to = new List(); if (string.IsNullOrEmpty(line)) @@ -70,7 +71,7 @@ public static List ParseFields(string line) while (++i <= len) { var value = EatValue(line, ref i); - to.Add(value.FromCsvField()); + to.Add(parseFn != null ? parseFn(value.FromCsvField()) : value.FromCsvField()); } return to; @@ -355,7 +356,9 @@ public static List Read(List rows) List headers = null; if (!CsvConfig.OmitHeaders || Headers.Count == 0) - headers = CsvReader.ParseFields(rows[0]); + { + headers = CsvReader.ParseFields(rows[0], s => s.Trim()); + } if (typeof(T).IsValueType || typeof(T) == typeof(string)) { From 4fec2a0f7074c29cf630d61b5fb62aaef73f3d00 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 21 Nov 2019 22:25:56 -0500 Subject: [PATCH 172/372] cleanup --- src/ServiceStack.Text/CsvSerializer.cs | 6 +++--- src/ServiceStack.Text/Jsv/JsvReader.Generic.cs | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/ServiceStack.Text/CsvSerializer.cs b/src/ServiceStack.Text/CsvSerializer.cs index 62f3bc3b7..99d57f691 100644 --- a/src/ServiceStack.Text/CsvSerializer.cs +++ b/src/ServiceStack.Text/CsvSerializer.cs @@ -270,9 +270,9 @@ private static WriteObjectDelegate GetWriteFn() bestCandidateEnumerableType = typeof(T).GetTypeWithGenericTypeDefinitionOf(typeof(IEnumerable<>)); if (bestCandidateEnumerableType != null) { - var dictionarOrKvps = typeof(T).HasInterface(typeof(IEnumerable>)) - || typeof(T).HasInterface(typeof(IEnumerable>)); - if (dictionarOrKvps) + var dictionaryOrKvps = typeof(T).HasInterface(typeof(IEnumerable>)) + || typeof(T).HasInterface(typeof(IEnumerable>)); + if (dictionaryOrKvps) { return WriteSelf; } diff --git a/src/ServiceStack.Text/Jsv/JsvReader.Generic.cs b/src/ServiceStack.Text/Jsv/JsvReader.Generic.cs index a714a9aa6..7ee6c3655 100644 --- a/src/ServiceStack.Text/Jsv/JsvReader.Generic.cs +++ b/src/ServiceStack.Text/Jsv/JsvReader.Generic.cs @@ -33,8 +33,9 @@ public static ParseStringSpanDelegate GetParseStringSpanFn(Type type) do { snapshot = ParseFnCache; - newCache = new Dictionary(ParseFnCache); - newCache[type] = parseFactoryFn; + newCache = new Dictionary(ParseFnCache) { + [type] = parseFactoryFn + }; } while (!ReferenceEquals( Interlocked.CompareExchange(ref ParseFnCache, newCache, snapshot), snapshot)); From d68942084242e5a7856404781ec16b4f94ebb64b Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 21 Nov 2019 22:26:31 -0500 Subject: [PATCH 173/372] don't double deserialize quoted csv fields --- src/ServiceStack.Text/CsvReader.cs | 2 +- .../ServiceStack.Text.Tests/CsvSerializerTests.cs | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/CsvReader.cs b/src/ServiceStack.Text/CsvReader.cs index b737e2726..07d340fd2 100644 --- a/src/ServiceStack.Text/CsvReader.cs +++ b/src/ServiceStack.Text/CsvReader.cs @@ -71,7 +71,7 @@ public static List ParseFields(string line, Func parseFn) while (++i <= len) { var value = EatValue(line, ref i); - to.Add(parseFn != null ? parseFn(value.FromCsvField()) : value.FromCsvField()); + to.Add(parseFn != null ? parseFn(value) : value); } return to; diff --git a/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs b/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs index 243ef021c..e073c479d 100644 --- a/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs +++ b/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs @@ -377,6 +377,20 @@ public void Can_serialize_single_StringDictionary_or_StringKvps() Assert.That(kvps.ToCsv().NormalizeNewLines(), Is.EqualTo("Id,CustomerId\n1,ALFKI").Or.EqualTo("CustomerId,Id\nALFKI,1")); } + [Test] + public void Can_serialize_fields_with_double_quotes() + { + var person = new Person { Id = 1, Name = "\"Mr. Lee\"" }; + Assert.That(person.ToCsv().NormalizeNewLines(), Is.EqualTo("Id,Name\n1,\"\"\"Mr. Lee\"\"\"")); + var fromCsv = person.ToCsv().FromCsv(); + Assert.That(fromCsv, Is.EqualTo(person)); + + person = new Person { Id = 1, Name = "\"Anon\" Review" }; + Assert.That(person.ToCsv().NormalizeNewLines(), Is.EqualTo("Id,Name\n1,\"\"\"Anon\"\" Review\"")); + fromCsv = person.ToCsv().FromCsv(); + Assert.That(fromCsv, Is.EqualTo(person)); + } + [Test] public void serialize_Category() { From f565fd38ce8dd4b7147141332115e10b5b5d1750 Mon Sep 17 00:00:00 2001 From: timzap Date: Fri, 22 Nov 2019 16:56:34 +1100 Subject: [PATCH 174/372] Bug Report: CsvSerializer doesn't handle strings that start with double-quotes properly. CsvSerializerTests fail with the newly added test data entries. (#524) --- tests/ServiceStack.Text.Tests/Support/MovieDtos.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/ServiceStack.Text.Tests/Support/MovieDtos.cs b/tests/ServiceStack.Text.Tests/Support/MovieDtos.cs index e2df066dc..8e66073cf 100644 --- a/tests/ServiceStack.Text.Tests/Support/MovieDtos.cs +++ b/tests/ServiceStack.Text.Tests/Support/MovieDtos.cs @@ -14,6 +14,8 @@ public static class MoviesData new Movie { ImdbId = "tt1375666", Title = "Inception", Rating = 9.2m, Director = "Christopher Nolan", ReleaseDate = new DateTime(2010,7,16), TagLine = "Your mind is the scene of the crime", Genres = new List{"Action", "Mystery", "Sci-Fi", "Thriller"}, }, new Movie { ImdbId = "tt0071562", Title = "The Godfather: Part II", Rating = 9.0m, Director = "Francis Ford Coppola", ReleaseDate = new DateTime(1974,12,20), Genres = new List {"Crime","Drama", "Thriller"}, }, new Movie { ImdbId = "tt0060196", Title = "The Good, the Bad and the Ugly", Rating = 9.0m, Director = "Sergio Leone", ReleaseDate = new DateTime(1967,12,29), TagLine = "They formed an alliance of hate to steal a fortune in dead man's gold", Genres = new List{"Adventure","Western"}, }, + new Movie { ImdbId = "tt0678100", Title = "\"Mr. Lee\"", Rating = 8.4m, Director = "Steven Long Mitchell", ReleaseDate = new DateTime(1999,2,6), Genres = new List {"Drama", "Mystery", "Sci-Fi", "Thriller"}, }, + new Movie { ImdbId = "tt9793324", Title = "\"Anon\" Review", Rating = 0.0m, Director = null, ReleaseDate = new DateTime(2018,11,15), Genres = new List {"Sci-Fi"}, }, }; } From 745449bdb66a55bf04cdd85b7f2cccee93b880a8 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 22 Nov 2019 00:57:48 -0500 Subject: [PATCH 175/372] resolve double-unescaping of CSV fields --- src/ServiceStack.Text/CsvReader.cs | 2 +- src/ServiceStack.Text/CsvSerializer.cs | 19 ++++++++++++++----- .../Jsv/JsvTypeSerializer.cs | 10 +++++++--- .../CsvSerializerTests.cs | 2 +- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/ServiceStack.Text/CsvReader.cs b/src/ServiceStack.Text/CsvReader.cs index 07d340fd2..b737e2726 100644 --- a/src/ServiceStack.Text/CsvReader.cs +++ b/src/ServiceStack.Text/CsvReader.cs @@ -71,7 +71,7 @@ public static List ParseFields(string line, Func parseFn) while (++i <= len) { var value = EatValue(line, ref i); - to.Add(parseFn != null ? parseFn(value) : value); + to.Add(parseFn != null ? parseFn(value.FromCsvField()) : value.FromCsvField()); } return to; diff --git a/src/ServiceStack.Text/CsvSerializer.cs b/src/ServiceStack.Text/CsvSerializer.cs index 99d57f691..ec752ee48 100644 --- a/src/ServiceStack.Text/CsvSerializer.cs +++ b/src/ServiceStack.Text/CsvSerializer.cs @@ -151,7 +151,7 @@ public static T DeserializeFromReader(TextReader reader) public static T DeserializeFromString(string text) { - if (string.IsNullOrEmpty(text)) return default(T); + if (string.IsNullOrEmpty(text)) return default; var results = CsvSerializer.ReadObject(text); return ConvertFrom(results); } @@ -159,10 +159,19 @@ public static T DeserializeFromString(string text) public static object DeserializeFromString(Type type, string text) { if (string.IsNullOrEmpty(text)) return null; - var fn = GetReadFn(type); - var result = fn(text); - var converted = ConvertFrom(type, result); - return converted; + var hold = JsState.IsCsv; + JsState.IsCsv = true; + try + { + var fn = GetReadFn(type); + var result = fn(text); + var converted = ConvertFrom(type, result); + return converted; + } + finally + { + JsState.IsCsv = hold; + } } public static void WriteLateBoundObject(TextWriter writer, object value) diff --git a/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs b/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs index a1b92c4ba..2b78ed86b 100644 --- a/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs +++ b/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs @@ -259,12 +259,16 @@ public void WriteEnum(TextWriter writer, object enumValue) [MethodImpl(MethodImplOptions.AggressiveInlining)] public object UnescapeStringAsObject(ReadOnlySpan value) { - return value.FromCsvField().Value(); + return UnescapeSafeString(value).Value(); } - public string UnescapeSafeString(string value) => value.FromCsvField(); + public string UnescapeSafeString(string value) => JsState.IsCsv + ? value + : value.FromCsvField(); - public ReadOnlySpan UnescapeSafeString(ReadOnlySpan value) => value.FromCsvField(); + public ReadOnlySpan UnescapeSafeString(ReadOnlySpan value) => JsState.IsCsv + ? value // already unescaped in CsvReader.ParseFields() + : value.FromCsvField(); public string ParseRawString(string value) => value; diff --git a/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs b/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs index e073c479d..04982d01f 100644 --- a/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs +++ b/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs @@ -116,7 +116,7 @@ public void Does_parse_fields() } [Test] - public void Does_parse_fileds_with_unmatchedJsMark() + public void Does_parse_fields_with_unmatchedJsMark() { Assert.That(CsvReader.ParseFields("{A,B"), Is.EqualTo(new[] { "{A", "B" })); Assert.That(CsvReader.ParseFields("{A},B"), Is.EqualTo(new[] { "{A}", "B" })); From 721a78a746ad82d0384d7f09e7f528e6ccd56db8 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 27 Nov 2019 01:28:51 -0500 Subject: [PATCH 176/372] Update Directory.Build.props --- src/Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index adb97451f..ae56c3adf 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -37,7 +37,7 @@ - + From 4b0f937eed5931141d22ad4f98ac544883dabe95 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 27 Dec 2019 17:42:36 -0500 Subject: [PATCH 177/372] StripQuotes also strips single quotes --- src/ServiceStack.Text/StringExtensions.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 8605dc2ab..2d39e1f19 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -697,7 +697,8 @@ public static string StripQuotes(this string text) { return string.IsNullOrEmpty(text) || text.Length < 2 ? text - : text[0] == '"' && text[text.Length - 1] == '"' + : (text[0] == '"' && text[text.Length - 1] == '"') || + (text[0] == '\'' && text[text.Length - 1] == '\'') ? text.Substring(1, text.Length - 2) : text; } From 899dfc6613e9206561db28e1b333f5e787d3ea0b Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 13 Jan 2020 02:53:33 -0500 Subject: [PATCH 178/372] bump to v5.8 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index ae56c3adf..373215e15 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.7.1 + 5.8.0 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 794d9e12f..ee01ef63b 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.7.1 + 5.8.0 latest false From 54cab5ba49c0494e5f6749f8bcccb0e0888ec203 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 14 Jan 2020 11:51:01 -0500 Subject: [PATCH 179/372] bump to v5.8.1 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 373215e15..45c86d63f 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.8.0 + 5.8.1 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index ee01ef63b..18fc63a59 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.8.0 + 5.8.1 latest false From 03bb422a091f05fec37c1bffd796687b10a421e1 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 14 Jan 2020 12:26:24 -0500 Subject: [PATCH 180/372] Add AutoMapping method test --- .../AutoMappingTests.cs | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index e6dc7d25e..7a5feb8df 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -1563,5 +1563,34 @@ public void Does_convert_nested_collections() Assert.That(navItems[0].Children[1].Id, Is.EqualTo("B2")); Assert.That(navItems[0].Children[1].Children[0].Id, Is.EqualTo("C1")); } + + public class TestMethod + { + public void MyMethod(string myProp) + { + MyProp = myProp; + } + public string MyProp { get; set; } + } + + public class TestMethod2 + { + public void MyMethod() + { + MyProp = nameof(MyMethod); + } + public string MyProp { get; set; } + } + + [Test] + public void Does_not_try_to_map_methods() + { + var from = new TestMethod(); + var to = new TestMethod2(); + from.MyProp = "Test"; + to.PopulateFromPropertiesWithoutAttribute(from, typeof(IgnoreDataMemberAttribute)); + Assert.That(from.MyProp, Is.EqualTo(to.MyProp)); + } + } } From f70f16fbd5ccb94cdd36b0da78c59226da0bc379 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 15 Jan 2020 03:26:11 -0500 Subject: [PATCH 181/372] only allow methods that matches shapes of object getters/setters --- src/ServiceStack.Text/AutoMappingUtils.cs | 7 +++---- tests/ServiceStack.Text.Tests/AutoMappingTests.cs | 10 +++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 1b4a90beb..b6d0afdff 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -444,7 +444,6 @@ internal static AssignmentDefinition GetAssignmentDefinition(Type toType, Type f return AssignmentDefinitionCache.GetOrAdd(cacheKey, delegate { - var definition = new AssignmentDefinition { ToType = toType, @@ -515,7 +514,7 @@ private static Dictionary GetMembers(Type type, bool i var parameterInfos = methodInfo.GetParameters(); if (isReadable) { - if (parameterInfos.Length == 0) + if (parameterInfos.Length == 0 && methodInfo.ReturnType == typeof(object)) { var name = info.Name.StartsWith("get_") ? info.Name.Substring(4) : info.Name; if (!map.ContainsKey(name)) @@ -527,7 +526,8 @@ private static Dictionary GetMembers(Type type, bool i } else { - if (parameterInfos.Length == 1 && methodInfo.ReturnType == typeof(void)) + if (parameterInfos.Length == 1 && methodInfo.ReturnType == typeof(void) && + methodInfo.GetParameters()[0].ParameterType == typeof(object)) { var name = info.Name.StartsWith("set_") ? info.Name.Substring(4) : info.Name; if (!map.ContainsKey(name)) @@ -539,7 +539,6 @@ private static Dictionary GetMembers(Type type, bool i } } } - return map; } diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 7a5feb8df..5fefa1ced 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -1566,22 +1566,22 @@ public void Does_convert_nested_collections() public class TestMethod { - public void MyMethod(string myProp) + public void MyMethod() { - MyProp = myProp; + MyProp = nameof(MyProp); } public string MyProp { get; set; } } - + public class TestMethod2 { - public void MyMethod() + public void MyMethod(string myProp) { MyProp = nameof(MyMethod); } public string MyProp { get; set; } } - + [Test] public void Does_not_try_to_map_methods() { From 172afd4a5a41decb93b29dfd53425bcf4c2f8a58 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 15 Jan 2020 11:23:01 -0500 Subject: [PATCH 182/372] remove unused getter/setter automapping via backing methodinfo --- src/ServiceStack.Text/AutoMappingUtils.cs | 31 ----------------------- 1 file changed, 31 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index b6d0afdff..4e3eddf18 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -507,37 +507,6 @@ private static Dictionary GetMembers(Type type, bool i map[info.Name] = new AssignmentMember(fieldInfo.FieldType, fieldInfo); continue; } - - var methodInfo = info as MethodInfo; - if (methodInfo != null) - { - var parameterInfos = methodInfo.GetParameters(); - if (isReadable) - { - if (parameterInfos.Length == 0 && methodInfo.ReturnType == typeof(object)) - { - var name = info.Name.StartsWith("get_") ? info.Name.Substring(4) : info.Name; - if (!map.ContainsKey(name)) - { - map[name] = new AssignmentMember(methodInfo.ReturnType, methodInfo); - continue; - } - } - } - else - { - if (parameterInfos.Length == 1 && methodInfo.ReturnType == typeof(void) && - methodInfo.GetParameters()[0].ParameterType == typeof(object)) - { - var name = info.Name.StartsWith("set_") ? info.Name.Substring(4) : info.Name; - if (!map.ContainsKey(name)) - { - map[name] = new AssignmentMember(parameterInfos[0].ParameterType, methodInfo); - continue; - } - } - } - } } return map; } From 8dcac4c3dcb07ce73cff4379fc33f0a53d9040e0 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 20 Jan 2020 21:59:40 -0500 Subject: [PATCH 183/372] Update Env.cs --- src/ServiceStack.Text/Env.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 4404af6e4..2659ec24b 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -110,7 +110,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.7m; + public static decimal ServiceStackVersion = 5.8m; public static bool IsLinux { get; set; } From 4a4be8c85a835647cac32a51dd893269d379b2e7 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 22 Jan 2020 18:18:36 -0500 Subject: [PATCH 184/372] Update StringExtensions.cs --- src/ServiceStack.Text/StringExtensions.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 2d39e1f19..e93a5bc42 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -533,12 +533,17 @@ public static T FromJsvSpan(this ReadOnlySpan jsv) { return TypeSerializer.DeserializeFromSpan(jsv); } + + static readonly object semaphore = new object(); //tmp workaround async multi-threading public static string ToJson(this T obj) { - return JsConfig.PreferInterfaces - ? JsonSerializer.SerializeToString(obj, AssemblyUtils.MainInterface()) - : JsonSerializer.SerializeToString(obj); + lock (semaphore) + { + return JsConfig.PreferInterfaces + ? JsonSerializer.SerializeToString(obj, AssemblyUtils.MainInterface()) + : JsonSerializer.SerializeToString(obj); + } } public static string ToSafeJson(this T obj) From 51ebd7b075e779bf595922e116cef8c48f1f55a7 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 23 Jan 2020 01:50:49 -0500 Subject: [PATCH 185/372] revert lock --- src/ServiceStack.Text/Common/WriteDictionary.cs | 4 +--- src/ServiceStack.Text/StringExtensions.cs | 11 +++-------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/ServiceStack.Text/Common/WriteDictionary.cs b/src/ServiceStack.Text/Common/WriteDictionary.cs index a91112353..a40501384 100644 --- a/src/ServiceStack.Text/Common/WriteDictionary.cs +++ b/src/ServiceStack.Text/Common/WriteDictionary.cs @@ -72,9 +72,8 @@ public override int GetHashCode() public static Action GetWriteGenericDictionary(Type keyType, Type valueType) { - WriteMapDelegate writeFn; var mapKey = new MapKey(keyType, valueType); - if (CacheFns.TryGetValue(mapKey, out writeFn)) return writeFn.Invoke; + if (CacheFns.TryGetValue(mapKey, out var writeFn)) return writeFn.Invoke; var genericType = typeof(ToStringDictionaryMethods<,,>).MakeGenericType(keyType, valueType, typeof(TSerializer)); var mi = genericType.GetStaticMethod("WriteIDictionary"); @@ -239,7 +238,6 @@ public static void WriteGenericIDictionary( { writeKeyFn(writer, kvp.Key); } - } finally { diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index e93a5bc42..6db4b84c4 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -534,16 +534,11 @@ public static T FromJsvSpan(this ReadOnlySpan jsv) return TypeSerializer.DeserializeFromSpan(jsv); } - static readonly object semaphore = new object(); //tmp workaround async multi-threading - public static string ToJson(this T obj) { - lock (semaphore) - { - return JsConfig.PreferInterfaces - ? JsonSerializer.SerializeToString(obj, AssemblyUtils.MainInterface()) - : JsonSerializer.SerializeToString(obj); - } + return JsConfig.PreferInterfaces + ? JsonSerializer.SerializeToString(obj, AssemblyUtils.MainInterface()) + : JsonSerializer.SerializeToString(obj); } public static string ToSafeJson(this T obj) From 5654a941de9584ff56345dfaa466d24beb717d90 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 23 Jan 2020 15:43:54 -0500 Subject: [PATCH 186/372] fix usages of ReleaseBufferToPool --- src/ServiceStack.Text/DefaultMemory.cs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/ServiceStack.Text/DefaultMemory.cs b/src/ServiceStack.Text/DefaultMemory.cs index 246f875d8..65c300e7b 100644 --- a/src/ServiceStack.Text/DefaultMemory.cs +++ b/src/ServiceStack.Text/DefaultMemory.cs @@ -460,23 +460,31 @@ public override void Write(Stream stream, ReadOnlyMemory value) public override Task WriteAsync(Stream stream, ReadOnlySpan value, CancellationToken token = default) { + // encode the span into a buffer; this should never fail, so if it does: something + // is very very ill; don't stress about returning to the pool byte[] bytes = BufferPool.GetBuffer(Encoding.UTF8.GetMaxByteCount(value.Length)); + var chars = value.ToArray(); + int bytesCount = Encoding.UTF8.GetBytes(chars, 0, chars.Length, bytes, 0); + // now do the write async - this returns to the pool + return WriteAsyncAndReturn(stream, bytes, 0, bytesCount, token); + } + + private static async Task WriteAsyncAndReturn(Stream stream, byte[] bytes, int offset, int count, CancellationToken token) + { try { - var chars = value.ToArray(); - int bytesCount = Encoding.UTF8.GetBytes(chars, 0, chars.Length, bytes, 0); - return stream.WriteAsync(bytes, 0, bytesCount, token); + await stream.WriteAsync(bytes, offset, count, token); } finally { BufferPool.ReleaseBufferToPool(ref bytes); } } - + public override Task WriteAsync(Stream stream, ReadOnlyMemory value, CancellationToken token = default) => WriteAsync(stream, value.Span, token); - public override Task WriteAsync(Stream stream, ReadOnlyMemory value, CancellationToken token = default) + public override async Task WriteAsync(Stream stream, ReadOnlyMemory value, CancellationToken token = default) { byte[] bytes = BufferPool.GetBuffer(value.Length); try @@ -485,11 +493,10 @@ public override Task WriteAsync(Stream stream, ReadOnlyMemory value, Cance if (stream is MemoryStream ms) { ms.Write(bytes, 0, value.Length); - return TypeConstants.EmptyTask; } else { - return stream.WriteAsync(bytes, 0, value.Length, token); + await stream.WriteAsync(bytes, 0, value.Length, token); } } finally From 5d98d20209c9770fdf7aa0e730cd9334ae4e2751 Mon Sep 17 00:00:00 2001 From: Bnaya Eshet <3382669+bnayae@users.noreply.github.com> Date: Sat, 25 Jan 2020 18:47:50 +0200 Subject: [PATCH 187/372] optional mapping for ToObjectDictionary (#525) * optional mapping for ToObjectDictionary * log htm * overload instead of optional parameter for better support for JS.Configure() * test --- src/ServiceStack.Text/PlatformExtensions.cs | 130 ++++++++++++++---- src/UpgradeLog.htm | Bin 0 -> 42608 bytes .../AutoMappingObjectDictionaryTests.cs | 10 ++ .../AutoMappingTests.cs | 6 + 4 files changed, 120 insertions(+), 26 deletions(-) create mode 100644 src/UpgradeLog.htm diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index 6dd119d09..38f086955 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -658,32 +658,74 @@ public void SetValue(object instance, object value) } } + private static Dictionary ConvertToDictionary( + IEnumerable> collection, + Func mapper = null) + { + if (mapper != null) + { + return mapper.MapToDictionary(collection); + } + + var to = new Dictionary(); + foreach (var entry in collection) + { + string key = entry.Key; + object value = entry.Value; + to[key] = value; + } + return to; + } + + private static Dictionary MapToDictionary( + this Func mapper, + IEnumerable> collection) + { + return collection.ToDictionary( + pair => pair.Key, + pair => mapper(pair.Key, pair.Value)); + } + public static Dictionary ToObjectDictionary(this object obj) + { + return ToObjectDictionary(obj, null); + } + + public static Dictionary ToObjectDictionary( + this object obj, + Func mapper) { if (obj == null) return null; if (obj is Dictionary alreadyDict) + { + if (mapper != null) + return mapper.MapToDictionary(alreadyDict); return alreadyDict; + } if (obj is IDictionary interfaceDict) + { + if (mapper != null) + return mapper.MapToDictionary(interfaceDict); return new Dictionary(interfaceDict); + } var to = new Dictionary(); if (obj is Dictionary stringDict) { - foreach (var entry in stringDict) - { - to[entry.Key] = entry.Value; - } - return to; + return ConvertToDictionary(stringDict, mapper); } if (obj is IDictionary d) { foreach (var key in d.Keys) { - to[key.ToString()] = d[key]; + string k = key.ToString(); + object v = d[key]; + v = mapper?.Invoke(k, v) ?? v; + to[k] = v; } return to; } @@ -692,26 +734,21 @@ public static Dictionary ToObjectDictionary(this object obj) { for (var i = 0; i < nvc.Count; i++) { - to[nvc.GetKey(i)] = nvc.Get(i); + string k = nvc.GetKey(i); + object v = nvc.Get(i); + v = mapper?.Invoke(k, v) ?? v; + to[k] = v; } return to; } if (obj is IEnumerable> objKvps) { - foreach (var kvp in objKvps) - { - to[kvp.Key] = kvp.Value; - } - return to; + return ConvertToDictionary(objKvps, mapper); } if (obj is IEnumerable> strKvps) { - foreach (var kvp in strKvps) - { - to[kvp.Key] = kvp.Value; - } - return to; + return ConvertToDictionary(strKvps, mapper); } var type = obj.GetType(); @@ -724,22 +761,60 @@ public static Dictionary ToObjectDictionary(this object obj) { var key = keyGetter(entry); var value = valueGetter(entry); - to[key.ConvertTo()] = value; + string k = key.ConvertTo(); + value = mapper?.Invoke(k, value) ?? value; + to[k] = value; } return to; } - + if (obj is KeyValuePair objKvp) - return new Dictionary { { nameof(objKvp.Key), objKvp.Key }, { nameof(objKvp.Value), objKvp.Value } }; + { + string kk = nameof(objKvp.Key); + object kv = objKvp.Key; + kv = mapper?.Invoke(kk, kv) ?? kv; + + string vk = nameof(objKvp.Value); + object vv = objKvp.Value; + vv = mapper?.Invoke(vk, vv) ?? vv; + + return new Dictionary + { + [kk] = kv, + [vk] = vv + }; + } if (obj is KeyValuePair strKvp) - return new Dictionary { { nameof(strKvp.Key), strKvp.Key }, { nameof(strKvp.Value), strKvp.Value } }; - + { + string kk = nameof(objKvp.Key); + object kv = strKvp.Key; + kv = mapper?.Invoke(kk, kv) ?? kv; + + string vk = nameof(strKvp.Value); + object vv = strKvp.Value; + vv = mapper?.Invoke(vk, vv) ?? vv; + + return new Dictionary + { + [kk] = kv, + [vk] = vv + }; + } if (type.GetKeyValuePairTypes(out _, out var _)) { - return new Dictionary { - { "Key", TypeProperties.Get(type).GetPublicGetter("Key")(obj).ConvertTo() }, - { "Value", TypeProperties.Get(type).GetPublicGetter("Value")(obj) }, + string kk = "Key"; + object kv = TypeProperties.Get(type).GetPublicGetter("Key")(obj).ConvertTo(); + kv = mapper?.Invoke(kk, kv) ?? kv; + + string vk = "Value"; + object vv = TypeProperties.Get(type).GetPublicGetter("Value")(obj); + vv = mapper?.Invoke(vk, vv) ?? vv; + + return new Dictionary + { + [kk] = kv, + [vk] = vv }; } @@ -748,7 +823,10 @@ public static Dictionary ToObjectDictionary(this object obj) foreach (var fieldDef in def.Fields) { - to[fieldDef.Name] = fieldDef.GetValueFn(obj); + string k = fieldDef.Name; + object v = fieldDef.GetValueFn(obj); + v = mapper?.Invoke(k, v) ?? v; + to[k] = v; } return to; diff --git a/src/UpgradeLog.htm b/src/UpgradeLog.htm new file mode 100644 index 0000000000000000000000000000000000000000..a5d93a65db67588dc5f40fed805c52d5161b3f4d GIT binary patch literal 42608 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 SlIQU!>a~mF1i9X$-v0y9FjPwb literal 0 HcmV?d00001 diff --git a/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs index 58f4455e3..34a710411 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingObjectDictionaryTests.cs @@ -11,6 +11,16 @@ namespace ServiceStack.Text.Tests [TestFixture] public class AutoMappingObjectDictionaryTests { + [Test] + public void Can_convert_Car_to_ObjectDictionary_WithMapper() + { + var dto = new DtoWithEnum { Name = "Dan", Color = Color.Blue}; + var map = dto.ToObjectDictionary((k,v) => k == nameof(Color) ? v.ToString().ToLower() : v); + + Assert.That(map["Color"], Is.EqualTo(Color.Blue.ToString().ToLower())); + Assert.That(map["Name"], Is.EqualTo(dto.Name)); + } + [Test] public void Can_convert_Car_to_ObjectDictionary() { diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 5fefa1ced..2d872324f 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -131,6 +131,12 @@ public class NullableConversionDto public decimal? Amount { get; set; } } + public class DtoWithEnum + { + public string Name { get; set; } + public Color Color { get; set; } + } + public class NullableEnumConversion { public Color Color { get; set; } From f7337e62a3e3ed25b10cf342a7b45b72b53fc5b4 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 15 Feb 2020 22:41:33 +0800 Subject: [PATCH 188/372] Resolve object empty string issue when using JS.Configure() --- .../Common/DeserializeType.cs | 4 ++- src/ServiceStack.Text/Json/JsonUtils.cs | 2 +- .../Issues/WhitespaceIssues.cs | 27 ++++++++++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/ServiceStack.Text/Common/DeserializeType.cs b/src/ServiceStack.Text/Common/DeserializeType.cs index d18c33b28..ce3a9abc4 100644 --- a/src/ServiceStack.Text/Common/DeserializeType.cs +++ b/src/ServiceStack.Text/Common/DeserializeType.cs @@ -94,7 +94,9 @@ public static object ObjectStringToType(ReadOnlySpan strType) return primitiveType; if (Serializer.ObjectDeserializer != null && typeof(TSerializer) == typeof(Json.JsonTypeSerializer)) - return Serializer.ObjectDeserializer(strType); + return !strType.IsNullOrEmpty() + ? Serializer.ObjectDeserializer(strType) + : strType.Value(); return Serializer.UnescapeString(strType).Value(); } diff --git a/src/ServiceStack.Text/Json/JsonUtils.cs b/src/ServiceStack.Text/Json/JsonUtils.cs index 2f9e1fd31..91eb96a70 100644 --- a/src/ServiceStack.Text/Json/JsonUtils.cs +++ b/src/ServiceStack.Text/Json/JsonUtils.cs @@ -42,7 +42,7 @@ public static class JsonUtils [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsWhiteSpace(char c) { - return c == ' ' || (c >= '\x0009' && c <= '\x000d') || c == '\x00a0' || c == '\x0085'; + return c == ' ' || (c >= '\x0009' && c <= '\x000d') || c == '\x00a0' || c == '\x0085' || c == TypeConstants.NonWidthWhiteSpace; } public static void WriteString(TextWriter writer, string value) diff --git a/tests/ServiceStack.Text.Tests/Issues/WhitespaceIssues.cs b/tests/ServiceStack.Text.Tests/Issues/WhitespaceIssues.cs index 6a4abbda7..3c2ce06fa 100644 --- a/tests/ServiceStack.Text.Tests/Issues/WhitespaceIssues.cs +++ b/tests/ServiceStack.Text.Tests/Issues/WhitespaceIssues.cs @@ -1,4 +1,7 @@ -using NUnit.Framework; +using System.IO; +using Northwind.Common.DataModel; +using NUnit.Framework; +using ServiceStack.Text.Json; namespace ServiceStack.Text.Tests.Issues { @@ -20,5 +23,27 @@ public void Does_deserialize_empty_string_to_object() var obj = json.FromJson(); Assert.That(obj, Is.EqualTo("")); } + + public class ObjectEmptyStringTest + { + public object Name { get; set; } + } + + [Test] + public void Does_serialize_property_Empty_String() + { + JS.Configure(); + var dto = new ObjectEmptyStringTest { Name = "" }; + var json = dto.ToJson(); + + var fromJson = json.FromJson(); + Assert.That(fromJson.Name, Is.EqualTo(dto.Name)); + + var utf8 = json.ToUtf8Bytes(); + var ms = new MemoryStream(utf8); + var fromMs = JsonSerializer.DeserializeFromStream(ms); + Assert.That(fromMs.Name, Is.EqualTo(dto.Name)); + JS.UnConfigure(); + } } } \ No newline at end of file From 7a6e853a07cebeec9420d411426ee8878bf3595f Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 26 Feb 2020 20:33:41 +0800 Subject: [PATCH 189/372] Fix QueryString serializer of top-level string values --- src/ServiceStack.Text/QueryStringSerializer.cs | 9 +++++++-- .../QueryStringSerializerTests.cs | 11 +++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/QueryStringSerializer.cs b/src/ServiceStack.Text/QueryStringSerializer.cs index e990afd93..58c4c593a 100644 --- a/src/ServiceStack.Text/QueryStringSerializer.cs +++ b/src/ServiceStack.Text/QueryStringSerializer.cs @@ -165,7 +165,8 @@ public static void WriteIDictionary(TextWriter writer, object oMap) foreach (var key in map.Keys) { var dictionaryValue = map[key]; - if (dictionaryValue == null) continue; + if (dictionaryValue == null) + continue; if (writeKeyFn == null) { @@ -174,7 +175,11 @@ public static void WriteIDictionary(TextWriter writer, object oMap) } if (writeValueFn == null || isObjectDictionary) - writeValueFn = Serializer.GetWriteFn(dictionaryValue.GetType()); + { + writeValueFn = dictionaryValue is string + ? (w,x) => w.Write(((string)x).UrlEncode()) + : Serializer.GetWriteFn(dictionaryValue.GetType()); + } if (ranOnce) writer.Write("&"); diff --git a/tests/ServiceStack.Text.Tests/QueryStringSerializerTests.cs b/tests/ServiceStack.Text.Tests/QueryStringSerializerTests.cs index f25ad3655..9d5d02c5c 100644 --- a/tests/ServiceStack.Text.Tests/QueryStringSerializerTests.cs +++ b/tests/ServiceStack.Text.Tests/QueryStringSerializerTests.cs @@ -48,6 +48,17 @@ public void Can_Serialize_Unicode_Query_String() Is.EqualTo("A=%e5%b4%91%e2%a8%b9%e5%a0%a1%ea%81%80%e1%a2%96%e3%a4%b9%c3%ac%e3%ad%a1%ec%a4%aa%e9%8a%ac")); } + [Test] + public void Does_serialize_Poco_and_string_dictionary_with_encoded_data() + { + var msg = "Field with comma, to demo. "; + Assert.That(QueryStringSerializer.SerializeToString(new D { A = msg }), + Is.EqualTo("A=Field+with+comma,+to+demo.+")); + + Assert.That(QueryStringSerializer.SerializeToString(new D { A = msg }.ToStringDictionary()), + Is.EqualTo("A=Field+with+comma,+to+demo.+")); + } + class Empty { } [Test] From 81a062ba83c7cda983175faf839ab195d937ec8d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 26 Feb 2020 20:43:32 +0800 Subject: [PATCH 190/372] Encode top-level queryString string values with UrlEncode instead of JSV --- tests/ServiceStack.Text.Tests/QueryStringWriterTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ServiceStack.Text.Tests/QueryStringWriterTests.cs b/tests/ServiceStack.Text.Tests/QueryStringWriterTests.cs index 63233de26..d4e7abb0d 100644 --- a/tests/ServiceStack.Text.Tests/QueryStringWriterTests.cs +++ b/tests/ServiceStack.Text.Tests/QueryStringWriterTests.cs @@ -49,7 +49,7 @@ public void Can_write_dictionary_to_QueryString() queryString.Print(); Assert.That(queryString, - Is.EqualTo("Id=tt0110912&Title=Pulp+Fiction&Rating=8.9&Director=Quentin+Tarantino&ReleaseDate=1994-10-24&TagLine=Girls+like+me+don%27t+make+invitations+like+this+to+just+anyone%21&Genres=%22Crime,Drama,Thriller%22")); + Is.EqualTo("Id=tt0110912&Title=Pulp+Fiction&Rating=8.9&Director=Quentin+Tarantino&ReleaseDate=1994-10-24&TagLine=Girls+like+me+don%27t+make+invitations+like+this+to+just+anyone%21&Genres=Crime,Drama,Thriller")); } [Test] From 206032f410337952269db30a6c4ce90fe2fc825e Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 4 Mar 2020 15:17:37 +0800 Subject: [PATCH 191/372] Add IsDefaultValue Utils --- src/ServiceStack.Text/AutoMappingUtils.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index 4e3eddf18..f707e8fd7 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -416,7 +416,8 @@ private static object PopulateObjectInternal(object obj, Dictionary r public static object GetDefaultValue(this Type type) { - if (!type.IsValueType) return null; + if (!type.IsValueType) + return null; if (DefaultValueTypes.TryGetValue(type, out var defaultValue)) return defaultValue; @@ -435,6 +436,10 @@ public static object GetDefaultValue(this Type type) return defaultValue; } + public static bool IsDefaultValue(object value) => IsDefaultValue(value, value?.GetType()); + public static bool IsDefaultValue(object value, Type valueType) => value == null + || (valueType.IsValueType && value.Equals(valueType.GetDefaultValue())); + private static readonly ConcurrentDictionary AssignmentDefinitionCache = new ConcurrentDictionary(); From 781432ac0516c8e12f19ea33d626005787c453aa Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 15 Apr 2020 06:04:21 +0800 Subject: [PATCH 192/372] Add OnSerialize event on JSON, JSV & CSV Serializers --- src/ServiceStack.Text/CsvSerializer.cs | 3 +++ src/ServiceStack.Text/Json/JsonWriter.Generic.cs | 1 + src/ServiceStack.Text/JsonSerializer.cs | 5 +++++ src/ServiceStack.Text/Jsv/JsvWriter.Generic.cs | 1 + src/ServiceStack.Text/TypeSerializer.cs | 5 +++++ 5 files changed, 15 insertions(+) diff --git a/src/ServiceStack.Text/CsvSerializer.cs b/src/ServiceStack.Text/CsvSerializer.cs index ec752ee48..6454916f8 100644 --- a/src/ServiceStack.Text/CsvSerializer.cs +++ b/src/ServiceStack.Text/CsvSerializer.cs @@ -17,6 +17,8 @@ public class CsvSerializer //Don't emit UTF8 BOM by default public static Encoding UseEncoding { get; set; } = PclExport.Instance.GetUTF8Encoding(false); + public static Action OnSerialize { get; set; } + private static Dictionary WriteFnCache = new Dictionary(); internal static WriteObjectDelegate GetWriteFn(Type type) { @@ -394,6 +396,7 @@ public static void WriteObject(TextWriter writer, object value) JsState.IsCsv = true; try { + CsvSerializer.OnSerialize?.Invoke(value); WriteCacheFn(writer, value); } finally diff --git a/src/ServiceStack.Text/Json/JsonWriter.Generic.cs b/src/ServiceStack.Text/Json/JsonWriter.Generic.cs index 3ca27da83..771e38c72 100644 --- a/src/ServiceStack.Text/Json/JsonWriter.Generic.cs +++ b/src/ServiceStack.Text/Json/JsonWriter.Generic.cs @@ -215,6 +215,7 @@ public static void WriteObject(TextWriter writer, object value) public static void WriteRootObject(TextWriter writer, object value) { TypeConfig.Init(); + JsonSerializer.OnSerialize?.Invoke(value); JsState.Depth = 0; CacheFn(writer, value); diff --git a/src/ServiceStack.Text/JsonSerializer.cs b/src/ServiceStack.Text/JsonSerializer.cs index 6bb5e6e79..c5868241a 100644 --- a/src/ServiceStack.Text/JsonSerializer.cs +++ b/src/ServiceStack.Text/JsonSerializer.cs @@ -40,6 +40,8 @@ public static UTF8Encoding UTF8Encoding set => JsConfig.UTF8Encoding = value; } + public static Action OnSerialize { get; set; } + public static T DeserializeFromString(string value) { return JsonReader.Parse(value) is T obj ? obj : default(T); @@ -112,6 +114,7 @@ public static string SerializeToString(object value, Type type) } else { + OnSerialize?.Invoke(value); JsonWriter.GetWriteFn(type)(writer, value); } return StringWriterThreadStatic.ReturnAndFree(writer); @@ -149,6 +152,7 @@ public static void SerializeToWriter(object value, Type type, TextWriter writer) return; } + OnSerialize?.Invoke(value); JsonWriter.GetWriteFn(type)(writer, value); } @@ -175,6 +179,7 @@ public static void SerializeToStream(T value, Stream stream) public static void SerializeToStream(object value, Type type, Stream stream) { + OnSerialize?.Invoke(value); var writer = new StreamWriter(stream, JsConfig.UTF8Encoding, BufferSize, leaveOpen:true); JsonWriter.GetWriteFn(type)(writer, value); writer.Flush(); diff --git a/src/ServiceStack.Text/Jsv/JsvWriter.Generic.cs b/src/ServiceStack.Text/Jsv/JsvWriter.Generic.cs index 26506df01..1eeed485f 100644 --- a/src/ServiceStack.Text/Jsv/JsvWriter.Generic.cs +++ b/src/ServiceStack.Text/Jsv/JsvWriter.Generic.cs @@ -162,6 +162,7 @@ public static void WriteRootObject(TextWriter writer, object value) if (writer == null) return; //AOT TypeConfig.Init(); + TypeSerializer.OnSerialize?.Invoke(value); JsState.Depth = 0; CacheFn(writer, value); diff --git a/src/ServiceStack.Text/TypeSerializer.cs b/src/ServiceStack.Text/TypeSerializer.cs index 362fd1cfc..3f2b0c6ab 100644 --- a/src/ServiceStack.Text/TypeSerializer.cs +++ b/src/ServiceStack.Text/TypeSerializer.cs @@ -42,6 +42,8 @@ public static UTF8Encoding UTF8Encoding set => JsConfig.UTF8Encoding = value; } + public static Action OnSerialize { get; set; } + public const string DoubleQuoteString = "\"\""; /// @@ -129,6 +131,7 @@ public static string SerializeToString(object value, Type type) if (value is string str) return str.EncodeJsv(); + OnSerialize?.Invoke(value); var writer = StringWriterThreadStatic.Allocate(); JsvWriter.GetWriteFn(type)(writer, value); return StringWriterThreadStatic.ReturnAndFree(writer); @@ -166,6 +169,7 @@ public static void SerializeToWriter(object value, Type type, TextWriter writer) return; } + OnSerialize?.Invoke(value); JsvWriter.GetWriteFn(type)(writer, value); } @@ -192,6 +196,7 @@ public static void SerializeToStream(T value, Stream stream) public static void SerializeToStream(object value, Type type, Stream stream) { + OnSerialize?.Invoke(value); var writer = new StreamWriter(stream, JsConfig.UTF8Encoding); JsvWriter.GetWriteFn(type)(writer, value); writer.Flush(); From 80e39fea6687d0a0dcebde4234c11eb522ba96e9 Mon Sep 17 00:00:00 2001 From: deining Date: Thu, 16 Apr 2020 10:50:45 +0200 Subject: [PATCH 193/372] Fixed broken link in README.md (#526) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d93f63c5c..7e2abc926 100644 --- a/README.md +++ b/README.md @@ -192,7 +192,7 @@ ServiceStack's JS Utils is available in the [ServiceStack.Common](https://www.nu PM> Install-Package ServiceStack.Text -> From v4.0.62+ [ServiceStack.Text is now free!](https://github.com/ServiceStack/ServiceStack/blob/master/docs/2016/v4.0.62.md#servicestacktext-is-now-free) +> From v4.0.62+ [ServiceStack.Text is now free!](https://docs.servicestack.net/releases/v4.0.62#servicestacktext-is-now-free) ## Copying From bb5e79e78d7e9ffbe97bfb7d84d1d39ba3ee502c Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 20 Apr 2020 22:53:06 +0800 Subject: [PATCH 194/372] Add HasAttributeOf* APIs --- src/ServiceStack.Text/PlatformExtensions.cs | 34 +++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index 38f086955..4f51393bf 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -124,15 +124,27 @@ public static MethodInfo GetInstanceMethod(this Type type, string methodName) => [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool HasAttribute(this Type type) => type.AllAttributes().Any(x => x.GetType() == typeof(T)); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool HasAttributeOf(this Type type) => type.AllAttributes().Any(x => x is T); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool HasAttribute(this PropertyInfo pi) => pi.AllAttributes().Any(x => x.GetType() == typeof(T)); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool HasAttributeOf(this PropertyInfo pi) => pi.AllAttributes().Any(x => x is T); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool HasAttribute(this FieldInfo fi) => fi.AllAttributes().Any(x => x.GetType() == typeof(T)); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool HasAttributeOf(this FieldInfo fi) => fi.AllAttributes().Any(x => x is T); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool HasAttribute(this MethodInfo mi) => mi.AllAttributes().Any(x => x.GetType() == typeof(T)); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool HasAttributeOf(this MethodInfo mi) => mi.AllAttributes().Any(x => x is T); + private static readonly ConcurrentDictionary, bool> hasAttributeCache = new ConcurrentDictionary, bool>(); public static bool HasAttributeCached(this MemberInfo memberInfo) { @@ -155,6 +167,28 @@ public static bool HasAttributeCached(this MemberInfo memberInfo) return hasAttr; } + private static readonly ConcurrentDictionary, bool> hasAttributeOfCache = new ConcurrentDictionary, bool>(); + public static bool HasAttributeOfCached(this MemberInfo memberInfo) + { + var key = new Tuple(memberInfo, typeof(T)); + if (hasAttributeOfCache.TryGetValue(key , out var hasAttr)) + return hasAttr; + + hasAttr = memberInfo is Type t + ? t.AllAttributes().Any(x => x is T) + : memberInfo is PropertyInfo pi + ? pi.AllAttributes().Any(x => x is T) + : memberInfo is FieldInfo fi + ? fi.AllAttributes().Any(x => x is T) + : memberInfo is MethodInfo mi + ? mi.AllAttributes().Any(x => x is T) + : throw new NotSupportedException(memberInfo.GetType().Name); + + hasAttributeOfCache[key] = hasAttr; + + return hasAttr; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool HasAttributeNamed(this Type type, string name) { From ab34e5603484339e3a67c2792539def75e8c6584 Mon Sep 17 00:00:00 2001 From: deining Date: Thu, 23 Apr 2020 14:40:59 +0200 Subject: [PATCH 195/372] Fixing typo in README.md (#527) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7e2abc926..ad348c0f4 100644 --- a/README.md +++ b/README.md @@ -96,7 +96,7 @@ JsonArrayObjects.Parse() ### Pretty Print JSON -You an format JSON into a more readable format with the `IndentJson()` extension method, e.g: +You can format JSON into a more readable format with the `IndentJson()` extension method, e.g: ```csharp var prettyJson = dto.ToJson().IndentJson(); From d1f4b83de7e0eeddfad350701783dcb48013a429 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 28 Apr 2020 18:04:14 +0800 Subject: [PATCH 196/372] Upgrade System.Memory to v4.5.4 --- src/ServiceStack.Text/ServiceStack.Text.Core.csproj | 2 +- src/ServiceStack.Text/ServiceStack.Text.csproj | 2 +- tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj | 2 +- .../ServiceStack.Text.TestsConsole.csproj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index 28bea2a4e..f61922411 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -16,7 +16,7 @@ $(DefineConstants);NETSTANDARD;NETCORE2_1 - + diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index 4b319d075..f68c2eaf6 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -15,7 +15,7 @@ $(DefineConstants);NETSTANDARD;NETCORE2_1 - + diff --git a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj index 1be2e2f51..8d95e7157 100644 --- a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj +++ b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj @@ -33,7 +33,7 @@ - + diff --git a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj index 110c5e3a8..c8f4f104c 100644 --- a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj +++ b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj @@ -18,7 +18,7 @@ - + From ae0ca59f290e7514de11358bc4e7e65742ad8fea Mon Sep 17 00:00:00 2001 From: deining Date: Tue, 28 Apr 2020 18:56:00 +0200 Subject: [PATCH 197/372] README.md: fixing minor typos (#528) --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ad348c0f4..9ecd94664 100644 --- a/README.md +++ b/README.md @@ -152,7 +152,7 @@ project. It provides a dynamic, but more succinct API than the above options. ### JS Utils -ServiceStack.Text APIs for deserializing arbitrary JSON requires specifying the the Type to deserialize into. An alternative flexible approach to read any arbitrary JavaScript or JSON data structures is to use the high-performance and memory efficient JSON utils in +ServiceStack.Text APIs for deserializing arbitrary JSON requires specifying the Type to deserialize into. An alternative flexible approach to read any arbitrary JavaScript or JSON data structures is to use the high-performance and memory efficient JSON utils in [#Script](https://sharpscript.net/) implementation of JavaScript. ```csharp @@ -166,7 +166,7 @@ JSON.parse("[{a:1}]") //= new List { new Dictionary { { #### Eval Since JS Utils is an essential part of [#Script](https://sharpscript.net/) it allows for advanced scenarios like implementing a text DSL or scripting language for executing custom logic or business rules you want to be able to change without having to compile or redeploy your App. It uses [#Script Context](https://sharpscript.net/docs/methods) which lets you evaluate the script within a custom scope that defines what functions -and arguments it has access to, e.g: +and arguments it has access to, e.g.: ```csharp public class CustomMethods : ScriptMethods @@ -205,7 +205,7 @@ Contributors need to approve the [Contributor License Agreement](https://docs.go ## ServiceStack.JsonSerializer For reasons outlined [in this blog post](https://github.com/ServiceStackV3/mythz_blog/blob/master/pages/344.md) I decided to re-use *TypeSerializer's* text processing-core to create ServiceStack.JsonSerializer - the fastest JSON Serializer for .NET. -Based on the [Northwind Benchmarks](http://mono.servicestack.net/benchmarks/) it's *3.6x* faster than .NET's BCL JsonDataContractSerializer and *3x* faster then the previous fastest JSON serializer benchmarked - [JSON.NET](http://json.codeplex.com/). +Based on the [Northwind Benchmarks](http://mono.servicestack.net/benchmarks/) it's *3.6x* faster than .NET's BCL JsonDataContractSerializer and *3x* faster than the previous fastest JSON serializer benchmarked - [JSON.NET](http://json.codeplex.com/). A comprehensive set of other .NET benchmarks are maintained at [servicestack.net/benchmarks](http://mono.servicestack.net/benchmarks/) and [in the wiki](https://github.com/ServiceStack/ServiceStack/wiki/Real-world-performance). @@ -793,7 +793,7 @@ is escaped using CSV-style escaping where the value is wrapped in double quotes, {Name:"Me, Junior"} -A value with a double-quote is escaped with another double quote e.g: +A value with a double quote is escaped with another double quote e.g: `new MyClass { Size = "2\" x 1\"" }` is serialized as: From 4ba28bd5b9b5b1e5221b00cd63871a435ad90ebf Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 1 May 2020 14:06:14 +0800 Subject: [PATCH 198/372] spelling --- src/ServiceStack.Text/HttpUtils.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 707855c44..0fae75539 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1075,14 +1075,14 @@ public static void UploadFile(this WebRequest webRequest, Stream fileStream, str httpReq.ContentType = "multipart/form-data; boundary=\"" + boundary + "\""; - var boundarybytes = ("\r\n--" + boundary + "--\r\n").ToAsciiBytes(); + var boundaryBytes = ("\r\n--" + boundary + "--\r\n").ToAsciiBytes(); var header = "\r\n--" + boundary + $"\r\nContent-Disposition: form-data; name=\"{field}\"; filename=\"{fileName}\"\r\nContent-Type: {mimeType}\r\n\r\n"; - var headerbytes = header.ToAsciiBytes(); + var headerBytes = header.ToAsciiBytes(); - var contentLength = fileStream.Length + headerbytes.Length + boundarybytes.Length; + var contentLength = fileStream.Length + headerBytes.Length + boundaryBytes.Length; PclExport.Instance.InitHttpWebRequest(httpReq, contentLength: contentLength, allowAutoRedirect: false, keepAlive: false); @@ -1094,11 +1094,11 @@ public static void UploadFile(this WebRequest webRequest, Stream fileStream, str using (var outputStream = PclExport.Instance.GetRequestStream(httpReq)) { - outputStream.Write(headerbytes, 0, headerbytes.Length); + outputStream.Write(headerBytes, 0, headerBytes.Length); fileStream.CopyTo(outputStream, 4096); - outputStream.Write(boundarybytes, 0, boundarybytes.Length); + outputStream.Write(boundaryBytes, 0, boundaryBytes.Length); PclExport.Instance.CloseStream(outputStream); } From c53744d4bca2e5eeae2dfcc9025831bcb9b43c9a Mon Sep 17 00:00:00 2001 From: deining Date: Sun, 3 May 2020 14:15:44 +0200 Subject: [PATCH 199/372] Fix broken link in README.md (#529) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9ecd94664..e1753221a 100644 --- a/README.md +++ b/README.md @@ -294,7 +294,7 @@ new []{ 1, 2, 3 }.ToJson() //= [1,2,3] ## JSON Format -JSON is a lightweight text serialization format with a spec that's so simple that it fits on one page: [http://www.json.org](json.org). +JSON is a lightweight text serialization format with a spec that's so simple that it fits on one page: [https://www.json.org](https://www.json.org). The only valid values in JSON are: From 69085b6f6e6bfd9f61dca4b8010be4842b0d9cfc Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 19 May 2020 13:19:07 +0800 Subject: [PATCH 200/372] Add support for serializing CSV with excluded default values --- src/ServiceStack.Text/CsvWriter.cs | 76 +++++++++++++++---- .../DataModel/Northwind.models.cs | 2 +- .../CsvSerializerTests.cs | 48 +++++++++++- .../ServiceStack.Text.Tests.csproj | 2 +- 4 files changed, 112 insertions(+), 16 deletions(-) diff --git a/src/ServiceStack.Text/CsvWriter.cs b/src/ServiceStack.Text/CsvWriter.cs index c800e4a3f..1ad3cbfd9 100644 --- a/src/ServiceStack.Text/CsvWriter.cs +++ b/src/ServiceStack.Text/CsvWriter.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Reflection; using ServiceStack.Text.Common; namespace ServiceStack.Text @@ -144,6 +145,7 @@ public class CsvWriter public static List Headers { get; set; } internal static List> PropertyGetters; + internal static List PropertyInfos; private static readonly WriteObjectDelegate OptimizedWriter; @@ -163,12 +165,15 @@ internal static void Reset() Headers = new List(); PropertyGetters = new List>(); + PropertyInfos = new List(); foreach (var propertyInfo in TypeConfig.Properties) { if (!propertyInfo.CanRead || propertyInfo.GetGetMethod(nonPublic:true) == null) continue; if (!TypeSerializer.CanCreateFromString(propertyInfo.PropertyType)) continue; PropertyGetters.Add(propertyInfo.CreateGetter()); + PropertyInfos.Add(propertyInfo); + var propertyName = propertyInfo.Name; var dcsDataMemberName = propertyInfo.GetDataMemberName(); if (dcsDataMemberName != null) @@ -257,6 +262,7 @@ public static void WriteObjectRow(TextWriter writer, object record) public static void Write(TextWriter writer, IEnumerable records) { if (writer == null) return; //AOT + if (records == null) return; if (typeof(T) == typeof(Dictionary) || typeof(T) == typeof(IDictionary)) { @@ -277,10 +283,56 @@ public static void Write(TextWriter writer, IEnumerable records) return; } - if (!CsvConfig.OmitHeaders && Headers.Count > 0) + var recordsList = records.ToList(); + + var headers = Headers; + var propGetters = PropertyGetters; + var treatAsSingleRow = typeof(T).IsValueType || typeof(T) == typeof(string); + + if (!treatAsSingleRow && JsConfig.ExcludeDefaultValues) + { + var hasValues = new bool[headers.Count]; + var defaultValues = new object[headers.Count]; + for (var i = 0; i < PropertyInfos.Count; i++) + { + defaultValues[i] = PropertyInfos[i].PropertyType.GetDefaultValue(); + } + + foreach (var record in recordsList) + { + for (var i = 0; i < propGetters.Count; i++) + { + var propGetter = propGetters[i]; + var value = propGetter(record); + + if (value != null && !value.Equals(defaultValues[i])) + hasValues[i] = true; + } + } + + if (hasValues.Any(x => x == false)) + { + var newHeaders = new List(); + var newGetters = new List>(); + + for (int i = 0; i < hasValues.Length; i++) + { + if (hasValues[i]) + { + newHeaders.Add(headers[i]); + newGetters.Add(propGetters[i]); + } + } + + headers = newHeaders; + propGetters = newGetters; + } + } + + if (!CsvConfig.OmitHeaders && headers.Count > 0) { var ranOnce = false; - foreach (var header in Headers) + foreach (var header in headers) { CsvWriter.WriteItemSeperatorIfRanOnce(writer, ref ranOnce); @@ -289,25 +341,23 @@ public static void Write(TextWriter writer, IEnumerable records) writer.Write(CsvConfig.RowSeparatorString); } - if (records == null) return; - - if (typeof(T).IsValueType || typeof(T) == typeof(string)) + if (treatAsSingleRow) { - var singleRow = GetSingleRow(records, typeof(T)); + var singleRow = GetSingleRow(recordsList, typeof(T)); WriteRow(writer, singleRow); return; } - var row = new string[Headers.Count]; - foreach (var record in records) + var row = new string[headers.Count]; + foreach (var record in recordsList) { - for (var i = 0; i < PropertyGetters.Count; i++) + for (var i = 0; i < propGetters.Count; i++) { - var propertyGetter = PropertyGetters[i]; - var value = propertyGetter(record) ?? ""; + var propGetter = propGetters[i]; + var value = propGetter(record) ?? ""; - var strValue = value is string - ? (string)value + var strValue = value is string s + ? s : TypeSerializer.SerializeToString(value).StripQuotes(); row[i] = strValue; diff --git a/tests/Northwind.Common/DataModel/Northwind.models.cs b/tests/Northwind.Common/DataModel/Northwind.models.cs index e505e51ea..17404087e 100644 --- a/tests/Northwind.Common/DataModel/Northwind.models.cs +++ b/tests/Northwind.Common/DataModel/Northwind.models.cs @@ -523,7 +523,7 @@ public override int GetHashCode() public class OrderDetail : IHasStringId, IEquatable { - public string Id { get { return this.OrderId + "/" + this.ProductId; } } + public string Id => this.OrderId + "/" + this.ProductId; [Index] [Alias("OrderID")] diff --git a/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs b/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs index 04982d01f..520bdb7d7 100644 --- a/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs +++ b/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; -using System.Threading; +using System.Linq; using Northwind.Common.DataModel; using NUnit.Framework; using ServiceStack.Text.Tests.Support; @@ -390,6 +390,52 @@ public void Can_serialize_fields_with_double_quotes() fromCsv = person.ToCsv().FromCsv(); Assert.That(fromCsv, Is.EqualTo(person)); } + + public Order Clone(Order o) => new Order { + Id = o.Id, + CustomerId = o.CustomerId, + EmployeeId = o.EmployeeId, + OrderDate = o.OrderDate, + RequiredDate = o.RequiredDate, + ShippedDate = o.ShippedDate, + ShipVia = o.ShipVia, + Freight = o.Freight, + ShipName = o.ShipName, + ShipAddress = o.ShipAddress, + ShipCity = o.ShipCity, + ShipRegion = o.ShipRegion, + ShipPostalCode = o.ShipPostalCode, + ShipCountry = o.ShipCountry, + }; + + [Test] + public void Can_only_serialize_NonDefaultValues() + { + using var scope = JsConfig.With(new Config { + ExcludeDefaultValues = true + }); + + var orders = NorthwindData.Orders.Take(5).Map(Clone); + orders.ForEach(x => { + //non-default min values + x.RequiredDate = DateTime.MinValue; + x.ShipVia = 0; + + //default values + x.ShippedDate = null; + x.EmployeeId = default; + x.Freight = default; + x.ShipPostalCode = null; + x.ShipCountry = null; + }); + + var csv = orders.ToCsv(); + // csv.Print(); + var headers = csv.LeftPart('\r'); + headers.Print(); + Assert.That(headers, Is.EquivalentTo( + "Id,CustomerId,OrderDate,RequiredDate,ShipVia,ShipName,ShipAddress,ShipCity,ShipRegion")); + } [Test] public void serialize_Category() diff --git a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj index 8d95e7157..0fad42534 100644 --- a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj +++ b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj @@ -13,7 +13,7 @@ false false false - 7.2 + latest Full From 71529920e78fed36f8ac0bda6ff277232da9e4bf Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 4 Jun 2020 03:21:46 +0800 Subject: [PATCH 201/372] unencode object dictionary values --- .../Common/DeserializeDictionary.cs | 4 ++-- src/ServiceStack.Text/StringSpanExtensions.cs | 6 ++++++ .../Issues/WhitespaceIssues.cs | 20 ++++++++++++++++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/ServiceStack.Text/Common/DeserializeDictionary.cs b/src/ServiceStack.Text/Common/DeserializeDictionary.cs index 5a18031b3..078362b50 100644 --- a/src/ServiceStack.Text/Common/DeserializeDictionary.cs +++ b/src/ServiceStack.Text/Common/DeserializeDictionary.cs @@ -276,7 +276,7 @@ public static IDictionary ParseDictionary( { to[mapKey] = (TValue)(tryToParseItemsAsPrimitiveTypes && elementStartIndex < valueLength ? DeserializeType.ParsePrimitive(elementValue.Value(), value[elementStartIndex]) - : parseValueFn(elementValue)); + : parseValueFn(elementValue).Value()); } } else @@ -288,7 +288,7 @@ public static IDictionary ParseDictionary( } else { - to[mapKey] = (TValue)parseValueFn(elementValue); + to[mapKey] = (TValue)parseValueFn(elementValue).Value(); } } diff --git a/src/ServiceStack.Text/StringSpanExtensions.cs b/src/ServiceStack.Text/StringSpanExtensions.cs index bb7d76555..36a200900 100644 --- a/src/ServiceStack.Text/StringSpanExtensions.cs +++ b/src/ServiceStack.Text/StringSpanExtensions.cs @@ -24,6 +24,12 @@ public static string Value(this ReadOnlySpan value) => value.IsEmpty ? "" : value.ToString(); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static object Value(this object obj) => + obj is string value && value.Length == 1 && value[0] == TypeConstants.NonWidthWhiteSpace + ? "" + : obj; + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsNullOrEmpty(this ReadOnlySpan value) => value.IsEmpty || (value.Length == 1 && value[0] == TypeConstants.NonWidthWhiteSpace); diff --git a/tests/ServiceStack.Text.Tests/Issues/WhitespaceIssues.cs b/tests/ServiceStack.Text.Tests/Issues/WhitespaceIssues.cs index 3c2ce06fa..fd8f76daf 100644 --- a/tests/ServiceStack.Text.Tests/Issues/WhitespaceIssues.cs +++ b/tests/ServiceStack.Text.Tests/Issues/WhitespaceIssues.cs @@ -1,4 +1,5 @@ -using System.IO; +using System.Collections.Generic; +using System.IO; using Northwind.Common.DataModel; using NUnit.Framework; using ServiceStack.Text.Json; @@ -45,5 +46,22 @@ public void Does_serialize_property_Empty_String() Assert.That(fromMs.Name, Is.EqualTo(dto.Name)); JS.UnConfigure(); } + + [Test] + public void Does_serialize_object_dictionary() + { + JsConfig.ConvertObjectTypesIntoStringDictionary = true; + + var value = "{Number:10330,CountryKey:DE,FederalStateKey:\"\",Salutation:,City:''}"; + var map = (Dictionary) value.FromJsv(); + + Assert.That(map["Number"], Is.EqualTo("10330")); + Assert.That(map["CountryKey"], Is.EqualTo("DE")); + Assert.That(map["FederalStateKey"], Is.EqualTo("")); + Assert.That(map["Salutation"], Is.EqualTo("")); + Assert.That(map["City"], Is.EqualTo("''")); + + JsConfig.ConvertObjectTypesIntoStringDictionary = false; + } } } \ No newline at end of file From 3ed8ebfe192e1925b6682fdcb465f99a26d9ed7f Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 6 Jun 2020 17:37:52 +0800 Subject: [PATCH 202/372] Update RecyclableMemoryStream.cs --- .../RecyclableMemoryStream.cs | 1407 ++++++++++++----- 1 file changed, 1006 insertions(+), 401 deletions(-) diff --git a/src/ServiceStack.Text/RecyclableMemoryStream.cs b/src/ServiceStack.Text/RecyclableMemoryStream.cs index 2d89f8631..543845820 100644 --- a/src/ServiceStack.Text/RecyclableMemoryStream.cs +++ b/src/ServiceStack.Text/RecyclableMemoryStream.cs @@ -24,13 +24,14 @@ using System.IO; using System.Collections.Generic; using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Tracing; using System.Linq; +using System.Runtime.CompilerServices; using System.Threading; namespace ServiceStack.Text //Internalize to avoid conflicts { - using Events = RecyclableMemoryStreamManager.Events; - public static class MemoryStreamFactory { public static bool UseRecyclableMemoryStream { get; set; } @@ -65,6 +66,275 @@ public static MemoryStream GetStream(byte[] bytes, int index, int count) : new MemoryStream(bytes, index, count, writable:true, publiclyVisible:true); } } + +#if !NETSTANDARD + public enum EventLevel + { + LogAlways = 0, + Critical, + Error, + Warning, + Informational, + Verbose, + } + + public enum EventKeywords : long + { + None = 0x0, + } + + [AttributeUsage(AttributeTargets.Class)] + public sealed class EventSourceAttribute : Attribute + { + public string Name { get; set; } + public string Guid { get; set; } + } + + [AttributeUsage(AttributeTargets.Method)] + public sealed class EventAttribute : Attribute + { + public EventAttribute(int id) { } + + public EventLevel Level { get; set; } + } + + public class EventSource + { + public void WriteEvent(params object[] unused) + { + return; + } + + public bool IsEnabled() + { + return false; + } + + public bool IsEnabled(EventLevel level, EventKeywords keywords) + { + return false; + } + } +#endif + + public sealed partial class RecyclableMemoryStreamManager + { + /// + /// ETW events for RecyclableMemoryStream + /// + [EventSource(Name = "Microsoft-IO-RecyclableMemoryStream", Guid = "{B80CD4E4-890E-468D-9CBA-90EB7C82DFC7}")] + public sealed class Events : EventSource + { + /// + /// Static log object, through which all events are written. + /// + public static Events Writer = new Events(); + + /// + /// Type of buffer + /// + public enum MemoryStreamBufferType + { + /// + /// Small block buffer + /// + Small, + /// + /// Large pool buffer + /// + Large + } + + /// + /// The possible reasons for discarding a buffer + /// + public enum MemoryStreamDiscardReason + { + /// + /// Buffer was too large to be re-pooled + /// + TooLarge, + /// + /// There are enough free bytes in the pool + /// + EnoughFree + } + + /// + /// Logged when a stream object is created. + /// + /// A unique ID for this stream. + /// A temporary ID for this stream, usually indicates current usage. + /// Requested size of the stream + [Event(1, Level = EventLevel.Verbose)] + public void MemoryStreamCreated(Guid guid, string tag, int requestedSize) + { + if (this.IsEnabled(EventLevel.Verbose, EventKeywords.None)) + { + WriteEvent(1, guid, tag ?? string.Empty, requestedSize); + } + } + + /// + /// Logged when the stream is disposed + /// + /// A unique ID for this stream. + /// A temporary ID for this stream, usually indicates current usage. + [Event(2, Level = EventLevel.Verbose)] + public void MemoryStreamDisposed(Guid guid, string tag) + { + if (this.IsEnabled(EventLevel.Verbose, EventKeywords.None)) + { + WriteEvent(2, guid, tag ?? string.Empty); + } + } + + /// + /// Logged when the stream is disposed for the second time. + /// + /// A unique ID for this stream. + /// A temporary ID for this stream, usually indicates current usage. + /// Call stack of initial allocation. + /// Call stack of the first dispose. + /// Call stack of the second dispose. + /// Note: Stacks will only be populated if RecyclableMemoryStreamManager.GenerateCallStacks is true. + [Event(3, Level = EventLevel.Critical)] + public void MemoryStreamDoubleDispose(Guid guid, string tag, string allocationStack, string disposeStack1, + string disposeStack2) + { + if (this.IsEnabled()) + { + this.WriteEvent(3, guid, tag ?? string.Empty, allocationStack ?? string.Empty, + disposeStack1 ?? string.Empty, disposeStack2 ?? string.Empty); + } + } + + /// + /// Logged when a stream is finalized. + /// + /// A unique ID for this stream. + /// A temporary ID for this stream, usually indicates current usage. + /// Call stack of initial allocation. + /// Note: Stacks will only be populated if RecyclableMemoryStreamManager.GenerateCallStacks is true. + [Event(4, Level = EventLevel.Error)] + public void MemoryStreamFinalized(Guid guid, string tag, string allocationStack) + { + if (this.IsEnabled()) + { + WriteEvent(4, guid, tag ?? string.Empty, allocationStack ?? string.Empty); + } + } + + /// + /// Logged when ToArray is called on a stream. + /// + /// A unique ID for this stream. + /// A temporary ID for this stream, usually indicates current usage. + /// Call stack of the ToArray call. + /// Length of stream + /// Note: Stacks will only be populated if RecyclableMemoryStreamManager.GenerateCallStacks is true. + [Event(5, Level = EventLevel.Verbose)] + public void MemoryStreamToArray(Guid guid, string tag, string stack, int size) + { + if (this.IsEnabled(EventLevel.Verbose, EventKeywords.None)) + { + WriteEvent(5, guid, tag ?? string.Empty, stack ?? string.Empty, size); + } + } + + /// + /// Logged when the RecyclableMemoryStreamManager is initialized. + /// + /// Size of blocks, in bytes. + /// Size of the large buffer multiple, in bytes. + /// Maximum buffer size, in bytes. + [Event(6, Level = EventLevel.Informational)] + public void MemoryStreamManagerInitialized(int blockSize, int largeBufferMultiple, int maximumBufferSize) + { + if (this.IsEnabled()) + { + WriteEvent(6, blockSize, largeBufferMultiple, maximumBufferSize); + } + } + + /// + /// Logged when a new block is created. + /// + /// Number of bytes in the small pool currently in use. + [Event(7, Level = EventLevel.Verbose)] + public void MemoryStreamNewBlockCreated(long smallPoolInUseBytes) + { + if (this.IsEnabled(EventLevel.Verbose, EventKeywords.None)) + { + WriteEvent(7, smallPoolInUseBytes); + } + } + + /// + /// Logged when a new large buffer is created. + /// + /// Requested size + /// Number of bytes in the large pool in use. + [Event(8, Level = EventLevel.Verbose)] + public void MemoryStreamNewLargeBufferCreated(int requiredSize, long largePoolInUseBytes) + { + if (this.IsEnabled(EventLevel.Verbose, EventKeywords.None)) + { + WriteEvent(8, requiredSize, largePoolInUseBytes); + } + } + + /// + /// Logged when a buffer is created that is too large to pool. + /// + /// Size requested by the caller + /// A temporary ID for this stream, usually indicates current usage. + /// Call stack of the requested stream. + /// Note: Stacks will only be populated if RecyclableMemoryStreamManager.GenerateCallStacks is true. + [Event(9, Level = EventLevel.Verbose)] + public void MemoryStreamNonPooledLargeBufferCreated(int requiredSize, string tag, string allocationStack) + { + if (this.IsEnabled(EventLevel.Verbose, EventKeywords.None)) + { + WriteEvent(9, requiredSize, tag ?? string.Empty, allocationStack ?? string.Empty); + } + } + + /// + /// Logged when a buffer is discarded (not put back in the pool, but given to GC to clean up). + /// + /// Type of the buffer being discarded. + /// A temporary ID for this stream, usually indicates current usage. + /// Reason for the discard. + [Event(10, Level = EventLevel.Warning)] + public void MemoryStreamDiscardBuffer(MemoryStreamBufferType bufferType, string tag, + MemoryStreamDiscardReason reason) + { + if (this.IsEnabled()) + { + WriteEvent(10, bufferType, tag ?? string.Empty, reason); + } + } + + /// + /// Logged when a stream grows beyond the maximum capacity. + /// + /// The requested capacity. + /// Maximum capacity, as configured by RecyclableMemoryStreamManager. + /// A temporary ID for this stream, usually indicates current usage. + /// Call stack for the capacity request. + /// Note: Stacks will only be populated if RecyclableMemoryStreamManager.GenerateCallStacks is true. + [Event(11, Level = EventLevel.Error)] + public void MemoryStreamOverCapacity(int requestedCapacity, long maxCapacity, string tag, + string allocationStack) + { + if (this.IsEnabled()) + { + WriteEvent(11, requestedCapacity, maxCapacity, tag ?? string.Empty, allocationStack ?? string.Empty); + } + } + } + } /// /// Manages pools of RecyclableMemoryStream objects. @@ -72,9 +342,9 @@ public static MemoryStream GetStream(byte[] bytes, int index, int count) /// /// There are two pools managed in here. The small pool contains same-sized buffers that are handed to streams /// as they write more data. - /// + /// /// For scenarios that need to call GetBuffer(), the large pool contains buffers of various sizes, all - /// multiples of LargeBufferMultiple (1 MB by default). They are split by size to avoid overly-wasteful buffer + /// multiples/exponentials of LargeBufferMultiple (1 MB by default). They are split by size to avoid overly-wasteful buffer /// usage. There should be far fewer 8 MB buffers than 1 MB buffers, for example. /// public partial class RecyclableMemoryStreamManager @@ -106,24 +376,25 @@ public partial class RecyclableMemoryStreamManager public delegate void UsageReportEventHandler( long smallPoolInUseBytes, long smallPoolFreeBytes, long largePoolInUseBytes, long largePoolFreeBytes); + /// + /// Default block size, in bytes + /// public const int DefaultBlockSize = 128 * 1024; + /// + /// Default large buffer multiple, in bytes + /// public const int DefaultLargeBufferMultiple = 1024 * 1024; + /// + /// Default maximum buffer size, in bytes + /// public const int DefaultMaximumBufferSize = 128 * 1024 * 1024; - private readonly int blockSize; private readonly long[] largeBufferFreeSize; private readonly long[] largeBufferInUseSize; - private readonly int largeBufferMultiple; - /// - /// pools[0] = 1x largeBufferMultiple buffers - /// pools[1] = 2x largeBufferMultiple buffers - /// etc., up to maximumBufferSize - /// private readonly ConcurrentStack[] largePools; - private readonly int maximumBufferSize; private readonly ConcurrentStack smallPool; private long smallPoolFreeSize; @@ -133,8 +404,7 @@ public delegate void UsageReportEventHandler( /// Initializes the memory manager with the default block/buffer specifications. /// public RecyclableMemoryStreamManager() - : this(DefaultBlockSize, DefaultLargeBufferMultiple, DefaultMaximumBufferSize) - { } + : this(DefaultBlockSize, DefaultLargeBufferMultiple, DefaultMaximumBufferSize, false) { } /// /// Initializes the memory manager with the given block requiredSize. @@ -145,36 +415,52 @@ public RecyclableMemoryStreamManager() /// blockSize is not a positive number, or largeBufferMultiple is not a positive number, or maximumBufferSize is less than blockSize. /// maximumBufferSize is not a multiple of largeBufferMultiple public RecyclableMemoryStreamManager(int blockSize, int largeBufferMultiple, int maximumBufferSize) + : this(blockSize, largeBufferMultiple, maximumBufferSize, false) { } + + /// + /// Initializes the memory manager with the given block requiredSize. + /// + /// Size of each block that is pooled. Must be > 0. + /// Each large buffer will be a multiple/exponential of this value. + /// Buffers larger than this are not pooled + /// Switch to exponential large buffer allocation strategy + /// blockSize is not a positive number, or largeBufferMultiple is not a positive number, or maximumBufferSize is less than blockSize. + /// maximumBufferSize is not a multiple/exponential of largeBufferMultiple + public RecyclableMemoryStreamManager(int blockSize, int largeBufferMultiple, int maximumBufferSize, bool useExponentialLargeBuffer) { if (blockSize <= 0) { - throw new ArgumentOutOfRangeException("blockSize", blockSize, "blockSize must be a positive number"); + throw new ArgumentOutOfRangeException(nameof(blockSize), blockSize, "blockSize must be a positive number"); } if (largeBufferMultiple <= 0) { - throw new ArgumentOutOfRangeException("largeBufferMultiple", + throw new ArgumentOutOfRangeException(nameof(largeBufferMultiple), "largeBufferMultiple must be a positive number"); } if (maximumBufferSize < blockSize) { - throw new ArgumentOutOfRangeException("maximumBufferSize", + throw new ArgumentOutOfRangeException(nameof(maximumBufferSize), "maximumBufferSize must be at least blockSize"); } - this.blockSize = blockSize; - this.largeBufferMultiple = largeBufferMultiple; - this.maximumBufferSize = maximumBufferSize; + this.BlockSize = blockSize; + this.LargeBufferMultiple = largeBufferMultiple; + this.MaximumBufferSize = maximumBufferSize; + this.UseExponentialLargeBuffer = useExponentialLargeBuffer; - if (!this.IsLargeBufferMultiple(maximumBufferSize)) + if (!this.IsLargeBufferSize(maximumBufferSize)) { - throw new ArgumentException("maximumBufferSize is not a multiple of largeBufferMultiple", - "maximumBufferSize"); + throw new ArgumentException(String.Format("maximumBufferSize is not {0} of largeBufferMultiple", + this.UseExponentialLargeBuffer ? "an exponential" : "a multiple"), + nameof(maximumBufferSize)); } this.smallPool = new ConcurrentStack(); - var numLargePools = maximumBufferSize / largeBufferMultiple; + var numLargePools = useExponentialLargeBuffer + ? ((int)Math.Log(maximumBufferSize / largeBufferMultiple, 2) + 1) + : (maximumBufferSize / largeBufferMultiple); // +1 to store size of bytes in use that are too large to be pooled this.largeBufferInUseSize = new long[numLargePools + 1]; @@ -187,57 +473,61 @@ public RecyclableMemoryStreamManager(int blockSize, int largeBufferMultiple, int this.largePools[i] = new ConcurrentStack(); } - Events.Write.MemoryStreamManagerInitialized(blockSize, largeBufferMultiple, maximumBufferSize); + Events.Writer.MemoryStreamManagerInitialized(blockSize, largeBufferMultiple, maximumBufferSize); } /// /// The size of each block. It must be set at creation and cannot be changed. /// - public int BlockSize - { - get { return this.blockSize; } - } + public int BlockSize { get; } /// - /// All buffers are multiples of this number. It must be set at creation and cannot be changed. + /// All buffers are multiples/exponentials of this number. It must be set at creation and cannot be changed. /// - public int LargeBufferMultiple - { - get { return this.largeBufferMultiple; } - } + public int LargeBufferMultiple { get; } + + /// + /// Use multiple large buffer allocation strategy. It must be set at creation and cannot be changed. + /// + public bool UseMultipleLargeBuffer => !this.UseExponentialLargeBuffer; /// - /// Gets or sets the maximum buffer size. + /// Use exponential large buffer allocation strategy. It must be set at creation and cannot be changed. + /// + public bool UseExponentialLargeBuffer { get; } + + /// + /// Gets the maximum buffer size. /// /// Any buffer that is returned to the pool that is larger than this will be /// discarded and garbage collected. - public int MaximumBufferSize - { - get { return this.maximumBufferSize; } - } + public int MaximumBufferSize { get; } /// /// Number of bytes in small pool not currently in use /// - public long SmallPoolFreeSize - { - get { return this.smallPoolFreeSize; } - } + public long SmallPoolFreeSize => this.smallPoolFreeSize; /// /// Number of bytes currently in use by stream from the small pool /// - public long SmallPoolInUseSize - { - get { return this.smallPoolInUseSize; } - } + public long SmallPoolInUseSize => this.smallPoolInUseSize; /// /// Number of bytes in large pool not currently in use /// public long LargePoolFreeSize { - get { return this.largeBufferFreeSize.Sum(); } + get + { + long sum = 0; + foreach (long freeSize in this.largeBufferFreeSize) + { + sum += freeSize; + } + + return sum; + } } /// @@ -245,16 +535,22 @@ public long LargePoolFreeSize /// public long LargePoolInUseSize { - get { return this.largeBufferInUseSize.Sum(); } + get + { + long sum = 0; + foreach (long inUseSize in this.largeBufferInUseSize) + { + sum += inUseSize; + } + + return sum; + } } /// /// How many blocks are in the small pool /// - public long SmallBlocksFree - { - get { return this.smallPool.Count; } - } + public long SmallBlocksFree => this.smallPool.Count; /// /// How many buffers are in the large pool @@ -307,6 +603,13 @@ public long LargeBuffersFree /// public bool AggressiveBufferReturn { get; set; } + /// + /// Causes an exception to be thrown if ToArray is ever called. + /// + /// Calling ToArray defeats the purpose of a pooled buffer. Use this property to discover code that is calling ToArray. If this is + /// set and stream.ToArray() is called, a NotSupportedException will be thrown. + public bool ThrowExceptionOnToArray { get; set; } + /// /// Removes and returns a single block from the pool. /// @@ -319,12 +622,8 @@ internal byte[] GetBlock() // We'll add this back to the pool when the stream is disposed // (unless our free pool is too large) block = new byte[this.BlockSize]; - Events.Write.MemoryStreamNewBlockCreated(this.smallPoolInUseSize); - - if (this.BlockCreated != null) - { - this.BlockCreated(); - } + Events.Writer.MemoryStreamNewBlockCreated(this.smallPoolInUseSize); + ReportBlockCreated(); } else { @@ -337,16 +636,16 @@ internal byte[] GetBlock() /// /// Returns a buffer of arbitrary size from the large buffer pool. This buffer - /// will be at least the requiredSize and always be a multiple of largeBufferMultiple. + /// will be at least the requiredSize and always be a multiple/exponential of largeBufferMultiple. /// /// The minimum length of the buffer /// The tag of the stream returning this buffer, for logging if necessary. /// A buffer of at least the required size. internal byte[] GetLargeBuffer(int requiredSize, string tag) { - requiredSize = this.RoundToLargeBufferMultiple(requiredSize); + requiredSize = this.RoundToLargeBufferSize(requiredSize); - var poolIndex = requiredSize / this.largeBufferMultiple - 1; + var poolIndex = this.GetPoolIndex(requiredSize); byte[] buffer; if (poolIndex < this.largePools.Length) @@ -355,11 +654,8 @@ internal byte[] GetLargeBuffer(int requiredSize, string tag) { buffer = new byte[requiredSize]; - Events.Write.MemoryStreamNewLargeBufferCreated(requiredSize, this.LargePoolInUseSize); - if (this.LargeBufferCreated != null) - { - this.LargeBufferCreated(); - } + Events.Writer.MemoryStreamNewLargeBufferCreated(requiredSize, this.LargePoolInUseSize); + ReportLargeBufferCreated(); } else { @@ -380,14 +676,10 @@ internal byte[] GetLargeBuffer(int requiredSize, string tag) if (this.GenerateCallStacks) { // Grab the stack -- we want to know who requires such large buffers - callStack = PclExport.Instance.GetStackTrace(); - } - Events.Write.MemoryStreamNonPooledLargeBufferCreated(requiredSize, tag, callStack); - - if (this.LargeBufferCreated != null) - { - this.LargeBufferCreated(); + callStack = Environment.StackTrace; } + Events.Writer.MemoryStreamNonPooledLargeBufferCreated(requiredSize, tag, callStack); + ReportLargeBufferCreated(); } Interlocked.Add(ref this.largeBufferInUseSize[poolIndex], buffer.Length); @@ -395,14 +687,45 @@ internal byte[] GetLargeBuffer(int requiredSize, string tag) return buffer; } - private int RoundToLargeBufferMultiple(int requiredSize) + private int RoundToLargeBufferSize(int requiredSize) { - return ((requiredSize + this.LargeBufferMultiple - 1) / this.LargeBufferMultiple) * this.LargeBufferMultiple; + if (this.UseExponentialLargeBuffer) + { + int pow = 1; + while (this.LargeBufferMultiple * pow < requiredSize) + { + pow <<= 1; + } + return this.LargeBufferMultiple * pow; + } + else + { + return ((requiredSize + this.LargeBufferMultiple - 1) / this.LargeBufferMultiple) * this.LargeBufferMultiple; + } } - private bool IsLargeBufferMultiple(int value) + private bool IsLargeBufferSize(int value) { - return (value != 0) && (value % this.LargeBufferMultiple) == 0; + return (value != 0) && (this.UseExponentialLargeBuffer + ? (value == RoundToLargeBufferSize(value)) + : (value % this.LargeBufferMultiple) == 0); + } + + private int GetPoolIndex(int length) + { + if (this.UseExponentialLargeBuffer) + { + int index = 0; + while ((this.LargeBufferMultiple << index) < length) + { + ++index; + } + return index; + } + else + { + return length / this.LargeBufferMultiple - 1; + } } /// @@ -411,22 +734,23 @@ private bool IsLargeBufferMultiple(int value) /// The buffer to return. /// The tag of the stream returning this buffer, for logging if necessary. /// buffer is null - /// buffer.Length is not a multiple of LargeBufferMultiple (it did not originate from this pool) + /// buffer.Length is not a multiple/exponential of LargeBufferMultiple (it did not originate from this pool) internal void ReturnLargeBuffer(byte[] buffer, string tag) { if (buffer == null) { - throw new ArgumentNullException("buffer"); + throw new ArgumentNullException(nameof(buffer)); } - if (!this.IsLargeBufferMultiple(buffer.Length)) + if (!this.IsLargeBufferSize(buffer.Length)) { throw new ArgumentException( - "buffer did not originate from this memory manager. The size is not a multiple of " + + String.Format("buffer did not originate from this memory manager. The size is not {0} of ", + this.UseExponentialLargeBuffer ? "an exponential" : "a multiple") + this.LargeBufferMultiple); } - var poolIndex = buffer.Length / this.largeBufferMultiple - 1; + var poolIndex = this.GetPoolIndex(buffer.Length); if (poolIndex < this.largePools.Length) { @@ -438,13 +762,9 @@ internal void ReturnLargeBuffer(byte[] buffer, string tag) } else { - Events.Write.MemoryStreamDiscardBuffer(Events.MemoryStreamBufferType.Large, tag, + Events.Writer.MemoryStreamDiscardBuffer(Events.MemoryStreamBufferType.Large, tag, Events.MemoryStreamDiscardReason.EnoughFree); - - if (this.LargeBufferDiscarded != null) - { - this.LargeBufferDiscarded(Events.MemoryStreamDiscardReason.EnoughFree); - } + ReportLargeBufferDiscarded(Events.MemoryStreamDiscardReason.EnoughFree); } } else @@ -453,21 +773,15 @@ internal void ReturnLargeBuffer(byte[] buffer, string tag) // analysis. We have space in the inuse array for this. poolIndex = this.largeBufferInUseSize.Length - 1; - Events.Write.MemoryStreamDiscardBuffer(Events.MemoryStreamBufferType.Large, tag, + Events.Writer.MemoryStreamDiscardBuffer(Events.MemoryStreamBufferType.Large, tag, Events.MemoryStreamDiscardReason.TooLarge); - if (this.LargeBufferDiscarded != null) - { - this.LargeBufferDiscarded(Events.MemoryStreamDiscardReason.TooLarge); - } + ReportLargeBufferDiscarded(Events.MemoryStreamDiscardReason.TooLarge); } Interlocked.Add(ref this.largeBufferInUseSize[poolIndex], -buffer.Length); - if (this.UsageReport != null) - { - this.UsageReport(this.smallPoolInUseSize, this.smallPoolFreeSize, this.LargePoolInUseSize, - this.LargePoolFreeSize); - } + ReportUsageReport(this.smallPoolInUseSize, this.smallPoolFreeSize, this.LargePoolInUseSize, + this.LargePoolFreeSize); } /// @@ -481,7 +795,7 @@ internal void ReturnBlocks(ICollection blocks, string tag) { if (blocks == null) { - throw new ArgumentNullException("blocks"); + throw new ArgumentNullException(nameof(blocks)); } var bytesToReturn = blocks.Count * this.BlockSize; @@ -504,61 +818,66 @@ internal void ReturnBlocks(ICollection blocks, string tag) } else { - Events.Write.MemoryStreamDiscardBuffer(Events.MemoryStreamBufferType.Small, tag, + Events.Writer.MemoryStreamDiscardBuffer(Events.MemoryStreamBufferType.Small, tag, Events.MemoryStreamDiscardReason.EnoughFree); - if (this.BlockDiscarded != null) - { - this.BlockDiscarded(); - } + ReportBlockDiscarded(); break; } } - if (this.UsageReport != null) - { - this.UsageReport(this.smallPoolInUseSize, this.smallPoolFreeSize, this.LargePoolInUseSize, - this.LargePoolFreeSize); - } + ReportUsageReport(this.smallPoolInUseSize, this.smallPoolFreeSize, this.LargePoolInUseSize, + this.LargePoolFreeSize); + } + + internal void ReportBlockCreated() + { + this.BlockCreated?.Invoke(); + } + + internal void ReportBlockDiscarded() + { + this.BlockDiscarded?.Invoke(); + } + + internal void ReportLargeBufferCreated() + { + this.LargeBufferCreated?.Invoke(); + } + + internal void ReportLargeBufferDiscarded(Events.MemoryStreamDiscardReason reason) + { + this.LargeBufferDiscarded?.Invoke(reason); } internal void ReportStreamCreated() { - if (this.StreamCreated != null) - { - this.StreamCreated(); - } + this.StreamCreated?.Invoke(); } internal void ReportStreamDisposed() { - if (this.StreamDisposed != null) - { - this.StreamDisposed(); - } + this.StreamDisposed?.Invoke(); } internal void ReportStreamFinalized() { - if (this.StreamFinalized != null) - { - this.StreamFinalized(); - } + this.StreamFinalized?.Invoke(); } internal void ReportStreamLength(long bytes) { - if (this.StreamLength != null) - { - this.StreamLength(bytes); - } + this.StreamLength?.Invoke(bytes); } internal void ReportStreamToArray() { - if (this.StreamConvertedToArray != null) - { - this.StreamConvertedToArray(); - } + this.StreamConvertedToArray?.Invoke(); + } + + internal void ReportUsageReport( + long smallPoolInUseBytes, long smallPoolFreeBytes, long largePoolInUseBytes, long largePoolFreeBytes) + { + this.UsageReport?.Invoke(smallPoolInUseBytes, smallPoolFreeBytes, largePoolInUseBytes, largePoolFreeBytes); } /// @@ -570,6 +889,16 @@ public MemoryStream GetStream() return new RecyclableMemoryStream(this); } + /// + /// Retrieve a new MemoryStream object with no tag and a default initial capacity. + /// + /// A unique identifier which can be used to trace usages of the stream. + /// A MemoryStream. + public MemoryStream GetStream(Guid id) + { + return new RecyclableMemoryStream(this, id); + } + /// /// Retrieve a new MemoryStream object with the given tag and a default initial capacity. /// @@ -580,6 +909,17 @@ public MemoryStream GetStream(string tag) return new RecyclableMemoryStream(this, tag); } + /// + /// Retrieve a new MemoryStream object with the given tag and a default initial capacity. + /// + /// A unique identifier which can be used to trace usages of the stream. + /// A tag which can be used to track the source of the stream. + /// A MemoryStream. + public MemoryStream GetStream(Guid id, string tag) + { + return new RecyclableMemoryStream(this, id, tag); + } + /// /// Retrieve a new MemoryStream object with the given tag and at least the given capacity. /// @@ -591,28 +931,99 @@ public MemoryStream GetStream(string tag, int requiredSize) return new RecyclableMemoryStream(this, tag, requiredSize); } + /// + /// Retrieve a new MemoryStream object with the given tag and at least the given capacity. + /// + /// A unique identifier which can be used to trace usages of the stream. + /// A tag which can be used to track the source of the stream. + /// The minimum desired capacity for the stream. + /// A MemoryStream. + public MemoryStream GetStream(Guid id, string tag, int requiredSize) + { + return new RecyclableMemoryStream(this, id, tag, requiredSize); + } + /// /// Retrieve a new MemoryStream object with the given tag and at least the given capacity, possibly using - /// a single continugous underlying buffer. + /// a single contiguous underlying buffer. /// /// Retrieving a MemoryStream which provides a single contiguous buffer can be useful in situations /// where the initial size is known and it is desirable to avoid copying data between the smaller underlying /// buffers to a single large one. This is most helpful when you know that you will always call GetBuffer /// on the underlying stream. + /// A unique identifier which can be used to trace usages of the stream. /// A tag which can be used to track the source of the stream. /// The minimum desired capacity for the stream. /// Whether to attempt to use a single contiguous buffer. /// A MemoryStream. - public MemoryStream GetStream(string tag, int requiredSize, bool asContiguousBuffer) + public MemoryStream GetStream(Guid id, string tag, int requiredSize, bool asContiguousBuffer) { if (!asContiguousBuffer || requiredSize <= this.BlockSize) { - return this.GetStream(tag, requiredSize); + return this.GetStream(id, tag, requiredSize); } - return new RecyclableMemoryStream(this, tag, requiredSize, this.GetLargeBuffer(requiredSize, tag)); + return new RecyclableMemoryStream(this, id, tag, requiredSize, this.GetLargeBuffer(requiredSize, tag)); + } + + /// + /// Retrieve a new MemoryStream object with the given tag and at least the given capacity, possibly using + /// a single contiguous underlying buffer. + /// + /// Retrieving a MemoryStream which provides a single contiguous buffer can be useful in situations + /// where the initial size is known and it is desirable to avoid copying data between the smaller underlying + /// buffers to a single large one. This is most helpful when you know that you will always call GetBuffer + /// on the underlying stream. + /// A tag which can be used to track the source of the stream. + /// The minimum desired capacity for the stream. + /// Whether to attempt to use a single contiguous buffer. + /// A MemoryStream. + public MemoryStream GetStream(string tag, int requiredSize, bool asContiguousBuffer) + { + return GetStream(Guid.NewGuid(), tag, requiredSize, asContiguousBuffer); } + /// + /// Retrieve a new MemoryStream object with the given tag and with contents copied from the provided + /// buffer. The provided buffer is not wrapped or used after construction. + /// + /// The new stream's position is set to the beginning of the stream when returned. + /// A unique identifier which can be used to trace usages of the stream. + /// A tag which can be used to track the source of the stream. + /// The byte buffer to copy data from. + /// The offset from the start of the buffer to copy from. + /// The number of bytes to copy from the buffer. + /// A MemoryStream. + public MemoryStream GetStream(Guid id, string tag, byte[] buffer, int offset, int count) + { + RecyclableMemoryStream stream = null; + try + { + stream = new RecyclableMemoryStream(this, id, tag, count); + stream.Write(buffer, offset, count); + stream.Position = 0; + return stream; + } + catch + { + stream?.Dispose(); + throw; + } + } + + /// + /// Retrieve a new MemoryStream object with the contents copied from the provided + /// buffer. The provided buffer is not wrapped or used after construction. + /// + /// The new stream's position is set to the beginning of the stream when returned. + /// The byte buffer to copy data from. + /// A MemoryStream. + public MemoryStream GetStream(byte[] buffer) + { + return GetStream(null, buffer, 0, buffer.Length); + } + + /// /// Retrieve a new MemoryStream object with the given tag and with contents copied from the provided /// buffer. The provided buffer is not wrapped or used after construction. @@ -623,15 +1034,63 @@ public MemoryStream GetStream(string tag, int requiredSize, bool asContiguousBuf /// The offset from the start of the buffer to copy from. /// The number of bytes to copy from the buffer. /// A MemoryStream. - //[SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] public MemoryStream GetStream(string tag, byte[] buffer, int offset, int count) { - var stream = new RecyclableMemoryStream(this, tag, count); - stream.Write(buffer, offset, count); - stream.Position = 0; - return stream; + return GetStream(Guid.NewGuid(), tag, buffer, offset, count); + } + +#if NETCOREAPP2_1 || NETSTANDARD2_1 + /// + /// Retrieve a new MemoryStream object with the given tag and with contents copied from the provided + /// buffer. The provided buffer is not wrapped or used after construction. + /// + /// The new stream's position is set to the beginning of the stream when returned. + /// A unique identifier which can be used to trace usages of the stream. + /// A tag which can be used to track the source of the stream. + /// The byte buffer to copy data from. + /// A MemoryStream. + public MemoryStream GetStream(Guid id, string tag, Memory buffer) + { + RecyclableMemoryStream stream = null; + try + { + stream = new RecyclableMemoryStream(this, id, tag, buffer.Length); + stream.Write(buffer.Span); + stream.Position = 0; + return stream; + } + catch + { + stream?.Dispose(); + throw; + } + } + + /// + /// Retrieve a new MemoryStream object with the contents copied from the provided + /// buffer. The provided buffer is not wrapped or used after construction. + /// + /// The new stream's position is set to the beginning of the stream when returned. + /// The byte buffer to copy data from. + /// A MemoryStream. + public MemoryStream GetStream(Memory buffer) + { + return GetStream(null, buffer); } + /// + /// Retrieve a new MemoryStream object with the given tag and with contents copied from the provided + /// buffer. The provided buffer is not wrapped or used after construction. + /// + /// The new stream's position is set to the beginning of the stream when returned. + /// A tag which can be used to track the source of the stream. + /// The byte buffer to copy data from. + /// A MemoryStream. + public MemoryStream GetStream(string tag, Memory buffer) + { + return GetStream(Guid.NewGuid(), tag, buffer); + } +#endif /// /// Triggered when a new block is created. /// @@ -706,9 +1165,9 @@ public MemoryStream GetStream(string tag, byte[] buffer, int offset, int count) /// The biggest wrinkle in this implementation is when GetBuffer() is called. This requires a single /// contiguous buffer. If only a single block is in use, then that block is returned. If multiple blocks /// are in use, we retrieve a larger buffer from the memory manager. These large buffers are also pooled, - /// split by size--they are multiples of a chunk size (1 MB by default). + /// split by size--they are multiples/exponentials of a chunk size (1 MB by default). /// - /// Once a large buffer is assigned to the stream the blocks are NEVER again used for this stream. All operations take place on the + /// Once a large buffer is assigned to the stream the small blocks are NEVER again used for this stream. All operations take place on the /// large buffer. The large buffer can be replaced by a larger buffer from the pool as needed. All blocks and large buffers /// are maintained in the stream until the stream is disposed (unless AggressiveBufferReturn is enabled in the stream manager). /// @@ -717,11 +1176,29 @@ public sealed class RecyclableMemoryStream : MemoryStream { private const long MaxStreamLength = Int32.MaxValue; + private static readonly byte[] emptyArray = new byte[0]; + /// /// All of these blocks must be the same size /// private readonly List blocks = new List(1); + private readonly Guid id; + + private readonly RecyclableMemoryStreamManager memoryManager; + + private readonly string tag; + + /// + /// This list is used to store buffers once they're replaced by something larger. + /// This is for the cases where you have users of this class that may hold onto the buffers longer + /// than they should and you want to prevent race conditions which could corrupt the data. + /// + private List dirtyBuffers; + + // long to allow Interlocked.Read (for .NET Standard 1.4 compat) + private long disposedState; + /// /// This is only set by GetBuffer() if the necessary buffer is larger than a single block size, or on /// construction if the caller immediately requests a single large buffer. @@ -732,27 +1209,30 @@ public sealed class RecyclableMemoryStream : MemoryStream private byte[] largeBuffer; /// - /// This list is used to store buffers once they're replaced by something larger. - /// This is for the cases where you have users of this class that may hold onto the buffers longer - /// than they should and you want to prevent race conditions which could corrupt the data. - /// - private List dirtyBuffers; - - private readonly Guid id; - /// - /// Unique identifier for this stream across it's entire lifetime + /// Unique identifier for this stream across its entire lifetime /// /// Object has been disposed - internal Guid Id { get { this.CheckDisposed(); return this.id; } } + internal Guid Id + { + get + { + this.CheckDisposed(); + return this.id; + } + } - private readonly string tag; /// /// A temporary identifier for the current usage of this stream. /// /// Object has been disposed - internal string Tag { get { this.CheckDisposed(); return this.tag; } } - - private readonly RecyclableMemoryStreamManager memoryManager; + internal string Tag + { + get + { + this.CheckDisposed(); + return this.tag; + } + } /// /// Gets the memory manager being used by this stream. @@ -767,72 +1247,83 @@ internal RecyclableMemoryStreamManager MemoryManager } } - private bool disposed; - - private readonly string allocationStack; - private string disposeStack; - /// /// Callstack of the constructor. It is only set if MemoryManager.GenerateCallStacks is true, /// which should only be in debugging situations. /// - internal string AllocationStack { get { return this.allocationStack; } } + internal string AllocationStack { get; } /// /// Callstack of the Dispose call. It is only set if MemoryManager.GenerateCallStacks is true, /// which should only be in debugging situations. /// - internal string DisposeStack { get { return this.disposeStack; } } + internal string DisposeStack { get; private set; } + #region Constructors /// - /// This buffer exists so that WriteByte can forward all of its calls to Write - /// without creating a new byte[] buffer on every call. + /// Allocate a new RecyclableMemoryStream object. /// - private readonly byte[] byteBuffer = new byte[1]; + /// The memory manager + public RecyclableMemoryStream(RecyclableMemoryStreamManager memoryManager) + : this(memoryManager, Guid.NewGuid(), null, 0, null) { } - #region Constructors /// /// Allocate a new RecyclableMemoryStream object. /// /// The memory manager - public RecyclableMemoryStream(RecyclableMemoryStreamManager memoryManager) - : this(memoryManager, null, 0, null) - { - } + /// A unique identifier which can be used to trace usages of the stream. + public RecyclableMemoryStream(RecyclableMemoryStreamManager memoryManager, Guid id) + : this(memoryManager, id, null, 0, null) { } + + /// + /// Allocate a new RecyclableMemoryStream object + /// + /// The memory manager + /// A string identifying this stream for logging and debugging purposes + public RecyclableMemoryStream(RecyclableMemoryStreamManager memoryManager, string tag) + : this(memoryManager, Guid.NewGuid(), tag, 0, null) { } + + /// + /// Allocate a new RecyclableMemoryStream object + /// + /// The memory manager + /// A unique identifier which can be used to trace usages of the stream. + /// A string identifying this stream for logging and debugging purposes + public RecyclableMemoryStream(RecyclableMemoryStreamManager memoryManager, Guid id, string tag) + : this(memoryManager, id, tag, 0, null) { } /// /// Allocate a new RecyclableMemoryStream object /// /// The memory manager /// A string identifying this stream for logging and debugging purposes - public RecyclableMemoryStream(RecyclableMemoryStreamManager memoryManager, string tag) - : this(memoryManager, tag, 0, null) - { - } + /// The initial requested size to prevent future allocations + public RecyclableMemoryStream(RecyclableMemoryStreamManager memoryManager, string tag, int requestedSize) + : this(memoryManager, Guid.NewGuid(), tag, requestedSize, null) { } /// /// Allocate a new RecyclableMemoryStream object /// /// The memory manager + /// A unique identifier which can be used to trace usages of the stream. /// A string identifying this stream for logging and debugging purposes /// The initial requested size to prevent future allocations - public RecyclableMemoryStream(RecyclableMemoryStreamManager memoryManager, string tag, int requestedSize) - : this(memoryManager, tag, requestedSize, null) - { - } + public RecyclableMemoryStream(RecyclableMemoryStreamManager memoryManager, Guid id, string tag, int requestedSize) + : this(memoryManager, id, tag, requestedSize, null) { } /// /// Allocate a new RecyclableMemoryStream object /// /// The memory manager + /// A unique identifier which can be used to trace usages of the stream. /// A string identifying this stream for logging and debugging purposes /// The initial requested size to prevent future allocations /// An initial buffer to use. This buffer will be owned by the stream and returned to the memory manager upon Dispose. - internal RecyclableMemoryStream(RecyclableMemoryStreamManager memoryManager, string tag, int requestedSize, - byte[] initialLargeBuffer) + internal RecyclableMemoryStream(RecyclableMemoryStreamManager memoryManager, Guid id, string tag, int requestedSize, byte[] initialLargeBuffer) + : base(emptyArray) { this.memoryManager = memoryManager; - this.id = Guid.NewGuid(); + this.id = id; this.tag = tag; if (requestedSize < memoryManager.BlockSize) @@ -849,19 +1340,21 @@ internal RecyclableMemoryStream(RecyclableMemoryStreamManager memoryManager, str this.largeBuffer = initialLargeBuffer; } - this.disposed = false; - if (this.memoryManager.GenerateCallStacks) { - this.allocationStack = PclExport.Instance.GetStackTrace(); + this.AllocationStack = Environment.StackTrace; } - Events.Write.MemoryStreamCreated(this.id, this.tag, requestedSize); + RecyclableMemoryStreamManager.Events.Writer.MemoryStreamCreated(this.id, this.tag, requestedSize); this.memoryManager.ReportStreamCreated(); } #endregion #region Dispose and Finalize + /// + /// The finalizer will be called when a stream is not disposed properly. + /// + /// Failing to dispose indicates a bug in the code using streams. Care should be taken to properly account for stream lifetime. ~RecyclableMemoryStream() { this.Dispose(false); @@ -871,34 +1364,32 @@ internal RecyclableMemoryStream(RecyclableMemoryStreamManager memoryManager, str /// Returns the memory used by this stream back to the pool. /// /// Whether we're disposing (true), or being called by the finalizer (false) - /// This method is not thread safe and it may not be called more than once. - //[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1816:CallGCSuppressFinalizeCorrectly", Justification = "We have different disposal semantics, so SuppressFinalize is in a different spot.")] + [SuppressMessage("Microsoft.Usage", "CA1816:CallGCSuppressFinalizeCorrectly", + Justification = "We have different disposal semantics, so SuppressFinalize is in a different spot.")] protected override void Dispose(bool disposing) { - if (this.disposed) + if (Interlocked.CompareExchange(ref this.disposedState, 1, 0) != 0) { string doubleDisposeStack = null; if (this.memoryManager.GenerateCallStacks) { - doubleDisposeStack = PclExport.Instance.GetStackTrace(); + doubleDisposeStack = Environment.StackTrace; } - Events.Write.MemoryStreamDoubleDispose(this.id, this.tag, this.allocationStack, this.disposeStack, doubleDisposeStack); + RecyclableMemoryStreamManager.Events.Writer.MemoryStreamDoubleDispose(this.id, this.tag, + this.AllocationStack, this.DisposeStack, doubleDisposeStack); return; } - Events.Write.MemoryStreamDisposed(this.id, this.tag); + RecyclableMemoryStreamManager.Events.Writer.MemoryStreamDisposed(this.id, this.tag); if (this.memoryManager.GenerateCallStacks) { - this.disposeStack = PclExport.Instance.GetStackTrace(); + this.DisposeStack = Environment.StackTrace; } if (disposing) { - // Once this flag is set, we can't access any properties -- use fields directly - this.disposed = true; - this.memoryManager.ReportStreamDisposed(); GC.SuppressFinalize(this); @@ -907,8 +1398,9 @@ protected override void Dispose(bool disposing) { // We're being finalized. - Events.Write.MemoryStreamFinalized(this.id, this.tag, this.allocationStack); + RecyclableMemoryStreamManager.Events.Writer.MemoryStreamFinalized(this.id, this.tag, this.AllocationStack); +#if !NETSTANDARD1_4 if (AppDomain.CurrentDomain.IsFinalizingForUnload()) { // If we're being finalized because of a shutdown, don't go any further. @@ -917,6 +1409,7 @@ protected override void Dispose(bool disposing) base.Dispose(disposing); return; } +#endif this.memoryManager.ReportStreamFinalized(); } @@ -937,6 +1430,7 @@ protected override void Dispose(bool disposing) } this.memoryManager.ReturnBlocks(this.blocks, this.tag); + this.blocks.Clear(); base.Dispose(disposing); } @@ -944,7 +1438,11 @@ protected override void Dispose(bool disposing) /// /// Equivalent to Dispose /// +#if NETSTANDARD1_4 + public void Close() +#else public override void Close() +#endif { this.Dispose(true); } @@ -959,6 +1457,8 @@ public override void Close() /// Explicitly setting the capacity to a lower value than the current value will have no effect. /// This is because the buffers are all pooled by chunks and there's little reason to /// allow stream truncation. + /// + /// Writing past the current capacity will cause Capacity to automatically increase, until MaximumStreamCapacity is reached. /// /// Object has been disposed public override int Capacity @@ -971,11 +1471,8 @@ public override int Capacity return this.largeBuffer.Length; } - if (this.blocks.Count > 0) - { - return this.blocks.Count * this.memoryManager.BlockSize; - } - return 0; + long size = (long)this.blocks.Count * this.memoryManager.BlockSize; + return (int)Math.Min(int.MaxValue, size); } set { @@ -1032,34 +1529,22 @@ public override long Position /// /// Whether the stream can currently read /// - public override bool CanRead - { - get { return !this.disposed; } - } + public override bool CanRead => !this.Disposed; /// /// Whether the stream can currently seek /// - public override bool CanSeek - { - get { return !this.disposed; } - } + public override bool CanSeek => !this.Disposed; /// /// Always false /// - public override bool CanTimeout - { - get { return false; } - } + public override bool CanTimeout => false; /// /// Whether the stream can currently write /// - public override bool CanWrite - { - get { return !this.disposed; } - } + public override bool CanWrite => !this.Disposed; /// /// Returns a single buffer containing the contents of the stream. @@ -1069,7 +1554,11 @@ public override bool CanWrite /// IMPORTANT: Doing a Write() after calling GetBuffer() invalidates the buffer. The old buffer is held onto /// until Dispose is called, but the next time GetBuffer() is called, a new buffer from the pool will be required. /// Object has been disposed +#if NETSTANDARD1_4 + public byte[] GetBuffer() +#else public override byte[] GetBuffer() +#endif { this.CheckDisposed(); @@ -1103,25 +1592,54 @@ public override byte[] GetBuffer() return this.largeBuffer; } + /// + /// Returns an ArraySegment that wraps a single buffer containing the contents of the stream. + /// + /// An ArraySegment containing a reference to the underlying bytes. + /// Always returns true. + /// GetBuffer has no failure modes (it always returns something, even if it's an empty buffer), therefore this method + /// always returns a valid ArraySegment to the same buffer returned by GetBuffer. +#if NET40 || NET45 + public bool TryGetBuffer(out ArraySegment buffer) +#else + public override bool TryGetBuffer(out ArraySegment buffer) +#endif + { + this.CheckDisposed(); + buffer = new ArraySegment(this.GetBuffer(), 0, (int)this.Length); + // GetBuffer has no failure modes, so this should always succeed + return true; + } + /// /// Returns a new array with a copy of the buffer's contents. You should almost certainly be using GetBuffer combined with the Length to /// access the bytes in this stream. Calling ToArray will destroy the benefits of pooled buffers, but it is included /// for the sake of completeness. /// /// Object has been disposed + /// The current RecyclableStreamManager object disallows ToArray calls. +#pragma warning disable CS0809 [Obsolete("This method has degraded performance vs. GetBuffer and should be avoided.")] public override byte[] ToArray() { this.CheckDisposed(); + + string stack = this.memoryManager.GenerateCallStacks ? Environment.StackTrace : null; + RecyclableMemoryStreamManager.Events.Writer.MemoryStreamToArray(this.id, this.tag, stack, this.length); + + if (this.memoryManager.ThrowExceptionOnToArray) + { + throw new NotSupportedException("The underlying RecyclableMemoryStreamManager is configured to not allow calls to ToArray."); + } + var newBuffer = new byte[this.Length]; this.InternalRead(newBuffer, 0, this.length, 0); - string stack = this.memoryManager.GenerateCallStacks ? PclExport.Instance.GetStackTrace() : null; - Events.Write.MemoryStreamToArray(this.id, this.tag, stack, 0); this.memoryManager.ReportStreamToArray(); return newBuffer; } +#pragma warning restore CS0809 /// /// Reads from the current position into the provided buffer @@ -1135,21 +1653,38 @@ public override byte[] ToArray() /// offset subtracted from the buffer length is less than count /// Object has been disposed public override int Read(byte[] buffer, int offset, int count) + { + return this.SafeRead(buffer, offset, count, ref this.position); + } + + /// + /// Reads from the specified position into the provided buffer + /// + /// Destination buffer + /// Offset into buffer at which to start placing the read bytes. + /// Number of bytes to read. + /// Position in the stream to start reading from + /// The number of bytes read + /// buffer is null + /// offset or count is less than 0 + /// offset subtracted from the buffer length is less than count + /// Object has been disposed + public int SafeRead(byte[] buffer, int offset, int count, ref int streamPosition) { this.CheckDisposed(); if (buffer == null) { - throw new ArgumentNullException("buffer"); + throw new ArgumentNullException(nameof(buffer)); } if (offset < 0) { - throw new ArgumentOutOfRangeException("offset", "offset cannot be negative"); + throw new ArgumentOutOfRangeException(nameof(offset), "offset cannot be negative"); } if (count < 0) { - throw new ArgumentOutOfRangeException("count", "count cannot be negative"); + throw new ArgumentOutOfRangeException(nameof(count), "count cannot be negative"); } if (offset + count > buffer.Length) @@ -1157,10 +1692,39 @@ public override int Read(byte[] buffer, int offset, int count) throw new ArgumentException("buffer length must be at least offset + count"); } - int amountRead = this.InternalRead(buffer, offset, count, this.position); - this.position += amountRead; + int amountRead = this.InternalRead(buffer, offset, count, streamPosition); + streamPosition += amountRead; + return amountRead; + } + +#if NETCOREAPP2_1 || NETSTANDARD2_1 + /// + /// Reads from the current position into the provided buffer + /// + /// Destination buffer + /// The number of bytes read + /// Object has been disposed + public override int Read(Span buffer) + { + return this.SafeRead(buffer, ref this.position); + } + + /// + /// Reads from the specified position into the provided buffer + /// + /// Destination buffer + /// Position in the stream to start reading from + /// The number of bytes read + /// Object has been disposed + public int SafeRead(Span buffer, ref int streamPosition) + { + this.CheckDisposed(); + + int amountRead = this.InternalRead(buffer, streamPosition); + streamPosition += amountRead; return amountRead; } +#endif /// /// Writes the buffer to the stream @@ -1177,17 +1741,18 @@ public override void Write(byte[] buffer, int offset, int count) this.CheckDisposed(); if (buffer == null) { - throw new ArgumentNullException("buffer"); + throw new ArgumentNullException(nameof(buffer)); } if (offset < 0) { - throw new ArgumentOutOfRangeException("offset", offset, "Offset must be in the range of 0 - buffer.Length-1"); + throw new ArgumentOutOfRangeException(nameof(offset), offset, + "Offset must be in the range of 0 - buffer.Length-1"); } if (count < 0) { - throw new ArgumentOutOfRangeException("count", count, "count must be non-negative"); + throw new ArgumentOutOfRangeException(nameof(count), count, "count must be non-negative"); } if (count + offset > buffer.Length) @@ -1203,13 +1768,6 @@ public override void Write(byte[] buffer, int offset, int count) throw new IOException("Maximum capacity exceeded"); } - long requiredBuffers = (end + blockSize - 1) / blockSize; - - if (requiredBuffers * blockSize > MaxStreamLength) - { - throw new IOException("Maximum capacity exceeded"); - } - this.EnsureCapacity((int)end); if (this.largeBuffer == null) @@ -1224,7 +1782,8 @@ public override void Write(byte[] buffer, int offset, int count) int remainingInBlock = blockSize - blockAndOffset.Offset; int amountToWriteInBlock = Math.Min(remainingInBlock, bytesRemaining); - Buffer.BlockCopy(buffer, offset + bytesWritten, currentBlock, blockAndOffset.Offset, amountToWriteInBlock); + Buffer.BlockCopy(buffer, offset + bytesWritten, currentBlock, blockAndOffset.Offset, + amountToWriteInBlock); bytesRemaining -= amountToWriteInBlock; bytesWritten += amountToWriteInBlock; @@ -1241,12 +1800,61 @@ public override void Write(byte[] buffer, int offset, int count) this.length = Math.Max(this.position, this.length); } +#if NETCOREAPP2_1 || NETSTANDARD2_1 + /// + /// Writes the buffer to the stream + /// + /// Source buffer + /// buffer is null + /// Object has been disposed + public override void Write(ReadOnlySpan source) + { + this.CheckDisposed(); + + int blockSize = this.memoryManager.BlockSize; + long end = (long)this.position + source.Length; + // Check for overflow + if (end > MaxStreamLength) + { + throw new IOException("Maximum capacity exceeded"); + } + + this.EnsureCapacity((int)end); + + if (this.largeBuffer == null) + { + var blockAndOffset = this.GetBlockAndRelativeOffset(this.position); + + while (source.Length > 0) + { + byte[] currentBlock = this.blocks[blockAndOffset.Block]; + int remainingInBlock = blockSize - blockAndOffset.Offset; + int amountToWriteInBlock = Math.Min(remainingInBlock, source.Length); + + source.Slice(0, amountToWriteInBlock) + .CopyTo(currentBlock.AsSpan(blockAndOffset.Offset)); + + source = source.Slice(amountToWriteInBlock); + + ++blockAndOffset.Block; + blockAndOffset.Offset = 0; + } + } + else + { + source.CopyTo(this.largeBuffer.AsSpan(this.position)); + } + this.position = (int)end; + this.length = Math.Max(this.position, this.length); + } +#endif + /// /// Returns a useful string for debugging. This should not normally be called in actual production code. /// public override string ToString() { - return string.Format("Id = {0}, Tag = {1}, Length = {2:N0} bytes", this.Id, this.Tag, this.Length); + return $"Id = {this.Id}, Tag = {this.Tag}, Length = {this.Length:N0} bytes"; } /// @@ -1257,8 +1865,44 @@ public override string ToString() public override void WriteByte(byte value) { this.CheckDisposed(); - this.byteBuffer[0] = value; - this.Write(this.byteBuffer, 0, 1); + + long end = (long)this.position + 1; + + // Check for overflow + if (end > MaxStreamLength) + { + throw new IOException("Maximum capacity exceeded"); + } + + if (this.largeBuffer == null) + { + var blockSize = this.memoryManager.BlockSize; + + var block = this.position / blockSize; + + if (block >= this.blocks.Count) + { + this.EnsureCapacity((int)end); + } + + this.blocks[block][this.position % blockSize] = value; + } + else + { + if (this.position >= this.largeBuffer.Length) + { + this.EnsureCapacity((int)end); + } + + this.largeBuffer[this.position] = value; + } + + this.position = (int)end; + + if (this.position > this.length) + { + this.length = this.position; + } } /// @@ -1267,23 +1911,34 @@ public override void WriteByte(byte value) /// The byte at the current position, or -1 if the position is at the end of the stream. /// Object has been disposed public override int ReadByte() + { + return this.SafeReadByte(ref this.position); + } + + /// + /// Reads a single byte from the specified position in the stream. + /// + /// The position in the stream to read from + /// The byte at the current position, or -1 if the position is at the end of the stream. + /// Object has been disposed + public int SafeReadByte(ref int streamPosition) { this.CheckDisposed(); - if (this.position == this.length) + if (streamPosition == this.length) { return -1; } - byte value = 0; + byte value; if (this.largeBuffer == null) { - var blockAndOffset = this.GetBlockAndRelativeOffset(this.position); + var blockAndOffset = this.GetBlockAndRelativeOffset(streamPosition); value = this.blocks[blockAndOffset.Block][blockAndOffset.Offset]; } else { - value = this.largeBuffer[position]; + value = this.largeBuffer[streamPosition]; } - this.position++; + streamPosition++; return value; } @@ -1297,7 +1952,8 @@ public override void SetLength(long value) this.CheckDisposed(); if (value < 0 || value > MaxStreamLength) { - throw new ArgumentOutOfRangeException("value", "value must be non-negative and at most " + MaxStreamLength); + throw new ArgumentOutOfRangeException(nameof(value), + "value must be non-negative and at most " + MaxStreamLength); } this.EnsureCapacity((int)value); @@ -1324,23 +1980,23 @@ public override long Seek(long offset, SeekOrigin loc) this.CheckDisposed(); if (offset > MaxStreamLength) { - throw new ArgumentOutOfRangeException("offset", "offset cannot be larger than " + MaxStreamLength); + throw new ArgumentOutOfRangeException(nameof(offset), "offset cannot be larger than " + MaxStreamLength); } int newPosition; switch (loc) { - case SeekOrigin.Begin: - newPosition = (int)offset; - break; - case SeekOrigin.Current: - newPosition = (int)offset + this.position; - break; - case SeekOrigin.End: - newPosition = (int)offset + this.length; - break; - default: - throw new ArgumentException("Invalid seek origin", "loc"); + case SeekOrigin.Begin: + newPosition = (int)offset; + break; + case SeekOrigin.Current: + newPosition = (int)offset + this.position; + break; + case SeekOrigin.End: + newPosition = (int)offset + this.length; + break; + default: + throw new ArgumentException("Invalid seek origin", nameof(loc)); } if (newPosition < 0) { @@ -1351,55 +2007,90 @@ public override long Seek(long offset, SeekOrigin loc) } /// - /// Synchronously writes this stream's bytes to the parameter stream. + /// Synchronously writes this stream's bytes to the argument stream. /// /// Destination stream /// Important: This does a synchronous write, which may not be desired in some situations + /// stream is null public override void WriteTo(Stream stream) + { + this.WriteTo(stream, 0, this.length); + } + + /// + /// Synchronously writes this stream's bytes, starting at offset, for count bytes, to the argument stream. + /// + /// Destination stream + /// Offset in source + /// Number of bytes to write + /// stream is null + /// Offset is less than 0, or offset + count is beyond this stream's length. + public void WriteTo(Stream stream, int offset, int count) { this.CheckDisposed(); if (stream == null) { - throw new ArgumentNullException("stream"); + throw new ArgumentNullException(nameof(stream)); + } + + if (offset < 0 || offset + count > this.length) + { + throw new ArgumentOutOfRangeException(message: "offset must not be negative and offset + count must not exceed the length of the stream", innerException: null); } if (this.largeBuffer == null) { - int currentBlock = 0; - int bytesRemaining = this.length; + var blockAndOffset = GetBlockAndRelativeOffset(offset); + int bytesRemaining = count; + int currentBlock = blockAndOffset.Block; + int currentOffset = blockAndOffset.Offset; while (bytesRemaining > 0) { - int amountToCopy = Math.Min(this.blocks[currentBlock].Length, bytesRemaining); - stream.Write(this.blocks[currentBlock], 0, amountToCopy); + int amountToCopy = Math.Min(this.blocks[currentBlock].Length - currentOffset, bytesRemaining); + stream.Write(this.blocks[currentBlock], currentOffset, amountToCopy); bytesRemaining -= amountToCopy; ++currentBlock; + currentOffset = 0; } } else { - stream.Write(this.largeBuffer, 0, this.length); + stream.Write(this.largeBuffer, offset, count); } + } - #endregion +#endregion - #region Helper Methods +#region Helper Methods + private bool Disposed => Interlocked.Read(ref this.disposedState) != 0; + + [MethodImpl((MethodImplOptions)256)] private void CheckDisposed() { - if (this.disposed) + if (this.Disposed) { - throw new ObjectDisposedException(string.Format("The stream with Id {0} and Tag {1} is disposed.", this.id, this.tag)); + this.ThrowDisposedException(); } } + [MethodImpl(MethodImplOptions.NoInlining)] + private void ThrowDisposedException() + { + throw new ObjectDisposedException($"The stream with Id {this.id} and Tag {this.tag} is disposed."); + } + private int InternalRead(byte[] buffer, int offset, int count, int fromPosition) { if (this.length - fromPosition <= 0) { return 0; } + + int amountToCopy; + if (this.largeBuffer == null) { var blockAndOffset = this.GetBlockAndRelativeOffset(fromPosition); @@ -1408,8 +2099,10 @@ private int InternalRead(byte[] buffer, int offset, int count, int fromPosition) while (bytesRemaining > 0) { - int amountToCopy = Math.Min(this.blocks[blockAndOffset.Block].Length - blockAndOffset.Offset, bytesRemaining); - Buffer.BlockCopy(this.blocks[blockAndOffset.Block], blockAndOffset.Offset, buffer, bytesWritten + offset, amountToCopy); + amountToCopy = Math.Min(this.blocks[blockAndOffset.Block].Length - blockAndOffset.Offset, + bytesRemaining); + Buffer.BlockCopy(this.blocks[blockAndOffset.Block], blockAndOffset.Offset, buffer, + bytesWritten + offset, amountToCopy); bytesWritten += amountToCopy; bytesRemaining -= amountToCopy; @@ -1419,13 +2112,47 @@ private int InternalRead(byte[] buffer, int offset, int count, int fromPosition) } return bytesWritten; } - else + amountToCopy = Math.Min(count, this.length - fromPosition); + Buffer.BlockCopy(this.largeBuffer, fromPosition, buffer, offset, amountToCopy); + return amountToCopy; + } + +#if NETCOREAPP2_1 || NETSTANDARD2_1 + private int InternalRead(Span buffer, int fromPosition) + { + if (this.length - fromPosition <= 0) + { + return 0; + } + + int amountToCopy; + + if (this.largeBuffer == null) { - int amountToCopy = Math.Min(count, this.length - fromPosition); - Buffer.BlockCopy(this.largeBuffer, fromPosition, buffer, offset, amountToCopy); - return amountToCopy; + var blockAndOffset = this.GetBlockAndRelativeOffset(fromPosition); + int bytesWritten = 0; + int bytesRemaining = Math.Min(buffer.Length, this.length - fromPosition); + + while (bytesRemaining > 0) + { + amountToCopy = Math.Min(this.blocks[blockAndOffset.Block].Length - blockAndOffset.Offset, + bytesRemaining); + this.blocks[blockAndOffset.Block].AsSpan(blockAndOffset.Offset, amountToCopy) + .CopyTo(buffer.Slice(bytesWritten)); + + bytesWritten += amountToCopy; + bytesRemaining -= amountToCopy; + + ++blockAndOffset.Block; + blockAndOffset.Offset = 0; + } + return bytesWritten; } + amountToCopy = Math.Min(buffer.Length, this.length - fromPosition); + this.largeBuffer.AsSpan(fromPosition, amountToCopy).CopyTo(buffer); + return amountToCopy; } +#endif private struct BlockAndOffset { @@ -1439,6 +2166,7 @@ public BlockAndOffset(int block, int offset) } } + [MethodImpl((MethodImplOptions)256)] private BlockAndOffset GetBlockAndRelativeOffset(int offset) { var blockSize = this.memoryManager.BlockSize; @@ -1449,8 +2177,10 @@ private void EnsureCapacity(int newCapacity) { if (newCapacity > this.memoryManager.MaximumStreamCapacity && this.memoryManager.MaximumStreamCapacity > 0) { - Events.Write.MemoryStreamOverCapacity(newCapacity, this.memoryManager.MaximumStreamCapacity, this.tag, this.allocationStack); - throw new InvalidOperationException("Requested capacity is too large: " + newCapacity + ". Limit is " + this.memoryManager.MaximumStreamCapacity); + RecyclableMemoryStreamManager.Events.Writer.MemoryStreamOverCapacity(newCapacity, + this.memoryManager.MaximumStreamCapacity, this.tag, this.AllocationStack); + throw new InvalidOperationException("Requested capacity is too large: " + newCapacity + ". Limit is " + + this.memoryManager.MaximumStreamCapacity); } if (this.largeBuffer != null) @@ -1493,131 +2223,6 @@ private void ReleaseLargeBuffer() this.largeBuffer = null; } - #endregion - } - - //Avoid taking on an extra dep - public sealed partial class RecyclableMemoryStreamManager - { - //[EventSource(Name = "Microsoft-IO-RecyclableMemoryStream", Guid = "{B80CD4E4-890E-468D-9CBA-90EB7C82DFC7}")] - public sealed class Events// : EventSource - { - public static Events Write = new Events(); - - public enum MemoryStreamBufferType - { - Small, - Large - } - - public enum MemoryStreamDiscardReason - { - TooLarge, - EnoughFree - } - - //[Event(1, Level = EventLevel.Verbose)] - public void MemoryStreamCreated(Guid guid, string tag, int requestedSize) - { - //if (this.IsEnabled(EventLevel.Verbose, EventKeywords.None)) - //{ - // WriteEvent(1, guid, tag ?? string.Empty, requestedSize); - //} - } - - //[Event(2, Level = EventLevel.Verbose)] - public void MemoryStreamDisposed(Guid guid, string tag) - { - //if (this.IsEnabled(EventLevel.Verbose, EventKeywords.None)) - //{ - // WriteEvent(2, guid, tag ?? string.Empty); - //} - } - - //[Event(3, Level = EventLevel.Critical)] - public void MemoryStreamDoubleDispose(Guid guid, string tag, string allocationStack, string disposeStack1, - string disposeStack2) - { - //if (this.IsEnabled()) - //{ - // this.WriteEvent(3, guid, tag ?? string.Empty, allocationStack ?? string.Empty, - // disposeStack1 ?? string.Empty, disposeStack2 ?? string.Empty); - //} - } - - //[Event(4, Level = EventLevel.Error)] - public void MemoryStreamFinalized(Guid guid, string tag, string allocationStack) - { - //if (this.IsEnabled()) - //{ - // WriteEvent(4, guid, tag ?? string.Empty, allocationStack ?? string.Empty); - //} - } - - //[Event(5, Level = EventLevel.Verbose)] - public void MemoryStreamToArray(Guid guid, string tag, string stack, int size) - { - //if (this.IsEnabled(EventLevel.Verbose, EventKeywords.None)) - //{ - // WriteEvent(5, guid, tag ?? string.Empty, stack ?? string.Empty, size); - //} - } - - //[Event(6, Level = EventLevel.Informational)] - public void MemoryStreamManagerInitialized(int blockSize, int largeBufferMultiple, int maximumBufferSize) - { - //if (this.IsEnabled()) - //{ - // WriteEvent(6, blockSize, largeBufferMultiple, maximumBufferSize); - //} - } - - //[Event(7, Level = EventLevel.Verbose)] - public void MemoryStreamNewBlockCreated(long smallPoolInUseBytes) - { - //if (this.IsEnabled(EventLevel.Verbose, EventKeywords.None)) - //{ - // WriteEvent(7, smallPoolInUseBytes); - //} - } - - //[Event(8, Level = EventLevel.Verbose)] - public void MemoryStreamNewLargeBufferCreated(int requiredSize, long largePoolInUseBytes) - { - //if (this.IsEnabled(EventLevel.Verbose, EventKeywords.None)) - //{ - // WriteEvent(8, requiredSize, largePoolInUseBytes); - //} - } - - //[Event(9, Level = EventLevel.Verbose)] - public void MemoryStreamNonPooledLargeBufferCreated(int requiredSize, string tag, string allocationStack) - { - //if (this.IsEnabled(EventLevel.Verbose, EventKeywords.None)) - //{ - // WriteEvent(9, requiredSize, tag ?? string.Empty, allocationStack ?? string.Empty); - //} - } - - //[Event(10, Level = EventLevel.Warning)] - public void MemoryStreamDiscardBuffer(MemoryStreamBufferType bufferType, string tag, - MemoryStreamDiscardReason reason) - { - //if (this.IsEnabled()) - //{ - // WriteEvent(10, bufferType, tag ?? string.Empty, reason); - //} - } - - //[Event(11, Level = EventLevel.Error)] - public void MemoryStreamOverCapacity(int requestedCapacity, long maxCapacity, string tag, - string allocationStack) - { - //if (this.IsEnabled()) - //{ - // WriteEvent(11, requestedCapacity, maxCapacity, tag ?? string.Empty, allocationStack ?? string.Empty); - //} - } - } +#endregion } } From edf6b708110b7946c8ec6b8af956672774c8826f Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 9 Jun 2020 16:51:45 +0800 Subject: [PATCH 203/372] bump to v5.9.0 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 45c86d63f..b8540d782 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.8.1 + 5.9.0 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 18fc63a59..365d25e14 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.8.1 + 5.9.0 latest false From 1b85b37f2d83df9f701a1303231699169ff56ad7 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 16 Jun 2020 01:12:03 +0800 Subject: [PATCH 204/372] bump to v5.9.1 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index b8540d782..a87247056 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.9.0 + 5.9.1 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 365d25e14..03f6af5da 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.9.0 + 5.9.1 latest false From 5e0725bba5ac0090a925fc10cf2be1cf7f55afb5 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 7 Jul 2020 01:35:17 +0800 Subject: [PATCH 205/372] Fix NRE in ReflectionOptimizer --- src/ServiceStack.Text/ReflectionOptimizer.Emit.cs | 6 +++++- src/ServiceStack.Text/ReflectionOptimizer.cs | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs b/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs index 2800ce38a..235dafd1a 100644 --- a/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs +++ b/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs @@ -11,7 +11,7 @@ namespace ServiceStack.Text public sealed class EmitReflectionOptimizer : ReflectionOptimizer { private static EmitReflectionOptimizer provider; - public static EmitReflectionOptimizer Provider => provider ?? (provider = new EmitReflectionOptimizer()); + public static EmitReflectionOptimizer Provider => provider ??= new EmitReflectionOptimizer(); private EmitReflectionOptimizer() { } public override Type UseType(Type type) @@ -52,6 +52,8 @@ public override GetMemberDelegate CreateGetter(PropertyInfo propertyInfo) } var mi = propertyInfo.GetGetMethod(true); + if (mi == null) + return null; gen.Emit(mi.IsFinal ? OpCodes.Call : OpCodes.Callvirt, mi); if (propertyInfo.PropertyType.IsValueType) @@ -70,6 +72,8 @@ public override GetMemberDelegate CreateGetter(PropertyInfo propertyInfo) var gen = getter.GetILGenerator(); var mi = propertyInfo.GetGetMethod(true); + if (mi == null) + return null; if (typeof(T).IsValueType) { diff --git a/src/ServiceStack.Text/ReflectionOptimizer.cs b/src/ServiceStack.Text/ReflectionOptimizer.cs index 5f021a9db..e16651899 100644 --- a/src/ServiceStack.Text/ReflectionOptimizer.cs +++ b/src/ServiceStack.Text/ReflectionOptimizer.cs @@ -36,7 +36,7 @@ public abstract class ReflectionOptimizer public sealed class RuntimeReflectionOptimizer : ReflectionOptimizer { private static RuntimeReflectionOptimizer provider; - public static RuntimeReflectionOptimizer Provider => provider ?? (provider = new RuntimeReflectionOptimizer()); + public static RuntimeReflectionOptimizer Provider => provider ??= new RuntimeReflectionOptimizer(); private RuntimeReflectionOptimizer(){} public override Type UseType(Type type) => type; From 9e4c26c7d1407835808281a0cb0c8c5688618312 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 13 Jul 2020 16:50:28 +0800 Subject: [PATCH 206/372] Update Env.cs --- src/ServiceStack.Text/Env.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 2659ec24b..e587e6cf9 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -110,7 +110,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.8m; + public static decimal ServiceStackVersion = 5.9m; public static bool IsLinux { get; set; } From 7bd9bc8706cc1f23dd8fdc7bd1265870d649d60a Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 4 Aug 2020 15:53:46 +0800 Subject: [PATCH 207/372] bump to v5.9.2 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index a87247056..d5a7f9a2e 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.9.1 + 5.9.2 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 03f6af5da..b6702f4e4 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.9.1 + 5.9.2 latest false From d7414c7d46f5faff35ea1cd9e8164f60a2e20de8 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 4 Aug 2020 17:08:35 +0800 Subject: [PATCH 208/372] revert to v5.9.1 for CI --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index d5a7f9a2e..a87247056 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.9.2 + 5.9.1 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index b6702f4e4..03f6af5da 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.9.2 + 5.9.1 latest false From f4f252f7469662d0795f1c8bf32e20ab645aea4d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 4 Aug 2020 18:26:34 +0800 Subject: [PATCH 209/372] fix typo --- src/ServiceStack.Text/Env.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index e587e6cf9..3bdab38f9 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -202,7 +202,7 @@ public static string ReferenceAssemblyPath { throw new FileNotFoundException( "Could not infer .NET Reference Assemblies path, e.g '{0}'.\n".Fmt(netFxReferenceBasePath + @"v4.0\") + - "Provide path manually 'Env.ReferenceAssembyPath'."); + "Provide path manually 'Env.ReferenceAssemblyPath'."); } } } From cff66e9a880751002cc5df4926f8abdc631c9760 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 5 Aug 2020 22:41:11 +0800 Subject: [PATCH 210/372] bump to v5.9.3 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index a87247056..19f7ebc5c 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.9.1 + 5.9.3 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 03f6af5da..c12b34d25 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.9.1 + 5.9.3 latest false From 217e934abe284c1df6351f23074e7f32f5757838 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 7 Aug 2020 22:19:21 +0800 Subject: [PATCH 211/372] Ensure all ISO8601 DateTime with fractions have same behavior --- .../Common/DateTimeSerializer.cs | 27 ++++++++++------- .../Utils/DateTimeSerializerTests.cs | 30 ++++++++++++------- 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/src/ServiceStack.Text/Common/DateTimeSerializer.cs b/src/ServiceStack.Text/Common/DateTimeSerializer.cs index 44c1c718e..ae511d6ef 100644 --- a/src/ServiceStack.Text/Common/DateTimeSerializer.cs +++ b/src/ServiceStack.Text/Common/DateTimeSerializer.cs @@ -45,7 +45,7 @@ public static class DateTimeSerializer private const char XsdTimeSeparator = 'T'; private static readonly int XsdTimeSeparatorIndex = XsdDateTimeFormat.IndexOf(XsdTimeSeparator); private const string XsdUtcSuffix = "Z"; - private static readonly char[] DateTimeSeperators = new[] { '-', '/' }; + private static readonly char[] DateTimeSeparators = { '-', '/' }; private static readonly Regex UtcOffsetInfoRegex = new Regex("([+-](?:2[0-3]|[0-1][0-9]):[0-5][0-9])", PclExport.Instance.RegexOptions); public static Func OnParseErrorFn { get; set; } @@ -100,7 +100,8 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr) return unspecifiedDate.Prepare(); } - if (dateTimeStr.Length == DefaultDateTimeFormatWithFraction.Length) + var hasUtcSuffix = dateTimeStr.EndsWith(XsdUtcSuffix); + if (!hasUtcSuffix && dateTimeStr.Length == DefaultDateTimeFormatWithFraction.Length) { var unspecifiedDate = config.AssumeUtc ? DateTime.Parse(dateTimeStr, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal) @@ -109,7 +110,9 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr) return unspecifiedDate.Prepare(); } - var kind = DateTimeKind.Unspecified; + var kind = hasUtcSuffix + ? DateTimeKind.Utc + : DateTimeKind.Unspecified; switch (config.DateHandler) { case DateHandler.UnixTime: @@ -135,7 +138,7 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr) if (dateTimeStr.Length >= XsdDateTimeFormat3F.Length && dateTimeStr.Length <= XsdDateTimeFormat.Length - && dateTimeStr.EndsWith(XsdUtcSuffix)) + && hasUtcSuffix) { var dateTime = Env.IsMono ? ParseManual(dateTimeStr) : null; if (dateTime != null) @@ -144,7 +147,7 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr) return PclExport.Instance.ParseXsdDateTimeAsUtc(dateTimeStr); } - if (dateTimeStr.Length == CondensedDateTimeFormat.Length && dateTimeStr.IndexOfAny(DateTimeSeperators) == -1) + if (dateTimeStr.Length == CondensedDateTimeFormat.Length && dateTimeStr.IndexOfAny(DateTimeSeparators) == -1) { return DateTime.ParseExact(dateTimeStr, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None); } @@ -164,12 +167,14 @@ public static DateTime ParseShortestXsdDateTime(string dateTimeStr) { if (config.SkipDateTimeConversion) { - return DateTime.Parse(dateTimeStr, null, - kind == DateTimeKind.Unspecified - ? DateTimeStyles.None - : kind == DateTimeKind.Local - ? DateTimeStyles.AssumeLocal - : DateTimeStyles.AssumeUniversal); + var dateTimeStyle = kind == DateTimeKind.Unspecified + ? DateTimeStyles.None + : kind == DateTimeKind.Local + ? DateTimeStyles.AssumeLocal + : DateTimeStyles.AssumeUniversal; + if (config.AlwaysUseUtc) + dateTimeStyle |= DateTimeStyles.AdjustToUniversal; + return DateTime.Parse(dateTimeStr, null, dateTimeStyle); } var assumeKind = config.AssumeUtc ? DateTimeStyles.AssumeUniversal : DateTimeStyles.AssumeLocal; diff --git a/tests/ServiceStack.Text.Tests/Utils/DateTimeSerializerTests.cs b/tests/ServiceStack.Text.Tests/Utils/DateTimeSerializerTests.cs index e74753bfe..2785ab073 100644 --- a/tests/ServiceStack.Text.Tests/Utils/DateTimeSerializerTests.cs +++ b/tests/ServiceStack.Text.Tests/Utils/DateTimeSerializerTests.cs @@ -443,7 +443,7 @@ public void DateTimeKind_Does_Not_Change_With_SkipDateTimeConversion_true() using (JsConfig.With(new Config { AlwaysUseUtc = true })) { - Assert.AreEqual(DateTimeKind.Local, TypeSerializer.DeserializeFromString(TypeSerializer.SerializeToString(testObject)).Date.Kind); + Assert.AreEqual(DateTimeKind.Utc, TypeSerializer.DeserializeFromString(TypeSerializer.SerializeToString(testObject)).Date.Kind); } using (JsConfig.With(new Config { AlwaysUseUtc = true, SkipDateTimeConversion = false })) { @@ -776,23 +776,33 @@ public void Does_not_lose_precision() } [TestFixture] - public class UnixTimeScopeTests + public class ScopedDateTimeTests { [Test] public void Does_serialize_to_UnixTime_when_scoped() { var dto = new TestObject { Date = new DateTime(2001, 01, 01, 0, 0, 0, DateTimeKind.Utc) }; - using (var config = JsConfig.BeginScope()) - { - config.DateHandler = DateHandler.UnixTime; + using var config = JsConfig.With(new Config { DateHandler = DateHandler.UnixTime }); + var json = dto.ToJson(); + Assert.That(json, Is.EquivalentTo("{\"Date\":978307200}")); - var json = dto.ToJson(); - Assert.That(json, Is.EquivalentTo("{\"Date\":978307200}")); + var fromJson = JsonSerializer.DeserializeFromString(json); + Assert.That(fromJson.Date, Is.EqualTo(dto.Date)); + } - var fromJson = JsonSerializer.DeserializeFromString(json); - Assert.That(fromJson.Date, Is.EqualTo(dto.Date)); - } + [Test] + [TestCase("2020-08-07T09:36:20.960Z")] + [TestCase("2020-08-07T09:36:20.96Z")] + [TestCase("2020-08-07T09:36:20.9Z")] + [TestCase("2020-08-07T09:36:20Z")] + public void Does_preserve_UTC_timezone_with_all_fractions(string dateFmt) + { + using var scope = JsConfig.CreateScope("AssumeUtc:false,AlwaysUseUtc:true,SkipDateTimeConversion:true"); + var date = JsonSerializer.DeserializeFromString(dateFmt); + Assert.That(date.Kind, Is.EqualTo(DateTimeKind.Utc)); + Assert.That(date, Is.EqualTo(new DateTime(2020, 08, 07, 9, 36, 20)) + .Within(TimeSpan.FromSeconds(1))); } } } \ No newline at end of file From 8d516759b876201f0fc21c8a6ab06104f7013fc3 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 7 Aug 2020 22:25:39 +0800 Subject: [PATCH 212/372] Update JsonDateTimeTests.cs --- tests/ServiceStack.Text.Tests/JsonTests/JsonDateTimeTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ServiceStack.Text.Tests/JsonTests/JsonDateTimeTests.cs b/tests/ServiceStack.Text.Tests/JsonTests/JsonDateTimeTests.cs index f59cc1945..444dec72a 100644 --- a/tests/ServiceStack.Text.Tests/JsonTests/JsonDateTimeTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonTests/JsonDateTimeTests.cs @@ -452,7 +452,7 @@ public void Can_deserialize_json_date_iso8601_with_skipDateTimeConversion_true() using (JsConfig.With(new Config { AlwaysUseUtc = true })) { - Assert.AreEqual(DateTimeKind.Local, JsonSerializer.DeserializeFromString(JsonSerializer.SerializeToString(testObject)).Date.Kind); + Assert.AreEqual(DateTimeKind.Utc, JsonSerializer.DeserializeFromString(JsonSerializer.SerializeToString(testObject)).Date.Kind); } using (JsConfig.With(new Config { AlwaysUseUtc = true, SkipDateTimeConversion = false })) { From f13c48fb9e8f9a6578adb2b01b4c045fb5297da9 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 11 Aug 2020 23:30:42 +0800 Subject: [PATCH 213/372] Add Env ConfigAwait --- src/ServiceStack.Text/Env.cs | 40 +++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 3bdab38f9..4c8963eb5 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -4,6 +4,9 @@ using System; using System.Globalization; using System.IO; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Threading.Tasks; namespace ServiceStack.Text { @@ -18,12 +21,12 @@ static Env() IsNetStandard = true; try { - IsLinux = System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Linux); - IsWindows = System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows); - IsOSX = System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.OSX); - IsNetCore3 = System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription.StartsWith(".NET Core 3"); + IsLinux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); + IsWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + IsOSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + IsNetCore3 = RuntimeInformation.FrameworkDescription.StartsWith(".NET Core 3"); - var fxDesc = System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription; + var fxDesc = RuntimeInformation.FrameworkDescription; IsMono = fxDesc.Contains("Mono"); IsNetCore = fxDesc.StartsWith(".NET Core", StringComparison.OrdinalIgnoreCase); } @@ -79,7 +82,7 @@ static Env() IsAndroid = AssemblyUtils.FindType("Android.Manifest") != null; if (IsOSX && IsMono) { - var runtimeDir = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(); + var runtimeDir = RuntimeEnvironment.GetRuntimeDirectory(); //iOS detection no longer trustworthy so assuming iOS based on some current heuristics. TODO: improve iOS detection IsIOS = runtimeDir.StartsWith("/private/var") || runtimeDir.Contains("/CoreSimulator/Devices/"); @@ -99,11 +102,11 @@ static Env() VersionString = ServiceStackVersion.ToString(CultureInfo.InvariantCulture); ServerUserAgent = "ServiceStack/" - + VersionString + " " - + PclExport.Instance.PlatformName - + (IsMono ? "/Mono" : "") - + (IsLinux ? "/Linux" : IsOSX ? "/OSX" : IsUnix ? "/Unix" : IsWindows ? "/Windows" : "/UnknownOS") - + (IsIOS ? "/iOS" : IsAndroid ? "/Android" : IsUWP ? "/UWP" : ""); + + VersionString + " " + + PclExport.Instance.PlatformName + + (IsMono ? "/Mono" : "") + + (IsLinux ? "/Linux" : IsOSX ? "/OSX" : IsUnix ? "/Unix" : IsWindows ? "/Windows" : "/UnknownOS") + + (IsIOS ? "/iOS" : IsAndroid ? "/Android" : IsUWP ? "/UWP" : ""); __releaseDate = new DateTime(2001,01,01); } @@ -216,7 +219,7 @@ private static bool IsRunningAsUwp() { try { - IsNetNative = System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription.StartsWith(".NET Native", StringComparison.OrdinalIgnoreCase); + IsNetNative = RuntimeInformation.FrameworkDescription.StartsWith(".NET Native", StringComparison.OrdinalIgnoreCase); return IsInAppContainer || IsNetNative; } catch (Exception) {} @@ -294,9 +297,18 @@ private static bool IsInAppContainer } } - [System.Runtime.InteropServices.DllImport("kernel32.dll", ExactSpelling = true)] + [DllImport("kernel32.dll", ExactSpelling = true)] private static extern int GetCurrentApplicationUserModelId(ref uint applicationUserModelIdLength, byte[] applicationUserModelId); #endif - + + public static bool ContinueOnCapturedContext = false; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ConfiguredTaskAwaitable ConfigAwait(this Task task) => + task.ConfigureAwait(ContinueOnCapturedContext); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ConfiguredTaskAwaitable ConfigAwait(this Task task) => + task.ConfigureAwait(ContinueOnCapturedContext); } } \ No newline at end of file From 35571f844575d864ca1b4f54e34c8b0bc58a2efb Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 12 Aug 2020 00:54:37 +0800 Subject: [PATCH 214/372] Type ConfigAwait --- src/ServiceStack.Text/Env.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 4c8963eb5..17bba8eca 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -308,7 +308,7 @@ public static ConfiguredTaskAwaitable ConfigAwait(this Task task) => task.ConfigureAwait(ContinueOnCapturedContext); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ConfiguredTaskAwaitable ConfigAwait(this Task task) => + public static ConfiguredTaskAwaitable ConfigAwait(this Task task) => task.ConfigureAwait(ContinueOnCapturedContext); } } \ No newline at end of file From cd27eede03822f9a7add51d76f5519ccd76c4d4c Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 12 Aug 2020 02:36:14 +0800 Subject: [PATCH 215/372] Change all async APIs to use ConfigAwait() --- src/ServiceStack.Text/DefaultMemory.cs | 7 ++++--- src/ServiceStack.Text/Env.cs | 10 +++++++++- src/ServiceStack.Text/HttpUtils.cs | 15 +++++++-------- src/ServiceStack.Text/JsonSerializer.cs | 2 +- src/ServiceStack.Text/NetCoreMemory.cs | 4 ++-- src/ServiceStack.Text/PclExport.Net45.cs | 4 ++-- src/ServiceStack.Text/StreamExtensions.cs | 6 +++--- src/ServiceStack.Text/TypeSerializer.cs | 2 +- 8 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/ServiceStack.Text/DefaultMemory.cs b/src/ServiceStack.Text/DefaultMemory.cs index 65c300e7b..cc05301b1 100644 --- a/src/ServiceStack.Text/DefaultMemory.cs +++ b/src/ServiceStack.Text/DefaultMemory.cs @@ -473,7 +473,7 @@ private static async Task WriteAsyncAndReturn(Stream stream, byte[] bytes, int o { try { - await stream.WriteAsync(bytes, offset, count, token); + await stream.WriteAsync(bytes, offset, count, token).ConfigAwait(); } finally { @@ -492,11 +492,12 @@ public override async Task WriteAsync(Stream stream, ReadOnlyMemory value, value.CopyTo(bytes); if (stream is MemoryStream ms) { + // ReSharper disable once MethodHasAsyncOverloadWithCancellation ms.Write(bytes, 0, value.Length); } else { - await stream.WriteAsync(bytes, 0, value.Length, token); + await stream.WriteAsync(bytes, 0, value.Length, token).ConfigAwait(); } } finally @@ -534,7 +535,7 @@ public override async Task DeserializeAsync(Stream stream, Type type, if (stream.CanSeek) stream.Position = 0; - ms = await stream.CopyToNewMemoryStreamAsync(); + ms = await stream.CopyToNewMemoryStreamAsync().ConfigAwait(); } return Deserialize(ms, fromPool, type, deserializer); diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 17bba8eca..131144534 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -301,7 +301,7 @@ private static bool IsInAppContainer private static extern int GetCurrentApplicationUserModelId(ref uint applicationUserModelIdLength, byte[] applicationUserModelId); #endif - public static bool ContinueOnCapturedContext = false; + public const bool ContinueOnCapturedContext = false; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ConfiguredTaskAwaitable ConfigAwait(this Task task) => @@ -310,5 +310,13 @@ public static ConfiguredTaskAwaitable ConfigAwait(this Task task) => [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ConfiguredTaskAwaitable ConfigAwait(this Task task) => task.ConfigureAwait(ContinueOnCapturedContext); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ConfiguredValueTaskAwaitable ConfigAwait(this ValueTask task) => + task.ConfigureAwait(ContinueOnCapturedContext); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ConfiguredValueTaskAwaitable ConfigAwait(this ValueTask task) => + task.ConfigureAwait(ContinueOnCapturedContext); } } \ No newline at end of file diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 0fae75539..a4314f71b 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -7,6 +7,7 @@ using System.Net; using System.Text; using System.Threading.Tasks; +using ServiceStack.Text; namespace ServiceStack { @@ -597,12 +598,12 @@ public static async Task SendStringToUrlAsync(this string url, string me } } - using (var webRes = await webReq.GetResponseAsync()) + using (var webRes = await webReq.GetResponseAsync().ConfigAwait()) { responseFilter?.Invoke((HttpWebResponse)webRes); using (var stream = webRes.GetResponseStream()) { - return await stream.ReadToEndAsync(); + return await stream.ReadToEndAsync().ConfigAwait(); } } } @@ -720,7 +721,7 @@ public static async Task SendBytesToUrlAsync(this string url, string met } } - var webRes = await webReq.GetResponseAsync(); + var webRes = await webReq.GetResponseAsync().ConfigAwait(); responseFilter?.Invoke((HttpWebResponse)webRes); using (var stream = webRes.GetResponseStream()) @@ -837,13 +838,11 @@ public static async Task SendStreamToUrlAsync(this string url, string me if (requestBody != null) { - using (var req = PclExport.Instance.GetRequestStream(webReq)) - { - await requestBody.CopyToAsync(req); - } + using var req = PclExport.Instance.GetRequestStream(webReq); + await requestBody.CopyToAsync(req).ConfigAwait(); } - var webRes = await webReq.GetResponseAsync(); + var webRes = await webReq.GetResponseAsync().ConfigAwait(); responseFilter?.Invoke((HttpWebResponse)webRes); var stream = webRes.GetResponseStream(); diff --git a/src/ServiceStack.Text/JsonSerializer.cs b/src/ServiceStack.Text/JsonSerializer.cs index c5868241a..3c0813437 100644 --- a/src/ServiceStack.Text/JsonSerializer.cs +++ b/src/ServiceStack.Text/JsonSerializer.cs @@ -202,7 +202,7 @@ public static Task DeserializeFromStreamAsync(Type type, Stream stream) public static async Task DeserializeFromStreamAsync(Stream stream) { - var obj = await MemoryProvider.Instance.DeserializeAsync(stream, typeof(T), DeserializeFromSpan); + var obj = await MemoryProvider.Instance.DeserializeAsync(stream, typeof(T), DeserializeFromSpan).ConfigAwait(); return (T)obj; } diff --git a/src/ServiceStack.Text/NetCoreMemory.cs b/src/ServiceStack.Text/NetCoreMemory.cs index ea6593b13..84d51174a 100644 --- a/src/ServiceStack.Text/NetCoreMemory.cs +++ b/src/ServiceStack.Text/NetCoreMemory.cs @@ -131,7 +131,7 @@ public override async Task WriteAsync(Stream stream, ReadOnlyMemory value, if (stream is MemoryStream ms) ms.Write(value.Span); else - await stream.WriteAsync(value, token); + await stream.WriteAsync(value, token).ConfigAwait(); } public override object Deserialize(Stream stream, Type type, DeserializeStringSpanDelegate deserializer) @@ -162,7 +162,7 @@ public override async Task DeserializeAsync(Stream stream, Type type, De if (stream.CanSeek) stream.Position = 0; - ms = await stream.CopyToNewMemoryStreamAsync(); + ms = await stream.CopyToNewMemoryStreamAsync().ConfigAwait(); } return Deserialize(ms, fromPool, type, deserializer); diff --git a/src/ServiceStack.Text/PclExport.Net45.cs b/src/ServiceStack.Text/PclExport.Net45.cs index 04408bd1e..3a86c4830 100644 --- a/src/ServiceStack.Text/PclExport.Net45.cs +++ b/src/ServiceStack.Text/PclExport.Net45.cs @@ -156,8 +156,8 @@ public override void WriteLine(string format, params object[] args) public override async Task WriteAndFlushAsync(Stream stream, byte[] bytes) { - await stream.WriteAsync(bytes, 0, bytes.Length); - await stream.FlushAsync(); + await stream.WriteAsync(bytes, 0, bytes.Length).ConfigAwait(); + await stream.FlushAsync().ConfigAwait(); } public override void AddCompression(WebRequest webReq) diff --git a/src/ServiceStack.Text/StreamExtensions.cs b/src/ServiceStack.Text/StreamExtensions.cs index 7ffd2b70a..01d4123f8 100644 --- a/src/ServiceStack.Text/StreamExtensions.cs +++ b/src/ServiceStack.Text/StreamExtensions.cs @@ -477,14 +477,14 @@ public static async Task WriteToAsync(this MemoryStream stream, Stream output, E { try { - await output.WriteAsync(stream.GetBuffer(), 0, (int) stream.Length, token); + await output.WriteAsync(stream.GetBuffer(), 0, (int) stream.Length, token).ConfigAwait(); } catch (UnauthorizedAccessException) { Tracer.Instance.WriteWarning("MemoryStream in WriteToAsync() wasn't created with a publiclyVisible:true byte[] bufffer, falling back to slow impl"); var bytes = stream.ToArray(); - await output.WriteAsync(bytes, 0, bytes.Length, token); + await output.WriteAsync(bytes, 0, bytes.Length, token).ConfigAwait(); } } @@ -511,7 +511,7 @@ public static MemoryStream CopyToNewMemoryStream(this Stream stream) public static async Task CopyToNewMemoryStreamAsync(this Stream stream) { var ms = MemoryStreamFactory.GetStream(); - await stream.CopyToAsync(ms); + await stream.CopyToAsync(ms).ConfigAwait(); ms.Position = 0; return ms; } diff --git a/src/ServiceStack.Text/TypeSerializer.cs b/src/ServiceStack.Text/TypeSerializer.cs index 3f2b0c6ab..586e52f2a 100644 --- a/src/ServiceStack.Text/TypeSerializer.cs +++ b/src/ServiceStack.Text/TypeSerializer.cs @@ -226,7 +226,7 @@ public static Task DeserializeFromStreamAsync(Type type, Stream stream) public static async Task DeserializeFromStreamAsync(Stream stream) { - var obj = await MemoryProvider.Instance.DeserializeAsync(stream, typeof(T), DeserializeFromSpan); + var obj = await MemoryProvider.Instance.DeserializeAsync(stream, typeof(T), DeserializeFromSpan).ConfigAwait(); return (T)obj; } From ab1c9dcc586b93271ecf27a3f8656e39c3344f6b Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 12 Aug 2020 03:43:13 +0800 Subject: [PATCH 216/372] Add Bcl.Async/ValueTask to NETStd --- src/ServiceStack.Text/Env.cs | 3 +++ src/ServiceStack.Text/ServiceStack.Text.Core.csproj | 1 + src/ServiceStack.Text/ServiceStack.Text.csproj | 1 + 3 files changed, 5 insertions(+) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 131144534..6bcfbd333 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -311,6 +311,7 @@ public static ConfiguredTaskAwaitable ConfigAwait(this Task task) => public static ConfiguredTaskAwaitable ConfigAwait(this Task task) => task.ConfigureAwait(ContinueOnCapturedContext); +#if NETSTANDARD || NETCORE2_1 [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ConfiguredValueTaskAwaitable ConfigAwait(this ValueTask task) => task.ConfigureAwait(ContinueOnCapturedContext); @@ -318,5 +319,7 @@ public static ConfiguredValueTaskAwaitable ConfigAwait(this ValueTask task) => [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ConfiguredValueTaskAwaitable ConfigAwait(this ValueTask task) => task.ConfigureAwait(ContinueOnCapturedContext); +#endif + } } \ No newline at end of file diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index f61922411..ef334cdfc 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -21,6 +21,7 @@ + diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index f68c2eaf6..fcdff3308 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -23,6 +23,7 @@ + From 75d5652b818ea6fd55723b6f91fff07fe452f0d5 Mon Sep 17 00:00:00 2001 From: Bond-009 Date: Thu, 20 Aug 2020 05:16:39 +0200 Subject: [PATCH 217/372] Use TryGetBuffer instead of GetBuffer and catching exceptions (#530) * Use TryGetBuffer instead of GetBuffer and catching exceptions Should be way faster * Address comments --- src/ServiceStack.Text/StreamExtensions.cs | 137 +++++++++++++++------- 1 file changed, 93 insertions(+), 44 deletions(-) diff --git a/src/ServiceStack.Text/StreamExtensions.cs b/src/ServiceStack.Text/StreamExtensions.cs index 01d4123f8..65be25c4c 100644 --- a/src/ServiceStack.Text/StreamExtensions.cs +++ b/src/ServiceStack.Text/StreamExtensions.cs @@ -119,7 +119,7 @@ public static byte[] ReadFully(this Stream input, byte[] buffer) /// /// Reads the given stream up to the end, returning the MemoryStream Buffer as ReadOnlyMemory<byte>. /// - public static ReadOnlyMemory ReadFullyAsMemory(this Stream input) => + public static ReadOnlyMemory ReadFullyAsMemory(this Stream input) => ReadFullyAsMemory(input, DefaultBufferSize); /// @@ -176,8 +176,8 @@ public static long CopyTo(this Stream input, Stream output, int bufferSize) } /// - /// Copies all the data from one stream into another, using the given - /// buffer for transferring data. Note that the current contents of + /// Copies all the data from one stream into another, using the given + /// buffer for transferring data. Note that the current contents of /// the buffer is ignored, so the buffer needn't be cleared beforehand. /// public static long CopyTo(this Stream input, Stream output, byte[] buffer) @@ -313,18 +313,18 @@ public static byte[] Combine(this byte[] bytes, params byte[][] withBytes) public static int AsyncBufferSize = 81920; // CopyToAsync() default value [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Task WriteAsync(this Stream stream, ReadOnlyMemory value, CancellationToken token = default) => + public static Task WriteAsync(this Stream stream, ReadOnlyMemory value, CancellationToken token = default) => MemoryProvider.Instance.WriteAsync(stream, value, token); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Task WriteAsync(this Stream stream, byte[] bytes, CancellationToken token = default) => + public static Task WriteAsync(this Stream stream, byte[] bytes, CancellationToken token = default) => MemoryProvider.Instance.WriteAsync(stream, bytes, token); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Task CopyToAsync(this Stream input, Stream output, CancellationToken token = default) => input.CopyToAsync(output, AsyncBufferSize, token); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Task WriteAsync(this Stream stream, string text, CancellationToken token = default) => + public static Task WriteAsync(this Stream stream, string text, CancellationToken token = default) => MemoryProvider.Instance.WriteAsync(stream, text.AsSpan(), token); public static string ToMd5Hash(this Stream stream) @@ -361,78 +361,118 @@ public static MemoryStream InMemoryStream(this byte[] bytes) public static string ReadToEnd(this MemoryStream ms, Encoding encoding) { ms.Position = 0; + +#if NETSTANDARD || NETCORE2_1 + if (ms.TryGetBuffer(out var buffer)) + { + return encoding.GetString(buffer.Array, buffer.Offset, buffer.Count); + } +#else try { - var ret = encoding.GetString(ms.GetBuffer(), 0, (int) ms.Length); - return ret; + return encoding.GetString(ms.GetBuffer(), 0, (int) ms.Length); } catch (UnauthorizedAccessException) { - Tracer.Instance.WriteWarning("MemoryStream wasn't created with a publiclyVisible:true byte[] bufffer, falling back to slow impl"); - - using (var reader = new StreamReader(ms, encoding, true, DefaultBufferSize, leaveOpen:true)) - { - return reader.ReadToEnd(); - } + } +#endif + + Tracer.Instance.WriteWarning("MemoryStream wasn't created with a publiclyVisible:true byte[] buffer, falling back to slow impl"); + + using (var reader = new StreamReader(ms, encoding, true, DefaultBufferSize, leaveOpen: true)) + { + return reader.ReadToEnd(); } } public static ReadOnlyMemory GetBufferAsMemory(this MemoryStream ms) { +#if NETSTANDARD || NETCORE2_1 + if (ms.TryGetBuffer(out var buffer)) + { + return new ReadOnlyMemory(buffer.Array, buffer.Offset, buffer.Count); + } +#else try { - return new ReadOnlyMemory(ms.GetBuffer(), 0, (int)ms.Length); + return new ReadOnlyMemory(ms.GetBuffer(), 0, (int) ms.Length); } catch (UnauthorizedAccessException) { - Tracer.Instance.WriteWarning("MemoryStream in GetBufferAsSpan() wasn't created with a publiclyVisible:true byte[] bufffer, falling back to slow impl"); - return new ReadOnlyMemory(ms.ToArray()); } +#endif + + Tracer.Instance.WriteWarning("MemoryStream in GetBufferAsSpan() wasn't created with a publiclyVisible:true byte[] buffer, falling back to slow impl"); + return new ReadOnlyMemory(ms.ToArray()); } public static ReadOnlySpan GetBufferAsSpan(this MemoryStream ms) { +#if NETSTANDARD || NETCORE2_1 + if (ms.TryGetBuffer(out var buffer)) + { + return new ReadOnlySpan(buffer.Array, buffer.Offset, buffer.Count); + } +#else try { - return new ReadOnlySpan(ms.GetBuffer(), 0, (int)ms.Length); + return new ReadOnlySpan(ms.GetBuffer(), 0, (int) ms.Length); } catch (UnauthorizedAccessException) { - Tracer.Instance.WriteWarning("MemoryStream in GetBufferAsSpan() wasn't created with a publiclyVisible:true byte[] bufffer, falling back to slow impl"); - return new ReadOnlySpan(ms.ToArray()); } +#endif + + Tracer.Instance.WriteWarning("MemoryStream in GetBufferAsSpan() wasn't created with a publiclyVisible:true byte[] buffer, falling back to slow impl"); + return new ReadOnlySpan(ms.ToArray()); } public static byte[] GetBufferAsBytes(this MemoryStream ms) { +#if NETSTANDARD || NETCORE2_1 + if (ms.TryGetBuffer(out var buffer)) + { + return buffer.Array; + } +#else try { return ms.GetBuffer(); } catch (UnauthorizedAccessException) { - Tracer.Instance.WriteWarning("MemoryStream in GetBufferAsBytes() wasn't created with a publiclyVisible:true byte[] bufffer, falling back to slow impl"); - return ms.ToArray(); } +#endif + + Tracer.Instance.WriteWarning("MemoryStream in GetBufferAsBytes() wasn't created with a publiclyVisible:true byte[] buffer, falling back to slow impl"); + return ms.ToArray(); } public static Task ReadToEndAsync(this MemoryStream ms) => ReadToEndAsync(ms, JsConfig.UTF8Encoding); public static Task ReadToEndAsync(this MemoryStream ms, Encoding encoding) { ms.Position = 0; + +#if NETSTANDARD || NETCORE2_1 + if (ms.TryGetBuffer(out var buffer)) + { + return encoding.GetString(buffer.Array, buffer.Offset, buffer.Count).InTask(); + } +#else try { - var ret = encoding.GetString(ms.GetBuffer(), 0, (int) ms.Length); - return ret.InTask(); + return encoding.GetString(ms.GetBuffer(), 0, (int) ms.Length).InTask(); } catch (UnauthorizedAccessException) { - Tracer.Instance.WriteWarning("MemoryStream in ReadToEndAsync() wasn't created with a publiclyVisible:true byte[] bufffer, falling back to slow impl"); - - using (var reader = new StreamReader(ms, encoding, true, DefaultBufferSize, leaveOpen:true)) - { - return reader.ReadToEndAsync(); - } + } +#endif + + Tracer.Instance.WriteWarning("MemoryStream in ReadToEndAsync() wasn't created with a publiclyVisible:true byte[] buffer, falling back to slow impl"); + + using (var reader = new StreamReader(ms, encoding, true, DefaultBufferSize, leaveOpen: true)) + { + return reader.ReadToEndAsync(); } } @@ -446,7 +486,7 @@ public static string ReadToEnd(this Stream stream, Encoding encoding) { stream.Position = 0; } - + using (var reader = new StreamReader(stream, encoding, true, DefaultBufferSize, leaveOpen:true)) { return reader.ReadToEnd(); @@ -463,40 +503,49 @@ public static Task ReadToEndAsync(this Stream stream, Encoding encoding) { stream.Position = 0; } - + using (var reader = new StreamReader(stream, encoding, true, DefaultBufferSize, leaveOpen:true)) { return reader.ReadToEndAsync(); } } - public static Task WriteToAsync(this MemoryStream stream, Stream output, CancellationToken token=default(CancellationToken)) => + public static Task WriteToAsync(this MemoryStream stream, Stream output, CancellationToken token=default(CancellationToken)) => WriteToAsync(stream, output, JsConfig.UTF8Encoding, token); - + public static async Task WriteToAsync(this MemoryStream stream, Stream output, Encoding encoding, CancellationToken token) { +#if NETSTANDARD || NETCORE2_1 + if (stream.TryGetBuffer(out var buffer)) + { + await output.WriteAsync(buffer.Array, buffer.Offset, buffer.Count, token).ConfigAwait(); + return; + } +#else try { await output.WriteAsync(stream.GetBuffer(), 0, (int) stream.Length, token).ConfigAwait(); + return; } catch (UnauthorizedAccessException) { - Tracer.Instance.WriteWarning("MemoryStream in WriteToAsync() wasn't created with a publiclyVisible:true byte[] bufffer, falling back to slow impl"); - - var bytes = stream.ToArray(); - await output.WriteAsync(bytes, 0, bytes.Length, token).ConfigAwait(); } +#endif + Tracer.Instance.WriteWarning("MemoryStream in WriteToAsync() wasn't created with a publiclyVisible:true byte[] bufffer, falling back to slow impl"); + + var bytes = stream.ToArray(); + await output.WriteAsync(bytes, 0, bytes.Length, token).ConfigAwait(); } - - public static Task WriteToAsync(this Stream stream, Stream output, CancellationToken token=default(CancellationToken)) => + + public static Task WriteToAsync(this Stream stream, Stream output, CancellationToken token=default(CancellationToken)) => WriteToAsync(stream, output, JsConfig.UTF8Encoding, token); - - + + public static Task WriteToAsync(this Stream stream, Stream output, Encoding encoding, CancellationToken token) { if (stream is MemoryStream ms) return ms.WriteToAsync(output, encoding, token); - + return stream.CopyToAsync(output, token); } @@ -516,4 +565,4 @@ public static async Task CopyToNewMemoryStreamAsync(this Stream st return ms; } } -} \ No newline at end of file +} From e0ea39e23915b84b8e2ecc4d4e3a98e4166c58d4 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 20 Aug 2020 12:44:58 +0800 Subject: [PATCH 218/372] Use Task.FromResult --- src/ServiceStack.Text/TaskUtils.cs | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/src/ServiceStack.Text/TaskUtils.cs b/src/ServiceStack.Text/TaskUtils.cs index e67fd8093..cf5265f22 100644 --- a/src/ServiceStack.Text/TaskUtils.cs +++ b/src/ServiceStack.Text/TaskUtils.cs @@ -12,20 +12,10 @@ namespace ServiceStack public static class TaskUtils { [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Task FromResult(T result) - { - var taskSource = new TaskCompletionSource(); - taskSource.SetResult(result); - return taskSource.Task; - } + public static Task FromResult(T result) => Task.FromResult(result); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Task InTask(this T result) - { - var taskSource = new TaskCompletionSource(); - taskSource.SetResult(result); - return taskSource.Task; - } + public static Task InTask(this T result) => Task.FromResult(result); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Task InTask(this Exception ex) @@ -36,15 +26,9 @@ public static Task InTask(this Exception ex) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsSuccess(this Task task) - { - return !task.IsFaulted && task.IsCompleted; - } + public static bool IsSuccess(this Task task) => !task.IsFaulted && task.IsCompleted; - public static Task Cast(this Task task) where To : From - { - return task.Then(x => (To)x); - } + public static Task Cast(this Task task) where To : From => task.Then(x => (To)x); public static TaskScheduler SafeTaskScheduler() { From 6f46ce06605d0fb7b5937fc7f88984f7fbf8663b Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 9 Sep 2020 23:53:46 +0800 Subject: [PATCH 219/372] Tidy + add some missing async overloads --- src/ServiceStack.Text/HttpUtils.cs | 102 +++++++++++----------- src/ServiceStack.Text/PclExport.cs | 5 ++ src/ServiceStack.Text/StreamExtensions.cs | 50 ++++------- 3 files changed, 75 insertions(+), 82 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index a4314f71b..78c12b442 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -549,23 +549,19 @@ public static string SendStringToUrl(this string url, string method = null, if (requestBody != null) { - using (var reqStream = PclExport.Instance.GetRequestStream(webReq)) - using (var writer = new StreamWriter(reqStream, UseEncoding)) - { - writer.Write(requestBody); - } + using var reqStream = PclExport.Instance.GetRequestStream(webReq); + using var writer = new StreamWriter(reqStream, UseEncoding); + writer.Write(requestBody); } else if (method != null && HasRequestBody(method)) { webReq.ContentLength = 0; } - using (var webRes = PclExport.Instance.GetResponse(webReq)) - using (var stream = webRes.GetResponseStream()) - { - responseFilter?.Invoke((HttpWebResponse)webRes); - return stream.ReadToEnd(UseEncoding); - } + using var webRes = webReq.GetResponse(); + using var stream = webRes.GetResponseStream(); + responseFilter?.Invoke((HttpWebResponse)webRes); + return stream.ReadToEnd(UseEncoding); } public static async Task SendStringToUrlAsync(this string url, string method = null, string requestBody = null, @@ -591,21 +587,15 @@ public static async Task SendStringToUrlAsync(this string url, string me if (requestBody != null) { - using (var reqStream = PclExport.Instance.GetRequestStream(webReq)) - using (var writer = new StreamWriter(reqStream, UseEncoding)) - { - writer.Write(requestBody); - } + using var reqStream = PclExport.Instance.GetRequestStream(webReq); + using var writer = new StreamWriter(reqStream, UseEncoding); + await writer.WriteAsync(requestBody); } - using (var webRes = await webReq.GetResponseAsync().ConfigAwait()) - { - responseFilter?.Invoke((HttpWebResponse)webRes); - using (var stream = webRes.GetResponseStream()) - { - return await stream.ReadToEndAsync().ConfigAwait(); - } - } + using var webRes = await webReq.GetResponseAsync().ConfigAwait(); + responseFilter?.Invoke((HttpWebResponse)webRes); + using var stream = webRes.GetResponseStream(); + return await stream.ReadToEndAsync().ConfigAwait(); } public static byte[] GetBytesFromUrl(this string url, string accept = "*/*", @@ -950,22 +940,24 @@ public static string GetResponseBody(this Exception ex) public static string ReadToEnd(this WebResponse webRes) { - using (var stream = webRes.GetResponseStream()) - { - return stream.ReadToEnd(UseEncoding); - } + using var stream = webRes.GetResponseStream(); + return stream.ReadToEnd(UseEncoding); + } + + public static Task ReadToEndAsync(this WebResponse webRes) + { + using var stream = webRes.GetResponseStream(); + return stream.ReadToEndAsync(UseEncoding); } public static IEnumerable ReadLines(this WebResponse webRes) { - using (var stream = webRes.GetResponseStream()) - using (var reader = new StreamReader(stream, UseEncoding, true, 1024, leaveOpen:true)) + using var stream = webRes.GetResponseStream(); + using var reader = new StreamReader(stream, UseEncoding, true, 1024, leaveOpen:true); + string line; + while ((line = reader.ReadLine()) != null) { - string line; - while ((line = reader.ReadLine()) != null) - { - yield return line; - } + yield return line; } } @@ -974,11 +966,24 @@ public static HttpWebResponse GetErrorResponse(this string url) try { var webReq = WebRequest.Create(url); - using (var webRes = PclExport.Instance.GetResponse(webReq)) - { - webRes.ReadToEnd(); - return null; - } + using var webRes = PclExport.Instance.GetResponse(webReq); + webRes.ReadToEnd(); + return null; + } + catch (WebException webEx) + { + return (HttpWebResponse)webEx.Response; + } + } + + public static async Task GetErrorResponseAsync(this string url) + { + try + { + var webReq = WebRequest.Create(url); + using var webRes = await webReq.GetResponseAsync(); + await webRes.ReadToEndAsync(); + return null; } catch (WebException webEx) { @@ -1091,16 +1096,11 @@ public static void UploadFile(this WebRequest webRequest, Stream fileStream, str return; } - using (var outputStream = PclExport.Instance.GetRequestStream(httpReq)) - { - outputStream.Write(headerBytes, 0, headerBytes.Length); - - fileStream.CopyTo(outputStream, 4096); - - outputStream.Write(boundaryBytes, 0, boundaryBytes.Length); - - PclExport.Instance.CloseStream(outputStream); - } + using var outputStream = PclExport.Instance.GetRequestStream(httpReq); + outputStream.Write(headerBytes, 0, headerBytes.Length); + fileStream.CopyTo(outputStream, 4096); + outputStream.Write(boundaryBytes, 0, boundaryBytes.Length); + PclExport.Instance.CloseStream(outputStream); } public static void UploadFile(this WebRequest webRequest, Stream fileStream, string fileName) @@ -1269,7 +1269,7 @@ public static string GetExtension(string mimeType) throw new NotSupportedException("Unknown mimeType: " + mimeType); } - //lowercases and trims left part of content-type prior ';' + //Lower cases and trims left part of content-type prior ';' public static string GetRealContentType(string contentType) { if (contentType == null) diff --git a/src/ServiceStack.Text/PclExport.cs b/src/ServiceStack.Text/PclExport.cs index de95d4021..1e86022d9 100644 --- a/src/ServiceStack.Text/PclExport.cs +++ b/src/ServiceStack.Text/PclExport.cs @@ -181,6 +181,11 @@ public virtual WebResponse GetResponse(WebRequest webRequest) } } + public virtual Task GetResponseAsync(WebRequest webRequest) + { + return webRequest.GetResponseAsync(); + } + public virtual bool IsDebugBuild(Assembly assembly) { return assembly.AllAttributes() diff --git a/src/ServiceStack.Text/StreamExtensions.cs b/src/ServiceStack.Text/StreamExtensions.cs index 65be25c4c..792d35002 100644 --- a/src/ServiceStack.Text/StreamExtensions.cs +++ b/src/ServiceStack.Text/StreamExtensions.cs @@ -43,13 +43,11 @@ public static IEnumerable ReadLines(this Stream stream) if (stream == null) throw new ArgumentNullException(nameof(stream)); - using (var reader = new StreamReader(stream)) + using var reader = new StreamReader(stream); + string line; + while ((line = reader.ReadLine()) != null) { - string line; - while ((line = reader.ReadLine()) != null) - { - yield return line; - } + yield return line; } } @@ -103,17 +101,15 @@ public static byte[] ReadFully(this Stream input, byte[] buffer) // We could do all our own work here, but using MemoryStream is easier // and likely to be just as efficient. - using (var tempStream = MemoryStreamFactory.GetStream()) + using var tempStream = MemoryStreamFactory.GetStream(); + CopyTo(input, tempStream, buffer); + // No need to copy the buffer if it's the right size + if (tempStream.Length == tempStream.GetBuffer().Length) { - CopyTo(input, tempStream, buffer); - // No need to copy the buffer if it's the right size - if (tempStream.Length == tempStream.GetBuffer().Length) - { - return tempStream.GetBuffer(); - } - // Okay, make a copy that's the right size - return tempStream.ToArray(); + return tempStream.GetBuffer(); } + // Okay, make a copy that's the right size + return tempStream.ToArray(); } /// @@ -379,10 +375,8 @@ public static string ReadToEnd(this MemoryStream ms, Encoding encoding) Tracer.Instance.WriteWarning("MemoryStream wasn't created with a publiclyVisible:true byte[] buffer, falling back to slow impl"); - using (var reader = new StreamReader(ms, encoding, true, DefaultBufferSize, leaveOpen: true)) - { - return reader.ReadToEnd(); - } + using var reader = new StreamReader(ms, encoding, true, DefaultBufferSize, leaveOpen: true); + return reader.ReadToEnd(); } public static ReadOnlyMemory GetBufferAsMemory(this MemoryStream ms) @@ -470,10 +464,8 @@ public static Task ReadToEndAsync(this MemoryStream ms, Encoding encodin Tracer.Instance.WriteWarning("MemoryStream in ReadToEndAsync() wasn't created with a publiclyVisible:true byte[] buffer, falling back to slow impl"); - using (var reader = new StreamReader(ms, encoding, true, DefaultBufferSize, leaveOpen: true)) - { - return reader.ReadToEndAsync(); - } + using var reader = new StreamReader(ms, encoding, true, DefaultBufferSize, leaveOpen: true); + return reader.ReadToEndAsync(); } public static string ReadToEnd(this Stream stream) => ReadToEnd(stream, JsConfig.UTF8Encoding); @@ -487,10 +479,8 @@ public static string ReadToEnd(this Stream stream, Encoding encoding) stream.Position = 0; } - using (var reader = new StreamReader(stream, encoding, true, DefaultBufferSize, leaveOpen:true)) - { - return reader.ReadToEnd(); - } + using var reader = new StreamReader(stream, encoding, true, DefaultBufferSize, leaveOpen:true); + return reader.ReadToEnd(); } public static Task ReadToEndAsync(this Stream stream) => ReadToEndAsync(stream, JsConfig.UTF8Encoding); @@ -504,10 +494,8 @@ public static Task ReadToEndAsync(this Stream stream, Encoding encoding) stream.Position = 0; } - using (var reader = new StreamReader(stream, encoding, true, DefaultBufferSize, leaveOpen:true)) - { - return reader.ReadToEndAsync(); - } + using var reader = new StreamReader(stream, encoding, true, DefaultBufferSize, leaveOpen:true); + return reader.ReadToEndAsync(); } public static Task WriteToAsync(this MemoryStream stream, Stream output, CancellationToken token=default(CancellationToken)) => From c8923be382764309c4d61a9adcf2f4725fd9d3b7 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 10 Sep 2020 00:15:34 +0800 Subject: [PATCH 220/372] Add GetResponseBodyAsync --- src/ServiceStack.Text/HttpUtils.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 78c12b442..a41be6dda 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -6,6 +6,7 @@ using System.IO; using System.Net; using System.Text; +using System.Threading; using System.Threading.Tasks; using ServiceStack.Text; @@ -935,7 +936,18 @@ public static string GetResponseBody(this Exception ex) return null; var errorResponse = (HttpWebResponse)webEx.Response; - return errorResponse.GetResponseStream().ReadToEnd(UseEncoding); + using var responseStream = errorResponse.GetResponseStream(); + return responseStream.ReadToEnd(UseEncoding); + } + + public static async Task GetResponseBodyAsync(this Exception ex, CancellationToken token=default) + { + if (!(ex is WebException webEx) || webEx.Response == null || webEx.Status != WebExceptionStatus.ProtocolError) + return null; + + var errorResponse = (HttpWebResponse)webEx.Response; + using var responseStream = errorResponse.GetResponseStream(); + return await responseStream.ReadToEndAsync(UseEncoding).ConfigAwait(); } public static string ReadToEnd(this WebResponse webRes) From c40ecdeac912a3492b09efc198a60571f2bbb01e Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 12 Sep 2020 22:30:14 +0800 Subject: [PATCH 221/372] Add PopulateInstance --- src/ServiceStack.Text/AutoMappingUtils.cs | 13 ----------- src/ServiceStack.Text/PlatformExtensions.cs | 24 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/ServiceStack.Text/AutoMappingUtils.cs b/src/ServiceStack.Text/AutoMappingUtils.cs index f707e8fd7..15e15bd2b 100644 --- a/src/ServiceStack.Text/AutoMappingUtils.cs +++ b/src/ServiceStack.Text/AutoMappingUtils.cs @@ -527,19 +527,6 @@ public static To PopulateWith(this To to, From from) return to; } - [Obsolete("Use PopulateWithNonDefaultValues")] - public static object PopulateInstance(this object to, object from) - { - if (to == null || from == null) - return null; - - var assignmentDefinition = GetAssignmentDefinition(to.GetType(), from.GetType()); - - assignmentDefinition.PopulateWithNonDefaultValues(to, from); - - return to; - } - public static To PopulateWithNonDefaultValues(this To to, From from) { if (Equals(to, default(To)) || Equals(from, default(From))) return default(To); diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index 4f51393bf..b6f6cb401 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -973,6 +973,30 @@ private static void PopulateInstanceInternal(IEnumerable> values, object instance) + { + if (values == null || instance == null) + return; + + PopulateInstanceInternal(values, instance, instance.GetType()); + } + + private static void PopulateInstanceInternal(IEnumerable> values, object to, Type type) + { + if (!toObjectMapCache.TryGetValue(type, out var def)) + toObjectMapCache[type] = def = CreateObjectDictionaryDefinition(type); + + foreach (var entry in values) + { + if (!def.FieldsMap.TryGetValue(entry.Key, out var fieldDef) && + !def.FieldsMap.TryGetValue(entry.Key.ToPascalCase(), out fieldDef) + || entry.Value == null) + continue; + + fieldDef.SetValue(to, entry.Value); + } + } + public static T FromObjectDictionary(this IEnumerable> values) { return (T)values.FromObjectDictionary(typeof(T)); From 5e274ee3a5263dfb06c98ff491c87316a5644826 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 25 Sep 2020 21:29:02 +0800 Subject: [PATCH 222/372] Do not alllow serializing Task's --- src/ServiceStack.Text/Common/JsWriter.cs | 6 ++++++ tests/ServiceStack.Text.Tests/SpecialTypesTests.cs | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/src/ServiceStack.Text/Common/JsWriter.cs b/src/ServiceStack.Text/Common/JsWriter.cs index 9184d955e..8313c3e2f 100644 --- a/src/ServiceStack.Text/Common/JsWriter.cs +++ b/src/ServiceStack.Text/Common/JsWriter.cs @@ -340,9 +340,15 @@ public void WriteValue(TextWriter writer, object value) var valueWriter = (IValueWriter)value; valueWriter.WriteTo(Serializer, writer); } + + void ThrowTaskNotSupported(TextWriter writer, object value) => + throw new NotSupportedException("Serializing Task's is not supported. Did you forget to await it?"); private WriteObjectDelegate GetCoreWriteFn() { + if (typeof(T).IsInstanceOf(typeof(System.Threading.Tasks.Task))) + return ThrowTaskNotSupported; + if (typeof(T).IsValueType && !JsConfig.TreatAsRefType(typeof(T)) || JsConfig.HasSerializeFn) { return JsConfig.HasSerializeFn diff --git a/tests/ServiceStack.Text.Tests/SpecialTypesTests.cs b/tests/ServiceStack.Text.Tests/SpecialTypesTests.cs index 0a7a06a67..06c083d4b 100644 --- a/tests/ServiceStack.Text.Tests/SpecialTypesTests.cs +++ b/tests/ServiceStack.Text.Tests/SpecialTypesTests.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.IO; +using System.Threading.Tasks; using NUnit.Framework; using ServiceStack.Web; @@ -122,5 +123,13 @@ public void Does_not_serialize_Streams() var dto = new RawRequest { Id = 1, RequestStream = new MemoryStream() }; Serialize(dto, includeXml: false); } + + [Test] + public void Serializing_Tasks_throws_NotSupportedException() + { + Assert.Throws(() => Task.FromResult(1).ToJson()); + Assert.Throws(() => Task.FromResult(1).ToJsv()); + } + } } \ No newline at end of file From 45305969e170d9ae1d1695898778dc705eaf0901 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 7 Oct 2020 22:32:55 +0800 Subject: [PATCH 223/372] Handle null map --- src/ServiceStack.Text/JsonObject.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/ServiceStack.Text/JsonObject.cs b/src/ServiceStack.Text/JsonObject.cs index 6ff57e813..5333f39ba 100644 --- a/src/ServiceStack.Text/JsonObject.cs +++ b/src/ServiceStack.Text/JsonObject.cs @@ -17,13 +17,17 @@ public static T JsonTo(this Dictionary map, string key) /// /// Get JSON string value converted to T /// - public static T Get(this Dictionary map, string key, T defaultValue = default(T)) + public static T Get(this Dictionary map, string key, T defaultValue = default) { + if (map == null) + return default; return map.TryGetValue(key, out var strVal) ? JsonSerializer.DeserializeFromString(strVal) : defaultValue; } public static T[] GetArray(this Dictionary map, string key) { + if (map == null) + return TypeConstants.EmptyArray; return map.TryGetValue(key, out var value) ? (map is JsonObject obj ? value.FromJson() : value.FromJsv()) : TypeConstants.EmptyArray; @@ -34,6 +38,8 @@ public static T[] GetArray(this Dictionary map, string key) /// public static string Get(this Dictionary map, string key) { + if (map == null) + return null; return map.TryGetValue(key, out var strVal) ? JsonTypeSerializer.Instance.UnescapeString(strVal) : null; @@ -56,11 +62,11 @@ public static List ConvertAll(this JsonArrayObjects jsonArrayObjects, Func return results; } - public static T ConvertTo(this JsonObject jsonObject, Func converFn) + public static T ConvertTo(this JsonObject jsonObject, Func convertFn) { return jsonObject == null - ? default(T) - : converFn(jsonObject); + ? default + : convertFn(jsonObject); } public static Dictionary ToDictionary(this JsonObject jsonObject) From 137eb1ca27f92aa85230c3762e46ab2007487a8c Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 13 Oct 2020 01:45:37 +0800 Subject: [PATCH 224/372] Add fast ToHex ext method --- src/ServiceStack.Text/StringExtensions.cs | 25 +++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 6db4b84c4..aef13ff7a 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -1242,6 +1242,31 @@ public static T FromXml(this string json) } #endif + public static string ToHex(this byte[] hashBytes, bool upper=false) + { + var len = hashBytes.Length * 2; + var chars = new char[len]; + var i = 0; + var index = 0; + for (i = 0; i < len; i += 2) + { + var b = hashBytes[index++]; + chars[i] = GetHexValue(b / 16, upper); + chars[i + 1] = GetHexValue(b % 16, upper); + } + return new string(chars); + } + + private static char GetHexValue(int i, bool upper) + { + if (i < 0 || i > 15) + throw new ArgumentOutOfRangeException(nameof(i), "must be between 0 and 15"); + + return i < 10 + ? (char) (i + '0') + : (char) (i - 10 + (upper ? 'A' : 'a')); + } + } } From eac56b53e0da404b17a6f09bc6da008c1816e6d3 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 20 Oct 2020 00:28:39 +0800 Subject: [PATCH 225/372] Add ReadFullyAsync/ReadFullyAsMemoryAsync/CopyToAsync --- src/ServiceStack.Text/StreamExtensions.cs | 123 ++++++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/src/ServiceStack.Text/StreamExtensions.cs b/src/ServiceStack.Text/StreamExtensions.cs index 792d35002..a76984108 100644 --- a/src/ServiceStack.Text/StreamExtensions.cs +++ b/src/ServiceStack.Text/StreamExtensions.cs @@ -112,6 +112,62 @@ public static byte[] ReadFully(this Stream input, byte[] buffer) return tempStream.ToArray(); } + /// + /// Reads the given stream up to the end, returning the data as a byte array. + /// + public static Task ReadFullyAsync(this Stream input, CancellationToken token=default) => + ReadFullyAsync(input, DefaultBufferSize, token); + + /// + /// Reads the given stream up to the end, returning the data as a byte + /// array, using the given buffer size. + /// + public static async Task ReadFullyAsync(this Stream input, int bufferSize, CancellationToken token=default) + { + if (bufferSize < 1) + throw new ArgumentOutOfRangeException(nameof(bufferSize)); + + byte[] buffer = BufferPool.GetBuffer(bufferSize); + try + { + return await ReadFullyAsync(input, buffer, token); + } + finally + { + BufferPool.ReleaseBufferToPool(ref buffer); + } + } + + /// + /// Reads the given stream up to the end, returning the data as a byte + /// array, using the given buffer for transferring data. Note that the + /// current contents of the buffer is ignored, so the buffer needn't + /// be cleared beforehand. + /// + public static async Task ReadFullyAsync(this Stream input, byte[] buffer, CancellationToken token=default) + { + if (buffer == null) + throw new ArgumentNullException(nameof(buffer)); + + if (input == null) + throw new ArgumentNullException(nameof(input)); + + if (buffer.Length == 0) + throw new ArgumentException("Buffer has length of 0"); + + // We could do all our own work here, but using MemoryStream is easier + // and likely to be just as efficient. + using var tempStream = MemoryStreamFactory.GetStream(); + await CopyToAsync(input, tempStream, buffer, token); + // No need to copy the buffer if it's the right size + if (tempStream.Length == tempStream.GetBuffer().Length) + { + return tempStream.GetBuffer(); + } + // Okay, make a copy that's the right size + return tempStream.ToArray(); + } + /// /// Reads the given stream up to the end, returning the MemoryStream Buffer as ReadOnlyMemory<byte>. /// @@ -150,6 +206,44 @@ public static ReadOnlyMemory ReadFullyAsMemory(this Stream input, byte[] b return ms.GetBufferAsMemory(); } + /// + /// Reads the given stream up to the end, returning the MemoryStream Buffer as ReadOnlyMemory<byte>. + /// + public static Task> ReadFullyAsMemoryAsync(this Stream input, CancellationToken token=default) => + ReadFullyAsMemoryAsync(input, DefaultBufferSize, token); + + /// + /// Reads the given stream up to the end, returning the MemoryStream Buffer as ReadOnlyMemory<byte>. + /// + public static async Task> ReadFullyAsMemoryAsync(this Stream input, int bufferSize, CancellationToken token=default) + { + byte[] buffer = BufferPool.GetBuffer(bufferSize); + try + { + return await ReadFullyAsMemoryAsync(input, buffer, token); + } + finally + { + BufferPool.ReleaseBufferToPool(ref buffer); + } + } + + public static async Task> ReadFullyAsMemoryAsync(this Stream input, byte[] buffer, CancellationToken token=default) + { + if (buffer == null) + throw new ArgumentNullException(nameof(buffer)); + + if (input == null) + throw new ArgumentNullException(nameof(input)); + + if (buffer.Length == 0) + throw new ArgumentException("Buffer has length of 0"); + + var ms = new MemoryStream(); + await CopyToAsync(input, ms, buffer, token); + return ms.GetBufferAsMemory(); + } + /// /// Copies all the data from one stream into another. @@ -200,6 +294,35 @@ public static long CopyTo(this Stream input, Stream output, byte[] buffer) return total; } + /// + /// Copies all the data from one stream into another, using the given + /// buffer for transferring data. Note that the current contents of + /// the buffer is ignored, so the buffer needn't be cleared beforehand. + /// + public static async Task CopyToAsync(this Stream input, Stream output, byte[] buffer, CancellationToken token=default) + { + if (buffer == null) + throw new ArgumentNullException(nameof(buffer)); + + if (input == null) + throw new ArgumentNullException(nameof(input)); + + if (output == null) + throw new ArgumentNullException(nameof(output)); + + if (buffer.Length == 0) + throw new ArgumentException("Buffer has length of 0"); + + long total = 0; + int read; + while ((read = await input.ReadAsync(buffer, 0, buffer.Length, token)) > 0) + { + await output.WriteAsync(buffer, 0, read, token); + total += read; + } + return total; + } + /// /// Reads exactly the given number of bytes from the specified stream. /// If the end of the stream is reached before the specified amount From 4708869691e85b80e29d8ac0c99eac1345ca3883 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 22 Oct 2020 16:43:46 +0800 Subject: [PATCH 226/372] Resolve scoped TypeAttr --- .../Common/DeserializeTypeRefJson.cs | 3 +- src/ServiceStack.Text/JsConfig.cs | 4 --- src/ServiceStack.Text/JsConfigScope.cs | 27 +++++++++++----- src/ServiceStack.Text/TypeConfig.cs | 3 +- .../RuntimeSerializationTests.cs | 31 +++++++++++++++++++ 5 files changed, 53 insertions(+), 15 deletions(-) diff --git a/src/ServiceStack.Text/Common/DeserializeTypeRefJson.cs b/src/ServiceStack.Text/Common/DeserializeTypeRefJson.cs index 2e63aa68a..bd13ffa51 100644 --- a/src/ServiceStack.Text/Common/DeserializeTypeRefJson.cs +++ b/src/ServiceStack.Text/Common/DeserializeTypeRefJson.cs @@ -8,8 +8,6 @@ internal static class DeserializeTypeRefJson { private static readonly JsonTypeSerializer Serializer = (JsonTypeSerializer)JsonTypeSerializer.Instance; - static readonly ReadOnlyMemory typeAttr = JsWriter.TypeAttr.AsMemory(); - internal static object StringToType(ReadOnlySpan strType, TypeConfig typeConfig, EmptyCtorDelegate ctorFn, @@ -34,6 +32,7 @@ internal static object StringToType(ReadOnlySpan strType, return ctorFn(); var config = JsConfig.GetConfig(); + var typeAttr = config.TypeAttrMemory; object instance = null; var lenient = config.PropertyConvention == PropertyConvention.Lenient; diff --git a/src/ServiceStack.Text/JsConfig.cs b/src/ServiceStack.Text/JsConfig.cs index bad0e495c..3e8221307 100644 --- a/src/ServiceStack.Text/JsConfig.cs +++ b/src/ServiceStack.Text/JsConfig.cs @@ -406,21 +406,17 @@ public static string TypeAttr { var config = Config.AssertNotInit(); config.TypeAttr = value; - config.JsonTypeAttrInObject = JsonTypeSerializer.GetTypeAttrInObject(value); - config.JsvTypeAttrInObject = JsvTypeSerializer.GetTypeAttrInObject(value); } } internal static string JsonTypeAttrInObject { get => JsConfigScope.Current != null ? JsConfigScope.Current.JsonTypeAttrInObject : Config.Instance.JsonTypeAttrInObject; - set => Config.AssertNotInit().JsonTypeAttrInObject = value; } internal static string JsvTypeAttrInObject { get => JsConfigScope.Current != null ? JsConfigScope.Current.JsvTypeAttrInObject : Config.Instance.JsvTypeAttrInObject; - set => Config.AssertNotInit().JsvTypeAttrInObject = value; } public static Func TypeWriter diff --git a/src/ServiceStack.Text/JsConfigScope.cs b/src/ServiceStack.Text/JsConfigScope.cs index e0eec2d22..25e21030b 100644 --- a/src/ServiceStack.Text/JsConfigScope.cs +++ b/src/ServiceStack.Text/JsConfigScope.cs @@ -120,10 +120,27 @@ private Config(Config config) public bool TreatEnumAsInteger { get; set; } public bool ExcludeTypeInfo { get; set; } public bool IncludeTypeInfo { get; set; } - public string TypeAttr { get; set; } + + private string typeAttr; + public string TypeAttr + { + get => typeAttr; + set + { + typeAttrSpan = null; + jsonTypeAttrInObject = null; + jsvTypeAttrInObject = null; + typeAttr = value; + } + } + ReadOnlyMemory? typeAttrSpan = null; + public ReadOnlyMemory TypeAttrMemory => typeAttrSpan ??= TypeAttr.AsMemory(); public string DateTimeFormat { get; set; } - internal string JsonTypeAttrInObject { get; set; } - internal string JsvTypeAttrInObject { get; set; } + private string jsonTypeAttrInObject; + internal string JsonTypeAttrInObject => jsonTypeAttrInObject ??= JsonTypeSerializer.GetTypeAttrInObject(TypeAttr); + private string jsvTypeAttrInObject; + internal string JsvTypeAttrInObject => jsvTypeAttrInObject ??= JsvTypeSerializer.GetTypeAttrInObject(TypeAttr); + public Func TypeWriter { get; set; } public Func TypeFinder { get; set; } public Func ParsePrimitiveFn { get; set; } @@ -180,8 +197,6 @@ public bool EmitLowercaseUnderscoreNames IncludeTypeInfo = false, TypeAttr = JsWriter.TypeAttr, DateTimeFormat = null, - JsonTypeAttrInObject = JsonTypeSerializer.GetTypeAttrInObject(JsWriter.TypeAttr), - JsvTypeAttrInObject = JsvTypeSerializer.GetTypeAttrInObject(JsWriter.TypeAttr), TypeWriter = AssemblyUtils.WriteType, TypeFinder = AssemblyUtils.FindType, ParsePrimitiveFn = null, @@ -222,8 +237,6 @@ public Config Populate(Config config) IncludeTypeInfo = config.IncludeTypeInfo; TypeAttr = config.TypeAttr; DateTimeFormat = config.DateTimeFormat; - JsonTypeAttrInObject = config.JsonTypeAttrInObject; - JsvTypeAttrInObject = config.JsvTypeAttrInObject; TypeWriter = config.TypeWriter; TypeFinder = config.TypeFinder; ParsePrimitiveFn = config.ParsePrimitiveFn; diff --git a/src/ServiceStack.Text/TypeConfig.cs b/src/ServiceStack.Text/TypeConfig.cs index db60f30ee..d3a405a84 100644 --- a/src/ServiceStack.Text/TypeConfig.cs +++ b/src/ServiceStack.Text/TypeConfig.cs @@ -30,8 +30,7 @@ public static class TypeConfig { internal static TypeConfig config; - static TypeConfig Config => - config ?? (config = Create()); + static TypeConfig Config => config ??= Create(); public static PropertyInfo[] Properties { diff --git a/tests/ServiceStack.Text.Tests/RuntimeSerializationTests.cs b/tests/ServiceStack.Text.Tests/RuntimeSerializationTests.cs index 09fd1fc1d..fe64497f3 100644 --- a/tests/ServiceStack.Text.Tests/RuntimeSerializationTests.cs +++ b/tests/ServiceStack.Text.Tests/RuntimeSerializationTests.cs @@ -300,6 +300,37 @@ public void Can_serialize_JS_literal_into_DTO() JS.UnConfigure(); } + [Test] + public void ServiceStack_AllowRuntimeType() + { + // Initialize static delegate to allow all types to be deserialized with the type attribute + JsConfig.AllowRuntimeType = _ => true; + JsConfig.TypeAttr = "$type"; + var example = new Example { Property = new MyProperty { Value = "Hello serializer" } }; + + var serialized = JsonSerializer.SerializeToString(example); + var deserialized = JsonSerializer.DeserializeFromString(serialized); + Assert.IsNotNull(deserialized?.Property); + + // Now the same process with a config scope that has a TypeAttr that differs from the global TypeAttr value + using var scope = JsConfig.With(new Config { TypeAttr = "_type" }); + serialized = JsonSerializer.SerializeToString(example); + deserialized = JsonSerializer.DeserializeFromString(serialized); + Assert.IsNotNull(deserialized?.Property); + + JsConfig.Reset(); + } + private class Example + { + public IProperty Property { get; set; } + } + private interface IProperty + { + } + private class MyProperty : IProperty + { + public string Value { get; set; } + } } } \ No newline at end of file From 1e1e0ad9c66162efd558386d897634ce318ebf84 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 27 Oct 2020 13:01:22 +0800 Subject: [PATCH 227/372] Extract .NET 4.5 HttpUtils + add async overloads --- src/ServiceStack.Text/HttpUtils.cs | 170 ++++++++++++++++++++++- src/ServiceStack.Text/PclExport.Net45.cs | 55 -------- 2 files changed, 166 insertions(+), 59 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index a41be6dda..b58a68195 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1076,6 +1076,15 @@ public static Task GetResponseAsync(this HttpWebRequest request return tcs.Task; } + private static byte[] GetHeaderBytes(string fileName, string mimeType, string field, string boundary) + { + var header = "\r\n--" + boundary + + $"\r\nContent-Disposition: form-data; name=\"{field}\"; filename=\"{fileName}\"\r\nContent-Type: {mimeType}\r\n\r\n"; + + var headerBytes = header.ToAsciiBytes(); + return headerBytes; + } + public static void UploadFile(this WebRequest webRequest, Stream fileStream, string fileName, string mimeType, string accept = null, Action requestFilter = null, string method = "POST", string field = "file") { @@ -1093,10 +1102,7 @@ public static void UploadFile(this WebRequest webRequest, Stream fileStream, str var boundaryBytes = ("\r\n--" + boundary + "--\r\n").ToAsciiBytes(); - var header = "\r\n--" + boundary + - $"\r\nContent-Disposition: form-data; name=\"{field}\"; filename=\"{fileName}\"\r\nContent-Type: {mimeType}\r\n\r\n"; - - var headerBytes = header.ToAsciiBytes(); + var headerBytes = GetHeaderBytes(fileName, mimeType, field, boundary); var contentLength = fileStream.Length + headerBytes.Length + boundaryBytes.Length; PclExport.Instance.InitHttpWebRequest(httpReq, @@ -1115,6 +1121,43 @@ public static void UploadFile(this WebRequest webRequest, Stream fileStream, str PclExport.Instance.CloseStream(outputStream); } + public static async Task UploadFileAsync(this WebRequest webRequest, Stream fileStream, string fileName, string mimeType, + string accept = null, Action requestFilter = null, string method = "POST", string field = "file", + CancellationToken token=default) + { + var httpReq = (HttpWebRequest)webRequest; + httpReq.Method = method; + + if (accept != null) + httpReq.Accept = accept; + + requestFilter?.Invoke(httpReq); + + var boundary = Guid.NewGuid().ToString("N"); + + httpReq.ContentType = "multipart/form-data; boundary=\"" + boundary + "\""; + + var boundaryBytes = ("\r\n--" + boundary + "--\r\n").ToAsciiBytes(); + + var headerBytes = GetHeaderBytes(fileName, mimeType, field, boundary); + + var contentLength = fileStream.Length + headerBytes.Length + boundaryBytes.Length; + PclExport.Instance.InitHttpWebRequest(httpReq, + contentLength: contentLength, allowAutoRedirect: false, keepAlive: false); + + if (ResultsFilter != null) + { + ResultsFilter.UploadStream(httpReq, fileStream, fileName); + return; + } + + using var outputStream = PclExport.Instance.GetRequestStream(httpReq); + await outputStream.WriteAsync(headerBytes, 0, headerBytes.Length, token).ConfigAwait(); + await fileStream.CopyToAsync(outputStream, 4096, token).ConfigAwait(); + await outputStream.WriteAsync(boundaryBytes, 0, boundaryBytes.Length, token).ConfigAwait(); + PclExport.Instance.CloseStream(outputStream); + } + public static void UploadFile(this WebRequest webRequest, Stream fileStream, string fileName) { if (fileName == null) @@ -1126,6 +1169,17 @@ public static void UploadFile(this WebRequest webRequest, Stream fileStream, str UploadFile(webRequest, fileStream, fileName, mimeType); } + public static async Task UploadFileAsync(this WebRequest webRequest, Stream fileStream, string fileName, CancellationToken token=default) + { + if (fileName == null) + throw new ArgumentNullException(nameof(fileName)); + var mimeType = MimeTypes.GetMimeType(fileName); + if (mimeType == null) + throw new ArgumentException("Mime-type not found for file: " + fileName); + + await UploadFileAsync(webRequest, fileStream, fileName, mimeType, token: token).ConfigAwait(); + } + public static string PostXmlToUrl(this string url, object data, Action requestFilter = null, Action responseFilter = null) { @@ -1153,6 +1207,114 @@ public static string PutCsvToUrl(this string url, object data, return SendStringToUrl(url, method: "PUT", requestBody: data.ToCsv(), contentType: MimeTypes.Csv, accept: MimeTypes.Csv, requestFilter: requestFilter, responseFilter: responseFilter); } + + public static WebResponse PostFileToUrl(this string url, + FileInfo uploadFileInfo, string uploadFileMimeType, + string accept = null, + Action requestFilter = null) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + using (var fileStream = uploadFileInfo.OpenRead()) + { + var fileName = uploadFileInfo.Name; + + webReq.UploadFile(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "POST"); + } + + if (ResultsFilter != null) + return null; + + return webReq.GetResponse(); + } + + public static async Task PostFileToUrlAsync(this string url, + FileInfo uploadFileInfo, string uploadFileMimeType, + string accept = null, + Action requestFilter = null, CancellationToken token=default) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + using (var fileStream = uploadFileInfo.OpenRead()) + { + var fileName = uploadFileInfo.Name; + + await webReq.UploadFileAsync(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "POST", token: token); + } + + if (ResultsFilter != null) + return null; + + return await webReq.GetResponseAsync(); + } + + public static WebResponse PutFileToUrl(this string url, + FileInfo uploadFileInfo, string uploadFileMimeType, + string accept = null, + Action requestFilter = null) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + using (var fileStream = uploadFileInfo.OpenRead()) + { + var fileName = uploadFileInfo.Name; + + webReq.UploadFile(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "PUT"); + } + + if (ResultsFilter != null) + return null; + + return webReq.GetResponse(); + } + + public static async Task PutFileToUrlAsync(this string url, + FileInfo uploadFileInfo, string uploadFileMimeType, + string accept = null, + Action requestFilter = null, CancellationToken token=default) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + using (var fileStream = uploadFileInfo.OpenRead()) + { + var fileName = uploadFileInfo.Name; + + await webReq.UploadFileAsync(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "PUT", token: token); + } + + if (ResultsFilter != null) + return null; + + return await webReq.GetResponseAsync(); + } + + public static WebResponse UploadFile(this WebRequest webRequest, + FileInfo uploadFileInfo, string uploadFileMimeType) + { + using (var fileStream = uploadFileInfo.OpenRead()) + { + var fileName = uploadFileInfo.Name; + + webRequest.UploadFile(fileStream, fileName, uploadFileMimeType); + } + + if (ResultsFilter != null) + return null; + + return webRequest.GetResponse(); + } + + public static async Task UploadFileAsync(this WebRequest webRequest, + FileInfo uploadFileInfo, string uploadFileMimeType) + { + using (var fileStream = uploadFileInfo.OpenRead()) + { + var fileName = uploadFileInfo.Name; + + await webRequest.UploadFileAsync(fileStream, fileName, uploadFileMimeType); + } + + if (ResultsFilter != null) + return null; + + return await webRequest.GetResponseAsync(); + } } //Allow Exceptions to Customize HTTP StatusCode and StatusDescription returned diff --git a/src/ServiceStack.Text/PclExport.Net45.cs b/src/ServiceStack.Text/PclExport.Net45.cs index 3a86c4830..0e1e4df48 100644 --- a/src/ServiceStack.Text/PclExport.Net45.cs +++ b/src/ServiceStack.Text/PclExport.Net45.cs @@ -535,61 +535,6 @@ public static StringCollection ToStringCollection(List items) public static class PclExportExt { - //HttpUtils - public static WebResponse PostFileToUrl(this string url, - FileInfo uploadFileInfo, string uploadFileMimeType, - string accept = null, - Action requestFilter = null) - { - var webReq = (HttpWebRequest)WebRequest.Create(url); - using (var fileStream = uploadFileInfo.OpenRead()) - { - var fileName = uploadFileInfo.Name; - - webReq.UploadFile(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "POST"); - } - - if (HttpUtils.ResultsFilter != null) - return null; - - return webReq.GetResponse(); - } - - public static WebResponse PutFileToUrl(this string url, - FileInfo uploadFileInfo, string uploadFileMimeType, - string accept = null, - Action requestFilter = null) - { - var webReq = (HttpWebRequest)WebRequest.Create(url); - using (var fileStream = uploadFileInfo.OpenRead()) - { - var fileName = uploadFileInfo.Name; - - webReq.UploadFile(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "PUT"); - } - - if (HttpUtils.ResultsFilter != null) - return null; - - return webReq.GetResponse(); - } - - public static WebResponse UploadFile(this WebRequest webRequest, - FileInfo uploadFileInfo, string uploadFileMimeType) - { - using (var fileStream = uploadFileInfo.OpenRead()) - { - var fileName = uploadFileInfo.Name; - - webRequest.UploadFile(fileStream, fileName, uploadFileMimeType); - } - - if (HttpUtils.ResultsFilter != null) - return null; - - return webRequest.GetResponse(); - } - //XmlSerializer public static void CompressToStream(TXmlDto from, Stream stream) { From 4ef36ecd9b1e430fa3f5820891264bf7be44b947 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 10 Nov 2020 23:31:04 +0800 Subject: [PATCH 228/372] Set deps to v5.10.1 --- src/Directory.Build.props | 2 +- src/ServiceStack.Text/Env.cs | 2 +- tests/Directory.Build.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 19f7ebc5c..6dc8aa509 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.9.3 + 5.10.1 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 6bcfbd333..691f9582b 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -113,7 +113,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.9m; + public static decimal ServiceStackVersion = 5.101m; public static bool IsLinux { get; set; } diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index c12b34d25..64478b705 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.9.3 + 5.10.1 latest false From 5f3bb4f7c1ea97335ca87388c35122a5522c1650 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 13 Nov 2020 19:17:32 +0800 Subject: [PATCH 229/372] Update Directory.Build.props --- src/Directory.Build.props | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 6dc8aa509..79255ce9c 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -24,18 +24,25 @@ true - - $(DefineConstants);NET45 + + $(DefineConstants);NETFX;NET45 True False ../servicestack.snk - true + + + + $(DefineConstants);NETFX;NET472 $(DefineConstants);NETSTANDARD;NETSTANDARD2_0 + + $(DefineConstants);NETSTANDARD;NETSTANDARD2_1 + + From 8ede3151ef4117e12a9bab13f01fb95fbf091d24 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 16 Nov 2020 18:34:04 +0800 Subject: [PATCH 230/372] bump to v5.10.2 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 79255ce9c..7043b6a7e 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.10.1 + 5.10.2 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 64478b705..451158371 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.10.1 + 5.10.2 latest false From 3dd5e3f05ddef1331e0d7b3385dcac630e3b0413 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 16 Nov 2020 19:02:30 +0800 Subject: [PATCH 231/372] Update Env.cs --- src/ServiceStack.Text/Env.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 691f9582b..f6ebc2042 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -113,7 +113,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.101m; + public static decimal ServiceStackVersion = 5.102m; public static bool IsLinux { get; set; } From 40b0329401d3dc6ff29f185afe9f68905b34030f Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 16 Nov 2020 23:27:16 +0800 Subject: [PATCH 232/372] bump to v5.10.3 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 7043b6a7e..47f0ad2bf 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.10.2 + 5.10.3 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 451158371..2732f39f8 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.10.2 + 5.10.3 latest false From 053ab301ba2061a9674553b384e2b25f278a7a29 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 16 Nov 2020 23:28:15 +0800 Subject: [PATCH 233/372] bump to v5.10.3 --- src/ServiceStack.Text/Env.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index f6ebc2042..9922e477d 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -113,7 +113,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.102m; + public static decimal ServiceStackVersion = 5.103m; public static bool IsLinux { get; set; } From 362568099d2466561855b3cd0a0b3925a24abf1b Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 18 Nov 2020 12:36:25 +0800 Subject: [PATCH 234/372] Add optional CancellationToken + use async APIs when available --- src/ServiceStack.Text/HttpUtils.cs | 186 ++++++++++++++--------------- 1 file changed, 88 insertions(+), 98 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index b58a68195..1795c2e5f 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -149,9 +149,9 @@ public static string GetJsonFromUrl(this string url, } public static Task GetJsonFromUrlAsync(this string url, - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { - return url.GetStringFromUrlAsync(MimeTypes.Json, requestFilter, responseFilter); + return url.GetStringFromUrlAsync(MimeTypes.Json, requestFilter, responseFilter, token: token); } public static string GetXmlFromUrl(this string url, @@ -161,9 +161,9 @@ public static string GetXmlFromUrl(this string url, } public static Task GetXmlFromUrlAsync(this string url, - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { - return url.GetStringFromUrlAsync(MimeTypes.Xml, requestFilter, responseFilter); + return url.GetStringFromUrlAsync(MimeTypes.Xml, requestFilter, responseFilter, token: token); } public static string GetCsvFromUrl(this string url, @@ -173,9 +173,9 @@ public static string GetCsvFromUrl(this string url, } public static Task GetCsvFromUrlAsync(this string url, - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { - return url.GetStringFromUrlAsync(MimeTypes.Csv, requestFilter, responseFilter); + return url.GetStringFromUrlAsync(MimeTypes.Csv, requestFilter, responseFilter, token: token); } public static string GetStringFromUrl(this string url, string accept = "*/*", @@ -185,9 +185,9 @@ public static string GetStringFromUrl(this string url, string accept = "*/*", } public static Task GetStringFromUrlAsync(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { - return SendStringToUrlAsync(url, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + return SendStringToUrlAsync(url, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PostStringToUrl(this string url, string requestBody = null, @@ -201,11 +201,11 @@ public static string PostStringToUrl(this string url, string requestBody = null, public static Task PostStringToUrlAsync(this string url, string requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "POST", requestBody: requestBody, contentType: contentType, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PostToUrl(this string url, string formData = null, string accept = "*/*", @@ -217,11 +217,11 @@ public static string PostToUrl(this string url, string formData = null, string a } public static Task PostToUrlAsync(this string url, string formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "POST", contentType: MimeTypes.FormUrlEncoded, requestBody: formData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PostToUrl(this string url, object formData = null, string accept = "*/*", @@ -235,13 +235,13 @@ public static string PostToUrl(this string url, object formData = null, string a } public static Task PostToUrlAsync(this string url, object formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { string postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; return SendStringToUrlAsync(url, method: "POST", contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PostJsonToUrl(this string url, string json, @@ -252,10 +252,10 @@ public static string PostJsonToUrl(this string url, string json, } public static Task PostJsonToUrlAsync(this string url, string json, - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "POST", requestBody: json, contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter); + requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PostJsonToUrl(this string url, object data, @@ -266,10 +266,10 @@ public static string PostJsonToUrl(this string url, object data, } public static Task PostJsonToUrlAsync(this string url, object data, - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "POST", requestBody: data.ToJson(), contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter); + requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PostXmlToUrl(this string url, string xml, @@ -280,10 +280,10 @@ public static string PostXmlToUrl(this string url, string xml, } public static Task PostXmlToUrlAsync(this string url, string xml, - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "POST", requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, - requestFilter: requestFilter, responseFilter: responseFilter); + requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PostCsvToUrl(this string url, string csv, @@ -294,10 +294,10 @@ public static string PostCsvToUrl(this string url, string csv, } public static Task PostCsvToUrlAsync(this string url, string csv, - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "POST", requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, - requestFilter: requestFilter, responseFilter: responseFilter); + requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PutStringToUrl(this string url, string requestBody = null, @@ -311,11 +311,11 @@ public static string PutStringToUrl(this string url, string requestBody = null, public static Task PutStringToUrlAsync(this string url, string requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "PUT", requestBody: requestBody, contentType: contentType, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PutToUrl(this string url, string formData = null, string accept = "*/*", @@ -327,11 +327,11 @@ public static string PutToUrl(this string url, string formData = null, string ac } public static Task PutToUrlAsync(this string url, string formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "PUT", contentType: MimeTypes.FormUrlEncoded, requestBody: formData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PutToUrl(this string url, object formData = null, string accept = "*/*", @@ -345,13 +345,13 @@ public static string PutToUrl(this string url, object formData = null, string ac } public static Task PutToUrlAsync(this string url, object formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { string postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; return SendStringToUrlAsync(url, method: "PUT", contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PutJsonToUrl(this string url, string json, @@ -362,10 +362,10 @@ public static string PutJsonToUrl(this string url, string json, } public static Task PutJsonToUrlAsync(this string url, string json, - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "PUT", requestBody: json, contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter); + requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PutJsonToUrl(this string url, object data, @@ -376,10 +376,10 @@ public static string PutJsonToUrl(this string url, object data, } public static Task PutJsonToUrlAsync(this string url, object data, - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "PUT", requestBody: data.ToJson(), contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter); + requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PutXmlToUrl(this string url, string xml, @@ -390,10 +390,10 @@ public static string PutXmlToUrl(this string url, string xml, } public static Task PutXmlToUrlAsync(this string url, string xml, - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "PUT", requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, - requestFilter: requestFilter, responseFilter: responseFilter); + requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PutCsvToUrl(this string url, string csv, @@ -404,10 +404,10 @@ public static string PutCsvToUrl(this string url, string csv, } public static Task PutCsvToUrlAsync(this string url, string csv, - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "PUT", requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, - requestFilter: requestFilter, responseFilter: responseFilter); + requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PatchStringToUrl(this string url, string requestBody = null, @@ -421,11 +421,11 @@ public static string PatchStringToUrl(this string url, string requestBody = null public static Task PatchStringToUrlAsync(this string url, string requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "PATCH", requestBody: requestBody, contentType: contentType, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PatchToUrl(this string url, string formData = null, string accept = "*/*", @@ -437,11 +437,11 @@ public static string PatchToUrl(this string url, string formData = null, string } public static Task PatchToUrlAsync(this string url, string formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "PATCH", contentType: MimeTypes.FormUrlEncoded, requestBody: formData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PatchToUrl(this string url, object formData = null, string accept = "*/*", @@ -455,13 +455,13 @@ public static string PatchToUrl(this string url, object formData = null, string } public static Task PatchToUrlAsync(this string url, object formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { string postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; return SendStringToUrlAsync(url, method: "PATCH", contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PatchJsonToUrl(this string url, string json, @@ -472,10 +472,10 @@ public static string PatchJsonToUrl(this string url, string json, } public static Task PatchJsonToUrlAsync(this string url, string json, - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "PATCH", requestBody: json, contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter); + requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PatchJsonToUrl(this string url, object data, @@ -486,10 +486,10 @@ public static string PatchJsonToUrl(this string url, object data, } public static Task PatchJsonToUrlAsync(this string url, object data, - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStringToUrlAsync(url, method: "PATCH", requestBody: data.ToJson(), contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter); + requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string DeleteFromUrl(this string url, string accept = "*/*", @@ -499,9 +499,9 @@ public static string DeleteFromUrl(this string url, string accept = "*/*", } public static Task DeleteFromUrlAsync(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { - return SendStringToUrlAsync(url, method: "DELETE", accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + return SendStringToUrlAsync(url, method: "DELETE", accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string OptionsFromUrl(this string url, string accept = "*/*", @@ -511,9 +511,9 @@ public static string OptionsFromUrl(this string url, string accept = "*/*", } public static Task OptionsFromUrlAsync(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { - return SendStringToUrlAsync(url, method: "OPTIONS", accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + return SendStringToUrlAsync(url, method: "OPTIONS", accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string HeadFromUrl(this string url, string accept = "*/*", @@ -523,9 +523,9 @@ public static string HeadFromUrl(this string url, string accept = "*/*", } public static Task HeadFromUrlAsync(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { - return SendStringToUrlAsync(url, method: "HEAD", accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + return SendStringToUrlAsync(url, method: "HEAD", accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string SendStringToUrl(this string url, string method = null, @@ -567,7 +567,7 @@ public static string SendStringToUrl(this string url, string method = null, public static async Task SendStringToUrlAsync(this string url, string method = null, string requestBody = null, string contentType = null, string accept = "*/*", Action requestFilter = null, - Action responseFilter = null) + Action responseFilter = null, CancellationToken token=default) { var webReq = (HttpWebRequest)WebRequest.Create(url); if (method != null) @@ -590,7 +590,7 @@ public static async Task SendStringToUrlAsync(this string url, string me { using var reqStream = PclExport.Instance.GetRequestStream(webReq); using var writer = new StreamWriter(reqStream, UseEncoding); - await writer.WriteAsync(requestBody); + await writer.WriteAsync(requestBody).ConfigAwait(); } using var webRes = await webReq.GetResponseAsync().ConfigAwait(); @@ -606,9 +606,9 @@ public static byte[] GetBytesFromUrl(this string url, string accept = "*/*", } public static Task GetBytesFromUrlAsync(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { - return url.SendBytesToUrlAsync(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + return url.SendBytesToUrlAsync(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static byte[] PostBytesToUrl(this string url, byte[] requestBody = null, string contentType = null, string accept = "*/*", @@ -620,11 +620,11 @@ public static byte[] PostBytesToUrl(this string url, byte[] requestBody = null, } public static Task PostBytesToUrlAsync(this string url, byte[] requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendBytesToUrlAsync(url, method: "POST", contentType: contentType, requestBody: requestBody, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static byte[] PutBytesToUrl(this string url, byte[] requestBody = null, string contentType = null, string accept = "*/*", @@ -636,11 +636,11 @@ public static byte[] PutBytesToUrl(this string url, byte[] requestBody = null, s } public static Task PutBytesToUrlAsync(this string url, byte[] requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendBytesToUrlAsync(url, method: "PUT", contentType: contentType, requestBody: requestBody, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static byte[] SendBytesToUrl(this string url, string method = null, @@ -666,26 +666,20 @@ public static byte[] SendBytesToUrl(this string url, string method = null, if (requestBody != null) { - using (var req = PclExport.Instance.GetRequestStream(webReq)) - { - req.Write(requestBody, 0, requestBody.Length); - } + using var req = PclExport.Instance.GetRequestStream(webReq); + req.Write(requestBody, 0, requestBody.Length); } - using (var webRes = PclExport.Instance.GetResponse(webReq)) - { - responseFilter?.Invoke((HttpWebResponse)webRes); + using var webRes = PclExport.Instance.GetResponse(webReq); + responseFilter?.Invoke((HttpWebResponse)webRes); - using (var stream = webRes.GetResponseStream()) - { - return stream.ReadFully(); - } - } + using var stream = webRes.GetResponseStream(); + return stream.ReadFully(); } public static async Task SendBytesToUrlAsync(this string url, string method = null, byte[] requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { var webReq = (HttpWebRequest)WebRequest.Create(url); if (method != null) @@ -706,19 +700,15 @@ public static async Task SendBytesToUrlAsync(this string url, string met if (requestBody != null) { - using (var req = PclExport.Instance.GetRequestStream(webReq)) - { - req.Write(requestBody, 0, requestBody.Length); - } + using var req = PclExport.Instance.GetRequestStream(webReq); + await req.WriteAsync(requestBody, 0, requestBody.Length, token).ConfigAwait(); } var webRes = await webReq.GetResponseAsync().ConfigAwait(); responseFilter?.Invoke((HttpWebResponse)webRes); - using (var stream = webRes.GetResponseStream()) - { - return stream.ReadFully(); - } + using var stream = webRes.GetResponseStream(); + return await stream.ReadFullyAsync(token).ConfigAwait(); } public static Stream GetStreamFromUrl(this string url, string accept = "*/*", @@ -728,9 +718,9 @@ public static Stream GetStreamFromUrl(this string url, string accept = "*/*", } public static Task GetStreamFromUrlAsync(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { - return url.SendStreamToUrlAsync(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + return url.SendStreamToUrlAsync(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static Stream PostStreamToUrl(this string url, Stream requestBody = null, string contentType = null, string accept = "*/*", @@ -742,11 +732,11 @@ public static Stream PostStreamToUrl(this string url, Stream requestBody = null, } public static Task PostStreamToUrlAsync(this string url, Stream requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStreamToUrlAsync(url, method: "POST", contentType: contentType, requestBody: requestBody, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static Stream PutStreamToUrl(this string url, Stream requestBody = null, string contentType = null, string accept = "*/*", @@ -758,11 +748,11 @@ public static Stream PutStreamToUrl(this string url, Stream requestBody = null, } public static Task PutStreamToUrlAsync(this string url, Stream requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { return SendStreamToUrlAsync(url, method: "PUT", contentType: contentType, requestBody: requestBody, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } /// @@ -809,7 +799,7 @@ public static Stream SendStreamToUrl(this string url, string method = null, /// public static async Task SendStreamToUrlAsync(this string url, string method = null, Stream requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) + Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) { var webReq = (HttpWebRequest)WebRequest.Create(url); if (method != null) @@ -824,13 +814,13 @@ public static async Task SendStreamToUrlAsync(this string url, string me if (ResultsFilter != null) { - return new MemoryStream(ResultsFilter.GetBytes(webReq, requestBody.ReadFully())); + return new MemoryStream(ResultsFilter.GetBytes(webReq, await requestBody.ReadFullyAsync(token).ConfigAwait())); } if (requestBody != null) { using var req = PclExport.Instance.GetRequestStream(webReq); - await requestBody.CopyToAsync(req).ConfigAwait(); + await requestBody.CopyToAsync(req, token).ConfigAwait(); } var webRes = await webReq.GetResponseAsync().ConfigAwait(); @@ -993,8 +983,8 @@ public static async Task GetErrorResponseAsync(this string url) try { var webReq = WebRequest.Create(url); - using var webRes = await webReq.GetResponseAsync(); - await webRes.ReadToEndAsync(); + using var webRes = await webReq.GetResponseAsync().ConfigAwait(); + await webRes.ReadToEndAsync().ConfigAwait(); return null; } catch (WebException webEx) @@ -1237,13 +1227,13 @@ public static async Task PostFileToUrlAsync(this string url, { var fileName = uploadFileInfo.Name; - await webReq.UploadFileAsync(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "POST", token: token); + await webReq.UploadFileAsync(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "POST", token: token).ConfigAwait(); } if (ResultsFilter != null) return null; - return await webReq.GetResponseAsync(); + return await webReq.GetResponseAsync().ConfigAwait(); } public static WebResponse PutFileToUrl(this string url, @@ -1275,13 +1265,13 @@ public static async Task PutFileToUrlAsync(this string url, { var fileName = uploadFileInfo.Name; - await webReq.UploadFileAsync(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "PUT", token: token); + await webReq.UploadFileAsync(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "PUT", token: token).ConfigAwait(); } if (ResultsFilter != null) return null; - return await webReq.GetResponseAsync(); + return await webReq.GetResponseAsync().ConfigAwait(); } public static WebResponse UploadFile(this WebRequest webRequest, @@ -1307,13 +1297,13 @@ public static async Task UploadFileAsync(this WebRequest webRequest { var fileName = uploadFileInfo.Name; - await webRequest.UploadFileAsync(fileStream, fileName, uploadFileMimeType); + await webRequest.UploadFileAsync(fileStream, fileName, uploadFileMimeType).ConfigAwait(); } if (ResultsFilter != null) return null; - return await webRequest.GetResponseAsync(); + return await webRequest.GetResponseAsync().ConfigAwait(); } } From ea9d6e2a3b71c0a0af4a1dcc9ba0a9fde032acd1 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 20 Nov 2020 00:34:01 +0800 Subject: [PATCH 235/372] Ignore __type attr when trying to deserialize into KVP --- src/ServiceStack.Text/Common/DeserializeKeyValuePair.cs | 2 +- .../ServiceStack.Text.Tests/RuntimeSerializationTests.cs | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Common/DeserializeKeyValuePair.cs b/src/ServiceStack.Text/Common/DeserializeKeyValuePair.cs index 7492f88cf..8ded3e2ca 100644 --- a/src/ServiceStack.Text/Common/DeserializeKeyValuePair.cs +++ b/src/ServiceStack.Text/Common/DeserializeKeyValuePair.cs @@ -74,7 +74,7 @@ public static object ParseKeyValuePair( keyValue = (TKey)parseKeyFn(keyElementValue); else if (key.CompareIgnoreCase("value".AsSpan())) valueValue = (TValue)parseValueFn(keyElementValue); - else + else if (!key.SequenceEqual(JsConfig.TypeAttr.AsSpan())) throw new SerializationException("Incorrect KeyValuePair property: " + key.ToString()); Serializer.EatItemSeperatorOrMapEndChar(value, ref index); diff --git a/tests/ServiceStack.Text.Tests/RuntimeSerializationTests.cs b/tests/ServiceStack.Text.Tests/RuntimeSerializationTests.cs index fe64497f3..655894b12 100644 --- a/tests/ServiceStack.Text.Tests/RuntimeSerializationTests.cs +++ b/tests/ServiceStack.Text.Tests/RuntimeSerializationTests.cs @@ -332,5 +332,14 @@ private class MyProperty : IProperty { public string Value { get; set; } } + + [Test] + public void Can_deserialize_object_into_string_dictionary() + { + var json = "{\"__type\":\"System.Collections.Generic.KeyValuePair`2[[System.String, System.Private.CoreLib],[System.String, System.Private.CoreLib]], System.Private.CoreLib\",\"Key\":\"A\",\"Value\":\"B\"}"; + var dto = json.FromJson>(); + Assert.That(dto.Key, Is.EqualTo("A")); + Assert.That(dto.Value, Is.EqualTo("B")); + } } } \ No newline at end of file From 1ccb66d6de5cac282fe8cbdaa9b1475b981c79f2 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 24 Nov 2020 17:40:03 +0800 Subject: [PATCH 236/372] Update README.md --- README.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/README.md b/README.md index e1753221a..76d7c3abf 100644 --- a/README.md +++ b/README.md @@ -358,6 +358,53 @@ JsonSerializer also supports serialization of anonymous types in much the same w {"A":1,"B":2,"C":3,"D":4} +### Parsing JSON Dates + +The default WCF Date that's returned in ServiceStack.Text can be converted with: + +```js +function todate (s) { + return new Date(parseFloat(/Date\(([^)]+)\)/.exec(s)[1])); +}; +``` + +Which if you're using the [servicestack-client](https://docs.servicestack.net/servicestack-client-umd) npm package can be resolved with: + +```ts +import { todate } from "servicestack-client"; +var date = todate(wcfDateString); +``` + +Or if using [ss-utils.js](https://docs.servicestack.net/ss-utils-js) that's built into ServiceStack: + +```js +var date = $.ss.todate(wcfDateString); +``` + +If you change ServiceStack.Text default serialization of Date to either use the ISO8601 date format: + +```csharp +JsConfig.DateHandler = DateHandler.ISO8601; +``` + +It can be parsed natively with: + +```js +new Date(dateString) +``` + +Likewise when configured to return: + +```csharp +JsConfig.DateHandler = DateHandler.UnixTimeMs; +``` + +It can also be converted natively with: + +```js +new Date(unixTimeMs) +``` + ## Global Default JSON Configuration The JSON/JSV and CSV serialization can be customized globally by configuring the `JsConfig` or type-specific `JsConfig` static classes with your preferred defaults. Global static configuration can be configured once on **Startup** using `JsConfig.Init()`, e.g: From 4733481907b764a120ffab2bf4f190bb32440e25 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 7 Dec 2020 23:32:51 +0800 Subject: [PATCH 237/372] Create Inspect.cs --- src/ServiceStack.Text/Inspect.cs | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/ServiceStack.Text/Inspect.cs diff --git a/src/ServiceStack.Text/Inspect.cs b/src/ServiceStack.Text/Inspect.cs new file mode 100644 index 000000000..17a523db4 --- /dev/null +++ b/src/ServiceStack.Text/Inspect.cs @@ -0,0 +1,34 @@ +using System; +using System.IO; + +namespace ServiceStack.Text +{ + /// + /// Helper utility for inspecting variables + /// + public static class Inspect + { + public static class Config + { + public static Action VarsFilter { get; set; } = DefaultVarsFilter; + + public static void DefaultVarsFilter(object anonArgs) + { + try + { + File.WriteAllText("vars.json", anonArgs.ToSafeJson()); + } + catch (Exception ex) + { + Tracer.Instance.WriteError("Inspect.Vars() Error: " + ex); + } + } + } + + /// + /// Dump serialized values to 'vars.json' + /// + /// Anonymous object with named value + public static void Vars(object anonArgs) => Config.VarsFilter?.Invoke(anonArgs); + } +} \ No newline at end of file From 2e9185a86860ff1dd7bf33ef5714b7debb512738 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 8 Dec 2020 15:10:53 +0800 Subject: [PATCH 238/372] Move Inspect to base namespace --- src/ServiceStack.Text/Inspect.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Inspect.cs b/src/ServiceStack.Text/Inspect.cs index 17a523db4..e7a6cac30 100644 --- a/src/ServiceStack.Text/Inspect.cs +++ b/src/ServiceStack.Text/Inspect.cs @@ -1,7 +1,8 @@ using System; using System.IO; +using ServiceStack.Text; -namespace ServiceStack.Text +namespace ServiceStack { /// /// Helper utility for inspecting variables From 1d13069185f9a1156b776f0e1dc15091ca5d3d81 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 11 Dec 2020 04:41:12 +0800 Subject: [PATCH 239/372] Allow Inspect.Vars path to be overriden with INSPECT_VARS --- src/ServiceStack.Text/Inspect.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Inspect.cs b/src/ServiceStack.Text/Inspect.cs index e7a6cac30..e88749718 100644 --- a/src/ServiceStack.Text/Inspect.cs +++ b/src/ServiceStack.Text/Inspect.cs @@ -11,13 +11,24 @@ public static class Inspect { public static class Config { + public const string VarsName = "vars.json"; + public static Action VarsFilter { get; set; } = DefaultVarsFilter; public static void DefaultVarsFilter(object anonArgs) { try { - File.WriteAllText("vars.json", anonArgs.ToSafeJson()); + var inspectVarsPath = Environment.GetEnvironmentVariable("INSPECT_VARS"); + if (inspectVarsPath == "0") // Disable + return; + + var varsPath = inspectVarsPath?.Length > 0 + ? Path.PathSeparator == '\\' + ? inspectVarsPath.Replace('/','\\') + : inspectVarsPath.Replace('\\','/') + : VarsName; + File.WriteAllText(varsPath, anonArgs.ToSafeJson()); } catch (Exception ex) { From 805826297572a5df818b3448b5d6ddfe9b21097c Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 11 Dec 2020 14:18:55 +0800 Subject: [PATCH 240/372] AssertDir() on INSPECT_VARS --- src/ServiceStack.Text/Inspect.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ServiceStack.Text/Inspect.cs b/src/ServiceStack.Text/Inspect.cs index e88749718..1798c6b85 100644 --- a/src/ServiceStack.Text/Inspect.cs +++ b/src/ServiceStack.Text/Inspect.cs @@ -28,6 +28,10 @@ public static void DefaultVarsFilter(object anonArgs) ? inspectVarsPath.Replace('/','\\') : inspectVarsPath.Replace('\\','/') : VarsName; + + if (varsPath.IndexOf(Path.PathSeparator) >= 0) + Path.GetDirectoryName(varsPath).AssertDir(); + File.WriteAllText(varsPath, anonArgs.ToSafeJson()); } catch (Exception ex) From 4794cb44102fb51fb1996901ff28d5e843c4fd20 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 11 Dec 2020 15:11:42 +0800 Subject: [PATCH 241/372] Rename to Inspect.vars() --- src/ServiceStack.Text/Inspect.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Inspect.cs b/src/ServiceStack.Text/Inspect.cs index 1798c6b85..693acb18f 100644 --- a/src/ServiceStack.Text/Inspect.cs +++ b/src/ServiceStack.Text/Inspect.cs @@ -45,6 +45,7 @@ public static void DefaultVarsFilter(object anonArgs) /// Dump serialized values to 'vars.json' /// /// Anonymous object with named value - public static void Vars(object anonArgs) => Config.VarsFilter?.Invoke(anonArgs); + // ReSharper disable once InconsistentNaming + public static void vars(object anonArgs) => Config.VarsFilter?.Invoke(anonArgs); } } \ No newline at end of file From 5ce1cb3ad5f74bd7cb4b94c4a7f12249d95646a9 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 11 Dec 2020 22:20:51 +0800 Subject: [PATCH 242/372] Use correct Path.DirectorySeparatorChar --- src/ServiceStack.Text/Inspect.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/Inspect.cs b/src/ServiceStack.Text/Inspect.cs index 693acb18f..8a08ea724 100644 --- a/src/ServiceStack.Text/Inspect.cs +++ b/src/ServiceStack.Text/Inspect.cs @@ -24,12 +24,12 @@ public static void DefaultVarsFilter(object anonArgs) return; var varsPath = inspectVarsPath?.Length > 0 - ? Path.PathSeparator == '\\' + ? Path.DirectorySeparatorChar == '\\' ? inspectVarsPath.Replace('/','\\') : inspectVarsPath.Replace('\\','/') : VarsName; - if (varsPath.IndexOf(Path.PathSeparator) >= 0) + if (varsPath.IndexOf(Path.DirectorySeparatorChar) >= 0) Path.GetDirectoryName(varsPath).AssertDir(); File.WriteAllText(varsPath, anonArgs.ToSafeJson()); From c1d36202759344c140dbc8cac32755aeb46da75a Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 13 Dec 2020 19:20:04 +0800 Subject: [PATCH 243/372] Only write vars.json if INSPECT_VARS is set --- src/ServiceStack.Text/Inspect.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/ServiceStack.Text/Inspect.cs b/src/ServiceStack.Text/Inspect.cs index 8a08ea724..cce08faa0 100644 --- a/src/ServiceStack.Text/Inspect.cs +++ b/src/ServiceStack.Text/Inspect.cs @@ -20,14 +20,12 @@ public static void DefaultVarsFilter(object anonArgs) try { var inspectVarsPath = Environment.GetEnvironmentVariable("INSPECT_VARS"); - if (inspectVarsPath == "0") // Disable + if (string.IsNullOrEmpty(inspectVarsPath)) // Disable return; - var varsPath = inspectVarsPath?.Length > 0 - ? Path.DirectorySeparatorChar == '\\' - ? inspectVarsPath.Replace('/','\\') - : inspectVarsPath.Replace('\\','/') - : VarsName; + var varsPath = Path.DirectorySeparatorChar == '\\' + ? inspectVarsPath.Replace('/','\\') + : inspectVarsPath.Replace('\\','/'); if (varsPath.IndexOf(Path.DirectorySeparatorChar) >= 0) Path.GetDirectoryName(varsPath).AssertDir(); From a08c2ea403329161f0434d3c2a65fc62686e8dcf Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 24 Dec 2020 23:27:27 +0800 Subject: [PATCH 244/372] Add missing APIs in Inspect to match APIs alt languages --- src/ServiceStack.Text/Inspect.cs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Inspect.cs b/src/ServiceStack.Text/Inspect.cs index cce08faa0..202ee4fec 100644 --- a/src/ServiceStack.Text/Inspect.cs +++ b/src/ServiceStack.Text/Inspect.cs @@ -14,6 +14,8 @@ public static class Config public const string VarsName = "vars.json"; public static Action VarsFilter { get; set; } = DefaultVarsFilter; + + public static Func DumpTableFilter { get; set; } public static void DefaultVarsFilter(object anonArgs) { @@ -34,7 +36,7 @@ public static void DefaultVarsFilter(object anonArgs) } catch (Exception ex) { - Tracer.Instance.WriteError("Inspect.Vars() Error: " + ex); + Tracer.Instance.WriteError("Inspect.vars() Error: " + ex); } } } @@ -45,5 +47,27 @@ public static void DefaultVarsFilter(object anonArgs) /// Anonymous object with named value // ReSharper disable once InconsistentNaming public static void vars(object anonArgs) => Config.VarsFilter?.Invoke(anonArgs); + + /// + /// Recursively prints the contents of any POCO object in a human-friendly, readable format + /// + public static string dump(this T instance) => instance.Dump(); + + /// + /// Print Dump to Console.WriteLine + /// + public static void printDump(this T instance) => instance.PrintDump(); + + /// + /// Dump object in Ascii Markdown table + /// + public static string dumpTable(object instance) => Config.DumpTableFilter != null + ? Config.DumpTableFilter(instance) + : throw new NotImplementedException("Config.DumpTableFilter is not configured, call JS.Configure()"); + + /// + /// Print Dump object in Ascii Markdown table + /// + public static void printDumpTable(this object target) => PclExport.Instance.WriteLine(dumpTable(target)); } } \ No newline at end of file From 4602401ff03b27075c6034e20a70f02f46a23749 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 25 Dec 2020 23:16:32 +0800 Subject: [PATCH 245/372] Move Inspect to SS.Common --- src/ServiceStack.Text/Inspect.cs | 73 -------------------------------- 1 file changed, 73 deletions(-) delete mode 100644 src/ServiceStack.Text/Inspect.cs diff --git a/src/ServiceStack.Text/Inspect.cs b/src/ServiceStack.Text/Inspect.cs deleted file mode 100644 index 202ee4fec..000000000 --- a/src/ServiceStack.Text/Inspect.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.IO; -using ServiceStack.Text; - -namespace ServiceStack -{ - /// - /// Helper utility for inspecting variables - /// - public static class Inspect - { - public static class Config - { - public const string VarsName = "vars.json"; - - public static Action VarsFilter { get; set; } = DefaultVarsFilter; - - public static Func DumpTableFilter { get; set; } - - public static void DefaultVarsFilter(object anonArgs) - { - try - { - var inspectVarsPath = Environment.GetEnvironmentVariable("INSPECT_VARS"); - if (string.IsNullOrEmpty(inspectVarsPath)) // Disable - return; - - var varsPath = Path.DirectorySeparatorChar == '\\' - ? inspectVarsPath.Replace('/','\\') - : inspectVarsPath.Replace('\\','/'); - - if (varsPath.IndexOf(Path.DirectorySeparatorChar) >= 0) - Path.GetDirectoryName(varsPath).AssertDir(); - - File.WriteAllText(varsPath, anonArgs.ToSafeJson()); - } - catch (Exception ex) - { - Tracer.Instance.WriteError("Inspect.vars() Error: " + ex); - } - } - } - - /// - /// Dump serialized values to 'vars.json' - /// - /// Anonymous object with named value - // ReSharper disable once InconsistentNaming - public static void vars(object anonArgs) => Config.VarsFilter?.Invoke(anonArgs); - - /// - /// Recursively prints the contents of any POCO object in a human-friendly, readable format - /// - public static string dump(this T instance) => instance.Dump(); - - /// - /// Print Dump to Console.WriteLine - /// - public static void printDump(this T instance) => instance.PrintDump(); - - /// - /// Dump object in Ascii Markdown table - /// - public static string dumpTable(object instance) => Config.DumpTableFilter != null - ? Config.DumpTableFilter(instance) - : throw new NotImplementedException("Config.DumpTableFilter is not configured, call JS.Configure()"); - - /// - /// Print Dump object in Ascii Markdown table - /// - public static void printDumpTable(this object target) => PclExport.Instance.WriteLine(dumpTable(target)); - } -} \ No newline at end of file From d3f474c430aec23ebd4e0c608c56fed0eff71dd9 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 30 Dec 2020 20:41:45 +0800 Subject: [PATCH 246/372] Add .jar Mimetype --- src/ServiceStack.Text/HttpUtils.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 1795c2e5f..1e704699f 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1391,6 +1391,7 @@ public static class MimeTypes public const string ProtoBuf = "application/x-protobuf"; public const string JavaScript = "text/javascript"; public const string WebAssembly = "application/wasm"; + public const string Jar = "application/java-archive"; public const string FormUrlEncoded = "application/x-www-form-urlencoded"; public const string MultiPartFormData = "multipart/form-data"; @@ -1515,6 +1516,7 @@ public static bool IsBinary(string contentType) case MsWord: case Compressed: case WebAssembly: + case Jar: return true; } @@ -1717,6 +1719,9 @@ public static string GetMimeType(string fileNameOrExt) return "application/font-woff"; case "woff2": return "application/font-woff2"; + + case "jar": + return Jar; case "aaf": case "aca": From 8b92144b50a87a763a4ea60c0767e8c07007daae Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 31 Dec 2020 01:11:50 +0800 Subject: [PATCH 247/372] Add source files mimetypes --- src/ServiceStack.Text/HttpUtils.cs | 55 +++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 1e704699f..9ca0a9c64 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1560,12 +1560,17 @@ public static string GetMimeType(string fileNameOrExt) switch (fileExt) { case "jpeg": + return "image/jpeg"; case "gif": + return "image/gif"; case "png": + return "image/png"; case "tiff": + return "image/tiff"; case "bmp": + return "image/bmp"; case "webp": - return "image/" + fileExt; + return "image/webp"; case "jpg": return "image/jpeg"; @@ -1586,10 +1591,8 @@ public static string GetMimeType(string fileNameOrExt) case "js": return "text/javascript"; - case "ts": - return "text/x.typescript"; - + return "text/typescript"; case "jsx": return "text/jsx"; @@ -1598,12 +1601,49 @@ public static string GetMimeType(string fileNameOrExt) case "css": return Css; - case "sgml": - return "text/" + fileExt; + case "cs": + return "text/x-csharp"; + case "fs": + return "text/x-fsharp"; + case "vb": + return "text/x-vb"; + case "dart": + return "application/dart"; + case "go": + return "text/x-go"; + case "kt": + case "kts": + return "text/x-kotlin"; + case "java": + return "text/x-java"; + case "py": + return "text/x-python"; + case "groovy": + case "gradle": + return "text/x-groovy"; + + case "yml": + case "yaml": + return YamlText; + + case "sh": + return "text/x-sh"; + case "bat": + case "cmd": + return "application/bat"; + + case "xml": + case "csproj": + case "fsproj": + case "vbproj": + return "text/xml"; case "txt": return "text/plain"; + case "sgml": + return "text/sgml"; + case "mp3": return "audio/mpeg3"; @@ -1722,7 +1762,7 @@ public static string GetMimeType(string fileNameOrExt) case "jar": return Jar; - + case "aaf": case "aca": case "asd": @@ -1740,7 +1780,6 @@ public static string GetMimeType(string fileNameOrExt) case "fla": case "ics": case "inf": - case "java": case "mix": case "msi": case "mso": From c1358e55154cfd9f580f5949867b4bafa108ece6 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 4 Jan 2021 09:20:59 +0800 Subject: [PATCH 248/372] Add .ps1 --- src/ServiceStack.Text/HttpUtils.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 9ca0a9c64..baf2906f3 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1639,6 +1639,7 @@ public static string GetMimeType(string fileNameOrExt) return "text/xml"; case "txt": + case "ps1": return "text/plain"; case "sgml": From 6571e1c1e5b44865da4cbb1d10cd000a36c82655 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 6 Jan 2021 04:55:13 +0800 Subject: [PATCH 249/372] Add .dmg/.pkg mimetypes --- src/ServiceStack.Text/HttpUtils.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index baf2906f3..ff322d197 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1392,6 +1392,8 @@ public static class MimeTypes public const string JavaScript = "text/javascript"; public const string WebAssembly = "application/wasm"; public const string Jar = "application/java-archive"; + public const string Dmg = "application/x-apple-diskimage"; + public const string Pkg = "application/x-newton-compatible-pkg"; public const string FormUrlEncoded = "application/x-www-form-urlencoded"; public const string MultiPartFormData = "multipart/form-data"; @@ -1517,6 +1519,8 @@ public static bool IsBinary(string contentType) case Compressed: case WebAssembly: case Jar: + case Dmg: + case Pkg: return true; } @@ -1804,6 +1808,11 @@ public static string GetMimeType(string fileNameOrExt) case "wasm": return WebAssembly; + + case "dmg": + return Dmg; + case "pkg": + return Pkg; default: return "application/" + fileExt; From 5534bc8e1abebc904a36478c6fd3d78c55133371 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 12 Jan 2021 17:46:05 +0800 Subject: [PATCH 250/372] bump to v5.10.4 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 47f0ad2bf..4fe2359fa 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.10.3 + 5.10.4 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 2732f39f8..8f9fed925 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.10.3 + 5.10.4 latest false From 3d42b6f43e30f1e99b55b4e2d4465d70e0f5b4e6 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 14 Jan 2021 15:26:42 +0800 Subject: [PATCH 251/372] bump to v5.10.5 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 4fe2359fa..8a57b7395 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.10.4 + 5.10.5 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 8f9fed925..a5d2ef449 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.10.4 + 5.10.5 latest false From e03bbb09cabf8414f19436ee24af11b970ea9503 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 20 Jan 2021 22:56:25 +0800 Subject: [PATCH 252/372] Convert TestsConsole to net5.0 Console App --- .../ServiceStack.Text.TestsConsole/App.config | 6 -- .../ServiceStack.Text.TestsConsole/Program.cs | 79 ++++++++++++++++++- .../Properties/AssemblyInfo.cs | 36 --------- .../ServiceStack.Text.TestsConsole.csproj | 28 ++----- 4 files changed, 80 insertions(+), 69 deletions(-) delete mode 100644 tests/ServiceStack.Text.TestsConsole/App.config delete mode 100644 tests/ServiceStack.Text.TestsConsole/Properties/AssemblyInfo.cs diff --git a/tests/ServiceStack.Text.TestsConsole/App.config b/tests/ServiceStack.Text.TestsConsole/App.config deleted file mode 100644 index 8e1564635..000000000 --- a/tests/ServiceStack.Text.TestsConsole/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/ServiceStack.Text.TestsConsole/Program.cs b/tests/ServiceStack.Text.TestsConsole/Program.cs index a1c969e84..cf13c08d4 100644 --- a/tests/ServiceStack.Text.TestsConsole/Program.cs +++ b/tests/ServiceStack.Text.TestsConsole/Program.cs @@ -5,14 +5,17 @@ using System.Reflection.Emit; using NUnit.Framework; using ServiceStack.Common.Tests; +using ServiceStack.OrmLite; using ServiceStack.Reflection; namespace ServiceStack.Text.TestsConsole { class Program { - static void Main(string[] args) + public static void Main(string[] args) { + PrintDumpColumnSchema(); + //var da = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("dyn"), AssemblyBuilderAccess.Save); //var dm = da.DefineDynamicModule("dyn_mod", "dyn.dll"); @@ -33,9 +36,9 @@ static void Main(string[] args) //dt.CreateType(); //da.Save("dyn.dll"); - new StringConcatPerfTests { - MultipleIterations = new[] { 1000, 10000, 100000, 1000000, 10000000 } - }.Compare_interpolation_vs_string_Concat(); + // new StringConcatPerfTests { + // MultipleIterations = new[] { 1000, 10000, 100000, 1000000, 10000000 } + // }.Compare_interpolation_vs_string_Concat(); Console.ReadLine(); } @@ -58,5 +61,73 @@ public void Compare_interpolation_vs_string_Concat() public static object SimpleFormat(string text) => string.Format("Hi {0}", text); public static object SimpleConcat(string text) => "Hi " + text; + + public static void PrintDumpColumnSchema() + { + var dbFactory = new OrmLiteConnectionFactory(":memory:", + SqliteDialect.Provider); + + using var db = dbFactory.Open(); + db.CreateTableIfNotExists(); + + ColumnSchema[] columnSchemas = db.GetTableColumns(); + + columnSchemas.Each(x => x.ToString().Print()); + columnSchemas.Each(x => x.PrintDump()); + } + + public class Person + { + public static Person[] Rockstars = { + new(1, "Jimi", "Hendrix", 27), + new(2, "Janis", "Joplin", 27), + new(3, "Jim", "Morrisson", 27), + new(4, "Kurt", "Cobain", 27), + new(5, "Elvis", "Presley", 42), + new(6, "Michael", "Jackson", 50), + }; + + public int Id { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } + public int Age { get; set; } + + public Person() { } + public Person(int id, string firstName, string lastName, int age) + { + Id = id; + FirstName = firstName; + LastName = lastName; + Age = age; + } + + protected bool Equals(Person other) + { + return Id == other.Id && + string.Equals(FirstName, other.FirstName) && + string.Equals(LastName, other.LastName) && + Age == other.Age; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((Person)obj); + } + + public override int GetHashCode() + { + unchecked + { + var hashCode = Id; + hashCode = (hashCode * 397) ^ (FirstName != null ? FirstName.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ (LastName != null ? LastName.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ Age; + return hashCode; + } + } + } } } diff --git a/tests/ServiceStack.Text.TestsConsole/Properties/AssemblyInfo.cs b/tests/ServiceStack.Text.TestsConsole/Properties/AssemblyInfo.cs deleted file mode 100644 index 3e64f0e3d..000000000 --- a/tests/ServiceStack.Text.TestsConsole/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ServiceStack.Text.TestsConsole")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("ServiceStack.Text.TestsConsole")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("dd3beb33-2509-423a-8545-ce1a83684530")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj index c8f4f104c..e4f1bfb69 100644 --- a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj +++ b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj @@ -1,35 +1,17 @@  Exe - net45 - false - false - false - false - false - false - false - false + net5.0 - - - + + + - - - - - - - - - - - + \ No newline at end of file From 379c4ffb525945b799e4350098020d863ff8e61c Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 20 Jan 2021 22:59:20 +0800 Subject: [PATCH 253/372] Add JsConfig.ExcludeTypeNames + guard against TargetIE --- src/ServiceStack.Text/JsConfig.cs | 6 ++++++ src/ServiceStack.Text/JsConfigScope.cs | 10 ++++++++-- src/ServiceStack.Text/ReflectionExtensions.cs | 3 ++- src/ServiceStack.Text/TypeSerializer.cs | 2 +- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/ServiceStack.Text/JsConfig.cs b/src/ServiceStack.Text/JsConfig.cs index 3e8221307..964ceac6e 100644 --- a/src/ServiceStack.Text/JsConfig.cs +++ b/src/ServiceStack.Text/JsConfig.cs @@ -641,6 +641,12 @@ public static HashSet ExcludeTypes set => Config.AssertNotInit().ExcludeTypes = value; } + public static HashSet ExcludeTypeNames + { + get => JsConfigScope.Current != null ? JsConfigScope.Current.ExcludeTypeNames : Config.Instance.ExcludeTypeNames; + set => Config.AssertNotInit().ExcludeTypeNames = value; + } + public static string[] IgnoreAttributesNamed { set => ReflectionExtensions.IgnoreAttributesNamed = value; diff --git a/src/ServiceStack.Text/JsConfigScope.cs b/src/ServiceStack.Text/JsConfigScope.cs index 25e21030b..2bdded048 100644 --- a/src/ServiceStack.Text/JsConfigScope.cs +++ b/src/ServiceStack.Text/JsConfigScope.cs @@ -58,7 +58,7 @@ public void Dispose() public class Config { private static Config instance; - internal static Config Instance => instance ?? (instance = new Config(Defaults)); + internal static Config Instance => instance ??= new Config(Defaults); internal static bool HasInit = false; public static Config AssertNotInit() => HasInit @@ -176,6 +176,7 @@ public bool EmitLowercaseUnderscoreNames public EmptyCtorFactoryDelegate ModelFactory { get; set; } public string[] ExcludePropertyReferences { get; set; } public HashSet ExcludeTypes { get; set; } + public HashSet ExcludeTypeNames { get; set; } public bool EscapeUnicode { get; set; } public bool EscapeHtmlChars { get; set; } @@ -216,7 +217,11 @@ public bool EmitLowercaseUnderscoreNames MaxDepth = 50, OnDeserializationError = null, ModelFactory = ReflectionExtensions.GetConstructorMethodToCache, - ExcludeTypes = new HashSet { typeof(System.IO.Stream) }, + ExcludeTypes = new HashSet { + typeof(System.IO.Stream), + typeof(System.Reflection.MethodBase), + }, + ExcludeTypeNames = new HashSet {} }; public Config Populate(Config config) @@ -257,6 +262,7 @@ public Config Populate(Config config) OnDeserializationError = config.OnDeserializationError; ModelFactory = config.ModelFactory; ExcludeTypes = config.ExcludeTypes; + ExcludeTypeNames = config.ExcludeTypeNames; return this; } } diff --git a/src/ServiceStack.Text/ReflectionExtensions.cs b/src/ServiceStack.Text/ReflectionExtensions.cs index f8d18387a..4f3aeae96 100644 --- a/src/ServiceStack.Text/ReflectionExtensions.cs +++ b/src/ServiceStack.Text/ReflectionExtensions.cs @@ -637,7 +637,8 @@ public static PropertyInfo[] OnlySerializableProperties(this PropertyInfo[] prop var name = attr.GetType().Name; return !IgnoreAttributesNamed.Contains(name); })) - .Where(prop => !JsConfig.ExcludeTypes.Contains(prop.PropertyType)) + .Where(prop => !(JsConfig.ExcludeTypes.Contains(prop.PropertyType) || + JsConfig.ExcludeTypeNames.Contains(prop.PropertyType.FullName))) .ToArray(); } diff --git a/src/ServiceStack.Text/TypeSerializer.cs b/src/ServiceStack.Text/TypeSerializer.cs index 586e52f2a..db3113fb5 100644 --- a/src/ServiceStack.Text/TypeSerializer.cs +++ b/src/ServiceStack.Text/TypeSerializer.cs @@ -346,7 +346,7 @@ private static bool HasCircularReferences(object value, Stack parentValu { var type = value?.GetType(); - if (type == null || !type.IsClass || value is string) + if (type == null || !type.IsClass || value is string || value is Type) return false; if (parentValues == null) From 3e5a8407f28a9db78aa35e4eadd6f239ec2914f7 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 7 Feb 2021 00:43:46 +0800 Subject: [PATCH 254/372] Add IsValidVarRef --- src/ServiceStack.Text/StringExtensions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index aef13ff7a..3da0ed84f 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -952,6 +952,7 @@ public static bool ContainsAny(this string text, string[] testMatches, StringCom } public static bool IsValidVarName(this string name) => InvalidVarCharsRegex.IsMatch(name); + public static bool IsValidVarRef(this string name) => InvalidVarRefCharsRegex.IsMatch(name); public static string SafeVarName(this string text) => !string.IsNullOrEmpty(text) ? InvalidVarCharsRegex.Replace(text, "_") : null; From 9713ca9e251a3eb73243843196cb72b94f1883a8 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 7 Feb 2021 02:38:02 +0800 Subject: [PATCH 255/372] Update IsValidVarName/IsValidVarRef --- src/ServiceStack.Text/StringExtensions.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 3da0ed84f..e2b6b5105 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -853,10 +853,13 @@ public static bool EndsWithInvariant(this string str, string endsWith) return str.EndsWith(endsWith, PclExport.Instance.InvariantComparison); } - private static readonly Regex InvalidVarCharsRegex = new Regex(@"[^A-Za-z0-9_]", RegexOptions.Compiled); - private static readonly Regex InvalidVarRefCharsRegex = new Regex(@"[^A-Za-z0-9._]", RegexOptions.Compiled); - private static readonly Regex SplitCamelCaseRegex = new Regex("([A-Z]|[0-9]+)", RegexOptions.Compiled); - private static readonly Regex HttpRegex = new Regex(@"^http://", + private static readonly Regex InvalidVarCharsRegex = new(@"[^A-Za-z0-9_]", RegexOptions.Compiled); + private static readonly Regex ValidVarCharsRegex = new(@"^[A-Za-z0-9_]+$", RegexOptions.Compiled); + private static readonly Regex InvalidVarRefCharsRegex = new(@"[^A-Za-z0-9._]", RegexOptions.Compiled); + private static readonly Regex ValidVarRefCharsRegex = new(@"^[A-Za-z0-9._]+$", RegexOptions.Compiled); + + private static readonly Regex SplitCamelCaseRegex = new("([A-Z]|[0-9]+)", RegexOptions.Compiled); + private static readonly Regex HttpRegex = new(@"^http://", PclExport.Instance.RegexOptions | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); public static T ToEnum(this string value) @@ -951,8 +954,8 @@ public static bool ContainsAny(this string text, string[] testMatches, StringCom return false; } - public static bool IsValidVarName(this string name) => InvalidVarCharsRegex.IsMatch(name); - public static bool IsValidVarRef(this string name) => InvalidVarRefCharsRegex.IsMatch(name); + public static bool IsValidVarName(this string name) => ValidVarCharsRegex.IsMatch(name); + public static bool IsValidVarRef(this string name) => ValidVarRefCharsRegex.IsMatch(name); public static string SafeVarName(this string text) => !string.IsNullOrEmpty(text) ? InvalidVarCharsRegex.Replace(text, "_") : null; From a87908376713bed424de41981cfd0e3498f89760 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 9 Feb 2021 16:19:18 +0800 Subject: [PATCH 256/372] Create CompositeKeyIssue.cs --- .../Issues/CompositeKeyIssue.cs | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 tests/ServiceStack.Text.Tests/Issues/CompositeKeyIssue.cs diff --git a/tests/ServiceStack.Text.Tests/Issues/CompositeKeyIssue.cs b/tests/ServiceStack.Text.Tests/Issues/CompositeKeyIssue.cs new file mode 100644 index 000000000..daae1a98b --- /dev/null +++ b/tests/ServiceStack.Text.Tests/Issues/CompositeKeyIssue.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using NUnit.Framework; + +namespace ServiceStack.Text.Tests.Issues +{ + public class Container + { + public IDictionary Data { get; set; } = new Dictionary(); + } + + public struct CompositeKey + { + public string Name { get; set; } + public bool Value { get; set; } + public CompositeKey(string name, bool value) + { + Name = name; + Value = value; + } + + public CompositeKey(string jsonKey) + { + Name = jsonKey.LeftPart(':'); + Value = jsonKey.RightPart(':').ConvertTo(); + } + + public bool Equals(CompositeKey other) => + Name == other.Name && Value == other.Value; + + public override bool Equals(object obj) => + obj is CompositeKey other && Equals(other); + + public override int GetHashCode() + { + unchecked + { + return ((Name != null ? Name.GetHashCode() : 0) * 397) + ^ Value.GetHashCode(); + } + } + + public override string ToString() => $"{Name}:{Value}"; + } + + + public class CompositeKeyIssue + { + [Test] + public void Can_serialize_CompositeKey() + { + var dto = new Container + { + Data = new Dictionary + { + { new CompositeKey("abc", false), new[] { "1","2","3"} }, + { new CompositeKey("bdf", true), new[] { "b","c","d"} }, + { new CompositeKey("ceg", false), new[] { "4","5","6"} }, + } + }; + + var serialized = JsonSerializer.SerializeToString(dto); + var fromJson = JsonSerializer.DeserializeFromString>(serialized); + + Assert.That(fromJson.Data.Count, Is.EqualTo(dto.Data.Count)); + Assert.That(fromJson.Data, Is.EqualTo(dto.Data)); + } + } +} \ No newline at end of file From 1e192f3d9954a50c5f2b8ef1a49c8167c6dd7df4 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 11 Feb 2021 02:51:03 +0800 Subject: [PATCH 257/372] Include backticks in StripQuotes --- src/ServiceStack.Text/StringExtensions.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index e2b6b5105..d6fa7c54d 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -698,7 +698,8 @@ public static string StripQuotes(this string text) return string.IsNullOrEmpty(text) || text.Length < 2 ? text : (text[0] == '"' && text[text.Length - 1] == '"') || - (text[0] == '\'' && text[text.Length - 1] == '\'') + (text[0] == '\'' && text[text.Length - 1] == '\'') || + (text[0] == '`' && text[text.Length - 1] == '`') ? text.Substring(1, text.Length - 2) : text; } From 9a11551d55154db5204d427322eb2a0f92aebf96 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 22 Feb 2021 12:34:50 +0800 Subject: [PATCH 258/372] Add Lazy alternatives for prop AllAttributes & change First/Has to use them --- src/ServiceStack.Text/PlatformExtensions.cs | 69 +++++++++++++++++---- 1 file changed, 58 insertions(+), 11 deletions(-) diff --git a/src/ServiceStack.Text/PlatformExtensions.cs b/src/ServiceStack.Text/PlatformExtensions.cs index b6f6cb401..aabf7f366 100644 --- a/src/ServiceStack.Text/PlatformExtensions.cs +++ b/src/ServiceStack.Text/PlatformExtensions.cs @@ -131,7 +131,7 @@ public static MethodInfo GetInstanceMethod(this Type type, string methodName) => public static bool HasAttribute(this PropertyInfo pi) => pi.AllAttributes().Any(x => x.GetType() == typeof(T)); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool HasAttributeOf(this PropertyInfo pi) => pi.AllAttributes().Any(x => x is T); + public static bool HasAttributeOf(this PropertyInfo pi) => pi.AllAttributesLazy().Any(x => x is T); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool HasAttribute(this FieldInfo fi) => fi.AllAttributes().Any(x => x.GetType() == typeof(T)); @@ -145,7 +145,7 @@ public static MethodInfo GetInstanceMethod(this Type type, string methodName) => [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool HasAttributeOf(this MethodInfo mi) => mi.AllAttributes().Any(x => x is T); - private static readonly ConcurrentDictionary, bool> hasAttributeCache = new ConcurrentDictionary, bool>(); + private static readonly ConcurrentDictionary, bool> hasAttributeCache = new(); public static bool HasAttributeCached(this MemberInfo memberInfo) { var key = new Tuple(memberInfo, typeof(T)); @@ -200,7 +200,7 @@ public static bool HasAttributeNamed(this Type type, string name) public static bool HasAttributeNamed(this PropertyInfo pi, string name) { var normalizedAttr = name.Replace("Attribute", "").ToLower(); - return pi.AllAttributes().Any(x => x.GetType().Name.Replace("Attribute", "").ToLower() == normalizedAttr); + return pi.AllAttributesLazy().Any(x => x.GetType().Name.Replace("Attribute", "").ToLower() == normalizedAttr); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -241,11 +241,9 @@ public static PropertyInfo[] AllProperties(this Type type) => type.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); //Should only register Runtime Attributes on StartUp, So using non-ThreadSafe Dictionary is OK - static Dictionary> propertyAttributesMap - = new Dictionary>(); + static Dictionary> propertyAttributesMap = new(); - static Dictionary> typeAttributesMap - = new Dictionary>(); + static Dictionary> typeAttributesMap = new(); public static void ClearRuntimeAttributes() { @@ -335,6 +333,20 @@ public static object[] AllAttributes(this PropertyInfo propertyInfo) return runtimeAttrs.Cast().ToArray(); } + public static IEnumerable AllAttributesLazy(this PropertyInfo propertyInfo) + { + var attrs = propertyInfo.GetCustomAttributes(true); + var runtimeAttrs = propertyInfo.GetAttributes(); + foreach (var attr in runtimeAttrs) + { + yield return attr; + } + foreach (var attr in attrs) + { + yield return attr; + } + } + public static object[] AllAttributes(this PropertyInfo propertyInfo, Type attrType) { var attrs = propertyInfo.GetCustomAttributes(attrType, true); @@ -346,6 +358,18 @@ public static object[] AllAttributes(this PropertyInfo propertyInfo, Type attrTy return runtimeAttrs.Cast().ToArray(); } + public static IEnumerable AllAttributesLazy(this PropertyInfo propertyInfo, Type attrType) + { + foreach (var attr in propertyInfo.GetAttributes(attrType)) + { + yield return attr; + } + foreach (var attr in propertyInfo.GetCustomAttributes(attrType, true)) + { + yield return attr; + } + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static object[] AllAttributes(this ParameterInfo paramInfo) => paramInfo.GetCustomAttributes(true); @@ -373,6 +397,15 @@ public static object[] AllAttributes(this MemberInfo memberInfo, Type attrType) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static object[] AllAttributes(this Type type) => type.GetCustomAttributes(true).Union(type.GetRuntimeAttributes()).ToArray(); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static IEnumerable AllAttributesLazy(this Type type) + { + foreach (var attr in type.GetRuntimeAttributes()) + yield return attr; + foreach (var attr in type.GetCustomAttributes(true)) + yield return attr; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static object[] AllAttributes(this Type type, Type attrType) => type.GetCustomAttributes(attrType, true).Union(type.GetRuntimeAttributes(attrType)).ToArray(); @@ -392,6 +425,9 @@ public static object[] AllAttributes(this Type type, Type attrType) => [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TAttr[] AllAttributes(this PropertyInfo pi) => pi.AllAttributes(typeof(TAttr)).Cast().ToArray(); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static IEnumerable AllAttributesLazy(this PropertyInfo pi) => pi.AllAttributesLazy(typeof(TAttr)).Cast(); + [MethodImpl(MethodImplOptions.AggressiveInlining)] static IEnumerable GetRuntimeAttributes(this Type type) => typeAttributesMap.TryGetValue(type, out var attrs) ? attrs.OfType() @@ -411,6 +447,19 @@ public static TAttr[] AllAttributes(this Type type) .ToArray(); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static IEnumerable AllAttributesLazy(this Type type) + { + foreach (var attr in type.GetCustomAttributes(typeof(TAttr), true).OfType()) + { + yield return attr; + } + foreach (var attr in type.GetRuntimeAttributes()) + { + yield return attr; + } + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static TAttr FirstAttribute(this Type type) where TAttr : class { @@ -432,10 +481,8 @@ public static TAttribute FirstAttribute(this ParameterInfo paramInfo } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TAttribute FirstAttribute(this PropertyInfo propertyInfo) - { - return propertyInfo.AllAttributes().FirstOrDefault(); - } + public static TAttribute FirstAttribute(this PropertyInfo propertyInfo) => + propertyInfo.AllAttributesLazy().FirstOrDefault(); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Type FirstGenericTypeDefinition(this Type type) From 787821fda1fb46f094f090ccbc26bf42ae2d76cf Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 22 Feb 2021 19:15:27 +0800 Subject: [PATCH 259/372] Add HasAttributeOf + AllAttributesLazy test --- .../ReflectionExtensionTests.cs | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tests/ServiceStack.Text.Tests/ReflectionExtensionTests.cs b/tests/ServiceStack.Text.Tests/ReflectionExtensionTests.cs index f30720e75..ca8c7e780 100644 --- a/tests/ServiceStack.Text.Tests/ReflectionExtensionTests.cs +++ b/tests/ServiceStack.Text.Tests/ReflectionExtensionTests.cs @@ -146,9 +146,50 @@ public void Can_use_HasAttributeCached() Assert.That(typeof(CharEnum).HasAttributeCached()); Assert.That(typeof(CharEnum).HasAttribute()); } + + [Test] + public void Can_use_lazy_HasAttributeOf_APIs() + { + var props = typeof(DeclarativeValidationTest).GetPublicProperties(); + Assert.That(props.Length, Is.EqualTo(3)); + + var locationsProp = props.FirstOrDefault(x => + x.PropertyType != typeof(string) && x.PropertyType.GetTypeWithGenericInterfaceOf(typeof(IEnumerable<>)) != null); + + Assert.That(locationsProp.Name, Is.EqualTo(nameof(DeclarativeValidationTest.Locations))); + + var genericDef = locationsProp.PropertyType.GetTypeWithGenericInterfaceOf(typeof(IEnumerable<>)); + var elementType = genericDef.GetGenericArguments()[0]; + var elementProps = elementType.GetPublicProperties(); + var hasAnyChildValidators = elementProps + .Any(elProp => elProp.HasAttributeOf()); + Assert.That(hasAnyChildValidators); + } } public class GenericType { } public class GenericType { } public class GenericType { } + + public class Location + { + public string Name { get; set; } + [ValidateMaximumLength(20)] + public string Value { get; set; } + } + + public class DeclarativeValidationTest : IReturn + { + [ValidateNotEmpty] + [ValidateMaximumLength(20)] + public string Site { get; set; } + public List Locations { get; set; } // **** here's the example + public List NoValidators { get; set; } + } + + public class NoValidators + { + public string Name { get; set; } + public string Value { get; set; } + } } From 47ca69175b0affafea9538222fc5a35848fa9adf Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 26 Feb 2021 09:02:57 +0800 Subject: [PATCH 260/372] Remove tests /obj for clean builds --- build/build-core.proj | 2 ++ build/build-deps.proj | 2 ++ 2 files changed, 4 insertions(+) diff --git a/build/build-core.proj b/build/build-core.proj index 96c19ec52..ae2482002 100644 --- a/build/build-core.proj +++ b/build/build-core.proj @@ -12,6 +12,7 @@ $(MSBuildProjectDirectory)/.. $(BuildSolutionDir)/src + $(BuildSolutionDir)/tests Release $(BuildSolutionDir)/NuGet/ $(MajorVersion).$(MinorVersion).$(PatchVersion) @@ -40,6 +41,7 @@ + diff --git a/build/build-deps.proj b/build/build-deps.proj index c36735aa1..127763cae 100644 --- a/build/build-deps.proj +++ b/build/build-deps.proj @@ -12,6 +12,7 @@ $(MSBuildProjectDirectory)/.. $(BuildSolutionDir)/src + $(BuildSolutionDir)/tests Release $(BuildSolutionDir)/NuGet/ $(MajorVersion).$(MinorVersion).$(PatchVersion) @@ -38,6 +39,7 @@ + From aaebd60e99cee2824f0959fd86e99a3568a4a940 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 26 Feb 2021 16:44:07 +0800 Subject: [PATCH 261/372] bump to 5.105 --- src/ServiceStack.Text/Env.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 9922e477d..db6d963e6 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -113,7 +113,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.103m; + public static decimal ServiceStackVersion = 5.105m; public static bool IsLinux { get; set; } From 1e2c2ada57432e6e887e5e7d35defa7847c51ab8 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 28 Feb 2021 09:31:25 +0800 Subject: [PATCH 262/372] Fix ConvertObjectTypesIntoStringDictionary when value starts with obj literal --- src/ServiceStack.Text/Common/DeserializeType.cs | 6 ++++-- .../JsonTests/AnonymousDeserializationTests.cs | 13 +++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/Common/DeserializeType.cs b/src/ServiceStack.Text/Common/DeserializeType.cs index ce3a9abc4..47571abe6 100644 --- a/src/ServiceStack.Text/Common/DeserializeType.cs +++ b/src/ServiceStack.Text/Common/DeserializeType.cs @@ -74,7 +74,9 @@ public static object ObjectStringToType(ReadOnlySpan strType) if (config.ConvertObjectTypesIntoStringDictionary && !strType.IsNullOrEmpty()) { - if (strType[0] == JsWriter.MapStartChar) + var firstChar = strType[0]; + var endChar = strType[strType.Length - 1]; + if (firstChar == JsWriter.MapStartChar && endChar == JsWriter.MapEndChar) { var dynamicMatch = DeserializeDictionary.ParseDictionary(strType, null, v => Serializer.UnescapeString(v).ToString(), v => Serializer.UnescapeString(v).ToString()); if (dynamicMatch != null && dynamicMatch.Count > 0) @@ -83,7 +85,7 @@ public static object ObjectStringToType(ReadOnlySpan strType) } } - if (strType[0] == JsWriter.ListStartChar) + if (firstChar == JsWriter.ListStartChar && endChar == JsWriter.ListEndChar) { return DeserializeList, TSerializer>.ParseStringSpan(strType); } diff --git a/tests/ServiceStack.Text.Tests/JsonTests/AnonymousDeserializationTests.cs b/tests/ServiceStack.Text.Tests/JsonTests/AnonymousDeserializationTests.cs index b73809884..71638f632 100644 --- a/tests/ServiceStack.Text.Tests/JsonTests/AnonymousDeserializationTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonTests/AnonymousDeserializationTests.cs @@ -77,5 +77,18 @@ public void Deserialize_dynamic_json_with_inner_obj_and_array() var phone2 = dyn.obj.phones[1].number; Assert.AreEqual(phone2, "39967"); } + + [Test] + public void Deserialize_dynamic_json_with_keys_starting_with_object_literal() + { + using (JsConfig.With(new Config {ConvertObjectTypesIntoStringDictionary = true})) + { + var json = @"{""prop1"": ""value1"", ""prop2"": ""{tag} value2"", ""prop3"": { ""A"" : 1 } }"; + var obj = json.FromJson>(); + Assert.That(obj["prop1"], Is.EqualTo("value1")); + Assert.That(obj["prop2"], Is.EqualTo("{tag} value2")); + Assert.That(obj["prop3"], Is.EqualTo(new Dictionary { ["A"] = "1" })); + } + } } } \ No newline at end of file From 4de0db7e72606044e5886dca895491f1177b6944 Mon Sep 17 00:00:00 2001 From: Eaton Zveare Date: Tue, 9 Mar 2021 22:56:13 -0500 Subject: [PATCH 263/372] Add mime type (#531) --- src/ServiceStack.Text/HttpUtils.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index ff322d197..6ad061a16 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1384,6 +1384,7 @@ public static class MimeTypes public const string Xml = "application/xml"; public const string XmlText = "text/xml"; public const string Json = "application/json"; + public const string ProblemJson = "application/problem+json"; public const string JsonText = "text/json"; public const string Jsv = "application/jsv"; public const string JsvText = "text/jsv"; From 36d2a2387792a7b91ea854dbad157832ed1c42f9 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 26 Mar 2021 15:49:50 +0800 Subject: [PATCH 264/372] Update SO link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 76d7c3abf..d7bb51125 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Follow [@ServiceStack](https://twitter.com/servicestack) or [view the docs](https://docs.servicestack.net), use [StackOverflow](http://stackoverflow.com/questions/ask) or the [Customer Forums](https://forums.servicestack.net/) for support. +Follow [@ServiceStack](https://twitter.com/servicestack), [view the docs](https://docs.servicestack.net), use [StackOverflow](https://stackoverflow.com/questions/ask?tags=servicestack,servicestack.text) or [Customer Forums](https://forums.servicestack.net/) for support. ## [FREE high-perf Text Serializers](https://docs.servicestack.net/releases/v4.0.62#servicestacktext-is-now-free) and Core Utils powering [servicestack.net](https://servicestack.net) From 12f6102ba3a3c2f4d640a42935ae5b9ae4b99c2b Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 30 Mar 2021 15:15:18 +0800 Subject: [PATCH 265/372] Add ToLong overloads --- src/ServiceStack.Text/StringExtensions.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index d6fa7c54d..bff956c30 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -1034,8 +1034,10 @@ public static bool IsSystemType(this Type type) public static int ToInt(this string text, int defaultValue) => int.TryParse(text, out var ret) ? ret : defaultValue; + public static long ToLong(this string text) => long.Parse(text); public static long ToInt64(this string text) => long.Parse(text); + public static long ToLong(this string text, long defaultValue) => long.TryParse(text, out var ret) ? ret : defaultValue; public static long ToInt64(this string text, long defaultValue) => long.TryParse(text, out var ret) ? ret : defaultValue; public static float ToFloat(this string text) => text == null ? default(float) : float.Parse(text); From 6b6e9302da9a939a99f3c35ca3d23d83388b987d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 31 Mar 2021 00:00:52 +0800 Subject: [PATCH 266/372] Make EnumInfo a public readonly property --- src/ServiceStack.Text/CachedTypeInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/CachedTypeInfo.cs b/src/ServiceStack.Text/CachedTypeInfo.cs index 770d12fdb..4c24d6241 100644 --- a/src/ServiceStack.Text/CachedTypeInfo.cs +++ b/src/ServiceStack.Text/CachedTypeInfo.cs @@ -36,7 +36,7 @@ public CachedTypeInfo(Type type) EnumInfo = EnumInfo.GetEnumInfo(type); } - internal readonly EnumInfo EnumInfo; + public EnumInfo EnumInfo { get; } } public class EnumInfo From a07a20999b883946779dbb80433dd8dfefaad49c Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 31 Mar 2021 00:02:58 +0800 Subject: [PATCH 267/372] Update AutoMappingTests.cs --- tests/ServiceStack.Text.Tests/AutoMappingTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs index 2d872324f..9701c7478 100644 --- a/tests/ServiceStack.Text.Tests/AutoMappingTests.cs +++ b/tests/ServiceStack.Text.Tests/AutoMappingTests.cs @@ -599,7 +599,7 @@ public void Does_convert_models_with_collections() Assert.That(MatchesUsers(array, from.Collection.ConvertTo())); Assert.That(MatchesUsers(array, from.Collection.ConvertTo>())); - var hashset = from.Collection.ToHashSet(); + var hashset = from.Collection.ToSet(); Assert.That(MatchesUsers(hashset, from.Collection.ConvertTo>())); Assert.That(MatchesUsers(hashset, from.Collection.ConvertTo>())); Assert.That(MatchesUsers(hashset, from.Collection.ConvertTo())); From b78bad993741c41d9fc6083e4706dd5c9440becb Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 2 Apr 2021 17:14:02 +0800 Subject: [PATCH 268/372] fix docs --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d7bb51125..9cd5d2f12 100644 --- a/README.md +++ b/README.md @@ -326,7 +326,7 @@ All other scalar values are stored as strings that are surrounded with double qu ### C# Structs and Value Types -Because a C# struct is a value type whose public properties are normally just convenience properties around a single scalar value, they are ignored instead the **TStruct.ToString()** method is used to serialize and either the **static TStruct.ParseJson()**/**static TStruct.ParseJsv()** methods or **new TStruct(string)** constructor will be used to deserialize the value type if it exists. +Because a C# struct is a value type whose public properties are normally just convenience properties around a single scalar value, they are ignored instead the **TStruct.ToString()** method is used to serialize and either the **static TStruct.Parse()**** method or **new TStruct(string)** constructor will be used to deserialize the value type if it exists. ### array type From 1deaafaa2530a759cd8f08f3ddf10053540c4069 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 2 Apr 2021 17:14:16 +0800 Subject: [PATCH 269/372] clean code --- tests/ServiceStack.Text.Tests/CustomStructTests.cs | 12 ++---------- .../StringConverterUtilsTests.cs | 2 +- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/tests/ServiceStack.Text.Tests/CustomStructTests.cs b/tests/ServiceStack.Text.Tests/CustomStructTests.cs index 7c3758dfa..d4b978170 100644 --- a/tests/ServiceStack.Text.Tests/CustomStructTests.cs +++ b/tests/ServiceStack.Text.Tests/CustomStructTests.cs @@ -49,16 +49,8 @@ public static UserStat Parse(string userStatString) return userStat; } - public override string ToString() - { - return string.Format("{0}:{1}:{2}:{3}:{4}:{5}", - this.UserId.ToString("n"), - TimesRecommended, - TimesPurchased, - TimesRecommended, - TimesPreviewed, - GetWeightedValue()); - } + public override string ToString() => + $"{this.UserId:n}:{TimesRecommended}:{TimesPurchased}:{TimesRecommended}:{TimesPreviewed}:{GetWeightedValue()}"; } [TestFixture] diff --git a/tests/ServiceStack.Text.Tests/StringConverterUtilsTests.cs b/tests/ServiceStack.Text.Tests/StringConverterUtilsTests.cs index a84f32d4d..593cf79d8 100644 --- a/tests/ServiceStack.Text.Tests/StringConverterUtilsTests.cs +++ b/tests/ServiceStack.Text.Tests/StringConverterUtilsTests.cs @@ -38,7 +38,7 @@ public static StringEnumerable ParseJsv(string value) public void Create_super_list_type_of_int_from_string() { var textValue = "1,2,3"; - var convertedValue = textValue.Split(',').ToList().ConvertAll(x => Convert.ToInt32(x)); + var convertedValue = textValue.Split(',').ToList().ConvertAll(Convert.ToInt32); var result = TypeSerializer.DeserializeFromString(textValue); Assert.That(result, Is.EquivalentTo(convertedValue)); } From 4ca3f236f35a8ae524af9c2cbb98b1a98aa5447a Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 2 Apr 2021 17:19:48 +0800 Subject: [PATCH 270/372] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9cd5d2f12..e1ef86cee 100644 --- a/README.md +++ b/README.md @@ -326,7 +326,7 @@ All other scalar values are stored as strings that are surrounded with double qu ### C# Structs and Value Types -Because a C# struct is a value type whose public properties are normally just convenience properties around a single scalar value, they are ignored instead the **TStruct.ToString()** method is used to serialize and either the **static TStruct.Parse()**** method or **new TStruct(string)** constructor will be used to deserialize the value type if it exists. +Because a C# struct is a value type whose public properties are normally just convenience properties around a single scalar value, they are ignored instead the **TStruct.ToString()** method is used to serialize and either the **static TStruct.Parse()** method or **new TStruct(string)** constructor will be used to deserialize the value type if it exists. ### array type From a14c2307bb64767f193ad3e745c582c1a895a218 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Thu, 15 Apr 2021 12:51:32 +1000 Subject: [PATCH 271/372] Fix List primitive to/from CSV so that same input gets the same output. (#532) --- src/ServiceStack.Text/CsvReader.cs | 20 +++++++++++ .../CsvTests/ObjectSerializerTests.cs | 34 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/ServiceStack.Text/CsvReader.cs b/src/ServiceStack.Text/CsvReader.cs index b737e2726..72f3f8dcb 100644 --- a/src/ServiceStack.Text/CsvReader.cs +++ b/src/ServiceStack.Text/CsvReader.cs @@ -272,6 +272,21 @@ private static List GetSingleRow(IEnumerable rows, Type recordType) return row; } + private static List ParseSingleRow(string row, Type recordType) + { + var results = new List(); + var itemRows = CsvReader.ParseFields(row); + foreach (var itemRow in itemRows) + { + var to = recordType == typeof(string) + ? (T)(object)itemRow + : TypeSerializer.DeserializeFromString(itemRow); + + results.Add(to); + } + return results; + } + public static List GetRows(IEnumerable records) { var rows = new List(); @@ -360,6 +375,11 @@ public static List Read(List rows) headers = CsvReader.ParseFields(rows[0], s => s.Trim()); } + if (typeof(T).IsValueType || (typeof(T) == typeof(string)) && rows.Count == 1) + { + return ParseSingleRow(rows[0], typeof(T)); + } + if (typeof(T).IsValueType || typeof(T) == typeof(string)) { return GetSingleRow(rows, typeof(T)); diff --git a/tests/ServiceStack.Text.Tests/CsvTests/ObjectSerializerTests.cs b/tests/ServiceStack.Text.Tests/CsvTests/ObjectSerializerTests.cs index 8c4baa3ef..b0920e8e6 100644 --- a/tests/ServiceStack.Text.Tests/CsvTests/ObjectSerializerTests.cs +++ b/tests/ServiceStack.Text.Tests/CsvTests/ObjectSerializerTests.cs @@ -191,6 +191,40 @@ public void Can_serialize_text_with_unmatched_list_or_map_chars() Assert.That(des[0].Prop4, Is.EqualTo(src[0].Prop4)); Assert.That(des[0].Prop5, Is.EqualTo(src[0].Prop5)); } + + [Test] + public void Can_serialize_csv_and_deserialize_List_string() + { + var list = new List + { + "one", + "two", + "three" + }; + + var flatList = list.ToCsv(); + + var originalList = flatList.FromCsv>(); + + Assert.That(originalList.Count, Is.EqualTo(3)); + } + + [Test] + public void Can_serialize_csv_and_deserialize_List_primitives() + { + var list = new List + { + 1, + 2, + 3 + }; + + var flatList = list.ToCsv(); + + var originalList = flatList.FromCsv>(); + + Assert.That(originalList.Count, Is.EqualTo(3)); + } } public class POCO From d60fd266e41d3aadd7de4a94e5e0897f3e921382 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 15 Apr 2021 10:55:58 +0800 Subject: [PATCH 272/372] DRY single CSV row logic --- src/ServiceStack.Text/CsvReader.cs | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/src/ServiceStack.Text/CsvReader.cs b/src/ServiceStack.Text/CsvReader.cs index 72f3f8dcb..f468ae62a 100644 --- a/src/ServiceStack.Text/CsvReader.cs +++ b/src/ServiceStack.Text/CsvReader.cs @@ -272,21 +272,6 @@ private static List GetSingleRow(IEnumerable rows, Type recordType) return row; } - private static List ParseSingleRow(string row, Type recordType) - { - var results = new List(); - var itemRows = CsvReader.ParseFields(row); - foreach (var itemRow in itemRows) - { - var to = recordType == typeof(string) - ? (T)(object)itemRow - : TypeSerializer.DeserializeFromString(itemRow); - - results.Add(to); - } - return results; - } - public static List GetRows(IEnumerable records) { var rows = new List(); @@ -375,14 +360,11 @@ public static List Read(List rows) headers = CsvReader.ParseFields(rows[0], s => s.Trim()); } - if (typeof(T).IsValueType || (typeof(T) == typeof(string)) && rows.Count == 1) - { - return ParseSingleRow(rows[0], typeof(T)); - } - if (typeof(T).IsValueType || typeof(T) == typeof(string)) { - return GetSingleRow(rows, typeof(T)); + return rows.Count == 1 + ? GetSingleRow(CsvReader.ParseFields(rows[0]), typeof(T)) + : GetSingleRow(rows, typeof(T)); } for (var rowIndex = headers == null ? 0 : 1; rowIndex < rows.Count; rowIndex++) From 37d2796d96c8433554bfc1c5ca871196a5a5a3f9 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 20 Apr 2021 21:36:48 +0800 Subject: [PATCH 273/372] bump to v5.11 --- src/Directory.Build.props | 2 +- src/ServiceStack.Text/Env.cs | 2 +- tests/Directory.Build.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 8a57b7395..b1ca42687 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.10.5 + 5.11.0 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index db6d963e6..83e72dd8b 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -113,7 +113,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.105m; + public static decimal ServiceStackVersion = 5.11m; public static bool IsLinux { get; set; } diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index a5d2ef449..43ccab6fb 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.10.5 + 5.11.0 latest false From ed81298899b0846b5c40c578a52757302e842613 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 20 Apr 2021 22:28:39 +0800 Subject: [PATCH 274/372] revert to v5.10.5 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index b1ca42687..8a57b7395 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.11.0 + 5.10.5 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 43ccab6fb..a5d2ef449 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.11.0 + 5.10.5 latest false From 5b966ef40931fcdd391e6e854c6979c9a587841f Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 20 Apr 2021 23:29:54 +0800 Subject: [PATCH 275/372] Update ServiceStack.Text.TestsConsole.csproj --- .../ServiceStack.Text.TestsConsole.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj index e4f1bfb69..3aba157f5 100644 --- a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj +++ b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj @@ -11,7 +11,7 @@ - - + + \ No newline at end of file From d141c2f4cf58f05560f941eac18b12908fde750a Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 21 Apr 2021 02:18:38 +0800 Subject: [PATCH 276/372] bump to v5.11 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 8a57b7395..b1ca42687 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.10.5 + 5.11.0 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index a5d2ef449..43ccab6fb 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.10.5 + 5.11.0 latest false From 67353916d25da3d03745c1c6d6f605d5671bfaf8 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 29 Apr 2021 17:47:43 +0800 Subject: [PATCH 277/372] Update Env.cs --- src/ServiceStack.Text/Env.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 83e72dd8b..072501a2c 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -113,7 +113,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.11m; + public static decimal ServiceStackVersion = 5.111m; public static bool IsLinux { get; set; } From d5b29a3443efb6ef3daa675cf2458db86395c78c Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 29 Apr 2021 22:12:54 +0800 Subject: [PATCH 278/372] Ignore ConfigurationManager.AppSettings NotSupportedExceptions's --- src/ServiceStack.Text/PclExport.Net45.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ServiceStack.Text/PclExport.Net45.cs b/src/ServiceStack.Text/PclExport.Net45.cs index 0e1e4df48..ffccdee83 100644 --- a/src/ServiceStack.Text/PclExport.Net45.cs +++ b/src/ServiceStack.Text/PclExport.Net45.cs @@ -116,6 +116,7 @@ public override void RegisterLicenseFromConfig() return; } } + catch (NotSupportedException) { return; } // Ignore Unity/IL2CPP Exception catch (Exception ex) { licenceKeyText = Environment.GetEnvironmentVariable(EnvironmentKey)?.Trim(); From 7e624b9440f8e36f76bed473be1a13a4fb5bf87f Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 4 May 2021 04:37:05 +0800 Subject: [PATCH 279/372] bump to v5.11.1 --- src/Directory.Build.props | 2 +- tests/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index b1ca42687..947fb8b7d 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.11.0 + 5.11.1 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 43ccab6fb..dab7cd128 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.11.0 + 5.11.1 latest false From 36ed68649aa41f35ad5a8353ed4c8e37f0f0a794 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Mon, 17 May 2021 15:07:37 +1000 Subject: [PATCH 280/372] Test added and proposed fix for #761. (#533) --- src/ServiceStack.Text/Common/JsWriter.cs | 3 +- src/ServiceStack.Text/Common/WriteType.cs | 3 +- .../JsonSerializer.Generic.cs | 6 ++- src/ServiceStack.Text/JsonSerializer.cs | 9 ++-- src/ServiceStack.Text/TypeSerializer.cs | 9 ++-- .../JsonObjectTests.cs | 43 ++++++++++++++++++- 6 files changed, 62 insertions(+), 11 deletions(-) diff --git a/src/ServiceStack.Text/Common/JsWriter.cs b/src/ServiceStack.Text/Common/JsWriter.cs index 8313c3e2f..daf12c4e5 100644 --- a/src/ServiceStack.Text/Common/JsWriter.cs +++ b/src/ServiceStack.Text/Common/JsWriter.cs @@ -47,6 +47,7 @@ static JsWriter() public static void WriteDynamic(Action callback) { + var prevState = JsState.IsWritingDynamic; JsState.IsWritingDynamic = true; try { @@ -54,7 +55,7 @@ public static void WriteDynamic(Action callback) } finally { - JsState.IsWritingDynamic = false; + JsState.IsWritingDynamic = prevState; } } diff --git a/src/ServiceStack.Text/Common/WriteType.cs b/src/ServiceStack.Text/Common/WriteType.cs index 5d228cbe0..192c45343 100644 --- a/src/ServiceStack.Text/Common/WriteType.cs +++ b/src/ServiceStack.Text/Common/WriteType.cs @@ -466,9 +466,10 @@ public static void WriteProperties(TextWriter writer, object instance) private static void WriteLateboundProperties(TextWriter writer, object value, Type valueType) { var writeFn = Serializer.GetWriteFn(valueType); + var prevState = JsState.IsWritingDynamic; if (!JsConfig.ExcludeTypeInfo.GetValueOrDefault()) JsState.IsWritingDynamic = true; writeFn(writer, value); - if (!JsConfig.ExcludeTypeInfo.GetValueOrDefault()) JsState.IsWritingDynamic = false; + if (!JsConfig.ExcludeTypeInfo.GetValueOrDefault()) JsState.IsWritingDynamic = prevState; } internal static string GetPropertyName(string propertyName, Config config) diff --git a/src/ServiceStack.Text/JsonSerializer.Generic.cs b/src/ServiceStack.Text/JsonSerializer.Generic.cs index 505762e32..269757c98 100644 --- a/src/ServiceStack.Text/JsonSerializer.Generic.cs +++ b/src/ServiceStack.Text/JsonSerializer.Generic.cs @@ -48,9 +48,10 @@ public string SerializeToString(T value) if (value == null) return null; if (typeof(T) == typeof(object) || typeof(T).IsAbstract || typeof(T).IsInterface) { + var prevState = JsState.IsWritingDynamic; if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = true; var result = JsonSerializer.SerializeToString(value, value.GetType()); - if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = false; + if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = prevState; return result; } @@ -64,9 +65,10 @@ public void SerializeToWriter(T value, TextWriter writer) if (value == null) return; if (typeof(T) == typeof(object) || typeof(T).IsAbstract || typeof(T).IsInterface) { + var prevState = JsState.IsWritingDynamic; if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = true; JsonSerializer.SerializeToWriter(value, value.GetType(), writer); - if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = false; + if (typeof(T).IsAbstract || typeof(T).IsInterface) JsState.IsWritingDynamic = prevState; return; } diff --git a/src/ServiceStack.Text/JsonSerializer.cs b/src/ServiceStack.Text/JsonSerializer.cs index 3c0813437..4caa4787c 100644 --- a/src/ServiceStack.Text/JsonSerializer.cs +++ b/src/ServiceStack.Text/JsonSerializer.cs @@ -85,9 +85,10 @@ public static string SerializeToString(T value) } if (typeof(T).IsAbstract || typeof(T).IsInterface) { + var prevState = JsState.IsWritingDynamic; JsState.IsWritingDynamic = true; var result = SerializeToString(value, value.GetType()); - JsState.IsWritingDynamic = false; + JsState.IsWritingDynamic = prevState; return result; } @@ -133,9 +134,10 @@ public static void SerializeToWriter(T value, TextWriter writer) } else if (typeof(T).IsAbstract || typeof(T).IsInterface) { + var prevState = JsState.IsWritingDynamic; JsState.IsWritingDynamic = false; SerializeToWriter(value, value.GetType(), writer); - JsState.IsWritingDynamic = true; + JsState.IsWritingDynamic = prevState; } else { @@ -165,9 +167,10 @@ public static void SerializeToStream(T value, Stream stream) } else if (typeof(T).IsAbstract || typeof(T).IsInterface) { + var prevState = JsState.IsWritingDynamic; JsState.IsWritingDynamic = false; SerializeToStream(value, value.GetType(), stream); - JsState.IsWritingDynamic = true; + JsState.IsWritingDynamic = prevState; } else { diff --git a/src/ServiceStack.Text/TypeSerializer.cs b/src/ServiceStack.Text/TypeSerializer.cs index db3113fb5..a06fdcd11 100644 --- a/src/ServiceStack.Text/TypeSerializer.cs +++ b/src/ServiceStack.Text/TypeSerializer.cs @@ -114,9 +114,10 @@ public static string SerializeToString(T value) } if (typeof(T).IsAbstract || typeof(T).IsInterface) { + var prevState = JsState.IsWritingDynamic; JsState.IsWritingDynamic = true; var result = SerializeToString(value, value.GetType()); - JsState.IsWritingDynamic = false; + JsState.IsWritingDynamic = prevState; return result; } @@ -150,9 +151,10 @@ public static void SerializeToWriter(T value, TextWriter writer) } else if (typeof(T).IsAbstract || typeof(T).IsInterface) { + var prevState = JsState.IsWritingDynamic; JsState.IsWritingDynamic = false; SerializeToWriter(value, value.GetType(), writer); - JsState.IsWritingDynamic = true; + JsState.IsWritingDynamic = prevState; } else { @@ -182,9 +184,10 @@ public static void SerializeToStream(T value, Stream stream) } else if (typeof(T).IsAbstract || typeof(T).IsInterface) { + var prevState = JsState.IsWritingDynamic; JsState.IsWritingDynamic = false; SerializeToStream(value, value.GetType(), stream); - JsState.IsWritingDynamic = true; + JsState.IsWritingDynamic = prevState; } else { diff --git a/tests/ServiceStack.Text.Tests/JsonObjectTests.cs b/tests/ServiceStack.Text.Tests/JsonObjectTests.cs index 2d69bb3d5..180ed3f33 100644 --- a/tests/ServiceStack.Text.Tests/JsonObjectTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonObjectTests.cs @@ -1,5 +1,8 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Text; using NUnit.Framework; namespace ServiceStack.Text.Tests @@ -89,6 +92,44 @@ public void Does_encode_large_strings() System.Diagnostics.Debug.WriteLine(copy1["test"]); } } + + public interface IFoo + { + string Property { get; } + } + + public class FooA : IFoo + { + public string Property { get; set; } = "A"; + } + + [Test] + public void Can_consistently_serialize_stream() + { + var item = new FooA(); + var result1 = SerializeToStream1(item); + var result2 = SerializeToStream2(item); + var result3 = SerializeToStream1(item); + var result4 = SerializeToStream2(item); + + Assert.That(result1, Is.EqualTo(result2)); + } + + // Serialize using TypeSerializer.SerializeToStream(T, Stream) + public static string SerializeToStream1(IFoo item) + { + using var stream = new MemoryStream(); + TypeSerializer.SerializeToStream(item, stream); + return Encoding.UTF8.GetString(stream.GetBuffer(), 0, (int)stream.Length); + } + + // Serialize using TypeSerializer.SerializeToStream(object, Type, Stream) + public static string SerializeToStream2(IFoo item) + { + using var stream = new MemoryStream(); + TypeSerializer.SerializeToStream(item, item.GetType(), stream); + return Encoding.UTF8.GetString(stream.GetBuffer(), 0, (int)stream.Length); + } [Test] public void Can_parse_Twitter_response() From 53c529379ddaaf3ca9c2dc7bd804fec2693d1d7e Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Mon, 17 May 2021 15:10:34 +1000 Subject: [PATCH 281/372] Missed commit of additional state test. --- tests/ServiceStack.Text.Tests/JsonObjectTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/ServiceStack.Text.Tests/JsonObjectTests.cs b/tests/ServiceStack.Text.Tests/JsonObjectTests.cs index 180ed3f33..29fc04b4d 100644 --- a/tests/ServiceStack.Text.Tests/JsonObjectTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonObjectTests.cs @@ -113,6 +113,7 @@ public void Can_consistently_serialize_stream() var result4 = SerializeToStream2(item); Assert.That(result1, Is.EqualTo(result2)); + Assert.That(result3, Is.EqualTo(result4)); } // Serialize using TypeSerializer.SerializeToStream(T, Stream) From 8b6a91eccc51cf61c80d4992cf2d671d14518500 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 21 Jun 2021 14:16:49 +0800 Subject: [PATCH 282/372] Replace ReplaceAll with built-in string.Replace() --- src/ServiceStack.Text/StringExtensions.cs | 17 +++-------------- .../StringExtensionsTests.cs | 12 ++++++++++++ 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index bff956c30..2066ff4f9 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -922,20 +922,9 @@ public static string ReplaceFirst(this string haystack, string needle, string re return haystack.Substring(0, pos) + replacement + haystack.Substring(pos + needle.Length); } - public static string ReplaceAll(this string haystack, string needle, string replacement) - { - int pos; - // Avoid a possible infinite loop - if (needle == replacement) - return haystack; - while ((pos = haystack.IndexOf(needle, StringComparison.Ordinal)) >= 0) - { - haystack = haystack.Substring(0, pos) - + replacement - + haystack.Substring(pos + needle.Length); - } - return haystack; - } + [Obsolete("Use built-in string.Replace()")] + public static string ReplaceAll(this string haystack, string needle, string replacement) => + haystack.Replace(needle, replacement); public static bool ContainsAny(this string text, params string[] testMatches) { diff --git a/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs b/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs index c2f8333bf..5b1454a32 100644 --- a/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs +++ b/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Linq; +using System.Threading.Tasks; using NUnit.Framework; namespace ServiceStack.Text.Tests @@ -362,6 +363,17 @@ public void Does_ReplaceAll_from_Start() Assert.That("/images".ReplaceAll("/",""), Is.EqualTo("images")); } + [Test] + public void Does_ReplaceAll_Avoid_Infinite_Loops() + { + var input = "image"; + var output = input; + + output = input.ReplaceAll("image", "images"); + + Assert.That(output, Is.EqualTo("images")); + } + [TestCase("", ExpectedResult = "/")] [TestCase("/", ExpectedResult = "/")] [TestCase("?p1=asdf", ExpectedResult = "/?p1=asdf")] From 770d6458e62c149eddbd09b486fd104e5572413e Mon Sep 17 00:00:00 2001 From: itai-red-id <34806634+itai-red-id@users.noreply.github.com> Date: Wed, 30 Jun 2021 20:29:43 +0300 Subject: [PATCH 283/372] Support uppercase file extentions (#535) --- src/ServiceStack.Text/HttpUtils.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 6ad061a16..39ce5bca6 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1,4 +1,4 @@ -//Copyright (c) ServiceStack, Inc. All Rights Reserved. +//Copyright (c) ServiceStack, Inc. All Rights Reserved. //License: https://raw.github.com/ServiceStack/ServiceStack/master/license.txt using System; @@ -1556,7 +1556,7 @@ public static string GetMimeType(string fileNameOrExt) if (string.IsNullOrEmpty(fileNameOrExt)) throw new ArgumentNullException(nameof(fileNameOrExt)); - var fileExt = fileNameOrExt.LastRightPart('.'); + var fileExt = fileNameOrExt.LastRightPart('.').ToLower(); if (ExtensionMimeTypes.TryGetValue(fileExt, out var mimeType)) { return mimeType; From eaa83902b683b6d524edc41989268dd2ed949469 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 15 Aug 2021 19:07:24 +0800 Subject: [PATCH 284/372] Upgrade deps --- .../ServiceStack.Text.Core.csproj | 6 +++--- src/ServiceStack.Text/ServiceStack.Text.csproj | 6 +++--- tests/Northwind.Common/Northwind.Common.csproj | 14 +++++++------- .../ServiceStack.Text.Tests.csproj | 8 ++++---- .../StringExtensionsTests.cs | 4 ++-- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index ef334cdfc..f2b77a8fd 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -17,7 +17,7 @@ - + @@ -25,7 +25,7 @@ - - + + \ No newline at end of file diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index fcdff3308..c49c2c4a9 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -16,7 +16,7 @@ - + @@ -27,7 +27,7 @@ - - + + \ No newline at end of file diff --git a/tests/Northwind.Common/Northwind.Common.csproj b/tests/Northwind.Common/Northwind.Common.csproj index f9648df05..2ae3f767f 100644 --- a/tests/Northwind.Common/Northwind.Common.csproj +++ b/tests/Northwind.Common/Northwind.Common.csproj @@ -1,7 +1,7 @@  - net45;netstandard2.0 + net461;netstandard2.0 Northwind.Common Northwind.Common false @@ -25,14 +25,14 @@ - + - + $(DefineConstants);NET45 - + @@ -45,9 +45,9 @@ - - - + + + \ No newline at end of file diff --git a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj index 0fad42534..08677316a 100644 --- a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj +++ b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj @@ -1,6 +1,6 @@  - net45;netcoreapp2.1 + net461;netcoreapp2.1 portable ServiceStack.Text.Tests Library @@ -26,7 +26,7 @@ - + @@ -36,10 +36,10 @@ - + $(DefineConstants);NET45 - + diff --git a/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs b/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs index 5b1454a32..b6fce3311 100644 --- a/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs +++ b/tests/ServiceStack.Text.Tests/StringExtensionsTests.cs @@ -360,7 +360,7 @@ public void Does_ContainsAny_Return_CaseInsensitive_Matches() [Test] public void Does_ReplaceAll_from_Start() { - Assert.That("/images".ReplaceAll("/",""), Is.EqualTo("images")); + Assert.That("/images".Replace("/",""), Is.EqualTo("images")); } [Test] @@ -369,7 +369,7 @@ public void Does_ReplaceAll_Avoid_Infinite_Loops() var input = "image"; var output = input; - output = input.ReplaceAll("image", "images"); + output = input.Replace("image", "images"); Assert.That(output, Is.EqualTo("images")); } From 5fd5217a91ffdd35df9a5d9074ee3c850aee1078 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 15 Aug 2021 21:15:49 +0800 Subject: [PATCH 285/372] upgrade bcl.async deps --- src/ServiceStack.Text/ServiceStack.Text.Core.csproj | 2 +- src/ServiceStack.Text/ServiceStack.Text.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index f2b77a8fd..dc6d8f5d6 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -21,7 +21,7 @@ - + diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index c49c2c4a9..a52c68740 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -23,7 +23,7 @@ - + From e285687efaecd84e95f534f3a35c8b3b3a6433aa Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 17 Aug 2021 19:49:15 +0800 Subject: [PATCH 286/372] bump to v5.12 --- .vscode/tasks.json | 22 +++++++++++++++------- src/Directory.Build.props | 2 +- src/ServiceStack.Text/Env.cs | 2 +- tests/Directory.Build.props | 2 +- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 7024d02f9..0da8dcb66 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,9 +1,8 @@ { // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format - "version": "0.1.0", + "version": "2.0.0", "command": "dotnet", - "isShellCommand": true, "args": [], "options": { "env": { @@ -12,11 +11,20 @@ }, "tasks": [ { - "taskName": "build", - "args": [ "src/ServiceStack.Text.sln", "-v", "m" ], - "isBuildCommand": true, - "showOutput": "silent", - "problemMatcher": "$msCompile" + "label": "build", + "type": "shell", + "command": "dotnet", + "args": [ + "build", + "src/ServiceStack.Text.sln", + "-v", + "m" + ], + "problemMatcher": "$msCompile", + "group": { + "_id": "build", + "isDefault": false + } } ] } \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 947fb8b7d..61bb5cadc 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.11.1 + 5.12.0 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 072501a2c..b52e7eb0d 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -113,7 +113,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.111m; + public static decimal ServiceStackVersion = 5.12m; public static bool IsLinux { get; set; } diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index dab7cd128..7d424bf46 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.11.1 + 5.12.0 latest false From d4239f7c133ab2c2bbbd7bd75c3b5b5c26b67307 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 18 Aug 2021 17:21:42 +0800 Subject: [PATCH 287/372] bump to v5.12.1 --- src/Directory.Build.props | 2 +- src/ServiceStack.Text/Env.cs | 2 +- tests/Directory.Build.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 61bb5cadc..6a5e8bb54 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.12.0 + 5.12.1 ServiceStack ServiceStack, Inc. © 2008-2018 ServiceStack, Inc diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index b52e7eb0d..b47358a4e 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -113,7 +113,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.12m; + public static decimal ServiceStackVersion = 5.121m; public static bool IsLinux { get; set; } diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 7d424bf46..813bb0695 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.12.0 + 5.12.1 latest false From 2e758cd12d3fdc74c2756f571b15fb663bf49e0e Mon Sep 17 00:00:00 2001 From: AVee Date: Wed, 1 Sep 2021 16:02:56 +0200 Subject: [PATCH 288/372] Fix issue where DeserializeFn is not cleared by reset (#536) Co-authored-by: Arjan Veenstra --- .../Json/JsonReader.Generic.cs | 1 + .../Json/JsonWriter.Generic.cs | 1 + src/ServiceStack.Text/Jsv/JsvReader.Generic.cs | 1 + src/ServiceStack.Text/Jsv/JsvWriter.Generic.cs | 1 + .../Issues/JsConfigIssues.cs | 17 +++++++++++++++++ 5 files changed, 21 insertions(+) diff --git a/src/ServiceStack.Text/Json/JsonReader.Generic.cs b/src/ServiceStack.Text/Json/JsonReader.Generic.cs index 108421c81..11faa59d3 100644 --- a/src/ServiceStack.Text/Json/JsonReader.Generic.cs +++ b/src/ServiceStack.Text/Json/JsonReader.Generic.cs @@ -72,6 +72,7 @@ public static void Refresh() return; ReadFn = JsonReader.Instance.GetParseStringSpanFn(); + JsConfig.AddUniqueType(typeof(T)); } public static ParseStringDelegate GetParseFn() => ReadFn != null diff --git a/src/ServiceStack.Text/Json/JsonWriter.Generic.cs b/src/ServiceStack.Text/Json/JsonWriter.Generic.cs index 771e38c72..3dcf75d2f 100644 --- a/src/ServiceStack.Text/Json/JsonWriter.Generic.cs +++ b/src/ServiceStack.Text/Json/JsonWriter.Generic.cs @@ -167,6 +167,7 @@ public static void Refresh() CacheFn = typeof(T) == typeof(object) ? JsonWriter.WriteLateBoundObject : JsonWriter.Instance.GetWriteFn(); + JsConfig.AddUniqueType(typeof(T)); } public static WriteObjectDelegate WriteFn() diff --git a/src/ServiceStack.Text/Jsv/JsvReader.Generic.cs b/src/ServiceStack.Text/Jsv/JsvReader.Generic.cs index 7ee6c3655..df21cd9ad 100644 --- a/src/ServiceStack.Text/Jsv/JsvReader.Generic.cs +++ b/src/ServiceStack.Text/Jsv/JsvReader.Generic.cs @@ -70,6 +70,7 @@ public static void Refresh() return; ReadFn = JsvReader.Instance.GetParseStringSpanFn(); + JsConfig.AddUniqueType(typeof(T)); } public static ParseStringDelegate GetParseFn() => ReadFn != null diff --git a/src/ServiceStack.Text/Jsv/JsvWriter.Generic.cs b/src/ServiceStack.Text/Jsv/JsvWriter.Generic.cs index 1eeed485f..7cb2cce8a 100644 --- a/src/ServiceStack.Text/Jsv/JsvWriter.Generic.cs +++ b/src/ServiceStack.Text/Jsv/JsvWriter.Generic.cs @@ -124,6 +124,7 @@ public static void Refresh() CacheFn = typeof(T) == typeof(object) ? JsvWriter.WriteLateBoundObject : JsvWriter.Instance.GetWriteFn(); + JsConfig.AddUniqueType(typeof(T)); } public static WriteObjectDelegate WriteFn() diff --git a/tests/ServiceStack.Text.Tests/Issues/JsConfigIssues.cs b/tests/ServiceStack.Text.Tests/Issues/JsConfigIssues.cs index 6add141cf..929030ba0 100644 --- a/tests/ServiceStack.Text.Tests/Issues/JsConfigIssues.cs +++ b/tests/ServiceStack.Text.Tests/Issues/JsConfigIssues.cs @@ -22,6 +22,11 @@ public CustomFormatType(int value) { _value = value; } + + public override string ToString() + { + return _value.ToString(); + } } class Dto @@ -44,6 +49,18 @@ public void CallReset_AfterSerializingOnce_WithCustomSerializationForProperty_Do TestRoundTripValue(dto); } + + [Test] + public void CallReset_AfterSerializingOnce_WithCustomSerializationForProperty_MustClearCustomSerialization() + { + var dto = new Dto { CustomFormatTypeProperty = new CustomFormatType(12345) }; + JsConfig.DeSerializeFn = str => + new CustomFormatType(int.Parse(str)); + var json = dto.ToJson(); + JsConfig.Reset(); + var fromJson = json.FromJson(); + Assert.That(fromJson.CustomFormatTypeProperty.Value, Is.EqualTo(0)); + } private static void ConfigureCustomFormatType() { From dc84c1ca5c70021887ce3ce936c9badaedbd67f7 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 17 Oct 2021 23:15:15 +0800 Subject: [PATCH 289/372] Update README.md --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index e1ef86cee..d469c681f 100644 --- a/README.md +++ b/README.md @@ -5,17 +5,17 @@ Follow [@ServiceStack](https://twitter.com/servicestack), [view the docs](https: ServiceStack.Text is an **independent, dependency-free** serialization library containing ServiceStack's core high-performance utils and text processing functionality, including: - [JSON](https://github.com/ServiceStack/ServiceStack.Text), - [JSV](http://docs.servicestack.net/jsv-format) and - [CSV](http://docs.servicestack.net/csv-format) Text Serializers - - [AutoMapping Utils](http://docs.servicestack.net/auto-mapping) - - [HTTP Utils](http://docs.servicestack.net/http-utils) - - [Dump Utils](http://docs.servicestack.net/dump-utils) - - [Fast Reflection Utils](http://docs.servicestack.net/reflection-utils) + [JSV](https://docs.servicestack.net/jsv-format) and + [CSV](https://docs.servicestack.net/csv-format) Text Serializers + - [AutoMapping Utils](https://docs.servicestack.net/auto-mapping) + - [HTTP Utils](https://docs.servicestack.net/http-utils) + - [Dump Utils](https://docs.servicestack.net/dump-utils) + - [Fast Reflection Utils](https://docs.servicestack.net/reflection-utils) - Several String Extensions, Collection extensions, Reflection Utils and lots more. ### [Mobile Apps Support](https://github.com/ServiceStackApps/HelloMobile) -### Try out [ServiceStack.Text Live](http://gistlyn.com/text) +### Try out [ServiceStack.Text Live](https://gist.cafe/c71b3f0123b3d9d08c1b11c98c2ff379) A great way to try out ServiceStack.Text is on [gistlyn.com](http://gistlyn.com) which lets you immediately run and explore all ServiceStack.Text features from the comfort of your browser with zero software install: @@ -511,7 +511,7 @@ using (JsConfig.CreateScope("IncludeNullValues,EDV,dh:ut")) } ``` -This feature is used to provide a number of different [JSON customizations in ServiceStack Services](http://docs.servicestack.net/customize-json-responses). +This feature is used to provide a number of different [JSON customizations in ServiceStack Services](https://docs.servicestack.net/customize-json-responses). ### Type Configuration From 32bedd7b20850d3025188fd52a45b793e4600f77 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 17 Oct 2021 23:41:39 +0800 Subject: [PATCH 290/372] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d469c681f..5432e6189 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,10 @@ ServiceStack.Text is an **independent, dependency-free** serialization library c ### Try out [ServiceStack.Text Live](https://gist.cafe/c71b3f0123b3d9d08c1b11c98c2ff379) -A great way to try out ServiceStack.Text is on [gistlyn.com](http://gistlyn.com) which lets you immediately +A great way to try out ServiceStack.Text is on [gist.cafe](https://gist.cafe) which lets you immediately run and explore all ServiceStack.Text features from the comfort of your browser with zero software install: -[![](https://raw.githubusercontent.com/ServiceStack/Assets/master/img/livedemos/gistlyn/home-screenshot.png)](http://gistlyn.com/text) +[![](https://raw.githubusercontent.com/ServiceStack/docs/master/docs/images/gistcafe/gistcafe-csharp.png)](https://gist.cafe/c71b3f0123b3d9d08c1b11c98c2ff379) ## Simple API From 93fc32e4e7b8a9b79f0c9735ccd105c56a7f4dde Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 25 Oct 2021 17:51:30 +0800 Subject: [PATCH 291/372] Add new .NET 6 TFM build --- src/ServiceStack.Text/Env.cs | 10 +++++++--- src/ServiceStack.Text/LicenseUtils.cs | 2 +- src/ServiceStack.Text/MemoryProvider.cs | 2 +- src/ServiceStack.Text/NetCoreMemory.cs | 4 ++-- src/ServiceStack.Text/PclExport.NetCore.cs | 2 +- src/ServiceStack.Text/PclExport.cs | 2 +- src/ServiceStack.Text/ReflectionOptimizer.Emit.cs | 2 +- src/ServiceStack.Text/ReflectionOptimizer.cs | 2 +- src/ServiceStack.Text/ServiceStack.Text.csproj | 10 +++++++++- src/ServiceStack.Text/StreamExtensions.cs | 12 ++++++------ 10 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index b47358a4e..bb0b8d23b 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -64,11 +64,14 @@ static Env() SupportsDynamic = true; #endif -#if NETCORE2_1 +#if NETCORE2_1 || NET6_0 IsNetStandard = false; IsNetCore = true; - IsNetCore21 = true; SupportsDynamic = true; + IsNetCore21 = true; +#endif +#if NET6_0 + IsNet6 = true; #endif #if NETSTANDARD2_0 @@ -136,6 +139,7 @@ static Env() public static bool IsNetStandard { get; set; } public static bool IsNetCore21 { get; set; } + public static bool IsNet6 { get; set; } public static bool IsNetStandard20 { get; set; } public static bool IsNetFramework { get; set; } @@ -311,7 +315,7 @@ public static ConfiguredTaskAwaitable ConfigAwait(this Task task) => public static ConfiguredTaskAwaitable ConfigAwait(this Task task) => task.ConfigureAwait(ContinueOnCapturedContext); -#if NETSTANDARD || NETCORE2_1 +#if NETSTANDARD || NETCORE2_1 || NET6_0 [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ConfiguredValueTaskAwaitable ConfigAwait(this ValueTask task) => task.ConfigureAwait(ContinueOnCapturedContext); diff --git a/src/ServiceStack.Text/LicenseUtils.cs b/src/ServiceStack.Text/LicenseUtils.cs index 315cc44ec..7d1cc155f 100644 --- a/src/ServiceStack.Text/LicenseUtils.cs +++ b/src/ServiceStack.Text/LicenseUtils.cs @@ -499,7 +499,7 @@ public static bool VerifySignedHash(byte[] DataToVerify, byte[] SignedData, Syst public static LicenseKey VerifyLicenseKeyText(string licenseKeyText) { -#if NET45 || NETCORE2_1 +#if NET45 || NETCORE2_1 || NET6_0 LicenseKey key; try { diff --git a/src/ServiceStack.Text/MemoryProvider.cs b/src/ServiceStack.Text/MemoryProvider.cs index fd5c47aa4..af621427d 100644 --- a/src/ServiceStack.Text/MemoryProvider.cs +++ b/src/ServiceStack.Text/MemoryProvider.cs @@ -12,7 +12,7 @@ namespace ServiceStack.Text public abstract class MemoryProvider { public static MemoryProvider Instance = -#if NETCORE2_1 +#if NETCORE2_1 || NET6_0 ServiceStack.Memory.NetCoreMemory.Provider; #else DefaultMemory.Provider; diff --git a/src/ServiceStack.Text/NetCoreMemory.cs b/src/ServiceStack.Text/NetCoreMemory.cs index 84d51174a..90ad6a3f7 100644 --- a/src/ServiceStack.Text/NetCoreMemory.cs +++ b/src/ServiceStack.Text/NetCoreMemory.cs @@ -1,4 +1,4 @@ -#if NETCORE2_1 +#if NETCORE2_1 || NET6_0 using System; using System.Buffers.Text; @@ -16,7 +16,7 @@ namespace ServiceStack.Memory public sealed class NetCoreMemory : MemoryProvider { private static NetCoreMemory provider; - public static NetCoreMemory Provider => provider ?? (provider = new NetCoreMemory()); + public static NetCoreMemory Provider => provider ??= new NetCoreMemory(); private NetCoreMemory() { } public static void Configure() => Instance = Provider; diff --git a/src/ServiceStack.Text/PclExport.NetCore.cs b/src/ServiceStack.Text/PclExport.NetCore.cs index a91903f99..71a65cb22 100644 --- a/src/ServiceStack.Text/PclExport.NetCore.cs +++ b/src/ServiceStack.Text/PclExport.NetCore.cs @@ -1,4 +1,4 @@ -#if NETCORE2_1 +#if NETCORE2_1 || NET6_0 using System; using ServiceStack.Text; diff --git a/src/ServiceStack.Text/PclExport.cs b/src/ServiceStack.Text/PclExport.cs index 1e86022d9..048b3949c 100644 --- a/src/ServiceStack.Text/PclExport.cs +++ b/src/ServiceStack.Text/PclExport.cs @@ -29,7 +29,7 @@ public static class Platforms public static PclExport Instance #if NET45 = new Net45PclExport() -#elif NETCORE2_1 +#elif NETCORE2_1 || NET6_0 = new NetCorePclExport() #else = new NetStandardPclExport() diff --git a/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs b/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs index 235dafd1a..ee2d7525d 100644 --- a/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs +++ b/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs @@ -1,4 +1,4 @@ -#if NET45 || NETCORE2_1 +#if NET45 || NETCORE2_1 || NET6_0 using System; using System.Linq; diff --git a/src/ServiceStack.Text/ReflectionOptimizer.cs b/src/ServiceStack.Text/ReflectionOptimizer.cs index e16651899..41bcc5868 100644 --- a/src/ServiceStack.Text/ReflectionOptimizer.cs +++ b/src/ServiceStack.Text/ReflectionOptimizer.cs @@ -8,7 +8,7 @@ namespace ServiceStack.Text public abstract class ReflectionOptimizer { public static ReflectionOptimizer Instance = -#if NET45 || NETCORE2_1 +#if NET45 || NETCORE2_1 || NET6_0 EmitReflectionOptimizer.Provider #else ExpressionReflectionOptimizer.Provider diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index a52c68740..189aeca4a 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -2,7 +2,7 @@ ServiceStack.Text ServiceStack.Text - net45;netstandard2.0;netcoreapp2.1 + net45;netstandard2.0;netcoreapp2.1;net6.0 .NET's fastest JSON Serializer by ServiceStack .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. @@ -14,6 +14,9 @@ $(DefineConstants);NETSTANDARD;NETCORE2_1 + + $(DefineConstants);NETSTANDARD;NET6_0 + @@ -30,4 +33,9 @@ + + + + + \ No newline at end of file diff --git a/src/ServiceStack.Text/StreamExtensions.cs b/src/ServiceStack.Text/StreamExtensions.cs index a76984108..210854d56 100644 --- a/src/ServiceStack.Text/StreamExtensions.cs +++ b/src/ServiceStack.Text/StreamExtensions.cs @@ -481,7 +481,7 @@ public static string ReadToEnd(this MemoryStream ms, Encoding encoding) { ms.Position = 0; -#if NETSTANDARD || NETCORE2_1 +#if NETSTANDARD || NETCORE2_1 || NET6_0 if (ms.TryGetBuffer(out var buffer)) { return encoding.GetString(buffer.Array, buffer.Offset, buffer.Count); @@ -504,7 +504,7 @@ public static string ReadToEnd(this MemoryStream ms, Encoding encoding) public static ReadOnlyMemory GetBufferAsMemory(this MemoryStream ms) { -#if NETSTANDARD || NETCORE2_1 +#if NETSTANDARD || NETCORE2_1 || NET6_0 if (ms.TryGetBuffer(out var buffer)) { return new ReadOnlyMemory(buffer.Array, buffer.Offset, buffer.Count); @@ -525,7 +525,7 @@ public static ReadOnlyMemory GetBufferAsMemory(this MemoryStream ms) public static ReadOnlySpan GetBufferAsSpan(this MemoryStream ms) { -#if NETSTANDARD || NETCORE2_1 +#if NETSTANDARD || NETCORE2_1 || NET6_0 if (ms.TryGetBuffer(out var buffer)) { return new ReadOnlySpan(buffer.Array, buffer.Offset, buffer.Count); @@ -546,7 +546,7 @@ public static ReadOnlySpan GetBufferAsSpan(this MemoryStream ms) public static byte[] GetBufferAsBytes(this MemoryStream ms) { -#if NETSTANDARD || NETCORE2_1 +#if NETSTANDARD || NETCORE2_1 || NET6_0 if (ms.TryGetBuffer(out var buffer)) { return buffer.Array; @@ -570,7 +570,7 @@ public static Task ReadToEndAsync(this MemoryStream ms, Encoding encodin { ms.Position = 0; -#if NETSTANDARD || NETCORE2_1 +#if NETSTANDARD || NETCORE2_1 || NET6_0 if (ms.TryGetBuffer(out var buffer)) { return encoding.GetString(buffer.Array, buffer.Offset, buffer.Count).InTask(); @@ -626,7 +626,7 @@ public static Task WriteToAsync(this MemoryStream stream, Stream output, Cancell public static async Task WriteToAsync(this MemoryStream stream, Stream output, Encoding encoding, CancellationToken token) { -#if NETSTANDARD || NETCORE2_1 +#if NETSTANDARD || NETCORE2_1 || NET6_0 if (stream.TryGetBuffer(out var buffer)) { await output.WriteAsync(buffer.Array, buffer.Offset, buffer.Count, token).ConfigAwait(); From 33d0c238120a70bb4a119732d962e13d67876ed7 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 25 Oct 2021 22:55:18 +0800 Subject: [PATCH 292/372] .NET 6 build info --- build/build.bat | 4 ++-- tests/Directory.Build.props | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/build/build.bat b/build/build.bat index bc3006a32..4b85ae7e7 100644 --- a/build/build.bat +++ b/build/build.bat @@ -1,3 +1,3 @@ -SET MSBUILD="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe" +SET MSBUILD="C:\Program Files\Microsoft Visual Studio\2022\Preview\MSBuild\Current\Bin\MSBuild.exe" -%MSBUILD% build.proj /property:Configuration=Release;MinorVersion=4;PatchVersion=1 +%MSBUILD% build.proj /p:Configuration=Release /p:MinorVersion=12 /p:PatchVersion=1 diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 813bb0695..5284e1180 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -22,4 +22,8 @@ $(DefineConstants);NETCORE_SUPPORT;NETCORE + + $(DefineConstants);NETCORE_SUPPORT;NET_6 + + From 4e55cbbda714d3b9dd0d57d7f9323085cba19993 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 25 Oct 2021 23:33:55 +0800 Subject: [PATCH 293/372] temp disable net6.0 --- src/ServiceStack.Text/ServiceStack.Text.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index 189aeca4a..166b989c5 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -2,7 +2,8 @@ ServiceStack.Text ServiceStack.Text - net45;netstandard2.0;netcoreapp2.1;net6.0 + net45;netstandard2.0;netcoreapp2.1 + .NET's fastest JSON Serializer by ServiceStack .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. From f1418a8a5452b68553a8722e850ff45b41db16ac Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 26 Oct 2021 14:29:20 +0800 Subject: [PATCH 294/372] Try .net6 CI build again --- src/ServiceStack.Text/ServiceStack.Text.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index 166b989c5..12355d126 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -2,8 +2,8 @@ ServiceStack.Text ServiceStack.Text - net45;netstandard2.0;netcoreapp2.1 - + + net45;netstandard2.0;netcoreapp2.1;net6.0 .NET's fastest JSON Serializer by ServiceStack .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. From e9681256e24e3ee18d8825a461af4ab8149cd585 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 26 Oct 2021 15:07:56 +0800 Subject: [PATCH 295/372] Does global.json help CI? --- global.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 global.json diff --git a/global.json b/global.json new file mode 100644 index 000000000..550e1dfc7 --- /dev/null +++ b/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "6.0.100-rc.2.21505.57" + } +} \ No newline at end of file From 8cdc795e1719dc6a17975c7e3b32113cb2e61300 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 26 Oct 2021 19:14:30 +0800 Subject: [PATCH 296/372] Update ServiceStack.Text.Core.csproj --- src/ServiceStack.Text/ServiceStack.Text.Core.csproj | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index dc6d8f5d6..48ccee395 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -3,7 +3,8 @@ ServiceStack.Text.Core ServiceStack.Text ServiceStack.Text - netstandard2.0;netcoreapp2.1 + + netstandard2.0;netcoreapp2.1;net6.0 ServiceStack.Text .NET Standard 2.0 .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. @@ -15,6 +16,9 @@ $(DefineConstants);NETSTANDARD;NETCORE2_1 + + $(DefineConstants);NETSTANDARD;NET6_0 + @@ -28,4 +32,9 @@ + + + + + \ No newline at end of file From 761a9b58a7d833f0c67c2b31d45adaa3a796cb1f Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 27 Oct 2021 21:30:26 +0800 Subject: [PATCH 297/372] Refactor to use NETCORE/NETSTANDARD2_0 build symbols --- src/Directory.Build.props | 10 ++++++++- .../ServiceStack.Memory.csproj | 2 +- src/ServiceStack.Text.sln | 1 + src/ServiceStack.Text/Env.cs | 9 ++++---- src/ServiceStack.Text/JsConfigScope.cs | 8 +++---- src/ServiceStack.Text/LicenseUtils.cs | 2 +- src/ServiceStack.Text/MemoryProvider.cs | 2 +- src/ServiceStack.Text/NetCoreMemory.cs | 2 +- src/ServiceStack.Text/PathUtils.cs | 2 +- src/ServiceStack.Text/PclExport.NetCore.cs | 2 +- .../PclExport.NetStandard.cs | 2 +- src/ServiceStack.Text/PclExport.cs | 6 ++--- .../RecyclableMemoryStream.cs | 12 +++++----- .../ReflectionOptimizer.Emit.cs | 6 ++--- src/ServiceStack.Text/ReflectionOptimizer.cs | 2 +- .../ServiceStack.Text.Core.csproj | 2 +- .../ServiceStack.Text.csproj | 7 ++++-- src/ServiceStack.Text/StreamExtensions.cs | 12 +++++----- tests/Directory.Build.props | 22 ++++++++++++++++--- .../MiniProfiler/MiniProfiler.cs | 2 +- .../ServiceStack.Text.Benchmarks.csproj | 2 +- .../CsvSerializerTests.cs | 2 +- .../ServiceStack.Text.Tests/CsvStreamTests.cs | 16 +++++++------- .../DataContractTests.cs | 4 ++-- .../DateTimeOffsetAndTimeSpanTests.cs | 4 ++-- .../ServiceStack.Text.Tests/InterfaceTests.cs | 2 +- .../JsonTests/RouteValueDictionaryTests.cs | 2 +- .../TypeSerializerToStringDictionaryTests.cs | 2 +- .../ServiceStack.Text.Tests/MessagingTests.cs | 2 +- .../QueryStringSerializerTests.cs | 6 ++--- .../ServiceStack.Text.Tests.csproj | 2 +- .../StringSerializerNorthwindDatabaseTests.cs | 2 +- .../StringSerializerTests.cs | 2 +- .../StringSerializerTranslationTests.cs | 2 +- .../XmlSerializerTests.cs | 2 +- 35 files changed, 96 insertions(+), 69 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 6a5e8bb54..37d61bb6e 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -4,7 +4,7 @@ 5.12.1 ServiceStack ServiceStack, Inc. - © 2008-2018 ServiceStack, Inc + © 2008-2022 ServiceStack, Inc true https://github.com/ServiceStack/ServiceStack.Text https://servicestack.net/terms @@ -43,6 +43,14 @@ $(DefineConstants);NETSTANDARD;NETSTANDARD2_1 + + $(DefineConstants);NET6_0;NET6_0_OR_GREATER + + + + $(DefineConstants);NETCORE;NETCORE_SUPPORT + + diff --git a/src/ServiceStack.Memory/ServiceStack.Memory.csproj b/src/ServiceStack.Memory/ServiceStack.Memory.csproj index 392bcfe59..2cc2a99a7 100644 --- a/src/ServiceStack.Memory/ServiceStack.Memory.csproj +++ b/src/ServiceStack.Memory/ServiceStack.Memory.csproj @@ -3,7 +3,7 @@ netcoreapp2.1 - $(DefineConstants);NETSTANDARD;NETCORE2_1 + $(DefineConstants);NETSTANDARD;NETCORE;NETCORE2_1 diff --git a/src/ServiceStack.Text.sln b/src/ServiceStack.Text.sln index 6ae98a969..5b25d9f12 100644 --- a/src/ServiceStack.Text.sln +++ b/src/ServiceStack.Text.sln @@ -12,6 +12,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{F7FB50ED Directory.Build.props = Directory.Build.props ServiceStack.Text\ServiceStack.Text.Core.csproj = ServiceStack.Text\ServiceStack.Text.Core.csproj ..\build\build-core.proj = ..\build\build-core.proj + ..\tests\Directory.Build.props = ..\tests\Directory.Build.props EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServiceStack.Text", "ServiceStack.Text\ServiceStack.Text.csproj", "{579B3FDB-CDAD-44E1-8417-885C38E49A0E}" diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index bb0b8d23b..53bbfce0e 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -17,7 +17,7 @@ static Env() if (PclExport.Instance == null) throw new ArgumentException("PclExport.Instance needs to be initialized"); -#if NETSTANDARD +#if NETCORE IsNetStandard = true; try { @@ -64,7 +64,7 @@ static Env() SupportsDynamic = true; #endif -#if NETCORE2_1 || NET6_0 +#if NETCORE IsNetStandard = false; IsNetCore = true; SupportsDynamic = true; @@ -73,7 +73,6 @@ static Env() #if NET6_0 IsNet6 = true; #endif - #if NETSTANDARD2_0 IsNetStandard20 = true; #endif @@ -218,7 +217,7 @@ public static string ReferenceAssemblyPath set => referenceAssemblyPath = value; } -#if NETSTANDARD +#if NETCORE private static bool IsRunningAsUwp() { try @@ -315,7 +314,7 @@ public static ConfiguredTaskAwaitable ConfigAwait(this Task task) => public static ConfiguredTaskAwaitable ConfigAwait(this Task task) => task.ConfigureAwait(ContinueOnCapturedContext); -#if NETSTANDARD || NETCORE2_1 || NET6_0 +#if NETCORE [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ConfiguredValueTaskAwaitable ConfigAwait(this ValueTask task) => task.ConfigureAwait(ContinueOnCapturedContext); diff --git a/src/ServiceStack.Text/JsConfigScope.cs b/src/ServiceStack.Text/JsConfigScope.cs index 2bdded048..7212eca66 100644 --- a/src/ServiceStack.Text/JsConfigScope.cs +++ b/src/ServiceStack.Text/JsConfigScope.cs @@ -13,7 +13,7 @@ public sealed class JsConfigScope : Config, IDisposable bool disposed; readonly JsConfigScope parent; -#if NETSTANDARD +#if NETCORE private static AsyncLocal head = new AsyncLocal(); #else [ThreadStatic] private static JsConfigScope head; @@ -23,7 +23,7 @@ internal JsConfigScope() { PclExport.Instance.BeginThreadAffinity(); -#if NETSTANDARD +#if NETCORE parent = head.Value; head.Value = this; #else @@ -33,7 +33,7 @@ internal JsConfigScope() } internal static JsConfigScope Current => -#if NETSTANDARD +#if NETCORE head.Value; #else head; @@ -44,7 +44,7 @@ public void Dispose() if (!disposed) { disposed = true; -#if NETSTANDARD +#if NETCORE head.Value = parent; #else head = parent; diff --git a/src/ServiceStack.Text/LicenseUtils.cs b/src/ServiceStack.Text/LicenseUtils.cs index 7d1cc155f..ddc1d2ccb 100644 --- a/src/ServiceStack.Text/LicenseUtils.cs +++ b/src/ServiceStack.Text/LicenseUtils.cs @@ -499,7 +499,7 @@ public static bool VerifySignedHash(byte[] DataToVerify, byte[] SignedData, Syst public static LicenseKey VerifyLicenseKeyText(string licenseKeyText) { -#if NET45 || NETCORE2_1 || NET6_0 +#if NET45 || NETCORE LicenseKey key; try { diff --git a/src/ServiceStack.Text/MemoryProvider.cs b/src/ServiceStack.Text/MemoryProvider.cs index af621427d..60e60bad6 100644 --- a/src/ServiceStack.Text/MemoryProvider.cs +++ b/src/ServiceStack.Text/MemoryProvider.cs @@ -12,7 +12,7 @@ namespace ServiceStack.Text public abstract class MemoryProvider { public static MemoryProvider Instance = -#if NETCORE2_1 || NET6_0 +#if NETCORE && !NETSTANDARD2_0 ServiceStack.Memory.NetCoreMemory.Provider; #else DefaultMemory.Provider; diff --git a/src/ServiceStack.Text/NetCoreMemory.cs b/src/ServiceStack.Text/NetCoreMemory.cs index 90ad6a3f7..6ecaf62ee 100644 --- a/src/ServiceStack.Text/NetCoreMemory.cs +++ b/src/ServiceStack.Text/NetCoreMemory.cs @@ -1,4 +1,4 @@ -#if NETCORE2_1 || NET6_0 +#if NETCORE && !NETSTANDARD2_0 using System; using System.Buffers.Text; diff --git a/src/ServiceStack.Text/PathUtils.cs b/src/ServiceStack.Text/PathUtils.cs index e4ebc1299..73a7fe027 100644 --- a/src/ServiceStack.Text/PathUtils.cs +++ b/src/ServiceStack.Text/PathUtils.cs @@ -66,7 +66,7 @@ public static string MapAbsolutePath(this string relativePath) public static string MapHostAbsolutePath(this string relativePath) { var sep = PclExport.Instance.DirSep; -#if !NETSTANDARD +#if !NETCORE return PclExport.Instance.MapAbsolutePath(relativePath, $"{sep}.."); #else return PclExport.Instance.MapAbsolutePath(relativePath, $"{sep}..{sep}..{sep}.."); diff --git a/src/ServiceStack.Text/PclExport.NetCore.cs b/src/ServiceStack.Text/PclExport.NetCore.cs index 71a65cb22..14d8f89e4 100644 --- a/src/ServiceStack.Text/PclExport.NetCore.cs +++ b/src/ServiceStack.Text/PclExport.NetCore.cs @@ -1,4 +1,4 @@ -#if NETCORE2_1 || NET6_0 +#if NETCORE && !NETSTANDARD2_0 using System; using ServiceStack.Text; diff --git a/src/ServiceStack.Text/PclExport.NetStandard.cs b/src/ServiceStack.Text/PclExport.NetStandard.cs index b24672468..976e21fe9 100644 --- a/src/ServiceStack.Text/PclExport.NetStandard.cs +++ b/src/ServiceStack.Text/PclExport.NetStandard.cs @@ -1,7 +1,7 @@ //Copyright (c) ServiceStack, Inc. All Rights Reserved. //License: https://raw.github.com/ServiceStack/ServiceStack/master/license.txt -#if NETSTANDARD +#if NETCORE using System; using System.Collections.Generic; using System.IO; diff --git a/src/ServiceStack.Text/PclExport.cs b/src/ServiceStack.Text/PclExport.cs index 048b3949c..1f2a7e06c 100644 --- a/src/ServiceStack.Text/PclExport.cs +++ b/src/ServiceStack.Text/PclExport.cs @@ -29,10 +29,10 @@ public static class Platforms public static PclExport Instance #if NET45 = new Net45PclExport() -#elif NETCORE2_1 || NET6_0 - = new NetCorePclExport() -#else +#elif NETSTANDARD2_0 = new NetStandardPclExport() +#elif NETCORE + = new NetCorePclExport() #endif ; diff --git a/src/ServiceStack.Text/RecyclableMemoryStream.cs b/src/ServiceStack.Text/RecyclableMemoryStream.cs index 543845820..13ee0e6c9 100644 --- a/src/ServiceStack.Text/RecyclableMemoryStream.cs +++ b/src/ServiceStack.Text/RecyclableMemoryStream.cs @@ -36,7 +36,7 @@ public static class MemoryStreamFactory { public static bool UseRecyclableMemoryStream { get; set; } - public static RecyclableMemoryStreamManager RecyclableInstance = new RecyclableMemoryStreamManager(); + public static RecyclableMemoryStreamManager RecyclableInstance = new(); public static MemoryStream GetStream() { @@ -67,7 +67,7 @@ public static MemoryStream GetStream(byte[] bytes, int index, int count) } } -#if !NETSTANDARD +#if !NETCORE public enum EventLevel { LogAlways = 0, @@ -1039,7 +1039,7 @@ public MemoryStream GetStream(string tag, byte[] buffer, int offset, int count) return GetStream(Guid.NewGuid(), tag, buffer, offset, count); } -#if NETCOREAPP2_1 || NETSTANDARD2_1 +#if NETCORE && !NETSTANDARD2_0 /// /// Retrieve a new MemoryStream object with the given tag and with contents copied from the provided /// buffer. The provided buffer is not wrapped or used after construction. @@ -1697,7 +1697,7 @@ public int SafeRead(byte[] buffer, int offset, int count, ref int streamPosition return amountRead; } -#if NETCOREAPP2_1 || NETSTANDARD2_1 +#if !NETSTANDARD2_0 && NETCORE /// /// Reads from the current position into the provided buffer /// @@ -1800,7 +1800,7 @@ public override void Write(byte[] buffer, int offset, int count) this.length = Math.Max(this.position, this.length); } -#if NETCOREAPP2_1 || NETSTANDARD2_1 +#if !NETSTANDARD2_0 && NETCORE /// /// Writes the buffer to the stream /// @@ -2117,7 +2117,7 @@ private int InternalRead(byte[] buffer, int offset, int count, int fromPosition) return amountToCopy; } -#if NETCOREAPP2_1 || NETSTANDARD2_1 +#if NETCORE private int InternalRead(Span buffer, int fromPosition) { if (this.length - fromPosition <= 0) diff --git a/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs b/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs index ee2d7525d..6ffdd322a 100644 --- a/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs +++ b/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs @@ -1,4 +1,4 @@ -#if NET45 || NETCORE2_1 || NET6_0 +#if NET45 || (NETCORE && !NETSTANDARD2_0) using System; using System.Linq; @@ -324,7 +324,7 @@ static string ProxyName(Type targetType) static DynamicProxy() { var assemblyName = new AssemblyName("DynImpl"); -#if NETSTANDARD +#if NETCORE DynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); #else DynamicAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); @@ -348,7 +348,7 @@ static Type GetConstructedType(Type targetType) foreach (var face in targetType.GetInterfaces()) IncludeType(face, typeBuilder); -#if NETSTANDARD +#if NETCORE return typeBuilder.CreateTypeInfo().AsType(); #else return typeBuilder.CreateType(); diff --git a/src/ServiceStack.Text/ReflectionOptimizer.cs b/src/ServiceStack.Text/ReflectionOptimizer.cs index 41bcc5868..bfac69d1b 100644 --- a/src/ServiceStack.Text/ReflectionOptimizer.cs +++ b/src/ServiceStack.Text/ReflectionOptimizer.cs @@ -8,7 +8,7 @@ namespace ServiceStack.Text public abstract class ReflectionOptimizer { public static ReflectionOptimizer Instance = -#if NET45 || NETCORE2_1 || NET6_0 +#if NET45 || (NETCORE && !NETSTANDARD2_0) EmitReflectionOptimizer.Provider #else ExpressionReflectionOptimizer.Provider diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index 48ccee395..0d528ff6b 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -14,7 +14,7 @@ JSON;Text;Serializer;CSV;JSV;HTTP;Auto Mapping;Dump;Reflection;JS;Utils;Fast - $(DefineConstants);NETSTANDARD;NETCORE2_1 + $(DefineConstants);NETCORE;NETCORE2_1 $(DefineConstants);NETSTANDARD;NET6_0 diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index 12355d126..a874505fa 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -13,10 +13,13 @@ JSON;Text;Serializer;CSV;JSV;HTTP;Auto Mapping;Dump;Reflection;JS;Utils;Fast - $(DefineConstants);NETSTANDARD;NETCORE2_1 + $(DefineConstants);NETCORE;NETCORE2_1 + + + $(DefineConstants);NETCORE;NETSTANDARD;NETSTANDARD2_0 - $(DefineConstants);NETSTANDARD;NET6_0 + $(DefineConstants);NETCORE;NET6_0;NET6_0_OR_GREATER diff --git a/src/ServiceStack.Text/StreamExtensions.cs b/src/ServiceStack.Text/StreamExtensions.cs index 210854d56..b622fadbd 100644 --- a/src/ServiceStack.Text/StreamExtensions.cs +++ b/src/ServiceStack.Text/StreamExtensions.cs @@ -481,7 +481,7 @@ public static string ReadToEnd(this MemoryStream ms, Encoding encoding) { ms.Position = 0; -#if NETSTANDARD || NETCORE2_1 || NET6_0 +#if NETCORE if (ms.TryGetBuffer(out var buffer)) { return encoding.GetString(buffer.Array, buffer.Offset, buffer.Count); @@ -504,7 +504,7 @@ public static string ReadToEnd(this MemoryStream ms, Encoding encoding) public static ReadOnlyMemory GetBufferAsMemory(this MemoryStream ms) { -#if NETSTANDARD || NETCORE2_1 || NET6_0 +#if NETCORE if (ms.TryGetBuffer(out var buffer)) { return new ReadOnlyMemory(buffer.Array, buffer.Offset, buffer.Count); @@ -525,7 +525,7 @@ public static ReadOnlyMemory GetBufferAsMemory(this MemoryStream ms) public static ReadOnlySpan GetBufferAsSpan(this MemoryStream ms) { -#if NETSTANDARD || NETCORE2_1 || NET6_0 +#if NETCORE if (ms.TryGetBuffer(out var buffer)) { return new ReadOnlySpan(buffer.Array, buffer.Offset, buffer.Count); @@ -546,7 +546,7 @@ public static ReadOnlySpan GetBufferAsSpan(this MemoryStream ms) public static byte[] GetBufferAsBytes(this MemoryStream ms) { -#if NETSTANDARD || NETCORE2_1 || NET6_0 +#if NETCORE if (ms.TryGetBuffer(out var buffer)) { return buffer.Array; @@ -570,7 +570,7 @@ public static Task ReadToEndAsync(this MemoryStream ms, Encoding encodin { ms.Position = 0; -#if NETSTANDARD || NETCORE2_1 || NET6_0 +#if NETCORE if (ms.TryGetBuffer(out var buffer)) { return encoding.GetString(buffer.Array, buffer.Offset, buffer.Count).InTask(); @@ -626,7 +626,7 @@ public static Task WriteToAsync(this MemoryStream stream, Stream output, Cancell public static async Task WriteToAsync(this MemoryStream stream, Stream output, Encoding encoding, CancellationToken token) { -#if NETSTANDARD || NETCORE2_1 || NET6_0 +#if NETCORE if (stream.TryGetBuffer(out var buffer)) { await output.WriteAsync(buffer.Array, buffer.Offset, buffer.Count, token).ConfigAwait(); diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 5284e1180..a3ad75bd7 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -18,12 +18,28 @@ $(DefineConstants);NETFX;NET46 - - $(DefineConstants);NETCORE_SUPPORT;NETCORE + + $(DefineConstants);NETFX;NET461 + + + + $(DefineConstants);NETFX;NET472 + + + + $(DefineConstants);NETCORE;NETSTANDARD2_0 + + + + $(DefineConstants);NETSTANDARD;NETSTANDARD2_1 - $(DefineConstants);NETCORE_SUPPORT;NET_6 + $(DefineConstants);NET6_0;NET6_0_OR_GREATER + + + + $(DefineConstants);NETCORE;NETCORE_SUPPORT diff --git a/tests/ServiceStack.Text.Benchmarks/MiniProfiler/MiniProfiler.cs b/tests/ServiceStack.Text.Benchmarks/MiniProfiler/MiniProfiler.cs index 7eda2d50d..884dbfe47 100644 --- a/tests/ServiceStack.Text.Benchmarks/MiniProfiler/MiniProfiler.cs +++ b/tests/ServiceStack.Text.Benchmarks/MiniProfiler/MiniProfiler.cs @@ -280,7 +280,7 @@ public IEnumerable GetTimingHierarchy() } } -#if !NETSTANDARD +#if !NETCORE /// /// Create a DEEP clone of this MiniProfiler. /// diff --git a/tests/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj b/tests/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj index 108b74af4..e238d2b14 100644 --- a/tests/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj +++ b/tests/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj @@ -11,6 +11,6 @@ - $(DefineConstants);NETSTANDARD;NETCORE2_1 + $(DefineConstants);NETSTANDARD;NETCORE;NETCORE2_1 \ No newline at end of file diff --git a/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs b/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs index 520bdb7d7..0ac783e0a 100644 --- a/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs +++ b/tests/ServiceStack.Text.Tests/CsvSerializerTests.cs @@ -11,7 +11,7 @@ namespace ServiceStack.Text.Tests { [TestFixture] -#if NETCORE_SUPPORT +#if NETCORE [Ignore("Fix Northwind.dll")] #endif public class CsvSerializerTests diff --git a/tests/ServiceStack.Text.Tests/CsvStreamTests.cs b/tests/ServiceStack.Text.Tests/CsvStreamTests.cs index 414fcbab6..770f094db 100644 --- a/tests/ServiceStack.Text.Tests/CsvStreamTests.cs +++ b/tests/ServiceStack.Text.Tests/CsvStreamTests.cs @@ -19,7 +19,7 @@ public void TearDown() } [Test] -#if NETCORE_SUPPORT +#if NETCORE [Ignore("Fix Northwind.dll")] #endif public void Can_create_csv_from_Customers() @@ -31,7 +31,7 @@ public void Can_create_csv_from_Customers() } [Test] -#if NETCORE_SUPPORT +#if NETCORE [Ignore("Fix Northwind.dll")] #endif public void Can_create_csv_from_Customers_pipe_separator() @@ -44,7 +44,7 @@ public void Can_create_csv_from_Customers_pipe_separator() } [Test] -#if NETCORE_SUPPORT +#if NETCORE [Ignore("Fix Northwind.dll")] #endif public void Can_create_csv_from_Customers_pipe_delimiter() @@ -57,7 +57,7 @@ public void Can_create_csv_from_Customers_pipe_delimiter() } [Test] -#if NETCORE_SUPPORT +#if NETCORE [Ignore("Fix Northwind.dll")] #endif public void Can_create_csv_from_Customers_pipe_row_separator() @@ -70,7 +70,7 @@ public void Can_create_csv_from_Customers_pipe_row_separator() } [Test] -#if NETCORE_SUPPORT +#if NETCORE [Ignore("Fix Northwind.dll")] #endif public void Can_create_csv_from_Categories() @@ -88,7 +88,7 @@ public void Can_create_csv_from_Categories() } [Test] -#if NETCORE_SUPPORT +#if NETCORE [Ignore("Fix Northwind.dll")] #endif public void Can_create_csv_from_Categories_pipe_separator() @@ -107,7 +107,7 @@ public void Can_create_csv_from_Categories_pipe_separator() } [Test] -#if NETCORE_SUPPORT +#if NETCORE [Ignore("Fix Northwind.dll")] #endif public void Can_create_csv_from_Categories_pipe_delimiter() @@ -126,7 +126,7 @@ public void Can_create_csv_from_Categories_pipe_delimiter() } [Test] -#if NETCORE_SUPPORT +#if NETCORE [Ignore("Fix Northwind.dll")] #endif public void Can_create_csv_from_Categories_long_delimiter() diff --git a/tests/ServiceStack.Text.Tests/DataContractTests.cs b/tests/ServiceStack.Text.Tests/DataContractTests.cs index e3b43589b..0027c1805 100644 --- a/tests/ServiceStack.Text.Tests/DataContractTests.cs +++ b/tests/ServiceStack.Text.Tests/DataContractTests.cs @@ -258,7 +258,7 @@ public void Json_Serialize_Should_Respects_DataContract_Field_Name_With_Bytes_De Assert.IsTrue (t.Bytes.AreEqual (new byte[] { 0x61, 0x62 })); } -#if !NETCORE_SUPPORT +#if !NETCORE [Test] public void Can_get_weak_DataMember() { @@ -279,7 +279,7 @@ public class MyClass public string Title { get; set; } } -#if !NETCORE_SUPPORT +#if !NETCORE [Test] public void Can_get_weak_DataContract() { diff --git a/tests/ServiceStack.Text.Tests/DateTimeOffsetAndTimeSpanTests.cs b/tests/ServiceStack.Text.Tests/DateTimeOffsetAndTimeSpanTests.cs index 7e1aab785..b168d5e91 100644 --- a/tests/ServiceStack.Text.Tests/DateTimeOffsetAndTimeSpanTests.cs +++ b/tests/ServiceStack.Text.Tests/DateTimeOffsetAndTimeSpanTests.cs @@ -1,6 +1,6 @@ using System; using NUnit.Framework; -#if !NETCORE_SUPPORT +#if !NETCORE using ServiceStack.Serialization; #endif @@ -9,7 +9,7 @@ namespace ServiceStack.Text.Tests [TestFixture] public class DateTimeOffsetAndTimeSpanTests : TestBase { -#if !IOS && !NETCORE_SUPPORT +#if !IOS && !NETCORE [OneTimeSetUp] public void TestFixtureSetUp() { diff --git a/tests/ServiceStack.Text.Tests/InterfaceTests.cs b/tests/ServiceStack.Text.Tests/InterfaceTests.cs index be0a06c95..53e152ca5 100644 --- a/tests/ServiceStack.Text.Tests/InterfaceTests.cs +++ b/tests/ServiceStack.Text.Tests/InterfaceTests.cs @@ -120,7 +120,7 @@ public UserSession() public Dictionary ProviderOAuthAccess { get; set; } } -#if !NETCORE_SUPPORT +#if !NETCORE [Test] public void Can_Serialize_User_OAuthSession_map() { diff --git a/tests/ServiceStack.Text.Tests/JsonTests/RouteValueDictionaryTests.cs b/tests/ServiceStack.Text.Tests/JsonTests/RouteValueDictionaryTests.cs index da921a1e1..89fc75227 100644 --- a/tests/ServiceStack.Text.Tests/JsonTests/RouteValueDictionaryTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonTests/RouteValueDictionaryTests.cs @@ -1,4 +1,4 @@ -#if !NETCORE_SUPPORT +#if !NETCORE using System; using System.Runtime.Serialization; using System.Web.Routing; diff --git a/tests/ServiceStack.Text.Tests/JsvTests/TypeSerializerToStringDictionaryTests.cs b/tests/ServiceStack.Text.Tests/JsvTests/TypeSerializerToStringDictionaryTests.cs index 49250da2e..a1bf22ec0 100644 --- a/tests/ServiceStack.Text.Tests/JsvTests/TypeSerializerToStringDictionaryTests.cs +++ b/tests/ServiceStack.Text.Tests/JsvTests/TypeSerializerToStringDictionaryTests.cs @@ -8,7 +8,7 @@ namespace ServiceStack.Text.Tests.JsvTests { [TestFixture] -#if NETCORE_SUPPORT +#if NETCORE [Ignore("Fix Northwind.dll")] #endif public class TypeSerializerToStringDictionaryTests diff --git a/tests/ServiceStack.Text.Tests/MessagingTests.cs b/tests/ServiceStack.Text.Tests/MessagingTests.cs index b0038e984..8b00a6096 100644 --- a/tests/ServiceStack.Text.Tests/MessagingTests.cs +++ b/tests/ServiceStack.Text.Tests/MessagingTests.cs @@ -46,7 +46,7 @@ public void Can_serialize_object_IMessage_into_typed_Message() Assert.That(typedMessage.GetBody().Value, Is.EqualTo(dto.Value)); } -#if !NETCORE_SUPPORT +#if !NETCORE [Test] public void Can_serialize_IMessage_ToBytes_into_typed_Message() { diff --git a/tests/ServiceStack.Text.Tests/QueryStringSerializerTests.cs b/tests/ServiceStack.Text.Tests/QueryStringSerializerTests.cs index 9d5d02c5c..b16c7b767 100644 --- a/tests/ServiceStack.Text.Tests/QueryStringSerializerTests.cs +++ b/tests/ServiceStack.Text.Tests/QueryStringSerializerTests.cs @@ -4,7 +4,7 @@ using System.IO; using System.Web; using NUnit.Framework; -#if !NETCORE_SUPPORT +#if !NETCORE using ServiceStack.Host; using ServiceStack.Testing; #endif @@ -139,7 +139,7 @@ public void Can_serialize_quoted_strings() Assert.That(QueryStringSerializer.SerializeToString(new B { Property = "\"quoted content, and with a comma\"" }), Is.EqualTo("Property=%22quoted+content,+and+with+a+comma%22")); } -#if !NETCORE_SUPPORT +#if !NETCORE private T StringToPoco(string str) { var envKey = Environment.GetEnvironmentVariable("SERVICESTACK_LICENSE"); @@ -177,7 +177,7 @@ public void Can_serialize_with_comma_in_property_in_list() Assert.That(QueryStringSerializer.SerializeToString(testPocos), Is.EqualTo("ListOfA={ListOfB:[{Property:%22Doe,+John%22,Property2:Doe,Property3:John}]}")); } -#if !NETCORE_SUPPORT +#if !NETCORE [Test] public void Can_deserialize_with_comma_in_property_in_list_from_QueryStringSerializer() { diff --git a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj index 08677316a..266f235a4 100644 --- a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj +++ b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj @@ -50,7 +50,7 @@ - $(DefineConstants);NETCORE_SUPPORT;NETCORE;NETSTANDARD2_0 + $(DefineConstants);NETCORE;NETSTANDARD2_0 diff --git a/tests/ServiceStack.Text.Tests/StringSerializerNorthwindDatabaseTests.cs b/tests/ServiceStack.Text.Tests/StringSerializerNorthwindDatabaseTests.cs index 192dbe3e9..19d31aed6 100644 --- a/tests/ServiceStack.Text.Tests/StringSerializerNorthwindDatabaseTests.cs +++ b/tests/ServiceStack.Text.Tests/StringSerializerNorthwindDatabaseTests.cs @@ -6,7 +6,7 @@ namespace ServiceStack.Text.Tests { [TestFixture] -#if NETCORE_SUPPORT +#if NETCORE [Ignore("Fix Northwind.dll")] #endif public class StringSerializerNorthwindDatabaseTests diff --git a/tests/ServiceStack.Text.Tests/StringSerializerTests.cs b/tests/ServiceStack.Text.Tests/StringSerializerTests.cs index 717ff25b2..63d39ab0c 100644 --- a/tests/ServiceStack.Text.Tests/StringSerializerTests.cs +++ b/tests/ServiceStack.Text.Tests/StringSerializerTests.cs @@ -9,7 +9,7 @@ namespace ServiceStack.Text.Tests { [TestFixture] -#if NETCORE_SUPPORT +#if NETCORE [Ignore("Fix Northwind.dll")] #endif public class StringSerializerTests diff --git a/tests/ServiceStack.Text.Tests/StringSerializerTranslationTests.cs b/tests/ServiceStack.Text.Tests/StringSerializerTranslationTests.cs index 81e0d7189..ce4bc66f8 100644 --- a/tests/ServiceStack.Text.Tests/StringSerializerTranslationTests.cs +++ b/tests/ServiceStack.Text.Tests/StringSerializerTranslationTests.cs @@ -12,7 +12,7 @@ namespace ServiceStack.Text.Tests { [TestFixture] -#if NETCORE_SUPPORT +#if NETCORE [Ignore("Fix Northwind.dll")] #endif public class StringSerializerTranslationTests diff --git a/tests/ServiceStack.Text.Tests/XmlSerializerTests.cs b/tests/ServiceStack.Text.Tests/XmlSerializerTests.cs index 98a92525d..86f5254a1 100644 --- a/tests/ServiceStack.Text.Tests/XmlSerializerTests.cs +++ b/tests/ServiceStack.Text.Tests/XmlSerializerTests.cs @@ -6,7 +6,7 @@ namespace ServiceStack.Text.Tests { [TestFixture] -#if NETCORE_SUPPORT +#if NETCORE [Ignore("Fix Northwind.dll")] #endif public class XmlSerializerTests From 0fb69a07ea1668f5206a5f83af0e03526c4f8f12 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 4 Nov 2021 18:52:41 +0800 Subject: [PATCH 298/372] Add support for indented json via config/scoped json --- src/ServiceStack.Text/JsConfig.cs | 11 +++++++ src/ServiceStack.Text/JsConfigScope.cs | 3 ++ .../Json/JsonWriter.Generic.cs | 7 ++++- src/ServiceStack.Text/JsonSerializer.cs | 29 +++++++++++++++---- .../ServiceStack.Text.Tests/JsConfigTests.cs | 21 ++++++++++++-- 5 files changed, 61 insertions(+), 10 deletions(-) diff --git a/src/ServiceStack.Text/JsConfig.cs b/src/ServiceStack.Text/JsConfig.cs index 964ceac6e..455ac33ec 100644 --- a/src/ServiceStack.Text/JsConfig.cs +++ b/src/ServiceStack.Text/JsConfig.cs @@ -96,6 +96,11 @@ public static JsConfigScope CreateScope(string config, JsConfigScope scope = nul case "includetypeinfo": scope.IncludeTypeInfo = boolValue; break; + case "i": + case "pp": //pretty-print + case "indent": + scope.Indent = boolValue; + break; case "eccn": case "emitcamelcasenames": scope.TextCase = boolValue ? TextCase.CamelCase : scope.TextCase; @@ -399,6 +404,12 @@ public static bool IncludeTypeInfo set => Config.AssertNotInit().IncludeTypeInfo = value; } + public static bool Indent + { + get => JsConfigScope.Current != null ? JsConfigScope.Current.Indent : Config.Instance.Indent; + set => Config.AssertNotInit().Indent = value; + } + public static string TypeAttr { get => JsConfigScope.Current != null ? JsConfigScope.Current.TypeAttr : Config.Instance.TypeAttr; diff --git a/src/ServiceStack.Text/JsConfigScope.cs b/src/ServiceStack.Text/JsConfigScope.cs index 7212eca66..81603de19 100644 --- a/src/ServiceStack.Text/JsConfigScope.cs +++ b/src/ServiceStack.Text/JsConfigScope.cs @@ -120,6 +120,7 @@ private Config(Config config) public bool TreatEnumAsInteger { get; set; } public bool ExcludeTypeInfo { get; set; } public bool IncludeTypeInfo { get; set; } + public bool Indent { get; set; } private string typeAttr; public string TypeAttr @@ -196,6 +197,7 @@ public bool EmitLowercaseUnderscoreNames TreatEnumAsInteger = false, ExcludeTypeInfo = false, IncludeTypeInfo = false, + Indent = false, TypeAttr = JsWriter.TypeAttr, DateTimeFormat = null, TypeWriter = AssemblyUtils.WriteType, @@ -240,6 +242,7 @@ public Config Populate(Config config) TreatEnumAsInteger = config.TreatEnumAsInteger; ExcludeTypeInfo = config.ExcludeTypeInfo; IncludeTypeInfo = config.IncludeTypeInfo; + Indent = config.Indent; TypeAttr = config.TypeAttr; DateTimeFormat = config.DateTimeFormat; TypeWriter = config.TypeWriter; diff --git a/src/ServiceStack.Text/Json/JsonWriter.Generic.cs b/src/ServiceStack.Text/Json/JsonWriter.Generic.cs index 3dcf75d2f..c5a9cc865 100644 --- a/src/ServiceStack.Text/Json/JsonWriter.Generic.cs +++ b/src/ServiceStack.Text/Json/JsonWriter.Generic.cs @@ -214,12 +214,17 @@ public static void WriteObject(TextWriter writer, object value) } public static void WriteRootObject(TextWriter writer, object value) + { + GetRootObjectWriteFn(value)(writer, value); + } + + public static WriteObjectDelegate GetRootObjectWriteFn(object value) { TypeConfig.Init(); JsonSerializer.OnSerialize?.Invoke(value); JsState.Depth = 0; - CacheFn(writer, value); + return CacheFn; } } diff --git a/src/ServiceStack.Text/JsonSerializer.cs b/src/ServiceStack.Text/JsonSerializer.cs index 4caa4787c..d3468fb74 100644 --- a/src/ServiceStack.Text/JsonSerializer.cs +++ b/src/ServiceStack.Text/JsonSerializer.cs @@ -99,7 +99,7 @@ public static string SerializeToString(T value) } else { - JsonWriter.WriteRootObject(writer, value); + WriteObjectToWriter(value, JsonWriter.GetRootObjectWriteFn(value), writer); } return StringWriterThreadStatic.ReturnAndFree(writer); } @@ -116,7 +116,7 @@ public static string SerializeToString(object value, Type type) else { OnSerialize?.Invoke(value); - JsonWriter.GetWriteFn(type)(writer, value); + WriteObjectToWriter(value, JsonWriter.GetWriteFn(type), writer); } return StringWriterThreadStatic.ReturnAndFree(writer); } @@ -141,7 +141,7 @@ public static void SerializeToWriter(T value, TextWriter writer) } else { - JsonWriter.WriteRootObject(writer, value); + WriteObjectToWriter(value, JsonWriter.GetRootObjectWriteFn(value), writer); } } @@ -155,7 +155,7 @@ public static void SerializeToWriter(object value, Type type, TextWriter writer) } OnSerialize?.Invoke(value); - JsonWriter.GetWriteFn(type)(writer, value); + WriteObjectToWriter(value, JsonWriter.GetWriteFn(type), writer); } public static void SerializeToStream(T value, Stream stream) @@ -175,7 +175,7 @@ public static void SerializeToStream(T value, Stream stream) else { var writer = new StreamWriter(stream, JsConfig.UTF8Encoding, BufferSize, leaveOpen:true); - JsonWriter.WriteRootObject(writer, value); + WriteObjectToWriter(value, JsonWriter.GetRootObjectWriteFn(value), writer); writer.Flush(); } } @@ -184,10 +184,27 @@ public static void SerializeToStream(object value, Type type, Stream stream) { OnSerialize?.Invoke(value); var writer = new StreamWriter(stream, JsConfig.UTF8Encoding, BufferSize, leaveOpen:true); - JsonWriter.GetWriteFn(type)(writer, value); + WriteObjectToWriter(value, JsonWriter.GetWriteFn(type), writer); writer.Flush(); } + private static void WriteObjectToWriter(object value, WriteObjectDelegate serializeFn, TextWriter writer) + { + if (!JsConfig.Indent) + { + serializeFn(writer, value); + } + else + { + var sb = StringBuilderCache.Allocate(); + using var captureJson = new StringWriter(sb); + serializeFn(captureJson, value); + captureJson.Flush(); + var json = StringBuilderCache.ReturnAndFree(sb); + var indentJson = json.IndentJson(); + writer.Write(indentJson); + } + } public static T DeserializeFromStream(Stream stream) { return (T)MemoryProvider.Instance.Deserialize(stream, typeof(T), DeserializeFromSpan); diff --git a/tests/ServiceStack.Text.Tests/JsConfigTests.cs b/tests/ServiceStack.Text.Tests/JsConfigTests.cs index dc1627c18..b42d3d3b1 100644 --- a/tests/ServiceStack.Text.Tests/JsConfigTests.cs +++ b/tests/ServiceStack.Text.Tests/JsConfigTests.cs @@ -201,6 +201,19 @@ class TestObject } private const string AssertMessageFormat = "Cannot find correct property value ({0})"; + + [Test] + public void Can_indent_in_scoped_json() + { + var obj = new TestObject { Id = 1 }; + using (JsConfig.With(new Config { Indent = true })) + { + var scopedJson = obj.ToJson(); + Assert.That(scopedJson.NormalizeNewLines(), Is.EqualTo("{\n \"Id\": 1,\n \"RootId\": 0\n}")); + } + var json = obj.ToJson(); + Assert.That(json, Is.EqualTo("{\"Id\":1,\"RootId\":0}")); + } } [TestFixture] @@ -209,11 +222,12 @@ public class JsConfigCreateTests [Test] public void Does_create_scope_from_string() { - var scope = JsConfig.CreateScope("emitlowercaseunderscorenames,IncludeNullValues:false,ExcludeDefaultValues:0,IncludeDefaultEnums:1"); + var scope = JsConfig.CreateScope("emitlowercaseunderscorenames,IncludeNullValues:false,ExcludeDefaultValues:0,IncludeDefaultEnums:1,indent"); Assert.That(scope.TextCase, Is.EqualTo(TextCase.SnakeCase)); Assert.That(!scope.IncludeNullValues); Assert.That(!scope.ExcludeDefaultValues); Assert.That(scope.IncludeDefaultEnums); + Assert.That(scope.Indent); scope.Dispose(); scope = JsConfig.CreateScope("DateHandler:ISO8601,timespanhandler:durationformat,PropertyConvention:strict,TextCase:CamelCase"); @@ -227,11 +241,12 @@ public void Does_create_scope_from_string() [Test] public void Does_create_scope_from_string_using_CamelCaseHumps() { - var scope = JsConfig.CreateScope("eccn,inv:false,edv:0,ide:1"); + var scope = JsConfig.CreateScope("eccn,inv:false,edv:0,ide:1,pp"); Assert.That(scope.TextCase, Is.EqualTo(TextCase.CamelCase)); Assert.That(!scope.IncludeNullValues); Assert.That(!scope.ExcludeDefaultValues); Assert.That(scope.IncludeDefaultEnums); + Assert.That(scope.Indent); scope.Dispose(); scope = JsConfig.CreateScope("dh:ISO8601,tsh:df,pc:strict,tc:cc"); @@ -274,7 +289,7 @@ public void Does_not_allow_setting_multiple_inits_in_StrictMode() Env.StrictMode = true; - Assert.Throws(() => JsConfig.Init()); + Assert.Throws(JsConfig.Init); } [Test] From 00a5972c844d303fd028e5e4a23cb022fc6c44fe Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 5 Nov 2021 21:57:34 +0800 Subject: [PATCH 299/372] Implement JsonObject.GetEnumerator() so returns same value as indexer --- src/ServiceStack.Text/JsonObject.cs | 11 +++++++++++ tests/ServiceStack.Text.Tests/JsonObjectTests.cs | 15 +++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/ServiceStack.Text/JsonObject.cs b/src/ServiceStack.Text/JsonObject.cs index 5333f39ba..eaacf5fe4 100644 --- a/src/ServiceStack.Text/JsonObject.cs +++ b/src/ServiceStack.Text/JsonObject.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Globalization; using System.IO; @@ -88,6 +89,16 @@ public class JsonObject : Dictionary set => base[key] = value; } + public Enumerator GetEnumerator() + { + var to = new Dictionary(); + foreach (var key in Keys) + { + to[key] = this[key]; + } + return to.GetEnumerator(); + } + public static JsonObject Parse(string json) { return JsonSerializer.DeserializeFromString(json); diff --git a/tests/ServiceStack.Text.Tests/JsonObjectTests.cs b/tests/ServiceStack.Text.Tests/JsonObjectTests.cs index 29fc04b4d..bb20f7fcf 100644 --- a/tests/ServiceStack.Text.Tests/JsonObjectTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonObjectTests.cs @@ -474,5 +474,20 @@ public void Does_serialize_ObjectDictionaryWrapper_line_breaks() Assert.That(nested.ToJson(), Is.EqualTo("{\"Prop\":{\"a\":{\"text\":\"line\\nbreak\"}}}")); } + [Test] + public void Enumerating_JsonObject_returns_same_unescaped_value_as_indexer() + { + var obj = JsonObject.Parse(@"{""a"":""b\\c""}"); + Assert.That(obj["a"], Is.EqualTo("b\\c")); + + foreach (var entry in obj) + { + if (entry.Key == "a") + { + Assert.That(entry.Value, Is.EqualTo("b\\c")); + } + } + } + } } \ No newline at end of file From 99a556f76b77ae43bf3d38f0b5e0924abf60eebe Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 5 Nov 2021 22:54:04 +0800 Subject: [PATCH 300/372] Also override JsonObject's IEnumerable> --- src/ServiceStack.Text/JsonObject.cs | 7 +++-- .../JsonObjectTests.cs | 28 +++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/JsonObject.cs b/src/ServiceStack.Text/JsonObject.cs index eaacf5fe4..47fbfb044 100644 --- a/src/ServiceStack.Text/JsonObject.cs +++ b/src/ServiceStack.Text/JsonObject.cs @@ -78,7 +78,7 @@ public static Dictionary ToDictionary(this JsonObject jsonObject } } - public class JsonObject : Dictionary + public class JsonObject : Dictionary, IEnumerable> { /// /// Get JSON string value @@ -89,7 +89,7 @@ public class JsonObject : Dictionary set => base[key] = value; } - public Enumerator GetEnumerator() + public new Enumerator GetEnumerator() { var to = new Dictionary(); foreach (var key in Keys) @@ -99,6 +99,9 @@ public Enumerator GetEnumerator() return to.GetEnumerator(); } + IEnumerator> IEnumerable>.GetEnumerator() + => GetEnumerator(); + public static JsonObject Parse(string json) { return JsonSerializer.DeserializeFromString(json); diff --git a/tests/ServiceStack.Text.Tests/JsonObjectTests.cs b/tests/ServiceStack.Text.Tests/JsonObjectTests.cs index bb20f7fcf..667781dfd 100644 --- a/tests/ServiceStack.Text.Tests/JsonObjectTests.cs +++ b/tests/ServiceStack.Text.Tests/JsonObjectTests.cs @@ -487,6 +487,34 @@ public void Enumerating_JsonObject_returns_same_unescaped_value_as_indexer() Assert.That(entry.Value, Is.EqualTo("b\\c")); } } + + var asEnumerable = (IEnumerable>)obj; + foreach (var entry in asEnumerable) + { + if (entry.Key == "a") + { + Assert.That(entry.Value, Is.EqualTo("b\\c")); + } + } + + var asIDict = (IDictionary)obj; + foreach (var entry in asIDict) + { + if (entry.Key == "a") + { + Assert.That(entry.Value, Is.EqualTo("b\\c")); + } + } + + // Warning: can't override concrete Dictionary enumerator + // var asDict = (Dictionary)obj; + // foreach (var entry in asDict) + // { + // if (entry.Key == "a") + // { + // Assert.That(entry.Value, Is.EqualTo("b\\c")); + // } + // } } } From da5efc0dd2bda9d95bb95b2fc4614e7d3b1017ac Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 5 Nov 2021 23:23:46 +0800 Subject: [PATCH 301/372] Fix tests --- src/ServiceStack.Text/Common/WriteDictionary.cs | 4 ++++ src/ServiceStack.Text/JsonObject.cs | 11 +++++++++++ src/ServiceStack.Text/Pcl.Dynamic.cs | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Common/WriteDictionary.cs b/src/ServiceStack.Text/Common/WriteDictionary.cs index a40501384..4041e801b 100644 --- a/src/ServiceStack.Text/Common/WriteDictionary.cs +++ b/src/ServiceStack.Text/Common/WriteDictionary.cs @@ -205,6 +205,10 @@ public static void WriteGenericIDictionary( writer.Write(JsonUtils.Null); return; } + + if (map is JsonObject jsonObject) + map = (IDictionary) jsonObject.ToUnescapedDictionary(); + writer.Write(JsWriter.MapStartChar); var encodeMapKey = Serializer.GetTypeInfo(typeof(TKey)).EncodeMapKey; diff --git a/src/ServiceStack.Text/JsonObject.cs b/src/ServiceStack.Text/JsonObject.cs index 47fbfb044..196a13d44 100644 --- a/src/ServiceStack.Text/JsonObject.cs +++ b/src/ServiceStack.Text/JsonObject.cs @@ -102,6 +102,17 @@ public class JsonObject : Dictionary, IEnumerable> IEnumerable>.GetEnumerator() => GetEnumerator(); + public Dictionary ToUnescapedDictionary() + { + var to = new Dictionary(); + var enumerateAsConcreteDict = (Dictionary)this; + foreach (var entry in enumerateAsConcreteDict) + { + to[entry.Key] = entry.Value; + } + return to; + } + public static JsonObject Parse(string json) { return JsonSerializer.DeserializeFromString(json); diff --git a/src/ServiceStack.Text/Pcl.Dynamic.cs b/src/ServiceStack.Text/Pcl.Dynamic.cs index 0a3a84451..0a462ab61 100644 --- a/src/ServiceStack.Text/Pcl.Dynamic.cs +++ b/src/ServiceStack.Text/Pcl.Dynamic.cs @@ -102,7 +102,7 @@ public static dynamic Deserialize(string json) { // Support arbitrary nesting by using JsonObject var deserialized = JsonSerializer.DeserializeFromString(json); - var hash = deserialized.ToDictionary, string, object>(entry => entry.Key, entry => entry.Value); + var hash = deserialized.ToUnescapedDictionary().ToObjectDictionary(); return new DynamicJson(hash); } From 4a4ad4c5be466f936f61221d851171db73da4cb7 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 9 Nov 2021 19:01:17 +0800 Subject: [PATCH 302/372] Use 5.* wildcard version for .Text deps --- tests/Northwind.Common/Northwind.Common.csproj | 2 +- tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Northwind.Common/Northwind.Common.csproj b/tests/Northwind.Common/Northwind.Common.csproj index 2ae3f767f..c575bd4b0 100644 --- a/tests/Northwind.Common/Northwind.Common.csproj +++ b/tests/Northwind.Common/Northwind.Common.csproj @@ -26,7 +26,7 @@ - + diff --git a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj index 266f235a4..c5861f375 100644 --- a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj +++ b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj @@ -34,7 +34,7 @@ - + $(DefineConstants);NET45 From 8df4588b426e0d75b6057a9de9e627096efd4a2c Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 9 Nov 2021 22:40:48 +0800 Subject: [PATCH 303/372] bump to v5.13.0 --- src/Directory.Build.props | 2 +- src/ServiceStack.Text/Env.cs | 2 +- tests/Directory.Build.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 37d61bb6e..7bc3a2084 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.12.1 + 5.13.0 ServiceStack ServiceStack, Inc. © 2008-2022 ServiceStack, Inc diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 53bbfce0e..b0a6a6eda 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -115,7 +115,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.121m; + public static decimal ServiceStackVersion = 5.130m; public static bool IsLinux { get; set; } diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index a3ad75bd7..cd75a1be6 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.12.1 + 5.13.0 latest false From 67d23143769983d3d8465123aad7476762487a7a Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 10 Nov 2021 18:19:39 +0800 Subject: [PATCH 304/372] Change tests to run recommended net472 or net6.0 TFMs --- .../DictionaryTests.cs | 21 +++++++++++-------- .../ServiceStack.Text.Tests.csproj | 14 ++++++------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/tests/ServiceStack.Text.Tests/DictionaryTests.cs b/tests/ServiceStack.Text.Tests/DictionaryTests.cs index d20ccdd3f..400d44f51 100644 --- a/tests/ServiceStack.Text.Tests/DictionaryTests.cs +++ b/tests/ServiceStack.Text.Tests/DictionaryTests.cs @@ -250,7 +250,7 @@ public void Test_ServiceStack_Text_JsonSerializer_Array_Value_Deserializes_Corre } [Test] - public void deserizes_to_decimal_by_default() + public void Deserializes_to_decimal_by_default() { JsConfig.TryToParsePrimitiveTypeValues = true; @@ -279,7 +279,7 @@ public NumericType(decimal min, decimal max, Type type) } [Test] - public void deserizes_signed_bytes_into_to_best_fit_numeric() + public void Deserializes_signed_bytes_into_to_best_fit_numeric() { JsConfig.TryToParsePrimitiveTypeValues = true; JsConfig.TryToParseNumericType = true; @@ -292,8 +292,9 @@ public void deserizes_signed_bytes_into_to_best_fit_numeric() Assert.That(deserializedDict["max"], Is.EqualTo(sbyte.MaxValue)); } +#if NETFX [Test] - public void deserizes_floats_into_to_best_fit_floating_point() + public void Deserializes_floats_into_to_best_fit_floating_point() { JsConfig.TryToParsePrimitiveTypeValues = true; JsConfig.TryToParseNumericType = true; @@ -301,7 +302,8 @@ public void deserizes_floats_into_to_best_fit_floating_point() float floatValue = 1.1f; //TODO find a number that doesn't suck which throws in float.Parse() but not double.Parse() - double doubleValue = double.MaxValue - Math.Pow(2, 1000); + double Offset = Math.Pow(2, 1000); + double doubleValue = double.MaxValue - Offset; var intValue = int.MaxValue; var longValue = long.MaxValue; @@ -311,7 +313,7 @@ public void deserizes_floats_into_to_best_fit_floating_point() var toFloatValue = float.Parse(floatValue.ToString()); Assert.AreEqual(toFloatValue, floatValue, 1); var toDoubleValue = double.Parse(doubleValue.ToString()); - Assert.AreEqual(toDoubleValue, doubleValue, Math.Pow(2, 1000)); + Assert.AreEqual(toDoubleValue, doubleValue, Offset); var json = "{{\"float\":{0},\"double\":{1},\"int\":{2},\"long\":{3}}}" .Fmt(CultureInfo.InvariantCulture, floatValue, doubleValue, intValue, longValue); @@ -319,9 +321,9 @@ public void deserizes_floats_into_to_best_fit_floating_point() Assert.That(map["float"], Is.TypeOf()); Assert.That(map["float"], Is.EqualTo(floatValue)); - + Assert.That(map["double"], Is.TypeOf()); - Assert.AreEqual((double)map["double"], doubleValue, Math.Pow(2, 1000)); + Assert.AreEqual((double)map["double"], doubleValue, Offset); Assert.That(map["int"], Is.TypeOf()); Assert.That(map["int"], Is.EqualTo(intValue)); @@ -331,9 +333,10 @@ public void deserizes_floats_into_to_best_fit_floating_point() JsConfig.Reset(); } +#endif [Test] - public void deserizes_signed_types_into_to_best_fit_numeric() + public void Deserializes_signed_types_into_to_best_fit_numeric() { var unsignedTypes = new[] { @@ -365,7 +368,7 @@ public void deserizes_signed_types_into_to_best_fit_numeric() } [Test] - public void deserizes_unsigned_types_into_to_best_fit_numeric() + public void Deserializes_unsigned_types_into_to_best_fit_numeric() { var unsignedTypes = new[] { diff --git a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj index c5861f375..7092dec2b 100644 --- a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj +++ b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj @@ -1,6 +1,6 @@  - net461;netcoreapp2.1 + net472;net6.0 portable ServiceStack.Text.Tests Library @@ -16,7 +16,7 @@ latest - Full + Full @@ -36,10 +36,10 @@ - - $(DefineConstants);NET45 + + $(DefineConstants);NETFX - + @@ -49,10 +49,10 @@ - + $(DefineConstants);NETCORE;NETSTANDARD2_0 - + From 6463f003853521bcbb58b9941ce870aa76c15190 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 10 Nov 2021 20:36:46 +0800 Subject: [PATCH 305/372] Add support for .NET 6 DateOnly/TimeOnly data types --- .../Common/DeserializeBuiltin.cs | 12 ++ .../Common/ITypeSerializer.cs | 11 +- src/ServiceStack.Text/Common/JsWriter.cs | 18 +++ src/ServiceStack.Text/DateTimeExtensions.cs | 5 + .../Json/JsonTypeSerializer.cs | 45 +++++- .../Jsv/JsvTypeSerializer.cs | 39 +++++ .../ServiceStack.Text.Tests/Net6TypeTests.cs | 138 ++++++++++++++++++ .../ServiceStack.Text.Tests.csproj | 6 +- .../ServiceStack.Text.TestsConsole.csproj | 2 +- 9 files changed, 269 insertions(+), 7 deletions(-) create mode 100644 tests/ServiceStack.Text.Tests/Net6TypeTests.cs diff --git a/src/ServiceStack.Text/Common/DeserializeBuiltin.cs b/src/ServiceStack.Text/Common/DeserializeBuiltin.cs index 0889051c9..78471e323 100644 --- a/src/ServiceStack.Text/Common/DeserializeBuiltin.cs +++ b/src/ServiceStack.Text/Common/DeserializeBuiltin.cs @@ -74,6 +74,12 @@ private static ParseStringSpanDelegate GetParseStringSpanFn() return value => DateTimeSerializer.ParseDateTimeOffset(value.ToString()); if (typeof(T) == typeof(TimeSpan)) return value => DateTimeSerializer.ParseTimeSpan(value.ToString()); +#if NET6_0 + if (typeof(T) == typeof(DateOnly)) + return value => DateOnly.FromDateTime(DateTimeSerializer.ParseShortestXsdDateTime(value.ToString())); + if (typeof(T) == typeof(TimeOnly)) + return value => TimeOnly.FromTimeSpan(DateTimeSerializer.ParseTimeSpan(value.ToString())); +#endif } else { @@ -119,6 +125,12 @@ private static ParseStringSpanDelegate GetParseStringSpanFn() return value => value.IsNullOrEmpty() ? (Guid?)null : value.ParseGuid(); if (typeof(T) == typeof(DateTimeOffset?)) return value => DateTimeSerializer.ParseNullableDateTimeOffset(value.ToString()); +#if NET6_0 + if (typeof(T) == typeof(DateOnly?)) + return value => value.IsNullOrEmpty() ? default : DateOnly.FromDateTime(DateTimeSerializer.ParseShortestXsdDateTime(value.ToString())); + if (typeof(T) == typeof(TimeOnly?)) + return value => value.IsNullOrEmpty() ? default : TimeOnly.FromTimeSpan(DateTimeSerializer.ParseTimeSpan(value.ToString())); +#endif } return null; diff --git a/src/ServiceStack.Text/Common/ITypeSerializer.cs b/src/ServiceStack.Text/Common/ITypeSerializer.cs index 4545e0b62..2f25ebaa9 100644 --- a/src/ServiceStack.Text/Common/ITypeSerializer.cs +++ b/src/ServiceStack.Text/Common/ITypeSerializer.cs @@ -30,8 +30,8 @@ public interface ITypeSerializer void WriteNullableDateTime(TextWriter writer, object dateTime); void WriteDateTimeOffset(TextWriter writer, object oDateTimeOffset); void WriteNullableDateTimeOffset(TextWriter writer, object dateTimeOffset); - void WriteTimeSpan(TextWriter writer, object dateTimeOffset); - void WriteNullableTimeSpan(TextWriter writer, object dateTimeOffset); + void WriteTimeSpan(TextWriter writer, object timeSpan); + void WriteNullableTimeSpan(TextWriter writer, object timeSpan); void WriteGuid(TextWriter writer, object oValue); void WriteNullableGuid(TextWriter writer, object oValue); void WriteBytes(TextWriter writer, object oByteValue); @@ -50,6 +50,13 @@ public interface ITypeSerializer void WriteDecimal(TextWriter writer, object decimalValue); void WriteEnum(TextWriter writer, object enumValue); +#if NET6_0_OR_GREATER + void WriteDateOnly(TextWriter writer, object oDateOnly); + void WriteNullableDateOnly(TextWriter writer, object oDateOnly); + void WriteTimeOnly(TextWriter writer, object oTimeOnly); + void WriteNullableTimeOnly(TextWriter writer, object oTimeOnly); +#endif + ParseStringDelegate GetParseFn(); ParseStringSpanDelegate GetParseStringSpanFn(); ParseStringDelegate GetParseFn(Type type); diff --git a/src/ServiceStack.Text/Common/JsWriter.cs b/src/ServiceStack.Text/Common/JsWriter.cs index daf12c4e5..e9bb5dd00 100644 --- a/src/ServiceStack.Text/Common/JsWriter.cs +++ b/src/ServiceStack.Text/Common/JsWriter.cs @@ -278,6 +278,24 @@ public WriteObjectDelegate GetValueTypeToStringMethod(Type type) if (type == typeof(Guid?)) return Serializer.WriteNullableGuid; + +#if NET6_0 + if (type == typeof(DateOnly)) + if (isNullable) + return Serializer.WriteNullableDateOnly; + else + return Serializer.WriteDateOnly; + if (type == typeof(DateOnly?)) + return Serializer.WriteDateOnly; + + if (type == typeof(TimeOnly)) + if (isNullable) + return Serializer.WriteNullableTimeOnly; + else + return Serializer.WriteTimeOnly; + if (type == typeof(TimeOnly?)) + return Serializer.WriteTimeOnly; +#endif } else { diff --git a/src/ServiceStack.Text/DateTimeExtensions.cs b/src/ServiceStack.Text/DateTimeExtensions.cs index a11dedb4d..0373037f3 100644 --- a/src/ServiceStack.Text/DateTimeExtensions.cs +++ b/src/ServiceStack.Text/DateTimeExtensions.cs @@ -76,6 +76,11 @@ public static long ToUnixTimeMs(this long ticks) return (ticks - UnixEpoch) / TimeSpan.TicksPerMillisecond; } +#if NET6_0 + public static long ToUnixTimeMs(this DateOnly dateOnly) => dateOnly.ToDateTime(default, DateTimeKind.Utc).ToUnixTimeMs(); + public static long ToUnixTime(this DateOnly dateOnly) => dateOnly.ToDateTime(default, DateTimeKind.Utc).ToUnixTime(); +#endif + public static DateTime FromUnixTimeMs(this double msSince1970) { return UnixEpochDateTimeUtc + TimeSpan.FromMilliseconds(msSince1970); diff --git a/src/ServiceStack.Text/Json/JsonTypeSerializer.cs b/src/ServiceStack.Text/Json/JsonTypeSerializer.cs index 7101a82fc..4d38b238d 100644 --- a/src/ServiceStack.Text/Json/JsonTypeSerializer.cs +++ b/src/ServiceStack.Text/Json/JsonTypeSerializer.cs @@ -138,7 +138,6 @@ public void WriteTimeSpan(TextWriter writer, object oTimeSpan) public void WriteNullableTimeSpan(TextWriter writer, object oTimeSpan) { - if (oTimeSpan == null) return; WriteTimeSpan(writer, ((TimeSpan?)oTimeSpan).Value); } @@ -289,6 +288,50 @@ public void WriteEnum(TextWriter writer, object enumValue) JsWriter.WriteEnumFlags(writer, enumValue); } + +#if NET6_0 + public void WriteDateOnly(TextWriter writer, object oDateOnly) + { + var dateOnly = (DateOnly)oDateOnly; + switch (JsConfig.DateHandler) + { + case DateHandler.UnixTime: + writer.Write(dateOnly.ToUnixTime()); + break; + case DateHandler.UnixTimeMs: + writer.Write(dateOnly.ToUnixTimeMs()); + break; + default: + writer.Write(JsWriter.QuoteString); + writer.Write(dateOnly.ToString("O")); + writer.Write(JsWriter.QuoteString); + break; + } + } + + public void WriteNullableDateOnly(TextWriter writer, object oDateOnly) + { + if (oDateOnly == null) + writer.Write(JsonUtils.Null); + else + WriteDateOnly(writer, oDateOnly); + } + + public void WriteTimeOnly(TextWriter writer, object oTimeOnly) + { + var stringValue = JsConfig.TimeSpanHandler == TimeSpanHandler.StandardFormat + ? oTimeOnly.ToString() + : DateTimeSerializer.ToXsdTimeSpanString(((TimeOnly)oTimeOnly).ToTimeSpan()); + WriteRawString(writer, stringValue); + } + + public void WriteNullableTimeOnly(TextWriter writer, object oTimeOnly) + { + if (oTimeOnly == null) return; + WriteTimeSpan(writer, ((TimeOnly?)oTimeOnly).Value.ToTimeSpan()); + } +#endif + [MethodImpl(MethodImplOptions.AggressiveInlining)] public ParseStringDelegate GetParseFn() { diff --git a/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs b/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs index 2b78ed86b..4c7a48306 100644 --- a/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs +++ b/src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs @@ -248,6 +248,45 @@ public void WriteEnum(TextWriter writer, object enumValue) JsWriter.WriteEnumFlags(writer, enumValue); } +#if NET6_0 + public void WriteDateOnly(TextWriter writer, object oDateOnly) + { + var dateOnly = (DateOnly)oDateOnly; + switch (JsConfig.DateHandler) + { + case DateHandler.UnixTime: + writer.Write(dateOnly.ToUnixTime()); + break; + case DateHandler.UnixTimeMs: + writer.Write(dateOnly.ToUnixTimeMs()); + break; + default: + writer.Write(dateOnly.ToString("O")); + break; + } + } + + public void WriteNullableDateOnly(TextWriter writer, object oDateOnly) + { + if (oDateOnly == null) return; + WriteDateOnly(writer, oDateOnly); + } + + public void WriteTimeOnly(TextWriter writer, object oTimeOnly) + { + var stringValue = JsConfig.TimeSpanHandler == TimeSpanHandler.StandardFormat + ? oTimeOnly.ToString() + : DateTimeSerializer.ToXsdTimeSpanString(((TimeOnly)oTimeOnly).ToTimeSpan()); + WriteRawString(writer, stringValue); + } + + public void WriteNullableTimeOnly(TextWriter writer, object oTimeOnly) + { + if (oTimeOnly == null) return; + WriteTimeSpan(writer, ((TimeOnly?)oTimeOnly).Value.ToTimeSpan()); + } +#endif + public ParseStringDelegate GetParseFn() => JsvReader.Instance.GetParseFn(); public ParseStringDelegate GetParseFn(Type type) => JsvReader.GetParseFn(type); diff --git a/tests/ServiceStack.Text.Tests/Net6TypeTests.cs b/tests/ServiceStack.Text.Tests/Net6TypeTests.cs new file mode 100644 index 000000000..e3a097dad --- /dev/null +++ b/tests/ServiceStack.Text.Tests/Net6TypeTests.cs @@ -0,0 +1,138 @@ +using System; +using NUnit.Framework; + +#if NET6_0 +namespace ServiceStack.Text.Tests; + +public class DateOnlyDto +{ + public DateOnly Date { get; set; } + + protected bool Equals(DateOnlyDto other) => Date.Equals(other.Date); + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((DateOnlyDto)obj); + } + public override int GetHashCode() => Date.GetHashCode(); +} + +public class TimeOnlyDto +{ + public TimeOnly Time { get; set; } + + protected bool Equals(TimeOnlyDto other) => Time.Equals(other.Time); + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((TimeOnlyDto)obj); + } + public override int GetHashCode() => Time.GetHashCode(); +} + +public class NullableDateOnlyDto +{ + public DateOnly? Date { get; set; } + + protected bool Equals(NullableDateOnlyDto other) => Date.Equals(other.Date); + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((NullableDateOnlyDto)obj); + } + public override int GetHashCode() => (Date ?? default).GetHashCode(); +} + +public class NullableTimeOnlyDto +{ + public TimeOnly? Time { get; set; } + + protected bool Equals(NullableTimeOnlyDto other) => Time.Equals(other.Time); + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((NullableTimeOnlyDto)obj); + } + public override int GetHashCode() => (Time ?? default).GetHashCode(); +} + +public class Net6TypeTests +{ + [Test] + public void Can_serialize_DateOnly() + { + var date = new DateOnly(2001, 1, 13); + var json = date.ToJson(); + Assert.That(json, Is.EqualTo("\"2001-01-13\"")); + + var fromJson = json.FromJson(); + Assert.That(fromJson, Is.EqualTo(date)); + + var dto = new DateOnlyDto { Date = date }; + json = dto.ToJson(); + Assert.That(json, Is.EqualTo("{\"Date\":\"2001-01-13\"}")); + var fromJsonDto = json.FromJson(); + Assert.That(fromJsonDto, Is.EqualTo(dto)); + + var nullableDto = new NullableDateOnlyDto { Date = date }; + json = nullableDto.ToJson(); + Assert.That(json, Is.EqualTo("{\"Date\":\"2001-01-13\"}")); + var fromJsonNullableDto = json.FromJson(); + Assert.That(fromJsonNullableDto, Is.EqualTo(nullableDto)); + } + + [Test] + public void Can_serialize_DateOnly_UnixTime() + { + using (JsConfig.With(new Config { DateHandler = DateHandler.UnixTime })) + { + var date = new DateOnly(2001, 1, 13); + var json = date.ToJson(); + Assert.That(json, Is.EqualTo("979344000")); + + var fromJson = json.FromJson(); + Assert.That(fromJson, Is.EqualTo(date)); + + var dto = new DateOnlyDto { Date = date }; + json = dto.ToJson(); + Assert.That(json, Is.EqualTo("{\"Date\":979344000}")); + + var nullableDto = new NullableDateOnlyDto { Date = date }; + json = nullableDto.ToJson(); + Assert.That(json, Is.EqualTo("{\"Date\":979344000}")); + } + } + + [Test] + public void Can_serialize_TimeOnly() + { + var time = new TimeOnly(13, 13, 13); + var json = time.ToJson(); + Assert.That(json, Is.EqualTo("\"PT13H13M13S\"")); + + var fromJson = json.FromJson(); + Assert.That(fromJson, Is.EqualTo(time)); + + var dto = new TimeOnlyDto { Time = time }; + json = dto.ToJson(); + Assert.That(json, Is.EqualTo("{\"Time\":\"PT13H13M13S\"}")); + var fromJsonDto = json.FromJson(); + Assert.That(fromJsonDto, Is.EqualTo(dto)); + + var nullableDto = new NullableTimeOnlyDto { Time = time }; + json = nullableDto.ToJson(); + Assert.That(json, Is.EqualTo("{\"Time\":\"PT13H13M13S\"}")); + var fromJsonNullableDto = json.FromJson(); + Assert.That(fromJsonNullableDto, Is.EqualTo(nullableDto)); + } + +} +#endif \ No newline at end of file diff --git a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj index 7092dec2b..f50ae1ca7 100644 --- a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj +++ b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj @@ -23,9 +23,9 @@ - - - + + + diff --git a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj index 3aba157f5..7c573aa4a 100644 --- a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj +++ b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj @@ -1,7 +1,7 @@  Exe - net5.0 + net6.0 From 28faf27b542c4875940586deda7b8e57759ba808 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 10 Nov 2021 20:42:57 +0800 Subject: [PATCH 306/372] Upgrade ServiceStack.Memory to net6.0 --- src/ServiceStack.Memory/ServiceStack.Memory.csproj | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Memory/ServiceStack.Memory.csproj b/src/ServiceStack.Memory/ServiceStack.Memory.csproj index 2cc2a99a7..d5efec16f 100644 --- a/src/ServiceStack.Memory/ServiceStack.Memory.csproj +++ b/src/ServiceStack.Memory/ServiceStack.Memory.csproj @@ -1,10 +1,13 @@  - netcoreapp2.1 + netcoreapp2.1;net6.0 $(DefineConstants);NETSTANDARD;NETCORE;NETCORE2_1 + + $(DefineConstants);NETSTANDARD;NETCORE;NET6_0 + From 7c6f5c37590e30ee0215fef74b93b5b1a39e63cd Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 11 Nov 2021 20:31:56 +0800 Subject: [PATCH 307/372] Add JSV tests for new DateOnly TimeOnly .NET 6 types --- .../ServiceStack.Text.Tests/Net6TypeTests.cs | 74 ++++++++++++++++++- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/tests/ServiceStack.Text.Tests/Net6TypeTests.cs b/tests/ServiceStack.Text.Tests/Net6TypeTests.cs index e3a097dad..c9187b43f 100644 --- a/tests/ServiceStack.Text.Tests/Net6TypeTests.cs +++ b/tests/ServiceStack.Text.Tests/Net6TypeTests.cs @@ -67,7 +67,7 @@ public override bool Equals(object obj) public class Net6TypeTests { [Test] - public void Can_serialize_DateOnly() + public void Can_json_serialize_DateOnly() { var date = new DateOnly(2001, 1, 13); var json = date.ToJson(); @@ -90,7 +90,30 @@ public void Can_serialize_DateOnly() } [Test] - public void Can_serialize_DateOnly_UnixTime() + public void Can_jsv_serialize_DateOnly() + { + var date = new DateOnly(2001, 1, 13); + var json = date.ToJsv(); + Assert.That(json, Is.EqualTo("2001-01-13")); + + var fromJson = json.FromJsv(); + Assert.That(fromJson, Is.EqualTo(date)); + + var dto = new DateOnlyDto { Date = date }; + json = dto.ToJsv(); + Assert.That(json, Is.EqualTo("{Date:2001-01-13}")); + var fromJsonDto = json.FromJsv(); + Assert.That(fromJsonDto, Is.EqualTo(dto)); + + var nullableDto = new NullableDateOnlyDto { Date = date }; + json = nullableDto.ToJsv(); + Assert.That(json, Is.EqualTo("{Date:2001-01-13}")); + var fromJsonNullableDto = json.FromJsv(); + Assert.That(fromJsonNullableDto, Is.EqualTo(nullableDto)); + } + + [Test] + public void Can_json_serialize_DateOnly_UnixTime() { using (JsConfig.With(new Config { DateHandler = DateHandler.UnixTime })) { @@ -110,9 +133,31 @@ public void Can_serialize_DateOnly_UnixTime() Assert.That(json, Is.EqualTo("{\"Date\":979344000}")); } } + + [Test] + public void Can_jsv_serialize_DateOnly_UnixTime() + { + using (JsConfig.With(new Config { DateHandler = DateHandler.UnixTime })) + { + var date = new DateOnly(2001, 1, 13); + var json = date.ToJsv(); + Assert.That(json, Is.EqualTo("979344000")); + + var fromJson = json.FromJsv(); + Assert.That(fromJson, Is.EqualTo(date)); + + var dto = new DateOnlyDto { Date = date }; + json = dto.ToJsv(); + Assert.That(json, Is.EqualTo("{Date:979344000}")); + + var nullableDto = new NullableDateOnlyDto { Date = date }; + json = nullableDto.ToJsv(); + Assert.That(json, Is.EqualTo("{Date:979344000}")); + } + } [Test] - public void Can_serialize_TimeOnly() + public void Can_json_serialize_TimeOnly() { var time = new TimeOnly(13, 13, 13); var json = time.ToJson(); @@ -133,6 +178,29 @@ public void Can_serialize_TimeOnly() var fromJsonNullableDto = json.FromJson(); Assert.That(fromJsonNullableDto, Is.EqualTo(nullableDto)); } + + [Test] + public void Can_jsv_serialize_TimeOnly() + { + var time = new TimeOnly(13, 13, 13); + var json = time.ToJsv(); + Assert.That(json, Is.EqualTo("PT13H13M13S")); + + var fromJson = json.FromJsv(); + Assert.That(fromJson, Is.EqualTo(time)); + + var dto = new TimeOnlyDto { Time = time }; + json = dto.ToJsv(); + Assert.That(json, Is.EqualTo("{Time:PT13H13M13S}")); + var fromJsonDto = json.FromJsv(); + Assert.That(fromJsonDto, Is.EqualTo(dto)); + + var nullableDto = new NullableTimeOnlyDto { Time = time }; + json = nullableDto.ToJsv(); + Assert.That(json, Is.EqualTo("{Time:PT13H13M13S}")); + var fromJsonNullableDto = json.FromJsv(); + Assert.That(fromJsonNullableDto, Is.EqualTo(nullableDto)); + } } #endif \ No newline at end of file From ed60b5e1ef14b51839c311134e9391b754af8898 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 12 Nov 2021 11:47:36 +0800 Subject: [PATCH 308/372] Remove ServiceStack.Memory/obj in builds --- build/build-core.proj | 1 + build/build-deps.proj | 1 + build/build.proj | 1 + 3 files changed, 3 insertions(+) diff --git a/build/build-core.proj b/build/build-core.proj index ae2482002..bc499908e 100644 --- a/build/build-core.proj +++ b/build/build-core.proj @@ -41,6 +41,7 @@ + diff --git a/build/build-deps.proj b/build/build-deps.proj index 127763cae..5f5663b97 100644 --- a/build/build-deps.proj +++ b/build/build-deps.proj @@ -39,6 +39,7 @@ + diff --git a/build/build.proj b/build/build.proj index 1996c2f91..870a5ebbc 100644 --- a/build/build.proj +++ b/build/build.proj @@ -46,6 +46,7 @@ + From 4b43ecb7b971c518cdb7e9da73ef1a84dfe0ccc8 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 12 Nov 2021 12:06:30 +0800 Subject: [PATCH 309/372] bump v5.13.1 --- src/Directory.Build.props | 2 +- src/ServiceStack.Text/Env.cs | 7 ++++--- tests/Directory.Build.props | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 7bc3a2084..5a4855052 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.13.0 + 5.13.1 ServiceStack ServiceStack, Inc. © 2008-2022 ServiceStack, Inc diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index b0a6a6eda..db1dd1468 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -108,14 +108,15 @@ static Env() + PclExport.Instance.PlatformName + (IsMono ? "/Mono" : "") + (IsLinux ? "/Linux" : IsOSX ? "/OSX" : IsUnix ? "/Unix" : IsWindows ? "/Windows" : "/UnknownOS") - + (IsIOS ? "/iOS" : IsAndroid ? "/Android" : IsUWP ? "/UWP" : ""); + + (IsIOS ? "/iOS" : IsAndroid ? "/Android" : IsUWP ? "/UWP" : "") + + (IsNet6 ? "/net6" : IsNetStandard20 ? "/std2.0" : IsNetFramework ? "netfx" : ""); __releaseDate = new DateTime(2001,01,01); } public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.130m; + public static decimal ServiceStackVersion = 5.131m; public static bool IsLinux { get; set; } @@ -271,7 +272,7 @@ private static bool IsInAppContainer break; case 0: // ERROR_SUCCESS case 122: // ERROR_INSUFFICIENT_BUFFER - // Success is actually insufficent buffer as we're really only looking for + // Success is actually insufficient buffer as we're really only looking for // not NO_APPLICATION and we're not actually giving a buffer here. The // API will always return NO_APPLICATION if we're not running under a // WinRT process, no matter what size the buffer is. diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index cd75a1be6..0e785d9a3 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.13.0 + 5.13.1 latest false From 6a3e924921c341d1b5d1e4dc880c81634e3c88bb Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 12 Nov 2021 13:06:57 +0800 Subject: [PATCH 310/372] clear test folders --- build/build-core.proj | 1 + build/build-deps.proj | 1 + build/build.proj | 3 +++ 3 files changed, 5 insertions(+) diff --git a/build/build-core.proj b/build/build-core.proj index bc499908e..395a22659 100644 --- a/build/build-core.proj +++ b/build/build-core.proj @@ -42,6 +42,7 @@ + diff --git a/build/build-deps.proj b/build/build-deps.proj index 5f5663b97..ca0f8332f 100644 --- a/build/build-deps.proj +++ b/build/build-deps.proj @@ -40,6 +40,7 @@ + diff --git a/build/build.proj b/build/build.proj index 870a5ebbc..247a5d6ca 100644 --- a/build/build.proj +++ b/build/build.proj @@ -12,6 +12,7 @@ $(MSBuildProjectDirectory)/.. $(BuildSolutionDir)/src + $(BuildSolutionDir)/tests Release $(BuildSolutionDir)/NuGet/ $(MajorVersion).$(MinorVersion).$(PatchVersion) @@ -47,6 +48,8 @@ + + From cb3bd5cab3fcf71e0c44a22628f92d020f904acc Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 20 Nov 2021 14:10:43 +0800 Subject: [PATCH 311/372] bump to v5.13.2 --- src/Directory.Build.props | 2 +- src/ServiceStack.Text/Env.cs | 2 +- tests/Directory.Build.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 5a4855052..a80436bb5 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.13.1 + 5.13.2 ServiceStack ServiceStack, Inc. © 2008-2022 ServiceStack, Inc diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index db1dd1468..5b79611fc 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -116,7 +116,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.131m; + public static decimal ServiceStackVersion = 5.132m; public static bool IsLinux { get; set; } diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 0e785d9a3..4c31d3ee8 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.13.1 + 5.13.2 latest false From beecf371b6532f570d708ed233f908b3c5ff5e3d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 20 Nov 2021 16:06:40 +0800 Subject: [PATCH 312/372] bump to v5.13.3 --- src/Directory.Build.props | 2 +- src/ServiceStack.Text/Env.cs | 2 +- tests/Directory.Build.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index a80436bb5..a0f23e7be 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.13.2 + 5.13.3 ServiceStack ServiceStack, Inc. © 2008-2022 ServiceStack, Inc diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 5b79611fc..0a1ee1a27 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -116,7 +116,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.132m; + public static decimal ServiceStackVersion = 5.133m; public static bool IsLinux { get; set; } diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 4c31d3ee8..bbeaaa709 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.13.2 + 5.13.3 latest false From c6898dffff3dfcca60b1db5f207cf1ca0d3018f3 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 29 Nov 2021 18:25:42 +0800 Subject: [PATCH 313/372] Update .Source.csproj's to only netstandard/net6 --- global.json | 5 ----- src/ServiceStack.Text/ServiceStack.Text.csproj | 11 ++--------- 2 files changed, 2 insertions(+), 14 deletions(-) delete mode 100644 global.json diff --git a/global.json b/global.json deleted file mode 100644 index 550e1dfc7..000000000 --- a/global.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "sdk": { - "version": "6.0.100-rc.2.21505.57" - } -} \ No newline at end of file diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index a874505fa..8af1d0f91 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -2,8 +2,7 @@ ServiceStack.Text ServiceStack.Text - - net45;netstandard2.0;netcoreapp2.1;net6.0 + netstandard2.0;netcoreapp2.1;net6.0 .NET's fastest JSON Serializer by ServiceStack .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. @@ -15,19 +14,13 @@ $(DefineConstants);NETCORE;NETCORE2_1 - - $(DefineConstants);NETCORE;NETSTANDARD;NETSTANDARD2_0 - - $(DefineConstants);NETCORE;NET6_0;NET6_0_OR_GREATER + $(DefineConstants);NETSTANDARD;NET6_0 - - - From 15a9d708d72e4f8c52a0d43e1b14abe4c7cbc0ac Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 30 Nov 2021 03:52:24 +0800 Subject: [PATCH 314/372] remove xml doc warning --- src/ServiceStack.Text/ServiceStack.Text.Core.csproj | 1 + src/ServiceStack.Text/ServiceStack.Text.csproj | 1 + tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj | 1 + 3 files changed, 3 insertions(+) diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index 0d528ff6b..f0cd48f9e 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -12,6 +12,7 @@ https://github.com/ServiceStack/ServiceStack.Text JSON;Text;Serializer;CSV;JSV;HTTP;Auto Mapping;Dump;Reflection;JS;Utils;Fast + 1591 $(DefineConstants);NETCORE;NETCORE2_1 diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index 8af1d0f91..564226165 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -10,6 +10,7 @@ https://github.com/ServiceStack/ServiceStack.Text JSON;Text;Serializer;CSV;JSV;HTTP;Auto Mapping;Dump;Reflection;JS;Utils;Fast + 1591 $(DefineConstants);NETCORE;NETCORE2_1 diff --git a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj index f50ae1ca7..c1c8de7e1 100644 --- a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj +++ b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj @@ -14,6 +14,7 @@ false false latest + 1591 Full From 52082aeb2ae7b619afd4fd3a38a0eec5c090e9dd Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 30 Nov 2021 03:59:02 +0800 Subject: [PATCH 315/372] restore .csproj --- src/ServiceStack.Text/ServiceStack.Text.csproj | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index 564226165..ef46d4470 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -2,7 +2,7 @@ ServiceStack.Text ServiceStack.Text - netstandard2.0;netcoreapp2.1;net6.0 + net45;netstandard2.0;netcoreapp2.1;net6.0 .NET's fastest JSON Serializer by ServiceStack .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. @@ -12,16 +12,22 @@ JSON;Text;Serializer;CSV;JSV;HTTP;Auto Mapping;Dump;Reflection;JS;Utils;Fast 1591 + + $(DefineConstants);NETCORE;NETSTANDARD;NETSTANDARD2_0 + $(DefineConstants);NETCORE;NETCORE2_1 - $(DefineConstants);NETSTANDARD;NET6_0 + $(DefineConstants);NETCORE;NET6_0;NET6_0_OR_GREATER + + + From 52f79076158b2a0129325f5061e4ca7cf5ef4647 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 28 Dec 2021 21:49:28 +0800 Subject: [PATCH 316/372] Add new options --- src/ServiceStack.Text/Env.cs | 3 +- src/ServiceStack.Text/LicenseUtils.cs | 169 +++++++++++++++++++++++++- 2 files changed, 170 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 0a1ee1a27..b65466d03 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -109,7 +109,8 @@ static Env() + (IsMono ? "/Mono" : "") + (IsLinux ? "/Linux" : IsOSX ? "/OSX" : IsUnix ? "/Unix" : IsWindows ? "/Windows" : "/UnknownOS") + (IsIOS ? "/iOS" : IsAndroid ? "/Android" : IsUWP ? "/UWP" : "") - + (IsNet6 ? "/net6" : IsNetStandard20 ? "/std2.0" : IsNetFramework ? "netfx" : ""); + + (IsNet6 ? "/net6" : IsNetStandard20 ? "/std2.0" : IsNetFramework ? "netfx" : "") + + ($"/{LicenseUtils.Info}"); __releaseDate = new DateTime(2001,01,01); } diff --git a/src/ServiceStack.Text/LicenseUtils.cs b/src/ServiceStack.Text/LicenseUtils.cs index ddc1d2ccb..e673e97eb 100644 --- a/src/ServiceStack.Text/LicenseUtils.cs +++ b/src/ServiceStack.Text/LicenseUtils.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Globalization; using System.IO; using System.Linq; @@ -22,6 +23,8 @@ public LicenseException(string message, Exception innerException) : base(message public enum LicenseType { Free, + FreeIndividual, + FreeOpenSource, Indie, Business, Enterprise, @@ -210,6 +213,12 @@ public static void RegisterLicense(string licenseKeyText) Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; try { + if (IsFreeLicenseKey(licenseKeyText)) + { + ValidateFreeLicenseKey(licenseKeyText); + return; + } + var parts = licenseKeyText.SplitOnFirst('-'); subId = parts[0]; @@ -227,7 +236,7 @@ public static void RegisterLicense(string licenseKeyText) catch (Exception ex) { //bubble unrelated project Exceptions - if (ex is FileNotFoundException || ex is FileLoadException || ex is BadImageFormatException) + if (ex is FileNotFoundException || ex is FileLoadException || ex is BadImageFormatException || ex is NotSupportedException) throw; if (ex is LicenseException) @@ -277,6 +286,162 @@ private static void ValidateLicenseKey(LicenseKey key) if (LicenseWarningMessage != null) Console.WriteLine(LicenseWarningMessage); } + + private const string IndividualPrefix = "Individual (c) "; + private const string OpenSourcePrefix = "OSS "; + + private static bool IsFreeLicenseKey(string licenseText) => + licenseText.StartsWith(IndividualPrefix) || licenseText.StartsWith(OpenSourcePrefix); + + private static void ValidateFreeLicenseKey(string licenseText) + { + if (!IsFreeLicenseKey(licenseText)) + throw new NotSupportedException("Not a free License Key"); + + var envKey = Environment.GetEnvironmentVariable("SERVICESTACK_LICENSE"); + if (envKey == licenseText) + throw new LicenseException("Cannot use SERVICESTACK_LICENSE Environment variable with free License Keys, " + + "please use Licensing.RegisterLicense() in source code."); + + LicenseKey key = null; + if (licenseText.StartsWith(IndividualPrefix)) + { + key = VerifyIndividualLicense(licenseText); + if (key == null) + throw new LicenseException("Individual License Key is invalid."); + } + else if (licenseText.StartsWith(OpenSourcePrefix)) + { + key = VerifyOpenSourceLicense(licenseText); + if (key == null) + throw new LicenseException("Open Source License Key is invalid."); + } + else throw new NotSupportedException("Not a free License Key"); + + var releaseDate = Env.GetReleaseDate(); + if (releaseDate > key.Expiry) + throw new LicenseException($"This license has expired on {key.Expiry:d} and is not valid for use with this release.\n" + + "Check https://servicestack.net/free for eligible renewals.").Trace(); + + __activatedLicense = new __ActivatedLicense(key); + } + + internal static string Info => __activatedLicense?.LicenseKey == null + ? "NO" + : __activatedLicense.LicenseKey.Type switch { + LicenseType.Free => "FR", + LicenseType.FreeIndividual => "FI", + LicenseType.FreeOpenSource => "FO", + LicenseType.Indie => "IN", + LicenseType.Business => "BU", + LicenseType.Enterprise => "EN", + LicenseType.TextIndie => "TI", + LicenseType.TextBusiness => "TB", + LicenseType.OrmLiteIndie => "OI", + LicenseType.OrmLiteBusiness => "OB", + LicenseType.RedisIndie => "RI", + LicenseType.RedisBusiness => "RB", + LicenseType.AwsIndie => "AI", + LicenseType.AwsBusiness => "AB", + LicenseType.Trial => "TR", + LicenseType.Site => "SI", + LicenseType.TextSite => "TS", + LicenseType.RedisSite => "RS", + LicenseType.OrmLiteSite => "OS", + _ => "UN", + }; + + private static LicenseKey VerifyIndividualLicense(string licenseKey) + { + if (licenseKey == null) + return null; + if (licenseKey.Length < 100) + return null; + if (!licenseKey.StartsWith(IndividualPrefix)) + return null; + var keyText = licenseKey.LastLeftPart(' '); + var keySign = licenseKey.LastRightPart(' '); + if (keySign.Length < 48) + return null; + + try + { + var rsa = System.Security.Cryptography.RSA.Create(); + rsa.FromXml(LicensePublicKey); + +#if !NETCORE + var verified = ((System.Security.Cryptography.RSACryptoServiceProvider)rsa) + .VerifyData(keyText.ToUtf8Bytes(), "SHA256", Convert.FromBase64String(keySign)); +#else + var verified = rsa.VerifyData(keyText.ToUtf8Bytes(), + Convert.FromBase64String(keySign), + System.Security.Cryptography.HashAlgorithmName.SHA256, + System.Security.Cryptography.RSASignaturePadding.Pkcs1); +#endif + if (verified) + { + var yearStr = keyText.Substring(IndividualPrefix.Length).LeftPart(' '); + if (yearStr.Length == 4 && int.TryParse(yearStr, out var year)) + { + return new LicenseKey { + Expiry = new DateTime(year + 1, 1, 1, 0, 0, 0, DateTimeKind.Utc), + Hash = keySign, + Name = keyText, + Type = LicenseType.FreeIndividual, + }; + } + } + } + catch { } + + return null; + } + + private static LicenseKey VerifyOpenSourceLicense(string licenseKey) + { + if (licenseKey == null) + return null; + if (licenseKey.Length < 100) + return null; + if (!licenseKey.StartsWith(OpenSourcePrefix)) + return null; + var keyText = licenseKey.LastLeftPart(' '); + var keySign = licenseKey.LastRightPart(' '); + if (keySign.Length < 48) + return null; + + try + { + var rsa = System.Security.Cryptography.RSA.Create(); + rsa.FromXml(LicensePublicKey); + +#if !NETCORE + var verified = ((System.Security.Cryptography.RSACryptoServiceProvider)rsa) + .VerifyData(keyText.ToUtf8Bytes(), "SHA256", Convert.FromBase64String(keySign)); +#else + var verified = rsa.VerifyData(keyText.ToUtf8Bytes(), + Convert.FromBase64String(keySign), + System.Security.Cryptography.HashAlgorithmName.SHA256, + System.Security.Cryptography.RSASignaturePadding.Pkcs1); +#endif + if (verified) + { + var yearStr = keyText.Substring(OpenSourcePrefix.Length).RightPart(' ').LeftPart(' '); + if (yearStr.Length == 4 && int.TryParse(yearStr, out var year)) + { + return new LicenseKey { + Expiry = new DateTime(year + 1, 1, 1, 0, 0, 0, DateTimeKind.Utc), + Hash = keySign, + Name = keyText, + Type = LicenseType.FreeOpenSource, + }; + } + } + } + catch { } + + return null; + } public static void RemoveLicense() { @@ -382,6 +547,8 @@ public static LicenseFeature GetLicensedFeatures(this LicenseKey key) case LicenseType.Free: return LicenseFeature.Free; + case LicenseType.FreeIndividual: + case LicenseType.FreeOpenSource: case LicenseType.Indie: case LicenseType.Business: case LicenseType.Enterprise: From 1c868c7ec0e82180c799bcccfd67729d32303957 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 1 Jan 2022 08:25:02 +0800 Subject: [PATCH 317/372] Add scope overloads to ToJson/ToJsv/ToCsv ext methods --- src/ServiceStack.Text/StringExtensions.cs | 30 +++++++++++++++++++ .../ServiceStack.Text.Tests/JsConfigTests.cs | 11 +++++++ 2 files changed, 41 insertions(+) diff --git a/src/ServiceStack.Text/StringExtensions.cs b/src/ServiceStack.Text/StringExtensions.cs index 2066ff4f9..79206d0b0 100644 --- a/src/ServiceStack.Text/StringExtensions.cs +++ b/src/ServiceStack.Text/StringExtensions.cs @@ -517,6 +517,16 @@ public static string ToJsv(this T obj) return TypeSerializer.SerializeToString(obj); } + public static string ToJsv(this T obj, Action configure) + { + var config = new Config(); + configure(config); + using (JsConfig.With(config)) + { + return ToJsv(obj); + } + } + public static string ToSafeJsv(this T obj) { return TypeSerializer.HasCircularReferences(obj) @@ -533,6 +543,16 @@ public static T FromJsvSpan(this ReadOnlySpan jsv) { return TypeSerializer.DeserializeFromSpan(jsv); } + + public static string ToJson(this T obj, Action configure) + { + var config = new Config(); + configure(config); + using (JsConfig.With(config)) + { + return ToJson(obj); + } + } public static string ToJson(this T obj) { @@ -563,6 +583,16 @@ public static string ToCsv(this T obj) return CsvSerializer.SerializeToString(obj); } + public static string ToCsv(this T obj, Action configure) + { + var config = new Config(); + configure(config); + using (JsConfig.With(config)) + { + return ToCsv(obj); + } + } + public static T FromCsv(this string csv) { return CsvSerializer.DeserializeFromString(csv); diff --git a/tests/ServiceStack.Text.Tests/JsConfigTests.cs b/tests/ServiceStack.Text.Tests/JsConfigTests.cs index b42d3d3b1..40868914b 100644 --- a/tests/ServiceStack.Text.Tests/JsConfigTests.cs +++ b/tests/ServiceStack.Text.Tests/JsConfigTests.cs @@ -75,6 +75,17 @@ public void TestJsonDataWithJsConfigScope() AssertObjectJson(); } + [Test] + public void TestJsonDataWithJsConfigScope_ext() + { + Assert.That(CreateObject().ToJson(config => config.TextCase = TextCase.SnakeCase), + Is.EqualTo("{\"id\":1,\"root_id\":100,\"display_name\":\"Test object\"}")); + Assert.That(CreateObject().ToJson(config => config.TextCase = TextCase.CamelCase), + Is.EqualTo("{\"id\":1,\"rootId\":100,\"displayName\":\"Test object\"}")); + Assert.That(CreateObject().ToJson(config => config.TextCase = TextCase.PascalCase), + Is.EqualTo("{\"Id\":1,\"RootId\":100,\"DisplayName\":\"Test object\"}")); + } + [Test] public void TestCloneObjectWithJsConfigScope() { From 11006a9e93d374fb600d5abbb0ea4feb0d9257a4 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 3 Jan 2022 01:45:02 +0800 Subject: [PATCH 318/372] Imply lenient deserialization when using snake_case --- .../Common/DeserializeTypeRefJson.cs | 3 ++- .../Common/DeserializeTypeRefJsv.cs | 2 +- src/ServiceStack.Text/TypeConfig.cs | 13 ++++++++++++- tests/ServiceStack.Text.Tests/JsConfigTests.cs | 1 - 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/ServiceStack.Text/Common/DeserializeTypeRefJson.cs b/src/ServiceStack.Text/Common/DeserializeTypeRefJson.cs index bd13ffa51..6960ddc2f 100644 --- a/src/ServiceStack.Text/Common/DeserializeTypeRefJson.cs +++ b/src/ServiceStack.Text/Common/DeserializeTypeRefJson.cs @@ -35,7 +35,8 @@ internal static object StringToType(ReadOnlySpan strType, var typeAttr = config.TypeAttrMemory; object instance = null; - var lenient = config.PropertyConvention == PropertyConvention.Lenient; + var textCase = typeConfig.TextCase.GetValueOrDefault(config.TextCase); + var lenient = config.PropertyConvention == PropertyConvention.Lenient || textCase == TextCase.SnakeCase; for (; index < strTypeLength; index++) { if (!JsonUtils.IsWhiteSpace(buffer[index])) break; } //Whitespace inline diff --git a/src/ServiceStack.Text/Common/DeserializeTypeRefJsv.cs b/src/ServiceStack.Text/Common/DeserializeTypeRefJsv.cs index aef14a9e5..2f6c57379 100644 --- a/src/ServiceStack.Text/Common/DeserializeTypeRefJsv.cs +++ b/src/ServiceStack.Text/Common/DeserializeTypeRefJsv.cs @@ -32,7 +32,7 @@ internal static object StringToType(ReadOnlySpan strType, var config = JsConfig.GetConfig(); object instance = null; - var lenient = config.PropertyConvention == PropertyConvention.Lenient; + var lenient = config.PropertyConvention == PropertyConvention.Lenient || config.TextCase == TextCase.SnakeCase; var strTypeLength = strType.Length; while (index < strTypeLength) diff --git a/src/ServiceStack.Text/TypeConfig.cs b/src/ServiceStack.Text/TypeConfig.cs index d3a405a84..57585be3e 100644 --- a/src/ServiceStack.Text/TypeConfig.cs +++ b/src/ServiceStack.Text/TypeConfig.cs @@ -14,6 +14,15 @@ internal class TypeConfig internal FieldInfo[] Fields; internal Func OnDeserializing; internal bool IsUserType { get; set; } + internal Func TextCaseResolver; + internal TextCase? TextCase + { + get + { + var result = TextCaseResolver?.Invoke(); + return result is null or Text.TextCase.Default ? null : result; + } + } internal TypeConfig(Type type) { @@ -77,7 +86,9 @@ public static Func OnDeserializing static TypeConfig Create() { - config = new TypeConfig(typeof(T)); + config = new TypeConfig(typeof(T)) { + TextCaseResolver = () => JsConfig.TextCase + }; var excludedProperties = JsConfig.ExcludePropertyNames ?? TypeConstants.EmptyStringArray; diff --git a/tests/ServiceStack.Text.Tests/JsConfigTests.cs b/tests/ServiceStack.Text.Tests/JsConfigTests.cs index 40868914b..38c298e73 100644 --- a/tests/ServiceStack.Text.Tests/JsConfigTests.cs +++ b/tests/ServiceStack.Text.Tests/JsConfigTests.cs @@ -131,7 +131,6 @@ public void TestCloneObjectWithJsConfigLocal() { JsConfig.TextCase = TextCase.Default; JsConfig.TextCase = TextCase.SnakeCase; - JsConfig.PropertyConvention = PropertyConvention.Lenient; AssertObject(); From eef6e8f70081c4d5b68a8a909185960866ae443f Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 15 Jan 2022 17:49:30 +0800 Subject: [PATCH 319/372] Optimize MD5 Hash for .net6 --- src/ServiceStack.Text/StreamExtensions.cs | 28 +++++++++----------- tests/ServiceStack.Text.Tests/StreamTests.cs | 10 +++++++ 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/ServiceStack.Text/StreamExtensions.cs b/src/ServiceStack.Text/StreamExtensions.cs index b622fadbd..6ea626c7d 100644 --- a/src/ServiceStack.Text/StreamExtensions.cs +++ b/src/ServiceStack.Text/StreamExtensions.cs @@ -446,27 +446,23 @@ public static Task WriteAsync(this Stream stream, byte[] bytes, CancellationToke public static Task WriteAsync(this Stream stream, string text, CancellationToken token = default) => MemoryProvider.Instance.WriteAsync(stream, text.AsSpan(), token); - public static string ToMd5Hash(this Stream stream) + public static byte[] ToMd5Bytes(this Stream stream) { - var hash = System.Security.Cryptography.MD5.Create().ComputeHash(stream); - var sb = StringBuilderCache.Allocate(); - foreach (byte b in hash) +#if NET6_0_OR_GREATER + if (stream is MemoryStream ms) + return System.Security.Cryptography.MD5.HashData(ms.GetBufferAsSpan()); +#endif + if (stream.CanSeek) { - sb.Append(b.ToString("x2")); + stream.Position = 0; } - return StringBuilderCache.ReturnAndFree(sb); + return System.Security.Cryptography.MD5.Create().ComputeHash(stream); } - public static string ToMd5Hash(this byte[] bytes) - { - var hash = System.Security.Cryptography.MD5.Create().ComputeHash(bytes); - var sb = StringBuilderCache.Allocate(); - foreach (byte b in hash) - { - sb.Append(b.ToString("x2")); - } - return StringBuilderCache.ReturnAndFree(sb); - } + public static string ToMd5Hash(this Stream stream) => ToMd5Bytes(stream).ToHex(); + + public static string ToMd5Hash(this byte[] bytes) => + System.Security.Cryptography.MD5.Create().ComputeHash(bytes).ToHex(); /// /// Returns bytes in publiclyVisible MemoryStream diff --git a/tests/ServiceStack.Text.Tests/StreamTests.cs b/tests/ServiceStack.Text.Tests/StreamTests.cs index 63567c8b7..006e0c138 100644 --- a/tests/ServiceStack.Text.Tests/StreamTests.cs +++ b/tests/ServiceStack.Text.Tests/StreamTests.cs @@ -52,5 +52,15 @@ public void Does_escape_string_when_serializing_to_Stream() Assert.That(ssString, Is.EqualTo(expected)); } } + + [Test] + public void Can_create_MD5_hashes_from_Stream() + { + var md5Hash = "35f184b0e35d7f5629e79cb4bc802893"; + var utf8Bytes = nameof(Can_create_MD5_hashes_from_Stream).ToUtf8Bytes(); + var ms = new MemoryStream(utf8Bytes); + Assert.That(utf8Bytes.ToMd5Hash(), Is.EqualTo(md5Hash)); + Assert.That(ms.ToMd5Bytes().ToHex(), Is.EqualTo(md5Hash)); + } } } \ No newline at end of file From 9b60998db844b7d49425bcef0384a0648b763adc Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 16 Jan 2022 10:25:07 +0800 Subject: [PATCH 320/372] Add Brotli file compression --- src/ServiceStack.Text/HttpUtils.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 39ce5bca6..de6546aa3 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -2006,15 +2006,16 @@ public static class HttpMethods public static class CompressionTypes { - public static readonly string[] AllCompressionTypes = new[] { Deflate, GZip }; + public static readonly string[] AllCompressionTypes = { Deflate, GZip }; public const string Default = Deflate; + public const string Brotli = "br"; public const string Deflate = "deflate"; public const string GZip = "gzip"; public static bool IsValid(string compressionType) { - return compressionType == Deflate || compressionType == GZip; + return compressionType is Deflate or GZip or Brotli; } public static void AssertIsValid(string compressionType) @@ -2022,7 +2023,7 @@ public static void AssertIsValid(string compressionType) if (!IsValid(compressionType)) { throw new NotSupportedException(compressionType - + " is not a supported compression type. Valid types: gzip, deflate."); + + " is not a supported compression type. Valid types: gzip, deflate, br."); } } @@ -2030,6 +2031,7 @@ public static string GetExtension(string compressionType) { switch (compressionType) { + case Brotli: case Deflate: case GZip: return "." + compressionType; From 1994e93a61a3ab6b814952ccf53604df8564423e Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 16 Jan 2022 10:28:42 +0800 Subject: [PATCH 321/372] Only export brotli compression in net6 --- src/ServiceStack.Text/HttpUtils.cs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index de6546aa3..3b58c003e 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -2006,16 +2006,29 @@ public static class HttpMethods public static class CompressionTypes { - public static readonly string[] AllCompressionTypes = { Deflate, GZip }; + public static readonly string[] AllCompressionTypes = + { +#if NET6_0_OR_GREATER + Brotli, +#endif + Deflate, + GZip, + }; public const string Default = Deflate; +#if NET6_0_OR_GREATER public const string Brotli = "br"; +#endif public const string Deflate = "deflate"; public const string GZip = "gzip"; public static bool IsValid(string compressionType) { - return compressionType is Deflate or GZip or Brotli; + return compressionType is Deflate or GZip +#if NET6_0_OR_GREATER + or Brotli +#endif + ; } public static void AssertIsValid(string compressionType) @@ -2031,7 +2044,9 @@ public static string GetExtension(string compressionType) { switch (compressionType) { +#if NET6_0_OR_GREATER case Brotli: +#endif case Deflate: case GZip: return "." + compressionType; From 11fb0d3c8c94ddf7d5ebfe7dbbaffe7e58ffbea8 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 16 Jan 2022 10:30:24 +0800 Subject: [PATCH 322/372] ok to all Brotli symbols --- src/ServiceStack.Text/HttpUtils.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 3b58c003e..b672b575a 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -2016,9 +2016,7 @@ public static class CompressionTypes }; public const string Default = Deflate; -#if NET6_0_OR_GREATER public const string Brotli = "br"; -#endif public const string Deflate = "deflate"; public const string GZip = "gzip"; @@ -2044,9 +2042,7 @@ public static string GetExtension(string compressionType) { switch (compressionType) { -#if NET6_0_OR_GREATER case Brotli: -#endif case Deflate: case GZip: return "." + compressionType; From 729f90b26d6c3c49a73756ccc300bcac0f083552 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 16 Jan 2022 12:05:51 +0800 Subject: [PATCH 323/372] Update HttpUtils.cs --- src/ServiceStack.Text/HttpUtils.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index b672b575a..c5c81e394 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -1375,7 +1375,7 @@ namespace ServiceStack { public static class MimeTypes { - public static Dictionary ExtensionMimeTypes = new Dictionary(); + public static Dictionary ExtensionMimeTypes = new(); public const string Utf8Suffix = "; charset=utf-8"; public const string Html = "text/html"; @@ -1957,7 +1957,7 @@ public static class HttpHeaders public const string Host = "Host"; public const string UserAgent = "User-Agent"; - public static HashSet RestrictedHeaders = new HashSet(StringComparer.OrdinalIgnoreCase) + public static HashSet RestrictedHeaders = new(StringComparer.OrdinalIgnoreCase) { Accept, Connection, @@ -1990,7 +1990,7 @@ public static class HttpMethods "POLL", "SUBSCRIBE", "UNSUBSCRIBE" //MS Exchange WebDav: http://msdn.microsoft.com/en-us/library/aa142917.aspx }; - public static HashSet AllVerbs = new HashSet(allVerbs); + public static HashSet AllVerbs = new(allVerbs); public static bool Exists(string httpMethod) => AllVerbs.Contains(httpMethod.ToUpper()); public static bool HasVerb(string httpVerb) => Exists(httpVerb); @@ -2034,7 +2034,7 @@ public static void AssertIsValid(string compressionType) if (!IsValid(compressionType)) { throw new NotSupportedException(compressionType - + " is not a supported compression type. Valid types: gzip, deflate, br."); + + " is not a supported compression type. Valid types: " + string.Join(", ", AllCompressionTypes)); } } @@ -2057,7 +2057,7 @@ public static class HttpStatus { public static string GetStatusDescription(int statusCode) { - if (statusCode >= 100 && statusCode < 600) + if (statusCode is >= 100 and < 600) { int i = statusCode / 100; int j = statusCode % 100; @@ -2069,7 +2069,7 @@ public static string GetStatusDescription(int statusCode) return string.Empty; } - private static readonly string[][] Descriptions = new string[][] + private static readonly string[][] Descriptions = { null, new[] From a17d6ca95e0f4fc50a9525df4c4c241a7c0b260e Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 16 Jan 2022 12:35:47 +0800 Subject: [PATCH 324/372] Change default Compression Type to Brotli if net6 --- src/ServiceStack.Text/HttpUtils.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index c5c81e394..2a0baac9a 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -2015,18 +2015,23 @@ public static class CompressionTypes GZip, }; +#if NET6_0_OR_GREATER + public const string Default = Brotli; +#else public const string Default = Deflate; +#endif + public const string Brotli = "br"; public const string Deflate = "deflate"; public const string GZip = "gzip"; public static bool IsValid(string compressionType) { - return compressionType is Deflate or GZip #if NET6_0_OR_GREATER - or Brotli + return compressionType is Deflate or GZip or Brotli; +#else + return compressionType is Deflate or GZip; #endif - ; } public static void AssertIsValid(string compressionType) From 0bab92cedfca97e0201c0f3159341348fafc99ab Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 23 Jan 2022 10:21:35 +0800 Subject: [PATCH 325/372] Improve MimeTypes.GetExtension() --- src/ServiceStack.Text/HttpUtils.cs | 17 ++++++++++------- tests/ServiceStack.Text.Tests/HttpUtilsTests.cs | 9 +++++++++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 2a0baac9a..786b94dbd 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -12,7 +12,12 @@ namespace ServiceStack { - public static class HttpUtils + public static partial class HttpUtils + { + + } + + public static partial class HttpUtils { public static string UserAgent = "ServiceStack.Text"; @@ -781,10 +786,8 @@ public static Stream SendStreamToUrl(this string url, string method = null, if (requestBody != null) { - using (var req = PclExport.Instance.GetRequestStream(webReq)) - { - requestBody.CopyTo(req); - } + using var req = PclExport.Instance.GetRequestStream(webReq); + requestBody.CopyTo(req); } var webRes = PclExport.Instance.GetResponse(webReq); @@ -1431,8 +1434,8 @@ public static string GetExtension(string mimeType) } var parts = mimeType.Split('/'); - if (parts.Length == 1) return "." + parts[0]; - if (parts.Length == 2) return "." + parts[1]; + if (parts.Length == 1) return "." + parts[0].LeftPart('+').LeftPart(';'); + if (parts.Length == 2) return "." + parts[1].LeftPart('+').LeftPart(';'); throw new NotSupportedException("Unknown mimeType: " + mimeType); } diff --git a/tests/ServiceStack.Text.Tests/HttpUtilsTests.cs b/tests/ServiceStack.Text.Tests/HttpUtilsTests.cs index 8e7f640e1..bf8e243fe 100644 --- a/tests/ServiceStack.Text.Tests/HttpUtilsTests.cs +++ b/tests/ServiceStack.Text.Tests/HttpUtilsTests.cs @@ -64,5 +64,14 @@ public void Can_SetHashParam() Assert.That("http://example.com#s=rf/f=1".SetHashParam("f", "2"), Is.EqualTo("http://example.com#s=rf/f=2")); Assert.That("http://example.com#ab=0".SetHashParam("a", "1"), Is.EqualTo("http://example.com#ab=0/a=1")); } + + [Test] + public void Can_get_MimeType_file_extension() + { + Assert.That(MimeTypes.GetExtension(MimeTypes.Html), Is.EqualTo(".html")); + Assert.That(MimeTypes.GetExtension(MimeTypes.HtmlUtf8), Is.EqualTo(".html")); + Assert.That(MimeTypes.GetExtension(MimeTypes.ImagePng), Is.EqualTo(".png")); + Assert.That(MimeTypes.GetExtension(MimeTypes.ImageSvg), Is.EqualTo(".svg")); + } } } \ No newline at end of file From e3f1f6fd092c28b9c5e0806f35ca30599dba52d4 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 23 Jan 2022 10:31:45 +0800 Subject: [PATCH 326/372] remove partial class --- src/ServiceStack.Text/HttpUtils.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index 786b94dbd..a5551f4a3 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -12,11 +12,6 @@ namespace ServiceStack { - public static partial class HttpUtils - { - - } - public static partial class HttpUtils { public static string UserAgent = "ServiceStack.Text"; From 6e2d35f3c3a6bade1bd1b0ac8e96b5c2133d9aec Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 24 Jan 2022 03:03:56 +0800 Subject: [PATCH 327/372] Upgrade to v15.4.0 --- src/Directory.Build.props | 2 +- src/ServiceStack.Text/Env.cs | 2 +- tests/Directory.Build.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index a0f23e7be..a8a35f07b 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 5.13.3 + 5.14.0 ServiceStack ServiceStack, Inc. © 2008-2022 ServiceStack, Inc diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index b65466d03..8ab386aa3 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -117,7 +117,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.133m; + public static decimal ServiceStackVersion = 5.14m; public static bool IsLinux { get; set; } diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index bbeaaa709..02591eb88 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.13.3 + 5.14.0 latest false From ac60a4c0840c9d268de805f88de025e86703c8b8 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 24 Jan 2022 20:11:19 +0800 Subject: [PATCH 328/372] Remove legacy projects --- .../JsonSerializationBenchmarks.cs | 182 ---------- .../ParseBuiltinsBenchmarks.cs | 85 ----- .../ServiceStack.Text.Benchmarks/Program.cs | 24 -- .../ServiceStack.Text.Benchmarks.csproj | 30 -- .../JsonDeserializationBenchmarks.cs | 90 ----- .../MiniProfiler/ClientTiming.cs | 42 --- .../MiniProfiler/ClientTimings.cs | 172 --------- .../MiniProfiler/CustomTiming.cs | 127 ------- .../MiniProfiler/FlowData.cs | 52 --- .../MiniProfiler/MiniProfiler.cs | 341 ------------------ .../MiniProfiler/MiniProfilerExtensions.cs | 142 -------- .../MiniProfiler/StackTraceSnippet.cs | 78 ---- .../MiniProfiler/Timing.cs | 286 --------------- .../ModelWithCommonTypes.cs | 59 --- .../ParseBuiltinsBenchmarks.cs | 45 --- .../Program.cs | 35 -- ...t.VersionCompareBenchmarks.BaseLine.csproj | 36 -- ...Stack.Text.VersionCompareBenchmarks.csproj | 45 --- benchmarks/run-benchmarks.bat | 23 -- .../ServiceStack.Memory.csproj | 19 - 20 files changed, 1913 deletions(-) delete mode 100644 benchmarks/ServiceStack.Text.Benchmarks/JsonSerializationBenchmarks.cs delete mode 100644 benchmarks/ServiceStack.Text.Benchmarks/ParseBuiltinsBenchmarks.cs delete mode 100644 benchmarks/ServiceStack.Text.Benchmarks/Program.cs delete mode 100644 benchmarks/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj delete mode 100644 benchmarks/ServiceStack.Text.VersionCompareBenchmarks/JsonDeserializationBenchmarks.cs delete mode 100644 benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/ClientTiming.cs delete mode 100644 benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/ClientTimings.cs delete mode 100644 benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/CustomTiming.cs delete mode 100644 benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/FlowData.cs delete mode 100644 benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/MiniProfiler.cs delete mode 100644 benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/MiniProfilerExtensions.cs delete mode 100644 benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/StackTraceSnippet.cs delete mode 100644 benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/Timing.cs delete mode 100644 benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ModelWithCommonTypes.cs delete mode 100644 benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ParseBuiltinsBenchmarks.cs delete mode 100644 benchmarks/ServiceStack.Text.VersionCompareBenchmarks/Program.cs delete mode 100644 benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ServiceStack.Text.VersionCompareBenchmarks.BaseLine.csproj delete mode 100644 benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ServiceStack.Text.VersionCompareBenchmarks.csproj delete mode 100644 benchmarks/run-benchmarks.bat delete mode 100644 src/ServiceStack.Memory/ServiceStack.Memory.csproj diff --git a/benchmarks/ServiceStack.Text.Benchmarks/JsonSerializationBenchmarks.cs b/benchmarks/ServiceStack.Text.Benchmarks/JsonSerializationBenchmarks.cs deleted file mode 100644 index 1bd650e82..000000000 --- a/benchmarks/ServiceStack.Text.Benchmarks/JsonSerializationBenchmarks.cs +++ /dev/null @@ -1,182 +0,0 @@ -using System; -using System.IO; -using System.Text; -using BenchmarkDotNet.Attributes; -using ServiceStack.Text; -using ServiceStack.Text.Tests.DynamicModels; -using ServiceStack.Text.Json; - -namespace ServiceStack.Text.Benchmarks -{ - public class ModelWithCommonTypes - { - public char CharValue { get; set; } - - public byte ByteValue { get; set; } - - public sbyte SByteValue { get; set; } - - public short ShortValue { get; set; } - - public ushort UShortValue { get; set; } - - public int IntValue { get; set; } - - public uint UIntValue { get; set; } - - public long LongValue { get; set; } - - public ulong ULongValue { get; set; } - - public float FloatValue { get; set; } - - public double DoubleValue { get; set; } - - public decimal DecimalValue { get; set; } - - public DateTime DateTimeValue { get; set; } - - public TimeSpan TimeSpanValue { get; set; } - - public Guid GuidValue { get; set; } - - public static ModelWithCommonTypes Create(byte i) - { - return new ModelWithCommonTypes - { - ByteValue = i, - CharValue = (char)i, - DateTimeValue = new DateTime(2000, 1, 1 + i), - DecimalValue = i, - DoubleValue = i, - FloatValue = i, - IntValue = i, - LongValue = i, - SByteValue = (sbyte)i, - ShortValue = i, - TimeSpanValue = new TimeSpan(i), - UIntValue = i, - ULongValue = i, - UShortValue = i, - GuidValue = Guid.NewGuid(), - }; - } - } - - public class JsonSerializationBenchmarks - { - static ModelWithAllTypes allTypesModel = ModelWithAllTypes.Create(3); - static ModelWithCommonTypes commonTypesModel = ModelWithCommonTypes.Create(3); - static MemoryStream stream = new MemoryStream(32768); - const string serializedString = "this is the test string"; - readonly string serializedString256 = new string('t', 256); - readonly string serializedString512 = new string('t', 512); - readonly string serializedString4096 = new string('t', 4096); - - [Benchmark] - public void SerializeJsonAllTypes() - { - string result = JsonSerializer.SerializeToString(allTypesModel); - } - - [Benchmark] - public void SerializeJsonCommonTypes() - { - string result = JsonSerializer.SerializeToString(commonTypesModel); - } - - [Benchmark] - public void SerializeJsonString() - { - string result = JsonSerializer.SerializeToString(serializedString); - } - - [Benchmark] - public void SerializeJsonStringToStream() - { - stream.Position = 0; - JsonSerializer.SerializeToStream(serializedString, stream); - } - - [Benchmark] - public void SerializeJsonString256ToStream() - { - stream.Position = 0; - JsonSerializer.SerializeToStream(serializedString256, stream); - } - - [Benchmark] - public void SerializeJsonString512ToStream() - { - stream.Position = 0; - JsonSerializer.SerializeToStream(serializedString512, stream); - } - - [Benchmark] - public void SerializeJsonString4096ToStream() - { - stream.Position = 0; - JsonSerializer.SerializeToStream(serializedString4096, stream); - } - - [Benchmark] - public void SerializeJsonStringToStreamDirectly() - { - stream.Position = 0; - string tmp = JsonSerializer.SerializeToString(serializedString); - byte[] arr = Encoding.UTF8.GetBytes(tmp); - stream.Write(arr, 0, arr.Length); - } - - - [Benchmark] - public void SerializeJsonAllTypesToStream() - { - stream.Position = 0; - JsonSerializer.SerializeToStream(allTypesModel, stream); - } - - [Benchmark] - public void SerializeJsonCommonTypesToStream() - { - stream.Position = 0; - JsonSerializer.SerializeToStream(commonTypesModel, stream); - } - - [Benchmark] - public void SerializeJsonStringToStreamUsingDirectStreamWriter() - { - stream.Position = 0; - var writer = new DirectStreamWriter(stream, JsonSerializer.UTF8Encoding); - JsonWriter.WriteRootObject(writer, serializedString); - writer.Flush(); - } - - [Benchmark] - public void SerializeJsonString256ToStreamUsingDirectStreamWriter() - { - stream.Position = 0; - var writer = new DirectStreamWriter(stream, JsonSerializer.UTF8Encoding); - JsonWriter.WriteRootObject(writer, serializedString256); - writer.Flush(); - } - - [Benchmark] - public void SerializeJsonString512ToStreamUsingDirectStreamWriter() - { - stream.Position = 0; - var writer = new DirectStreamWriter(stream, JsonSerializer.UTF8Encoding); - JsonWriter.WriteRootObject(writer, serializedString512); - writer.Flush(); - } - - [Benchmark] - public void SerializeJsonString4096ToStreamUsingDirectStreamWriter() - { - stream.Position = 0; - var writer = new DirectStreamWriter(stream, JsonSerializer.UTF8Encoding); - JsonWriter.WriteRootObject(writer, serializedString4096); - writer.Flush(); - } - } -} diff --git a/benchmarks/ServiceStack.Text.Benchmarks/ParseBuiltinsBenchmarks.cs b/benchmarks/ServiceStack.Text.Benchmarks/ParseBuiltinsBenchmarks.cs deleted file mode 100644 index 1e736969e..000000000 --- a/benchmarks/ServiceStack.Text.Benchmarks/ParseBuiltinsBenchmarks.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Globalization; -using BenchmarkDotNet.Attributes; -using ServiceStack.Text; -#if NETCOREAPP1_1 -using Microsoft.Extensions.Primitives; -#endif -using ServiceStack.Text.Support; - -namespace ServiceStack.Text.Benchmarks -{ - public class ParseBuiltinBenchmarks - { - const string int32_1 = "1234"; - const string int32_2 = "-1234"; - const string decimal_1 = "1234.5678"; - const string decimal_2 = "-1234.5678"; - const string decimal_3 = "1234.5678901234567890"; - const string decimal_4 = "-1234.5678901234567890"; - const string guid_1 = "{b6170a18-3dd7-4a9b-b5d6-21033b5ad162}"; - - readonly StringSegment ss_int32_1 = new StringSegment(int32_1); - readonly StringSegment ss_int32_2 = new StringSegment(int32_2); - readonly StringSegment ss_decimal_1 = new StringSegment(decimal_1); - readonly StringSegment ss_decimal_2 = new StringSegment(decimal_2); - readonly StringSegment ss_decimal_3 = new StringSegment(decimal_3); - readonly StringSegment ss_decimal_4 = new StringSegment(decimal_4); - readonly StringSegment ss_guid_1 = new StringSegment(guid_1); - - [Benchmark] - public void Int32Parse() - { - var res1 = int.Parse(int32_1, CultureInfo.InvariantCulture); - var res2 = int.Parse(int32_2, CultureInfo.InvariantCulture); - } - - [Benchmark] - public void StringSegment_Int32Parse() - { - var res1 = ss_int32_1.ParseInt32(); - var res2 = ss_int32_2.ParseInt32(); - } - - [Benchmark] - public void DecimalParse() - { - var res1 = decimal.Parse(decimal_1, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture); - var res2 = decimal.Parse(decimal_2, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture); - } - - [Benchmark] - public void BigDecimalParse() - { - var res1 = decimal.Parse(decimal_3, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture); - var res2 = decimal.Parse(decimal_4, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture); - } - - - [Benchmark] - public void StringSegment_DecimalParse() - { - var res1 = ss_decimal_1.ParseDecimal(true); - var res2 = ss_decimal_2.ParseDecimal(true); - } - - [Benchmark] - public void StringSegment_BigDecimalParse() - { - var res1 = ss_decimal_3.ParseDecimal(true); - var res2 = ss_decimal_4.ParseDecimal(true); - } - - [Benchmark] - public void GuidParse() - { - var res1 = Guid.Parse(guid_1); - } - - [Benchmark] - public void StringSegment_GuidParse() - { - var res1 = ss_guid_1.ParseGuid(); - } - } -} \ No newline at end of file diff --git a/benchmarks/ServiceStack.Text.Benchmarks/Program.cs b/benchmarks/ServiceStack.Text.Benchmarks/Program.cs deleted file mode 100644 index 2ca6bcabe..000000000 --- a/benchmarks/ServiceStack.Text.Benchmarks/Program.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using BenchmarkDotNet.Configs; -using BenchmarkDotNet.Jobs; -using BenchmarkDotNet.Running; -using BenchmarkDotNet.Validators; - -namespace ServiceStack.Text.Benchmarks -{ - public class Program - { - public static void Main(string[] args) - { - //BenchmarkRunner.Run( - BenchmarkRunner.Run( - ManualConfig - .Create(DefaultConfig.Instance) - //.With(Job.RyuJitX64) - .With(Job.Core) - .With(new BenchmarkDotNet.Diagnosers.CompositeDiagnoser()) - .With(ExecutionValidator.FailOnError) - ); - } - } -} diff --git a/benchmarks/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj b/benchmarks/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj deleted file mode 100644 index 56c274987..000000000 --- a/benchmarks/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj +++ /dev/null @@ -1,30 +0,0 @@ - - - - net45;netcoreapp1.1 - ServiceStack.Text.Benchmarks - Exe - ServiceStack.Text.Benchmarks - $(PackageTargetFallback);dnxcore50 - 1.1.1 - - - - true - - - - portable - - - - - - - - - - - - - diff --git a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/JsonDeserializationBenchmarks.cs b/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/JsonDeserializationBenchmarks.cs deleted file mode 100644 index f3c2ce861..000000000 --- a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/JsonDeserializationBenchmarks.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.IO; -using System.Text; -using BenchmarkDotNet.Attributes; -using ServiceStack.Text; -using ServiceStack.Text.Json; -using StackExchange.Profiling; - -namespace ServiceStack.Text.Benchmarks -{ - public class StringType - { - public string Value1 { get; set; } - public string Value2 { get; set; } - public string Value3 { get; set; } - public string Value4 { get; set; } - public string Value5 { get; set; } - public string Value6 { get; set; } - public string Value7 { get; set; } - - public static StringType Create() - { - var st = new StringType(); - st.Value1 = st.Value2 = st.Value3 = st.Value4 = st.Value5 = st.Value6 = st.Value7 = "Hello, world"; - return st; - } - } - - [MemoryDiagnoser] - public class JsonDeserializationBenchmarks - { - static ModelWithCommonTypes commonTypesModel = ModelWithCommonTypes.Create(3); - static MemoryStream stream = new MemoryStream(32768); - const string serializedString = "this is the test string"; - readonly string serializedString256 = new string('t', 256); - readonly string serializedString512 = new string('t', 512); - readonly string serializedString4096 = new string('t', 4096); - - static string commonTypesModelJson; - static string stringTypeJson; - - static JsonDeserializationBenchmarks() - { - commonTypesModelJson = JsonSerializer.SerializeToString(commonTypesModel); - stringTypeJson = JsonSerializer.SerializeToString(StringType.Create()); - } - - [Benchmark(Description = "Deserialize Json: class with builtin types")] - public void DeserializeJsonCommonTypes() - { - var result = JsonSerializer.DeserializeFromString(commonTypesModelJson); - } - - [Benchmark(Description = "Deserialize Json: class with 10 string properties")] - public void DeserializeStringType() - { - var result = JsonSerializer.DeserializeFromString(stringTypeJson); - } - - [Benchmark(Description = "Deserialize Json: Complex MiniProfiler")] - public MiniProfiler ComplexDeserializeServiceStack() => ServiceStack.Text.JsonSerializer.DeserializeFromString(_complexProfilerJson); - - private static readonly MiniProfiler _complexProfiler = GetComplexProfiler(); - private static readonly string _complexProfilerJson = _complexProfiler.ToJson(); - - private static MiniProfiler GetComplexProfiler() - { - var mp = new MiniProfiler("Complex"); - for (var i = 0; i < 50; i++) - { - using (mp.Step("Step " + i)) - { - for (var j = 0; j < 50; j++) - { - using (mp.Step("SubStep " + j)) - { - for (var k = 0; k < 50; k++) - { - using (mp.CustomTiming("Custom " + k, "YOLO!")) - { - } - } - } - } - } - } - return mp; - } - } -} diff --git a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/ClientTiming.cs b/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/ClientTiming.cs deleted file mode 100644 index 6ecc24636..000000000 --- a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/ClientTiming.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Runtime.Serialization; - -namespace StackExchange.Profiling -{ - /// - /// A client timing probe - /// - [DataContract] - public class ClientTiming - { - /// - /// Gets or sets the name. - /// - [DataMember(Order = 1)] - public string Name { get; set; } - - /// - /// Gets or sets the start. - /// - [DataMember(Order = 2)] - public decimal Start { get; set; } - - /// - /// Gets or sets the duration. - /// - [DataMember(Order = 3)] - public decimal Duration { get; set; } - - /// - /// Unique Identifier used for sql storage. - /// - /// Not set unless storing in Sql - public Guid Id { get; set; } - - /// - /// Used for sql storage - /// - /// Not set unless storing in Sql - public Guid MiniProfilerId { get; set; } - } -} diff --git a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/ClientTimings.cs b/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/ClientTimings.cs deleted file mode 100644 index 0e3dbae35..000000000 --- a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/ClientTimings.cs +++ /dev/null @@ -1,172 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.Serialization; -using System.Text; - -namespace StackExchange.Profiling -{ - /// - /// Times collected from the client - /// - [DataContract] - public class ClientTimings - { - private const string TimingPrefix = "clientPerformance[timing]["; - private const string ProbesPrefix = "clientProbes["; - - /// - /// Gets or sets the list of client side timings - /// - [DataMember(Order = 2)] - public List Timings { get; set; } - - /// - /// Gets or sets the redirect count. - /// - [DataMember(Order = 1)] - public int RedirectCount { get; set; } - - /// - /// Returns null if there is not client timing stuff - /// - /// The form to transform to a . - public static ClientTimings FromForm(IDictionary form) - { - ClientTimings timing = null; - // AJAX requests won't have client timings - if (!form.ContainsKey(TimingPrefix + "navigationStart]")) return timing; - long.TryParse(form[TimingPrefix + "navigationStart]"], out long navigationStart); - if (navigationStart > 0) - { - var timings = new List(); - timing = new ClientTimings(); - int.TryParse(form["clientPerformance[navigation][redirectCount]"], out int redirectCount); - timing.RedirectCount = redirectCount; - - var clientPerf = new Dictionary(); - var clientProbes = new Dictionary(); - - foreach (string key in - form.Keys.OrderBy(i => i.IndexOf("Start]", StringComparison.Ordinal) > 0 ? "_" + i : i)) - { - if (key.StartsWith(TimingPrefix, StringComparison.Ordinal)) - { - long.TryParse(form[key], out long val); - val -= navigationStart; - - string parsedName = key.Substring( - TimingPrefix.Length, (key.Length - 1) - TimingPrefix.Length); - - // just ignore stuff that is negative ... not relevant - if (val > 0) - { - if (parsedName.EndsWith("Start", StringComparison.Ordinal)) - { - var shortName = parsedName.Substring(0, parsedName.Length - 5); - clientPerf[shortName] = new ClientTiming - { - Duration = -1, - Name = parsedName, - Start = val - }; - } - else if (parsedName.EndsWith("End", StringComparison.Ordinal)) - { - var shortName = parsedName.Substring(0, parsedName.Length - 3); - if (clientPerf.TryGetValue(shortName, out var t)) - { - t.Duration = val - t.Start; - t.Name = shortName; - } - } - else - { - clientPerf[parsedName] = new ClientTiming { Name = parsedName, Start = val, Duration = -1 }; - } - } - } - - if (key.StartsWith(ProbesPrefix, StringComparison.Ordinal)) - { - int endBracketIndex = key.IndexOf(']'); - if (endBracketIndex > 0 && int.TryParse(key.Substring(ProbesPrefix.Length, endBracketIndex - ProbesPrefix.Length), out int probeId)) - { - if (!clientProbes.TryGetValue(probeId, out var t)) - { - t = new ClientTiming(); - clientProbes.Add(probeId, t); - } - - if (key.EndsWith("[n]", StringComparison.Ordinal)) - { - t.Name = form[key]; - } - - if (key.EndsWith("[d]", StringComparison.Ordinal)) - { - long.TryParse(form[key], out long val); - if (val > 0) - { - t.Start = val - navigationStart; - } - } - } - } - } - - foreach (var group in clientProbes - .Values.OrderBy(p => p.Name) - .GroupBy(p => p.Name)) - { - ClientTiming current = null; - foreach (var item in group) - { - if (current == null) - { - current = item; - } - else - { - current.Duration = item.Start - current.Start; - timings.Add(current); - current = null; - } - } - } - - foreach (var item in clientPerf.Values) - { - item.Name = SentenceCase(item.Name); - } - - timings.AddRange(clientPerf.Values); - timing.Timings = timings.OrderBy(t => t.Start).ToList(); - } - - return timing; - } - - private static string SentenceCase(string value) - { - var sb = new StringBuilder(); - for (int i = 0; i < value.Length; i++) - { - if (i == 0) - { - sb.Append(char.ToUpper(value[0])); - continue; - } - - if (value[i] == char.ToUpper(value[i])) - { - sb.Append(' '); - } - - sb.Append(value[i]); - } - - return sb.ToString(); - } - } -} diff --git a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/CustomTiming.cs b/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/CustomTiming.cs deleted file mode 100644 index 545a7c09f..000000000 --- a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/CustomTiming.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System; -using System.Runtime.Serialization; - -namespace StackExchange.Profiling -{ - /// - /// A custom timing that usually represents a Remote Procedure Call, allowing better - /// visibility into these longer-running calls. - /// - [DataContract] - public class CustomTiming : IDisposable - { - private readonly decimal? _minSaveMs; - - /// - /// Don't use this. - /// - [Obsolete("Used for serialization")] - public CustomTiming() { /* serialization only */ } - - /// - /// Returns a new CustomTiming, also initializing its and, optionally, its . - /// - /// The to attach the timing so. - /// The descriptive command string for this timing, e.g. a URL or database command. - /// (Optional) The minimum time required to actually save this timing (e.g. do we care?). - public CustomTiming(MiniProfiler profiler, string commandString, decimal? minSaveMs = null) - { - _profiler = profiler; - _startTicks = profiler.ElapsedTicks; - _minSaveMs = minSaveMs; - CommandString = commandString; - - Id = Guid.NewGuid(); - StartMilliseconds = profiler.GetRoundedMilliseconds(profiler.ElapsedTicks); - - if (true/*!MiniProfiler.Settings.ExcludeStackTraceSnippetFromCustomTimings*/) - { - StackTraceSnippet = Helpers.StackTraceSnippet.Get(); - } - } - - private readonly MiniProfiler _profiler; - private readonly long _startTicks; - - /// - /// Unique identifier for this . - /// - [DataMember(Order = 1)] - public Guid Id { get; set; } - - /// - /// Gets or sets the command that was executed, e.g. "select * from Table" or "INCR my:redis:key" - /// - [DataMember(Order = 2)] - public string CommandString { get; set; } - - // TODO: should this just match the key that the List is stored under in Timing.CustomTimings? - /// - /// Short name describing what kind of custom timing this is, e.g. "Get", "Query", "Fetch". - /// - [DataMember(Order = 3)] - public string ExecuteType { get; set; } - - /// - /// Gets or sets roughly where in the calling code that this custom timing was executed. - /// - [DataMember(Order = 4)] - public string StackTraceSnippet { get; set; } - - /// - /// Gets or sets the offset from main MiniProfiler start that this custom command began. - /// - [DataMember(Order = 5)] - public decimal StartMilliseconds { get; set; } - - /// - /// Gets or sets how long this custom command statement took to execute. - /// - [DataMember(Order = 6)] - public decimal? DurationMilliseconds { get; set; } - - /// - /// OPTIONAL - how long this tim took to come back initially from the remote server, - /// before all data is fetched and command is completed. - /// - [DataMember(Order = 7)] - public decimal? FirstFetchDurationMilliseconds { get; set; } - - /// - /// Whether this operation errored. - /// - [DataMember(Order = 8)] - public bool Errored { get; set; } - - internal string Category { get; set; } - - /// - /// OPTIONAL - call after receiving the first response from your Remote Procedure Call to - /// properly set . - /// - public void FirstFetchCompleted() - { - FirstFetchDurationMilliseconds = FirstFetchDurationMilliseconds ?? _profiler.GetDurationMilliseconds(_startTicks); - } - - /// - /// Stops this timing, setting . - /// - public void Stop() - { - DurationMilliseconds = DurationMilliseconds ?? _profiler.GetDurationMilliseconds(_startTicks); - - if (_minSaveMs.HasValue && _minSaveMs.Value > 0 && DurationMilliseconds < _minSaveMs.Value) - { - _profiler.Head.RemoveCustomTiming(Category, this); - } - } - - void IDisposable.Dispose() => Stop(); - - /// - /// Returns for debugging. - /// - public override string ToString() => CommandString; - } -} diff --git a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/FlowData.cs b/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/FlowData.cs deleted file mode 100644 index 2455dc292..000000000 --- a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/FlowData.cs +++ /dev/null @@ -1,52 +0,0 @@ -#if NET45 -using System.Runtime.Remoting; -using System.Runtime.Remoting.Messaging; -#else -using System.Threading; -#endif - -namespace StackExchange.Profiling.Internal -{ - /// - /// Internal MiniProfiler extensions, not meant for consumption. - /// This can and probably will break without warning. Don't use the .Internal namespace directly. - /// - /// Shim class covering for AsyncLocal{T} in pre-.NET 4.6 which didn't have it. - /// - /// The type of data to store. - public class FlowData - { -#if NET45 - // Key specific to this type. -#pragma warning disable RCS1158 // Avoid static members in generic types. - private static readonly string _key = typeof(FlowData).FullName; -#pragma warning restore RCS1158 // Avoid static members in generic types. - - /// - /// Gets or sets the value of the ambient data. - /// - public T Value - { - get - { - var handle = CallContext.LogicalGetData(_key) as ObjectHandle; - return handle != null - ? (T)handle.Unwrap() - : default(T); - } - set { CallContext.LogicalSetData(_key, new ObjectHandle(value)); } - } -#else - private readonly AsyncLocal _backing = new AsyncLocal(); - - /// - /// Gets or sets the value of the ambient data. - /// - public T Value - { - get => _backing.Value; - set => _backing.Value = value; - } -#endif - } -} \ No newline at end of file diff --git a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/MiniProfiler.cs b/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/MiniProfiler.cs deleted file mode 100644 index 3d68b60c6..000000000 --- a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/MiniProfiler.cs +++ /dev/null @@ -1,341 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.Serialization; -using System.Threading.Tasks; -using System.Diagnostics; -using StackExchange.Profiling.Internal; - -namespace StackExchange.Profiling -{ - /// - /// A single MiniProfiler can be used to represent any number of steps/levels in a call-graph, via Step() - /// - /// Totally baller. - [DataContract] - public partial class MiniProfiler - { - /// - /// Initialises a new instance of the class. - /// Obsolete - used for serialization. - /// - [Obsolete("Used for serialization")] - public MiniProfiler() { /* serialization only */ } - - /// - /// Initialises a new instance of the class. Creates and starts a new MiniProfiler - /// for the root . - /// - /// The name of this , typically a URL. - public MiniProfiler(string name) - { - Id = Guid.NewGuid(); - MachineName = Environment.MachineName; - Started = DateTime.UtcNow; - - // stopwatch must start before any child Timings are instantiated - Stopwatch = Stopwatch.StartNew(); - Root = new Timing(this, null, name); - } - - /// - /// Whether the profiler is currently profiling - /// - internal bool IsActive { get; set; } - - /// - /// Gets or sets the profiler id. - /// Identifies this Profiler so it may be stored/cached. - /// - [DataMember(Order = 1)] - public Guid Id { get; set; } - - /// - /// Gets or sets a display name for this profiling session. - /// - [DataMember(Order = 2)] - public string Name { get; set; } - - /// - /// Gets or sets when this profiler was instantiated, in UTC time. - /// - [DataMember(Order = 3)] - public DateTime Started { get; set; } - - /// - /// Gets the milliseconds, to one decimal place, that this MiniProfiler ran. - /// - [DataMember(Order = 4)] - public decimal DurationMilliseconds { get; set; } - - /// - /// Gets or sets where this profiler was run. - /// - [DataMember(Order = 5)] - public string MachineName { get; set; } - - /// - /// Keys are names, values are URLs, allowing additional links to be added to a profiler result, e.g. perhaps a deeper - /// diagnostic page for the current request. - /// - /// - /// Use to easily add a name/url pair to this dictionary. - /// - [DataMember(Order = 6)] - public Dictionary CustomLinks { get; set; } - - /// - /// Json used to store Custom Links. Do not touch. - /// - /*public string CustomLinksJson - { - get => CustomLinks?.ToJson(); - set - { - if (value.HasValue()) - { - CustomLinks = value.FromJson>(); - } - } - } */ - - private Timing _root; - /// - /// Gets or sets the root timing. - /// The first that is created and started when this profiler is instantiated. - /// All other s will be children of this one. - /// - [DataMember(Order = 7)] - public Timing Root - { - get => _root; - set - { - _root = value; - RootTimingId = value.Id; - - // TODO: Add serialization tests, then move Timing.Children to get/set - // and for() { .ParentTiming = this; } over in the local setter set there - // let serialization take care of the tree instead. - // I bet the current method doesn't even work, since it depends on .Root being set - // last in deserialization order - // TL;DR: I bet no one ever checked this, or possible no one cares about parent after deserialization. - - // when being deserialized, we need to go through and set all child timings' parents - if (_root.HasChildren) - { - var timings = new Stack(); - timings.Push(_root); - while (timings.Count > 0) - { - var timing = timings.Pop(); - - if (timing.HasChildren) - { - var children = timing.Children; - - for (int i = children.Count - 1; i >= 0; i--) - { - children[i].ParentTiming = timing; - timings.Push(children[i]); // FLORIDA! TODO: refactor this and other stack creation methods into one - } - } - } - } - } - } - - /// - /// Id of Root Timing. Used for Sql Storage purposes. - /// - public Guid? RootTimingId { get; set; } - - /// - /// Gets or sets timings collected from the client - /// - [DataMember(Order = 8)] - public ClientTimings ClientTimings { get; set; } - - /// - /// RedirectCount in ClientTimings. Used for sql storage. - /// - public int? ClientTimingsRedirectCount { get; set; } - - /// - /// Gets or sets a string identifying the user/client that is profiling this request. - /// - /// - /// If this is not set manually at some point, the IUserProvider implementation will be used; - /// by default, this will be the current request's IP address. - /// - [DataMember(Order = 9)] - public string User { get; set; } - - /// - /// Returns true when this MiniProfiler has been viewed by the that recorded it. - /// - /// - /// Allows POSTs that result in a redirect to be profiled. implementation - /// will keep a list of all profilers that haven't been fetched down. - /// - [DataMember(Order = 10)] - public bool HasUserViewed { get; set; } - - // Allows async to properly track the attachment point - private readonly FlowData _head = new FlowData(); - - /// - /// Gets or sets points to the currently executing Timing. - /// - public Timing Head - { - get => _head.Value; - set => _head.Value = value; - } - - /// - /// Gets the ticks since this MiniProfiler was started. - /// - internal long ElapsedTicks => Stopwatch.ElapsedTicks; - - /// - /// Gets the timer, for unit testing, returns the timer. - /// - internal Stopwatch Stopwatch { get; set; } - - /// - /// Starts a new MiniProfiler based on the current . This new profiler can be accessed by - /// . - /// - /// - /// Allows explicit naming of the new profiling session; when null, an appropriate default will be used, e.g. for - /// a web request, the url will be used for the overall session name. - /// - //public static MiniProfiler Start(string sessionName = null) => - // Settings.ProfilerProvider.Start(sessionName); - - /// - /// Ends the current profiling session, if one exists. - /// - /// - /// When true, clears the , allowing profiling to - /// be prematurely stopped and discarded. Useful for when a specific route does not need to be profiled. - /// - //public static void Stop(bool discardResults = false) => - // Settings.ProfilerProvider.Stop(discardResults); - - /// - /// Asynchronously ends the current profiling session, if one exists. - /// This invokves async saving all the way down if th providers support it. - /// - /// - /// When true, clears the , allowing profiling to - /// be prematurely stopped and discarded. Useful for when a specific route does not need to be profiled. - /// - //public static Task StopAsync(bool discardResults = false) => - // Settings.ProfilerProvider.StopAsync(discardResults); - - /// - /// Deserializes the JSON string parameter to a . - /// - /// The string to deserialize int a . - //public static MiniProfiler FromJson(string json) => json.FromJson(); - - /// - /// Returns the 's and this profiler recorded. - /// - /// a string containing the recording information - public override string ToString() => Root != null ? Root.Name + " (" + DurationMilliseconds + " ms)" : string.Empty; - - /// - /// Returns true if Ids match. - /// - /// The to compare to. - public override bool Equals(object obj) => obj is MiniProfiler && Id.Equals(((MiniProfiler)obj).Id); - - /// - /// Returns hash code of Id. - /// - public override int GetHashCode() => Id.GetHashCode(); - - /// - /// Walks the hierarchy contained in this profiler, starting with , and returns each Timing found. - /// - public IEnumerable GetTimingHierarchy() - { - var timings = new Stack(); - - timings.Push(_root); - - while (timings.Count > 0) - { - var timing = timings.Pop(); - - yield return timing; - - if (timing.HasChildren) - { - var children = timing.Children; - for (int i = children.Count - 1; i >= 0; i--) timings.Push(children[i]); - } - } - } - -#if !NETCOREAPP1_1 // TODO: Revisit in .NET Standard 2.0 - /// - /// Create a DEEP clone of this MiniProfiler. - /// - public MiniProfiler Clone() - { - var serializer = new DataContractSerializer(typeof(MiniProfiler), null, int.MaxValue, false, true, null); - using (var ms = new System.IO.MemoryStream()) - { - serializer.WriteObject(ms, this); - ms.Position = 0; - return (MiniProfiler)serializer.ReadObject(ms); - } - } -#endif - - - internal Timing StepImpl(string name, decimal? minSaveMs = null, bool? includeChildrenWithMinSave = false) - { - return new Timing(this, Head, name, minSaveMs, includeChildrenWithMinSave); - } - - //internal IDisposable IgnoreImpl() => new Suppression(this); - - internal bool StopImpl() - { - if (!Stopwatch.IsRunning) - return false; - - Stopwatch.Stop(); - DurationMilliseconds = GetRoundedMilliseconds(ElapsedTicks); - - foreach (var timing in GetTimingHierarchy()) - { - timing.Stop(); - } - - return true; - } - - /// - /// Returns milliseconds based on Stopwatch's Frequency, rounded to one decimal place. - /// - /// The tick count to round. - internal decimal GetRoundedMilliseconds(long ticks) - { - long z = 10000 * ticks; - decimal timesTen = (int)(z / Stopwatch.Frequency); - return timesTen / 10; - } - - /// - /// Returns how many milliseconds have elapsed since was recorded. - /// - /// The start tick count. - internal decimal GetDurationMilliseconds(long startTicks) => - GetRoundedMilliseconds(ElapsedTicks - startTicks); - } -} \ No newline at end of file diff --git a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/MiniProfilerExtensions.cs b/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/MiniProfilerExtensions.cs deleted file mode 100644 index 9c54b3b98..000000000 --- a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/MiniProfilerExtensions.cs +++ /dev/null @@ -1,142 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace StackExchange.Profiling -{ - /// - /// Contains helper methods that ease working with null s. - /// - public static class MiniProfilerExtensions - { - /// - /// Wraps in a call and executes it, returning its result. - /// - /// the type of result. - /// The current profiling session or null. - /// Method to execute and profile. - /// The step name used to label the profiler results. - /// the profiled result. - /// Throws when is null. - public static T Inline(this MiniProfiler profiler, Func selector, string name) - { - if (selector == null) throw new ArgumentNullException(nameof(selector)); - if (profiler == null) return selector(); - using (profiler.StepImpl(name)) - { - return selector(); - } - } - - /// - /// Returns an () that will time the code between its creation and disposal. - /// - /// The current profiling session or null. - /// A descriptive name for the code that is encapsulated by the resulting Timing's lifetime. - /// the profile step - public static Timing Step(this MiniProfiler profiler, string name) => profiler?.StepImpl(name); - - /// - /// Returns an () that will time the code between its creation and disposal. - /// Will only save the if total time taken exceeds . - /// - /// The current profiling session or null. - /// A descriptive name for the code that is encapsulated by the resulting Timing's lifetime. - /// The minimum amount of time that needs to elapse in order for this result to be recorded. - /// Should the amount of time spent in child timings be included when comparing total time - /// profiled with ? If true, will include children. If false will ignore children. - /// - /// If is set to true and a child is removed due to its use of StepIf, then the - /// time spent in that time will also not count for the current StepIf calculation. - public static Timing StepIf(this MiniProfiler profiler, string name, decimal minSaveMs, bool includeChildren = false) - { - return profiler?.StepImpl(name, minSaveMs, includeChildren); - } - - /// - /// Returns a new that will automatically set its - /// and - /// - /// The current profiling session or null. - /// The category under which this timing will be recorded. - /// The command string that will be recorded along with this timing, for display in the MiniProfiler results. - /// Execute Type to be associated with the Custom Timing. Example: Get, Set, Insert, Delete - /// - /// Should be used like the extension method - /// - public static CustomTiming CustomTiming(this MiniProfiler profiler, string category, string commandString, string executeType = null) - { - return CustomTimingIf(profiler, category, commandString, 0, executeType: executeType); - } - - /// - /// Returns a new that will automatically set its - /// and . Will only save the new if the total elapsed time - /// takes more than . - /// - /// The current profiling session or null. - /// The category under which this timing will be recorded. - /// The command string that will be recorded along with this timing, for display in the MiniProfiler results. - /// Execute Type to be associated with the Custom Timing. Example: Get, Set, Insert, Delete - /// The minimum amount of time that needs to elapse in order for this result to be recorded. - /// - /// Should be used like the extension method - /// - public static CustomTiming CustomTimingIf(this MiniProfiler profiler, string category, string commandString, decimal minSaveMs, string executeType = null) - { - if (profiler == null || profiler.Head == null || !profiler.IsActive) return null; - - var result = new CustomTiming(profiler, commandString, minSaveMs) - { - ExecuteType = executeType, - Category = category - }; - - // THREADING: revisit - profiler.Head.AddCustomTiming(category, result); - - return result; - } - - /// - /// Returns an that will ignore profiling between its creation and disposal. - /// - /// - /// This is mainly useful in situations where you want to ignore database profiling for known hot spots, - /// but it is safe to use in a nested step such that you can ignore sub-sections of a profiled step. - /// - /// The current profiling session or null. - /// the profile step - //public static IDisposable Ignore(this MiniProfiler profiler) => profiler?.IgnoreImpl(); - - /// - /// Adds 's hierarchy to this profiler's current Timing step, - /// allowing other threads, remote calls, etc. to be profiled and joined into this profiling session. - /// - /// The to add to. - /// The to append to 's tree. - public static void AddProfilerResults(this MiniProfiler profiler, MiniProfiler externalProfiler) - { - if (profiler?.Head == null || externalProfiler == null) return; - profiler.Head.AddChild(externalProfiler.Root); - } - - /// - /// Adds the and pair to 's - /// dictionary; will be displayed on the client in the bottom of the profiler popup. - /// - /// The to add the link to. - /// The text label for the link. - /// The URL the link goes to. - public static void AddCustomLink(this MiniProfiler profiler, string text, string url) - { - if (profiler == null || !profiler.IsActive) return; - - lock (profiler) - { - profiler.CustomLinks = profiler.CustomLinks ?? new Dictionary(); - } - - profiler.CustomLinks[text] = url; - } - } -} \ No newline at end of file diff --git a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/StackTraceSnippet.cs b/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/StackTraceSnippet.cs deleted file mode 100644 index 70ea9d1fb..000000000 --- a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/StackTraceSnippet.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System.Diagnostics; -using System.Reflection; -using System.Text; - -namespace StackExchange.Profiling.Helpers -{ - /// - /// Gets part of a stack trace containing only methods we care about. - /// - public static class StackTraceSnippet - { - // TODO: Uhhhhhhh, this isn't gonna work. Let's come back to this. Oh and async. Dammit. - private const string AspNetEntryPointMethodName = "System.Web.HttpApplication.IExecutionStep.Execute"; - - /// - /// Gets the current formatted and filtered stack trace. - /// - /// Space separated list of methods - public static string Get() - { -#if !NETCOREAPP1_1 - var frames = new StackTrace().GetFrames(); -#else // TODO: Make this work in .NET Standard, true fix isn't until 2.0 via https://github.com/dotnet/corefx/pull/12527 - StackFrame[] frames = null; -#endif - if (frames == null /*|| MiniProfiler.Settings.StackMaxLength <= 0*/) - { - return string.Empty; - } - - var sb = new StringBuilder(); - int stackLength = -1; // Starts on -1 instead of zero to compensate for adding 1 first time - - foreach (StackFrame t in frames) - { - var method = t.GetMethod(); - - // no need to continue up the chain - if (method.Name == AspNetEntryPointMethodName) - break; - - if (stackLength >= 120 /*MiniProfiler.Settings.StackMaxLength*/) - break; - - var assembly = method.Module.Assembly.GetName().Name; - //if (!ShouldExcludeType(method) - // && !MiniProfiler.Settings.AssembliesToExclude.Contains(assembly) - // && !MiniProfiler.Settings.MethodsToExclude.Contains(method.Name)) - { - if (sb.Length > 0) - { - sb.Append(' '); - } - sb.Append(method.Name); - stackLength += method.Name.Length + 1; // 1 added for spaces. - } - } - - return sb.ToString(); - } - - /*private static bool ShouldExcludeType(MethodBase method) - { - var t = method.DeclaringType; - - while (t != null) - { - if (MiniProfiler.Settings.TypesToExclude.Contains(t.Name)) - return true; - - t = t.DeclaringType; - } - - return false; - } - */ - } -} \ No newline at end of file diff --git a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/Timing.cs b/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/Timing.cs deleted file mode 100644 index 5c1b90b13..000000000 --- a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/MiniProfiler/Timing.cs +++ /dev/null @@ -1,286 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.Serialization; - -namespace StackExchange.Profiling -{ - /// - /// An individual profiling step that can contain child steps. - /// - [DataContract] - public class Timing : IDisposable - { - /// - /// Offset from parent MiniProfiler's creation that this Timing was created. - /// - private readonly long _startTicks; - private readonly decimal? _minSaveMs; - private readonly bool _includeChildrenWithMinSave; - - /// - /// Initialises a new instance of the class. - /// Obsolete - used for serialization. - /// - [Obsolete("Used for serialization")] - public Timing() { /* serialization */ } - - /// - /// Creates a new Timing named 'name' in the 'profiler's session, with 'parent' as this Timing's immediate ancestor. - /// - /// The this belongs to. - /// The this is a child of. - /// The name of this timing. - /// (Optional) The minimum threshold (in milliseconds) for saving this timing. - /// (Optional) Whether the children are included when comparing to the threshold. - public Timing(MiniProfiler profiler, Timing parent, string name, decimal? minSaveMs = null, bool? includeChildrenWithMinSave = false) - { - Id = Guid.NewGuid(); - Profiler = profiler; - Profiler.Head = this; - - // root will have no parent - parent?.AddChild(this); - - Name = name; - - _startTicks = profiler.ElapsedTicks; - _minSaveMs = minSaveMs; - _includeChildrenWithMinSave = includeChildrenWithMinSave == true; - StartMilliseconds = profiler.GetRoundedMilliseconds(_startTicks); - } - - /// - /// Gets or sets Unique identifier for this timing; set during construction. - /// - [DataMember(Order = 1)] - public Guid Id { get; set; } - - /// - /// Gets or sets Text displayed when this Timing is rendered. - /// - [DataMember(Order = 2)] - public string Name { get; set; } - - /// - /// Gets or sets How long this Timing step took in ms; includes any Timings' durations. - /// - [DataMember(Order = 3)] - public decimal? DurationMilliseconds { get; set; } - - /// - /// Gets or sets The offset from the start of profiling. - /// - [DataMember(Order = 4)] - public decimal StartMilliseconds { get; set; } - - /// - /// Gets or sets All sub-steps that occur within this Timing step. Add new children through - /// - [DataMember(Order = 5)] - public List Children { get; set; } - - /// - /// lists keyed by their type, e.g. "sql", "memcache", "redis", "http". - /// - [DataMember(Order = 6)] - public Dictionary> CustomTimings { get; set; } - - /// - /// Returns true when there exists any objects in this . - /// - public bool HasCustomTimings => CustomTimings?.Values.Any(v => v?.Count > 0) ?? false; - - /// - /// Gets or sets Which Timing this Timing is under - the duration that this step takes will be added to its parent's duration. - /// - /// This will be null for the root (initial) Timing. - [IgnoreDataMember] - public Timing ParentTiming { get; set; } - - /// - /// The Unique Identifier identifying the parent timing of this Timing. Used for sql server storage. - /// - [IgnoreDataMember] - public Guid ParentTimingId { get; set; } - - /// - /// Gets the elapsed milliseconds in this step without any children's durations. - /// - [IgnoreDataMember] - public decimal DurationWithoutChildrenMilliseconds - { - get - { - var result = DurationMilliseconds.GetValueOrDefault(); - - if (HasChildren) - { - foreach (var child in Children) - { - result -= child.DurationMilliseconds.GetValueOrDefault(); - } - } - - return Math.Round(result, 1); - } - } - - /// - /// Gets a value indicating whether this is less than the configured - /// , by default 2.0 ms. - /// - [IgnoreDataMember] - public bool IsTrivial => DurationMilliseconds <= 2.0M /*MiniProfiler.Settings.TrivialDurationThresholdMilliseconds*/; - - /// - /// Gets a value indicating whether this Timing has inner Timing steps. - /// - [IgnoreDataMember] - public bool HasChildren => Children?.Count > 0; - - /// - /// Gets a value indicating whether this Timing is the first one created in a MiniProfiler session. - /// - [IgnoreDataMember] - public bool IsRoot => Equals(Profiler.Root); - - /// - /// Gets a value indicating whether how far away this Timing is from the Profiler's Root. - /// - [IgnoreDataMember] - public short Depth - { - get - { - short result = 0; - var parent = ParentTiming; - - while (parent != null) - { - parent = parent.ParentTiming; - result++; - } - - return result; - } - } - - /// - /// Gets a reference to the containing profiler, allowing this Timing to affect the Head and get Stopwatch readings. - /// - internal MiniProfiler Profiler { get; set; } - - /// - /// The unique identifier used to identify the Profiler with which this Timing is associated. Used for sql storage. - /// - [IgnoreDataMember] - public Guid MiniProfilerId { get; set; } - - /// - /// Returns this Timing's Name. - /// - public override string ToString() => Name; - - /// - /// Returns true if Ids match. - /// - /// The to comare to. - public override bool Equals(object obj) - { - return obj is Timing && Id.Equals(((Timing)obj).Id); - } - - /// - /// Returns hash code of Id. - /// - public override int GetHashCode() => Id.GetHashCode(); - - /// - /// Completes this Timing's duration and sets the MiniProfiler's Head up one level. - /// - public void Stop() - { - if (DurationMilliseconds != null) return; - DurationMilliseconds = Profiler.GetDurationMilliseconds(_startTicks); - Profiler.Head = ParentTiming; - - if (_minSaveMs.HasValue && _minSaveMs.Value > 0 && ParentTiming != null) - { - var compareMs = _includeChildrenWithMinSave ? DurationMilliseconds : DurationWithoutChildrenMilliseconds; - if (compareMs < _minSaveMs.Value) - { - ParentTiming.RemoveChild(this); - } - } - } - - /// - /// Stops profiling, allowing the using construct to neatly encapsulate a region to be profiled. - /// - void IDisposable.Dispose() => Stop(); - - /// - /// Add the parameter 'timing' to this Timing's Children collection. - /// - /// The child to add. - /// - /// Used outside this assembly for custom deserialization when creating an implementation. - /// - public void AddChild(Timing timing) - { - Children = Children ?? new List(); - - Children.Add(timing); - timing.Profiler = timing.Profiler ?? Profiler; - timing.ParentTiming = this; - timing.ParentTimingId = Id; - if (Profiler != null) - timing.MiniProfilerId = Profiler.Id; - } - - internal void RemoveChild(Timing timing) => Children?.Remove(timing); - - /// - /// Adds to this step's dictionary of - /// custom timings, . Ensures that is created, - /// as well as the 's list. - /// - /// The kind of custom timing, e.g. "http", "redis", "memcache" - /// Duration and command information - public void AddCustomTiming(string category, CustomTiming customTiming) - { - GetCustomTimingList(category).Add(customTiming); - } - - internal void RemoveCustomTiming(string category, CustomTiming customTiming) - { - GetCustomTimingList(category).Remove(customTiming); - } - - private readonly object _lockObject = new object(); - - /// - /// Returns the list keyed to the , creating any collections when null. - /// - /// The kind of custom timings, e.g. "sql", "redis", "memcache" - private List GetCustomTimingList(string category) - { - lock (_lockObject) - { - CustomTimings = CustomTimings ?? new Dictionary>(); - } - - List result; - lock (CustomTimings) - { - if (!CustomTimings.TryGetValue(category, out result)) - { - result = new List(); - CustomTimings[category] = result; - } - } - return result; - } - } -} \ No newline at end of file diff --git a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ModelWithCommonTypes.cs b/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ModelWithCommonTypes.cs deleted file mode 100644 index 0ae5ae3eb..000000000 --- a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ModelWithCommonTypes.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; - -namespace ServiceStack.Text.Benchmarks -{ - public class ModelWithCommonTypes - { - public char CharValue { get; set; } - - public byte ByteValue { get; set; } - - public sbyte SByteValue { get; set; } - - public short ShortValue { get; set; } - - public ushort UShortValue { get; set; } - - public int IntValue { get; set; } - - public uint UIntValue { get; set; } - - public long LongValue { get; set; } - - public ulong ULongValue { get; set; } - - public float FloatValue { get; set; } - - public double DoubleValue { get; set; } - - public decimal DecimalValue { get; set; } - - public DateTime DateTimeValue { get; set; } - - public TimeSpan TimeSpanValue { get; set; } - - public Guid GuidValue { get; set; } - - public static ModelWithCommonTypes Create(byte i) - { - return new ModelWithCommonTypes - { - ByteValue = i, - CharValue = (char)i, - DateTimeValue = new DateTime(2000, 1, 1 + i), - DecimalValue = i, - DoubleValue = i, - FloatValue = i, - IntValue = i, - LongValue = i, - SByteValue = (sbyte)i, - ShortValue = i, - TimeSpanValue = new TimeSpan(i), - UIntValue = i, - ULongValue = i, - UShortValue = i, - GuidValue = Guid.NewGuid(), - }; - } - } -} \ No newline at end of file diff --git a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ParseBuiltinsBenchmarks.cs b/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ParseBuiltinsBenchmarks.cs deleted file mode 100644 index 96a90eae2..000000000 --- a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ParseBuiltinsBenchmarks.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Globalization; -using BenchmarkDotNet.Attributes; -using ServiceStack.Text; - -namespace ServiceStack.Text.Benchmarks -{ - public class ParseBuiltinBenchmarks - { - const string int32_1 = "1234"; - const string int32_2 = "-1234"; - const string decimal_1 = "1234.5678"; - const string decimal_2 = "-1234.5678"; - const string decimal_3 = "1234.5678901234567890"; - const string decimal_4 = "-1234.5678901234567890"; - const string guid_1 = "{b6170a18-3dd7-4a9b-b5d6-21033b5ad162}"; - - [Benchmark] - public void Int32Parse() - { - var res1 = JsonSerializer.DeserializeFromString(int32_1); - var res2 = JsonSerializer.DeserializeFromString(int32_2); - } - - [Benchmark] - public void DecimalParse() - { - var res1 = JsonSerializer.DeserializeFromString(decimal_1); - var res2 = JsonSerializer.DeserializeFromString(decimal_2); - } - - [Benchmark] - public void BigDecimalParse() - { - var res1 = JsonSerializer.DeserializeFromString(decimal_3); - var res2 = JsonSerializer.DeserializeFromString(decimal_4); - } - - [Benchmark] - public void GuidParse() - { - var res1 = JsonSerializer.DeserializeFromString(guid_1); - } - } -} \ No newline at end of file diff --git a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/Program.cs b/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/Program.cs deleted file mode 100644 index c957937c1..000000000 --- a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/Program.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using BenchmarkDotNet.Configs; -using BenchmarkDotNet.Jobs; -using BenchmarkDotNet.Running; -using BenchmarkDotNet.Validators; - -namespace ServiceStack.Text.Benchmarks -{ - public class Program - { - public static void Main(string[] args) - { - var benchmarks = new[] { - typeof(JsonDeserializationBenchmarks), - typeof(ParseBuiltinBenchmarks) - }; - - var switcher = new BenchmarkSwitcher(benchmarks); - - foreach (var benchmark in benchmarks) - { - switcher.Run( - args: new[] {benchmark.Name}, - config: ManualConfig - .Create(DefaultConfig.Instance) - //.With(Job.RyuJitX64) - .With(Job.Core) - .With(Job.Clr) - .With(new BenchmarkDotNet.Diagnosers.CompositeDiagnoser()) - .With(ExecutionValidator.FailOnError) - ); - } - } - } -} diff --git a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ServiceStack.Text.VersionCompareBenchmarks.BaseLine.csproj b/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ServiceStack.Text.VersionCompareBenchmarks.BaseLine.csproj deleted file mode 100644 index a0f37384e..000000000 --- a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ServiceStack.Text.VersionCompareBenchmarks.BaseLine.csproj +++ /dev/null @@ -1,36 +0,0 @@ - - - - netcoreapp1.1;net46; - ServiceStack.Text.VersionCompareBenchmarks.BaseLine - Exe - ServiceStack.Text.VersionCompareBenchmarks - $(PackageTargetFallback);dnxcore50 - 1.1.2 - - - - true - - - - portable - - - - - - - - - - - - - - - - - - - diff --git a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ServiceStack.Text.VersionCompareBenchmarks.csproj b/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ServiceStack.Text.VersionCompareBenchmarks.csproj deleted file mode 100644 index 7b5a05480..000000000 --- a/benchmarks/ServiceStack.Text.VersionCompareBenchmarks/ServiceStack.Text.VersionCompareBenchmarks.csproj +++ /dev/null @@ -1,45 +0,0 @@ - - - - netcoreapp1.1;net46; - ServiceStack.Text.VersionCompareBenchmarks - Exe - ServiceStack.Text.VersionCompareBenchmarks - $(PackageTargetFallback);dnxcore50 - 1.1.2 - - - - true - - - - portable - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/benchmarks/run-benchmarks.bat b/benchmarks/run-benchmarks.bat deleted file mode 100644 index 1f47a2c04..000000000 --- a/benchmarks/run-benchmarks.bat +++ /dev/null @@ -1,23 +0,0 @@ -@echo off -set proj=ServiceStack.Text.VersionCompareBenchmarks -set curdate= -for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set curdate=%%c-%%a-%%b) -for /f "usebackq tokens=1,2 delims==" %%a in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do (if '.%%a.'=='.LocalDateTime.' set ldt=%%b) -set curdate=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% -echo %proj%\ServiceStack.Text.VersionCompareBenchmarks.csproj %curdate% - -mkdir Results - -rmdir /s /q bin -rmdir /s /q obj -dotnet restore %proj%\ServiceStack.Text.VersionCompareBenchmarks.csproj && dotnet build -c Release %proj%\ServiceStack.Text.VersionCompareBenchmarks.csproj -%proj%\bin\Release\net46\ServiceStack.Text.VersionCompareBenchmarks.exe -copy BenchmarkDotNet.Artifacts\results\JsonDeserializationBenchmarks-report-github.md Results\JsonDeserialization-%curdate%.md -copy BenchmarkDotNet.Artifacts\results\ParseBuiltinBenchmarks-report-github.md Results\ParseBuiltin-%curdate%.md - -rmdir /s /q bin -rmdir /s /q obj -dotnet restore %proj%\ServiceStack.Text.VersionCompareBenchmarks.BaseLine.csproj && dotnet build -c Release %proj%\ServiceStack.Text.VersionCompareBenchmarks.BaseLine.csproj -%proj%\bin\Release\net46\ServiceStack.Text.VersionCompareBenchmarks.BaseLine.exe -copy BenchmarkDotNet.Artifacts\results\JsonDeserializationBenchmarks-report-github.md Results\JsonDeserialization-baseline-%curdate%.md -copy BenchmarkDotNet.Artifacts\results\ParseBuiltinBenchmarks-report-github.md Results\ParseBuiltin-baseline-%curdate%.md diff --git a/src/ServiceStack.Memory/ServiceStack.Memory.csproj b/src/ServiceStack.Memory/ServiceStack.Memory.csproj deleted file mode 100644 index d5efec16f..000000000 --- a/src/ServiceStack.Memory/ServiceStack.Memory.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - netcoreapp2.1;net6.0 - - - $(DefineConstants);NETSTANDARD;NETCORE;NETCORE2_1 - - - $(DefineConstants);NETSTANDARD;NETCORE;NET6_0 - - - - - - - NetCoreMemory.cs - - - \ No newline at end of file From 237a371d5abbb70fabfb39e163bda89571733e8d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 24 Jan 2022 20:11:58 +0800 Subject: [PATCH 329/372] Upgrade to 6.0.0 --- NuGet.Config | 2 +- build/build-core.proj | 3 +-- build/build-deps.proj | 9 +------ build/build.proj | 8 +----- src/Directory.Build.props | 4 +-- src/ServiceStack.Text.sln | 6 ----- src/ServiceStack.Text/Env.cs | 2 +- src/ServiceStack.Text/MemoryProvider.cs | 2 +- src/ServiceStack.Text/NetCoreMemory.cs | 3 +-- .../Properties/AssemblyInfo.cs | 2 +- .../ServiceStack.Text.Core.csproj | 11 +------- .../ServiceStack.Text.csproj | 12 ++------- tests/Directory.Build.props | 20 ++------------ .../Northwind.Common/Northwind.Common.csproj | 15 +++-------- .../MemoryProviderBenchmarks.cs | 1 - .../ServiceStack.Text.Benchmarks.csproj | 4 +-- .../DataContractTests.cs | 27 ------------------- .../ServiceStack.Text.Tests.csproj | 1 - 18 files changed, 21 insertions(+), 111 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index 42daf5f44..f3c213adf 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/build/build-core.proj b/build/build-core.proj index 395a22659..707725c77 100644 --- a/build/build-core.proj +++ b/build/build-core.proj @@ -4,7 +4,7 @@ - 5 + 6 0 $(BUILD_NUMBER) @@ -41,7 +41,6 @@ - diff --git a/build/build-deps.proj b/build/build-deps.proj index ca0f8332f..38e06c69b 100644 --- a/build/build-deps.proj +++ b/build/build-deps.proj @@ -4,7 +4,7 @@ - 5 + 6 0 $(BUILD_NUMBER) @@ -32,14 +32,12 @@ - - @@ -69,11 +67,6 @@ - - - - 5 + 6 0 $(BUILD_NUMBER) @@ -47,7 +47,6 @@ - @@ -77,11 +76,6 @@ - - - - 5.14.0 + 6.0.0 ServiceStack ServiceStack, Inc. © 2008-2022 ServiceStack, Inc @@ -24,7 +24,7 @@ true - + $(DefineConstants);NETFX;NET45 True False diff --git a/src/ServiceStack.Text.sln b/src/ServiceStack.Text.sln index 5b25d9f12..a2c32f26d 100644 --- a/src/ServiceStack.Text.sln +++ b/src/ServiceStack.Text.sln @@ -21,8 +21,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServiceStack.Text.Tests", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServiceStack.Text.TestsConsole", "..\tests\ServiceStack.Text.TestsConsole\ServiceStack.Text.TestsConsole.csproj", "{DD3BEB33-2509-423A-8545-CE1A83684530}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServiceStack.Memory", "ServiceStack.Memory\ServiceStack.Memory.csproj", "{7128E4DB-6C8B-4EFC-A04D-DDDF8A58BB53}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServiceStack.Text.Benchmarks", "..\tests\ServiceStack.Text.Benchmarks\ServiceStack.Text.Benchmarks.csproj", "{FF1E5617-FD95-496F-B591-17DA6E0B364F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Northwind.Common", "..\tests\Northwind.Common\Northwind.Common.csproj", "{573926E5-F332-462D-A740-31706708A032}" @@ -45,10 +43,6 @@ Global {DD3BEB33-2509-423A-8545-CE1A83684530}.Debug|Any CPU.Build.0 = Debug|Any CPU {DD3BEB33-2509-423A-8545-CE1A83684530}.Release|Any CPU.ActiveCfg = Release|Any CPU {DD3BEB33-2509-423A-8545-CE1A83684530}.Release|Any CPU.Build.0 = Release|Any CPU - {7128E4DB-6C8B-4EFC-A04D-DDDF8A58BB53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7128E4DB-6C8B-4EFC-A04D-DDDF8A58BB53}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7128E4DB-6C8B-4EFC-A04D-DDDF8A58BB53}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7128E4DB-6C8B-4EFC-A04D-DDDF8A58BB53}.Release|Any CPU.Build.0 = Release|Any CPU {FF1E5617-FD95-496F-B591-17DA6E0B364F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FF1E5617-FD95-496F-B591-17DA6E0B364F}.Debug|Any CPU.Build.0 = Debug|Any CPU {FF1E5617-FD95-496F-B591-17DA6E0B364F}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 8ab386aa3..6ab3e42a5 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -117,7 +117,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.14m; + public static decimal ServiceStackVersion = 6.00m; public static bool IsLinux { get; set; } diff --git a/src/ServiceStack.Text/MemoryProvider.cs b/src/ServiceStack.Text/MemoryProvider.cs index 60e60bad6..4876ebc20 100644 --- a/src/ServiceStack.Text/MemoryProvider.cs +++ b/src/ServiceStack.Text/MemoryProvider.cs @@ -13,7 +13,7 @@ public abstract class MemoryProvider { public static MemoryProvider Instance = #if NETCORE && !NETSTANDARD2_0 - ServiceStack.Memory.NetCoreMemory.Provider; + NetCoreMemory.Provider; #else DefaultMemory.Provider; #endif diff --git a/src/ServiceStack.Text/NetCoreMemory.cs b/src/ServiceStack.Text/NetCoreMemory.cs index 6ecaf62ee..7a2aaed51 100644 --- a/src/ServiceStack.Text/NetCoreMemory.cs +++ b/src/ServiceStack.Text/NetCoreMemory.cs @@ -7,11 +7,10 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -using ServiceStack.Text; using ServiceStack.Text.Common; using ServiceStack.Text.Pools; -namespace ServiceStack.Memory +namespace ServiceStack.Text { public sealed class NetCoreMemory : MemoryProvider { diff --git a/src/ServiceStack.Text/Properties/AssemblyInfo.cs b/src/ServiceStack.Text/Properties/AssemblyInfo.cs index 2136c0240..b64975d01 100644 --- a/src/ServiceStack.Text/Properties/AssemblyInfo.cs +++ b/src/ServiceStack.Text/Properties/AssemblyInfo.cs @@ -2,4 +2,4 @@ [assembly: ComVisible(false)] [assembly: Guid("a352d4d3-df2a-4c78-b646-67181a6333a6")] -[assembly: System.Reflection.AssemblyVersion("5.0.0.0")] +[assembly: System.Reflection.AssemblyVersion("6.0.0.0")] diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index f0cd48f9e..675c4cd0c 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -3,8 +3,7 @@ ServiceStack.Text.Core ServiceStack.Text ServiceStack.Text - - netstandard2.0;netcoreapp2.1;net6.0 + netstandard2.0;net6.0 ServiceStack.Text .NET Standard 2.0 .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. @@ -14,9 +13,6 @@ JSON;Text;Serializer;CSV;JSV;HTTP;Auto Mapping;Dump;Reflection;JS;Utils;Fast 1591 - - $(DefineConstants);NETCORE;NETCORE2_1 - $(DefineConstants);NETSTANDARD;NET6_0 @@ -28,11 +24,6 @@ - - - - - diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index ef46d4470..9b3ef5e7f 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -2,7 +2,7 @@ ServiceStack.Text ServiceStack.Text - net45;netstandard2.0;netcoreapp2.1;net6.0 + net472;netstandard2.0;net6.0 .NET's fastest JSON Serializer by ServiceStack .NET's fastest JSON, JSV and CSV Text Serializers. Fast, Light, Resilient. @@ -15,9 +15,6 @@ $(DefineConstants);NETCORE;NETSTANDARD;NETSTANDARD2_0 - - $(DefineConstants);NETCORE;NETCORE2_1 - $(DefineConstants);NETCORE;NET6_0;NET6_0_OR_GREATER @@ -25,18 +22,13 @@ - + - - - - - diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 02591eb88..187fbd040 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 5.14.0 + 6.0.0 latest false @@ -10,18 +10,6 @@ DEBUG - - $(DefineConstants);NETFX;NET45 - - - - $(DefineConstants);NETFX;NET46 - - - - $(DefineConstants);NETFX;NET461 - - $(DefineConstants);NETFX;NET472 @@ -30,15 +18,11 @@ $(DefineConstants);NETCORE;NETSTANDARD2_0 - - $(DefineConstants);NETSTANDARD;NETSTANDARD2_1 - - $(DefineConstants);NET6_0;NET6_0_OR_GREATER - + $(DefineConstants);NETCORE;NETCORE_SUPPORT diff --git a/tests/Northwind.Common/Northwind.Common.csproj b/tests/Northwind.Common/Northwind.Common.csproj index c575bd4b0..40ac58cdf 100644 --- a/tests/Northwind.Common/Northwind.Common.csproj +++ b/tests/Northwind.Common/Northwind.Common.csproj @@ -1,7 +1,7 @@  - net461;netstandard2.0 + net472;net6.0 Northwind.Common Northwind.Common false @@ -29,25 +29,18 @@ - + $(DefineConstants);NET45 - + - + $(DefineConstants);NETSTANDARD2_0 - - - - - - - \ No newline at end of file diff --git a/tests/ServiceStack.Text.Benchmarks/MemoryProviderBenchmarks.cs b/tests/ServiceStack.Text.Benchmarks/MemoryProviderBenchmarks.cs index 9f479a846..a2a97a6a4 100644 --- a/tests/ServiceStack.Text.Benchmarks/MemoryProviderBenchmarks.cs +++ b/tests/ServiceStack.Text.Benchmarks/MemoryProviderBenchmarks.cs @@ -1,7 +1,6 @@ using System; using System.Globalization; using BenchmarkDotNet.Attributes; -using ServiceStack.Memory; namespace ServiceStack.Text.Benchmarks { diff --git a/tests/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj b/tests/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj index e238d2b14..32aeb35ff 100644 --- a/tests/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj +++ b/tests/ServiceStack.Text.Benchmarks/ServiceStack.Text.Benchmarks.csproj @@ -1,7 +1,7 @@  Exe - netcoreapp2.1 + net6.0 @@ -10,7 +10,7 @@ - + $(DefineConstants);NETSTANDARD;NETCORE;NETCORE2_1 \ No newline at end of file diff --git a/tests/ServiceStack.Text.Tests/DataContractTests.cs b/tests/ServiceStack.Text.Tests/DataContractTests.cs index 0027c1805..c4f689049 100644 --- a/tests/ServiceStack.Text.Tests/DataContractTests.cs +++ b/tests/ServiceStack.Text.Tests/DataContractTests.cs @@ -258,20 +258,6 @@ public void Json_Serialize_Should_Respects_DataContract_Field_Name_With_Bytes_De Assert.IsTrue (t.Bytes.AreEqual (new byte[] { 0x61, 0x62 })); } -#if !NETCORE - [Test] - public void Can_get_weak_DataMember() - { - var dto = new ClassOne(); - var dataMemberAttr = dto.GetType().GetProperty("Id").GetWeakDataMember(); - Assert.That(dataMemberAttr.Name, Is.Null); - - dataMemberAttr = dto.GetType().GetProperty("List").GetWeakDataMember(); - Assert.That(dataMemberAttr.Name, Is.EqualTo("listClassTwo")); - Assert.That(dataMemberAttr.Order, Is.EqualTo(1)); - } -#endif - [DataContract(Name = "my-class", Namespace = "http://schemas.ns.com")] public class MyClass { @@ -279,19 +265,6 @@ public class MyClass public string Title { get; set; } } -#if !NETCORE - [Test] - public void Can_get_weak_DataContract() - { - var mc = new MyClass { Title = "Some random title" }; - - var attr = mc.GetType().GetWeakDataContract(); - - Assert.That(attr.Name, Is.EqualTo("my-class")); - Assert.That(attr.Namespace, Is.EqualTo("http://schemas.ns.com")); - } -#endif - [Test] public void Does_use_DataMember_Name() { diff --git a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj index c1c8de7e1..3ffabe47b 100644 --- a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj +++ b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj @@ -54,7 +54,6 @@ $(DefineConstants);NETCORE;NETSTANDARD2_0 - From a4f579131c542b4505950adcd895bb16704e67a2 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 24 Jan 2022 21:08:49 +0800 Subject: [PATCH 330/372] Change #if NET45 to #if NETFX --- src/Directory.Build.props | 10 +--------- src/ServiceStack.Text/LicenseUtils.cs | 4 ++-- src/ServiceStack.Text/PclExport.Net45.cs | 2 +- src/ServiceStack.Text/PclExport.cs | 2 +- src/ServiceStack.Text/ReflectionOptimizer.Emit.cs | 2 +- src/ServiceStack.Text/ReflectionOptimizer.cs | 2 +- .../MiniProfiler/FlowData.cs | 4 ++-- .../RuntimeSerializationTests.cs | 2 +- 8 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index be1d46624..a118be095 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -25,24 +25,16 @@ - $(DefineConstants);NETFX;NET45 + $(DefineConstants);NETFX;NET45;NET472 True False ../servicestack.snk - - $(DefineConstants);NETFX;NET472 - - $(DefineConstants);NETSTANDARD;NETSTANDARD2_0 - - $(DefineConstants);NETSTANDARD;NETSTANDARD2_1 - - $(DefineConstants);NET6_0;NET6_0_OR_GREATER diff --git a/src/ServiceStack.Text/LicenseUtils.cs b/src/ServiceStack.Text/LicenseUtils.cs index e673e97eb..1a97e3e00 100644 --- a/src/ServiceStack.Text/LicenseUtils.cs +++ b/src/ServiceStack.Text/LicenseUtils.cs @@ -666,7 +666,7 @@ public static bool VerifySignedHash(byte[] DataToVerify, byte[] SignedData, Syst public static LicenseKey VerifyLicenseKeyText(string licenseKeyText) { -#if NET45 || NETCORE +#if NETFX || NETCORE LicenseKey key; try { @@ -686,7 +686,7 @@ public static LicenseKey VerifyLicenseKeyText(string licenseKeyText) private static void FromXml(this System.Security.Cryptography.RSA rsa, string xml) { -#if NET45 +#if NETFX rsa.FromXmlString(xml); #else //throws PlatformNotSupportedException diff --git a/src/ServiceStack.Text/PclExport.Net45.cs b/src/ServiceStack.Text/PclExport.Net45.cs index ffccdee83..73bc305be 100644 --- a/src/ServiceStack.Text/PclExport.Net45.cs +++ b/src/ServiceStack.Text/PclExport.Net45.cs @@ -1,4 +1,4 @@ -#if NET45 +#if NETFX using System; using System.Collections; using System.Collections.Concurrent; diff --git a/src/ServiceStack.Text/PclExport.cs b/src/ServiceStack.Text/PclExport.cs index 1f2a7e06c..c97a8be6b 100644 --- a/src/ServiceStack.Text/PclExport.cs +++ b/src/ServiceStack.Text/PclExport.cs @@ -27,7 +27,7 @@ public static class Platforms } public static PclExport Instance -#if NET45 +#if NETFX = new Net45PclExport() #elif NETSTANDARD2_0 = new NetStandardPclExport() diff --git a/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs b/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs index 6ffdd322a..cac57f78f 100644 --- a/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs +++ b/src/ServiceStack.Text/ReflectionOptimizer.Emit.cs @@ -1,4 +1,4 @@ -#if NET45 || (NETCORE && !NETSTANDARD2_0) +#if NETFX || (NETCORE && !NETSTANDARD2_0) using System; using System.Linq; diff --git a/src/ServiceStack.Text/ReflectionOptimizer.cs b/src/ServiceStack.Text/ReflectionOptimizer.cs index bfac69d1b..0042abcbc 100644 --- a/src/ServiceStack.Text/ReflectionOptimizer.cs +++ b/src/ServiceStack.Text/ReflectionOptimizer.cs @@ -8,7 +8,7 @@ namespace ServiceStack.Text public abstract class ReflectionOptimizer { public static ReflectionOptimizer Instance = -#if NET45 || (NETCORE && !NETSTANDARD2_0) +#if NETFX || (NETCORE && !NETSTANDARD2_0) EmitReflectionOptimizer.Provider #else ExpressionReflectionOptimizer.Provider diff --git a/tests/ServiceStack.Text.Benchmarks/MiniProfiler/FlowData.cs b/tests/ServiceStack.Text.Benchmarks/MiniProfiler/FlowData.cs index 2455dc292..d03b10539 100644 --- a/tests/ServiceStack.Text.Benchmarks/MiniProfiler/FlowData.cs +++ b/tests/ServiceStack.Text.Benchmarks/MiniProfiler/FlowData.cs @@ -1,4 +1,4 @@ -#if NET45 +#if NETFX using System.Runtime.Remoting; using System.Runtime.Remoting.Messaging; #else @@ -16,7 +16,7 @@ namespace StackExchange.Profiling.Internal /// The type of data to store. public class FlowData { -#if NET45 +#if NETFX // Key specific to this type. #pragma warning disable RCS1158 // Avoid static members in generic types. private static readonly string _key = typeof(FlowData).FullName; diff --git a/tests/ServiceStack.Text.Tests/RuntimeSerializationTests.cs b/tests/ServiceStack.Text.Tests/RuntimeSerializationTests.cs index 655894b12..4b5dd3ff5 100644 --- a/tests/ServiceStack.Text.Tests/RuntimeSerializationTests.cs +++ b/tests/ServiceStack.Text.Tests/RuntimeSerializationTests.cs @@ -40,7 +40,7 @@ public class MetaType : IMeta public class RequestDto : IReturn {} -#if NET45 +#if NETFX [Serializable] public class SerialiazableType { } #endif From aa4836205664d12159ac2c308200efe1734133f7 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 24 Jan 2022 21:42:53 +0800 Subject: [PATCH 331/372] Update Env.cs --- src/ServiceStack.Text/Env.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 6ab3e42a5..e55876ebb 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -34,7 +34,7 @@ static Env() IsUnix = IsOSX || IsLinux; HasMultiplePlatformTargets = true; IsUWP = IsRunningAsUwp(); -#elif NET45 +#elif NETFX IsNetFramework = true; switch (Environment.OSVersion.Platform) { From 9c8dc8582fe9f4b7dc6fd12addf6727c152b7d4b Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 24 Jan 2022 23:28:15 +0800 Subject: [PATCH 332/372] Remove unnecessary net6.0 deps --- .../ServiceStack.Text.csproj | 3 -- .../ServiceStack.Text.TestsConsole/Program.cs | 30 +++++++++---------- .../ServiceStack.Text.TestsConsole.csproj | 4 +-- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index 9b3ef5e7f..df4781b18 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -30,8 +30,5 @@ - - - \ No newline at end of file diff --git a/tests/ServiceStack.Text.TestsConsole/Program.cs b/tests/ServiceStack.Text.TestsConsole/Program.cs index cf13c08d4..d3836420e 100644 --- a/tests/ServiceStack.Text.TestsConsole/Program.cs +++ b/tests/ServiceStack.Text.TestsConsole/Program.cs @@ -5,7 +5,7 @@ using System.Reflection.Emit; using NUnit.Framework; using ServiceStack.Common.Tests; -using ServiceStack.OrmLite; +//using ServiceStack.OrmLite; using ServiceStack.Reflection; namespace ServiceStack.Text.TestsConsole @@ -14,7 +14,7 @@ class Program { public static void Main(string[] args) { - PrintDumpColumnSchema(); + // PrintDumpColumnSchema(); //var da = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("dyn"), AssemblyBuilderAccess.Save); @@ -62,19 +62,19 @@ public void Compare_interpolation_vs_string_Concat() public static object SimpleConcat(string text) => "Hi " + text; - public static void PrintDumpColumnSchema() - { - var dbFactory = new OrmLiteConnectionFactory(":memory:", - SqliteDialect.Provider); - - using var db = dbFactory.Open(); - db.CreateTableIfNotExists(); - - ColumnSchema[] columnSchemas = db.GetTableColumns(); - - columnSchemas.Each(x => x.ToString().Print()); - columnSchemas.Each(x => x.PrintDump()); - } + // public static void PrintDumpColumnSchema() + // { + // var dbFactory = new OrmLiteConnectionFactory(":memory:", + // SqliteDialect.Provider); + // + // using var db = dbFactory.Open(); + // db.CreateTableIfNotExists(); + // + // ColumnSchema[] columnSchemas = db.GetTableColumns(); + // + // columnSchemas.Each(x => x.ToString().Print()); + // columnSchemas.Each(x => x.PrintDump()); + // } public class Person { diff --git a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj index 7c573aa4a..ce48a1103 100644 --- a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj +++ b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj @@ -11,7 +11,7 @@ - - + + \ No newline at end of file From 52eddc2a510a2716887dcb47c721ca7430fcecb7 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 24 Jan 2022 23:29:48 +0800 Subject: [PATCH 333/372] Update ServiceStack.Text.Core.csproj --- src/ServiceStack.Text/ServiceStack.Text.Core.csproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj index 675c4cd0c..14f46e2db 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.Core.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.Core.csproj @@ -25,8 +25,5 @@ - - - \ No newline at end of file From c00dd99c66c8510514937babb5aa984e59d2a8b4 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 24 Jan 2022 23:46:49 +0800 Subject: [PATCH 334/372] Update NuGet.Config --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index f3c213adf..42daf5f44 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + \ No newline at end of file From 477fbd86da5113efb92af945d8a1c42049b464a7 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 24 Jan 2022 23:49:29 +0800 Subject: [PATCH 335/372] Update Northwind.Common.csproj --- tests/Northwind.Common/Northwind.Common.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Northwind.Common/Northwind.Common.csproj b/tests/Northwind.Common/Northwind.Common.csproj index 40ac58cdf..ca01132a2 100644 --- a/tests/Northwind.Common/Northwind.Common.csproj +++ b/tests/Northwind.Common/Northwind.Common.csproj @@ -26,7 +26,7 @@ - + From cf6c381eaf748425d378b8489451f01f957345b0 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 24 Jan 2022 23:50:01 +0800 Subject: [PATCH 336/372] Update ServiceStack.Text.Tests.csproj --- tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj index 3ffabe47b..108ce3a8d 100644 --- a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj +++ b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj @@ -35,7 +35,7 @@ - + $(DefineConstants);NETFX From 2ed1a4f29182c30e559d1e418b2313500c00e62a Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 25 Jan 2022 20:36:10 +0800 Subject: [PATCH 337/372] Current version doesn't exist in SS.Text test projs --- tests/Northwind.Common/Northwind.Common.csproj | 2 +- tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj | 2 +- .../ServiceStack.Text.TestsConsole.csproj | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Northwind.Common/Northwind.Common.csproj b/tests/Northwind.Common/Northwind.Common.csproj index ca01132a2..3d8f226f4 100644 --- a/tests/Northwind.Common/Northwind.Common.csproj +++ b/tests/Northwind.Common/Northwind.Common.csproj @@ -26,7 +26,7 @@ - + diff --git a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj index 108ce3a8d..00dadf020 100644 --- a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj +++ b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj @@ -35,7 +35,7 @@ - + $(DefineConstants);NETFX diff --git a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj index ce48a1103..2db98f522 100644 --- a/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj +++ b/tests/ServiceStack.Text.TestsConsole/ServiceStack.Text.TestsConsole.csproj @@ -11,7 +11,7 @@ - - + + \ No newline at end of file From 296c7a84bdc18f9671834c5806d610b67a9f2faa Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Thu, 27 Jan 2022 19:34:13 +0800 Subject: [PATCH 338/372] Update Env.cs --- src/ServiceStack.Text/Env.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index e55876ebb..0df2bedf5 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -117,7 +117,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 6.00m; + public static decimal ServiceStackVersion = 6.01m; public static bool IsLinux { get; set; } From 73fedf1a499bb85afa4c99486cc95e611a6eede6 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 28 Jan 2022 08:34:58 +0800 Subject: [PATCH 339/372] Refactor HttpUtils into different classes to prepare for alt net6 impl --- src/ServiceStack.Text/Env.cs | 15 +- src/ServiceStack.Text/HttpHeaders.cs | 213 ++ src/ServiceStack.Text/HttpMethods.cs | 32 + src/ServiceStack.Text/HttpUtils.Legacy.cs | 1243 ++++++++++++ src/ServiceStack.Text/HttpUtils.cs | 2227 ++------------------- src/ServiceStack.Text/MimeTypes.cs | 452 +++++ 6 files changed, 2098 insertions(+), 2084 deletions(-) create mode 100644 src/ServiceStack.Text/HttpHeaders.cs create mode 100644 src/ServiceStack.Text/HttpMethods.cs create mode 100644 src/ServiceStack.Text/HttpUtils.Legacy.cs create mode 100644 src/ServiceStack.Text/MimeTypes.cs diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 0df2bedf5..edf3a4b2b 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -104,17 +104,16 @@ static Env() VersionString = ServiceStackVersion.ToString(CultureInfo.InvariantCulture); ServerUserAgent = "ServiceStack/" - + VersionString + " " - + PclExport.Instance.PlatformName - + (IsMono ? "/Mono" : "") - + (IsLinux ? "/Linux" : IsOSX ? "/OSX" : IsUnix ? "/Unix" : IsWindows ? "/Windows" : "/UnknownOS") - + (IsIOS ? "/iOS" : IsAndroid ? "/Android" : IsUWP ? "/UWP" : "") - + (IsNet6 ? "/net6" : IsNetStandard20 ? "/std2.0" : IsNetFramework ? "netfx" : "") - + ($"/{LicenseUtils.Info}"); - + + VersionString + " " + + PclExport.Instance.PlatformName + + (IsLinux ? "/Linux" : IsOSX ? "/OSX" : IsUnix ? "/Unix" : IsWindows ? "/Windows" : "/UnknownOS") + (IsIOS ? "/iOS" : IsAndroid ? "/Android" : IsUWP ? "/UWP" : "") + + PlatformModifier + + $"/{LicenseUtils.Info}"; __releaseDate = new DateTime(2001,01,01); } + public static string PlatformModifier => (IsNet6 ? "/net6" : IsNetStandard20 ? "/std2.0" : IsNetFramework ? "/netfx" : "") + (IsMono ? "/Mono" : ""); + public static string VersionString { get; set; } public static decimal ServiceStackVersion = 6.01m; diff --git a/src/ServiceStack.Text/HttpHeaders.cs b/src/ServiceStack.Text/HttpHeaders.cs new file mode 100644 index 000000000..8cdfeace3 --- /dev/null +++ b/src/ServiceStack.Text/HttpHeaders.cs @@ -0,0 +1,213 @@ +using System; +using System.Collections.Generic; + +namespace ServiceStack; + +public static class HttpHeaders +{ + public const string XParamOverridePrefix = "X-Param-Override-"; + + public const string XHttpMethodOverride = "X-Http-Method-Override"; + + public const string XAutoBatchCompleted = "X-AutoBatch-Completed"; // How many requests were completed before first failure + + public const string XTag = "X-Tag"; + + public const string XUserAuthId = "X-UAId"; + + public const string XTrigger = "X-Trigger"; // Trigger Events on UserAgent + + public const string XForwardedFor = "X-Forwarded-For"; // IP Address + + public const string XForwardedPort = "X-Forwarded-Port"; // 80 + + public const string XForwardedProtocol = "X-Forwarded-Proto"; // http or https + + public const string XRealIp = "X-Real-IP"; + + public const string XLocation = "X-Location"; + + public const string XStatus = "X-Status"; + + public const string XPoweredBy = "X-Powered-By"; + + public const string Referer = "Referer"; + + public const string CacheControl = "Cache-Control"; + + public const string IfModifiedSince = "If-Modified-Since"; + + public const string IfUnmodifiedSince = "If-Unmodified-Since"; + + public const string IfNoneMatch = "If-None-Match"; + + public const string IfMatch = "If-Match"; + + public const string LastModified = "Last-Modified"; + + public const string Accept = "Accept"; + + public const string AcceptEncoding = "Accept-Encoding"; + + public const string ContentType = "Content-Type"; + + public const string ContentEncoding = "Content-Encoding"; + + public const string ContentLength = "Content-Length"; + + public const string ContentDisposition = "Content-Disposition"; + + public const string Location = "Location"; + + public const string SetCookie = "Set-Cookie"; + + public const string ETag = "ETag"; + + public const string Age = "Age"; + + public const string Expires = "Expires"; + + public const string Vary = "Vary"; + + public const string Authorization = "Authorization"; + + public const string WwwAuthenticate = "WWW-Authenticate"; + + public const string AllowOrigin = "Access-Control-Allow-Origin"; + + public const string AllowMethods = "Access-Control-Allow-Methods"; + + public const string AllowHeaders = "Access-Control-Allow-Headers"; + + public const string AllowCredentials = "Access-Control-Allow-Credentials"; + + public const string ExposeHeaders = "Access-Control-Expose-Headers"; + + public const string AccessControlMaxAge = "Access-Control-Max-Age"; + + public const string Origin = "Origin"; + + public const string RequestMethod = "Access-Control-Request-Method"; + + public const string RequestHeaders = "Access-Control-Request-Headers"; + + public const string AcceptRanges = "Accept-Ranges"; + + public const string ContentRange = "Content-Range"; + + public const string Range = "Range"; + + public const string SOAPAction = "SOAPAction"; + + public const string Allow = "Allow"; + + public const string AcceptCharset = "Accept-Charset"; + + public const string AcceptLanguage = "Accept-Language"; + + public const string Connection = "Connection"; + + public const string Cookie = "Cookie"; + + public const string ContentLanguage = "Content-Language"; + + public const string Expect = "Expect"; + + public const string Pragma = "Pragma"; + + public const string ProxyAuthenticate = "Proxy-Authenticate"; + + public const string ProxyAuthorization = "Proxy-Authorization"; + + public const string ProxyConnection = "Proxy-Connection"; + + public const string SetCookie2 = "Set-Cookie2"; + + public const string TE = "TE"; + + public const string Trailer = "Trailer"; + + public const string TransferEncoding = "Transfer-Encoding"; + + public const string Upgrade = "Upgrade"; + + public const string Via = "Via"; + + public const string Warning = "Warning"; + + public const string Date = "Date"; + public const string Host = "Host"; + public const string UserAgent = "User-Agent"; + + public static HashSet RestrictedHeaders = new(StringComparer.OrdinalIgnoreCase) + { + Accept, + Connection, + ContentLength, + ContentType, + Date, + Expect, + Host, + IfModifiedSince, + Range, + Referer, + TransferEncoding, + UserAgent, + ProxyConnection, + }; +} + + +public static class CompressionTypes +{ + public static readonly string[] AllCompressionTypes = + { +#if NET6_0_OR_GREATER + Brotli, +#endif + Deflate, + GZip, + }; + +#if NET6_0_OR_GREATER + public const string Default = Brotli; +#else + public const string Default = Deflate; +#endif + + public const string Brotli = "br"; + public const string Deflate = "deflate"; + public const string GZip = "gzip"; + + public static bool IsValid(string compressionType) + { +#if NET6_0_OR_GREATER + return compressionType is Deflate or GZip or Brotli; +#else + return compressionType is Deflate or GZip; +#endif + } + + public static void AssertIsValid(string compressionType) + { + if (!IsValid(compressionType)) + { + throw new NotSupportedException(compressionType + + " is not a supported compression type. Valid types: " + string.Join(", ", AllCompressionTypes)); + } + } + + public static string GetExtension(string compressionType) + { + switch (compressionType) + { + case Brotli: + case Deflate: + case GZip: + return "." + compressionType; + default: + throw new NotSupportedException( + "Unknown compressionType: " + compressionType); + } + } +} \ No newline at end of file diff --git a/src/ServiceStack.Text/HttpMethods.cs b/src/ServiceStack.Text/HttpMethods.cs new file mode 100644 index 000000000..af2427998 --- /dev/null +++ b/src/ServiceStack.Text/HttpMethods.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; + +namespace ServiceStack; + +public static class HttpMethods +{ + static readonly string[] allVerbs = { + "OPTIONS", "GET", "HEAD", "POST", "PUT", "DELETE", "TRACE", "CONNECT", // RFC 2616 + "PROPFIND", "PROPPATCH", "MKCOL", "COPY", "MOVE", "LOCK", "UNLOCK", // RFC 2518 + "VERSION-CONTROL", "REPORT", "CHECKOUT", "CHECKIN", "UNCHECKOUT", + "MKWORKSPACE", "UPDATE", "LABEL", "MERGE", "BASELINE-CONTROL", "MKACTIVITY", // RFC 3253 + "ORDERPATCH", // RFC 3648 + "ACL", // RFC 3744 + "PATCH", // https://datatracker.ietf.org/doc/draft-dusseault-http-patch/ + "SEARCH", // https://datatracker.ietf.org/doc/draft-reschke-webdav-search/ + "BCOPY", "BDELETE", "BMOVE", "BPROPFIND", "BPROPPATCH", "NOTIFY", + "POLL", "SUBSCRIBE", "UNSUBSCRIBE" //MS Exchange WebDav: http://msdn.microsoft.com/en-us/library/aa142917.aspx + }; + + public static HashSet AllVerbs = new(allVerbs); + + public static bool Exists(string httpMethod) => AllVerbs.Contains(httpMethod.ToUpper()); + public static bool HasVerb(string httpVerb) => Exists(httpVerb); + + public const string Get = "GET"; + public const string Put = "PUT"; + public const string Post = "POST"; + public const string Delete = "DELETE"; + public const string Options = "OPTIONS"; + public const string Head = "HEAD"; + public const string Patch = "PATCH"; +} \ No newline at end of file diff --git a/src/ServiceStack.Text/HttpUtils.Legacy.cs b/src/ServiceStack.Text/HttpUtils.Legacy.cs new file mode 100644 index 000000000..4bb8ba9d9 --- /dev/null +++ b/src/ServiceStack.Text/HttpUtils.Legacy.cs @@ -0,0 +1,1243 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using ServiceStack.Text; + +namespace ServiceStack; + +public static partial class HttpUtils +{ + [ThreadStatic] + public static IHttpResultsFilter ResultsFilter; + + public static string GetJsonFromUrl(this string url, + Action requestFilter = null, Action responseFilter = null) + { + return url.GetStringFromUrl(MimeTypes.Json, requestFilter, responseFilter); + } + + public static Task GetJsonFromUrlAsync(this string url, + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return url.GetStringFromUrlAsync(MimeTypes.Json, requestFilter, responseFilter, token: token); + } + + public static string GetXmlFromUrl(this string url, + Action requestFilter = null, Action responseFilter = null) + { + return url.GetStringFromUrl(MimeTypes.Xml, requestFilter, responseFilter); + } + + public static Task GetXmlFromUrlAsync(this string url, + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return url.GetStringFromUrlAsync(MimeTypes.Xml, requestFilter, responseFilter, token: token); + } + + public static string GetCsvFromUrl(this string url, + Action requestFilter = null, Action responseFilter = null) + { + return url.GetStringFromUrl(MimeTypes.Csv, requestFilter, responseFilter); + } + + public static Task GetCsvFromUrlAsync(this string url, + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return url.GetStringFromUrlAsync(MimeTypes.Csv, requestFilter, responseFilter, token: token); + } + + public static string GetStringFromUrl(this string url, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task GetStringFromUrlAsync(this string url, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, + token: token); + } + + public static string PostStringToUrl(this string url, string requestBody = null, + string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "POST", + requestBody: requestBody, contentType: contentType, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostStringToUrlAsync(this string url, string requestBody = null, + string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "POST", + requestBody: requestBody, contentType: contentType, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PostToUrl(this string url, string formData = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "POST", + contentType: MimeTypes.FormUrlEncoded, requestBody: formData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostToUrlAsync(this string url, string formData = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "POST", + contentType: MimeTypes.FormUrlEncoded, requestBody: formData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PostToUrl(this string url, object formData = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + string postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; + + return SendStringToUrl(url, method: "POST", + contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostToUrlAsync(this string url, object formData = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + string postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; + + return SendStringToUrlAsync(url, method: "POST", + contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PostJsonToUrl(this string url, string json, + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "POST", requestBody: json, contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostJsonToUrlAsync(this string url, string json, + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "POST", requestBody: json, contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PostJsonToUrl(this string url, object data, + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "POST", requestBody: data.ToJson(), contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostJsonToUrlAsync(this string url, object data, + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "POST", requestBody: data.ToJson(), contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PostXmlToUrl(this string url, string xml, + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "POST", requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostXmlToUrlAsync(this string url, string xml, + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "POST", requestBody: xml, contentType: MimeTypes.Xml, + accept: MimeTypes.Xml, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PostCsvToUrl(this string url, string csv, + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "POST", requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostCsvToUrlAsync(this string url, string csv, + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "POST", requestBody: csv, contentType: MimeTypes.Csv, + accept: MimeTypes.Csv, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PutStringToUrl(this string url, string requestBody = null, + string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", + requestBody: requestBody, contentType: contentType, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutStringToUrlAsync(this string url, string requestBody = null, + string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PUT", + requestBody: requestBody, contentType: contentType, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PutToUrl(this string url, string formData = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", + contentType: MimeTypes.FormUrlEncoded, requestBody: formData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutToUrlAsync(this string url, string formData = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PUT", + contentType: MimeTypes.FormUrlEncoded, requestBody: formData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PutToUrl(this string url, object formData = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + string postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; + + return SendStringToUrl(url, method: "PUT", + contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutToUrlAsync(this string url, object formData = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + string postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; + + return SendStringToUrlAsync(url, method: "PUT", + contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PutJsonToUrl(this string url, string json, + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", requestBody: json, contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutJsonToUrlAsync(this string url, string json, + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PUT", requestBody: json, contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PutJsonToUrl(this string url, object data, + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", requestBody: data.ToJson(), contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutJsonToUrlAsync(this string url, object data, + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PUT", requestBody: data.ToJson(), contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PutXmlToUrl(this string url, string xml, + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutXmlToUrlAsync(this string url, string xml, + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PUT", requestBody: xml, contentType: MimeTypes.Xml, + accept: MimeTypes.Xml, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PutCsvToUrl(this string url, string csv, + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutCsvToUrlAsync(this string url, string csv, + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PUT", requestBody: csv, contentType: MimeTypes.Csv, + accept: MimeTypes.Csv, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PatchStringToUrl(this string url, string requestBody = null, + string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "PATCH", + requestBody: requestBody, contentType: contentType, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PatchStringToUrlAsync(this string url, string requestBody = null, + string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PATCH", + requestBody: requestBody, contentType: contentType, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PatchToUrl(this string url, string formData = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "PATCH", + contentType: MimeTypes.FormUrlEncoded, requestBody: formData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PatchToUrlAsync(this string url, string formData = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PATCH", + contentType: MimeTypes.FormUrlEncoded, requestBody: formData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PatchToUrl(this string url, object formData = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + string postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; + + return SendStringToUrl(url, method: "PATCH", + contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PatchToUrlAsync(this string url, object formData = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + string postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; + + return SendStringToUrlAsync(url, method: "PATCH", + contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PatchJsonToUrl(this string url, string json, + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "PATCH", requestBody: json, contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PatchJsonToUrlAsync(this string url, string json, + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PATCH", requestBody: json, contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PatchJsonToUrl(this string url, object data, + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "PATCH", requestBody: data.ToJson(), contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PatchJsonToUrlAsync(this string url, object data, + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PATCH", requestBody: data.ToJson(), contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string DeleteFromUrl(this string url, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "DELETE", accept: accept, requestFilter: requestFilter, + responseFilter: responseFilter); + } + + public static Task DeleteFromUrlAsync(this string url, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "DELETE", accept: accept, requestFilter: requestFilter, + responseFilter: responseFilter, token: token); + } + + public static string OptionsFromUrl(this string url, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "OPTIONS", accept: accept, requestFilter: requestFilter, + responseFilter: responseFilter); + } + + public static Task OptionsFromUrlAsync(this string url, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "OPTIONS", accept: accept, requestFilter: requestFilter, + responseFilter: responseFilter, token: token); + } + + public static string HeadFromUrl(this string url, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "HEAD", accept: accept, requestFilter: requestFilter, + responseFilter: responseFilter); + } + + public static Task HeadFromUrlAsync(this string url, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "HEAD", accept: accept, requestFilter: requestFilter, + responseFilter: responseFilter, token: token); + } + + public static string SendStringToUrl(this string url, string method = null, + string requestBody = null, string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + if (method != null) + webReq.Method = method; + if (contentType != null) + webReq.ContentType = contentType; + + webReq.Accept = accept; + PclExport.Instance.AddCompression(webReq); + + requestFilter?.Invoke(webReq); + + if (ResultsFilter != null) + { + return ResultsFilter.GetString(webReq, requestBody); + } + + if (requestBody != null) + { + using var reqStream = PclExport.Instance.GetRequestStream(webReq); + using var writer = new StreamWriter(reqStream, UseEncoding); + writer.Write(requestBody); + } + else if (method != null && HasRequestBody(method)) + { + webReq.ContentLength = 0; + } + + using var webRes = webReq.GetResponse(); + using var stream = webRes.GetResponseStream(); + responseFilter?.Invoke((HttpWebResponse)webRes); + return stream.ReadToEnd(UseEncoding); + } + + public static async Task SendStringToUrlAsync(this string url, string method = null, + string requestBody = null, + string contentType = null, string accept = "*/*", Action requestFilter = null, + Action responseFilter = null, CancellationToken token = default) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + if (method != null) + webReq.Method = method; + if (contentType != null) + webReq.ContentType = contentType; + + webReq.Accept = accept; + PclExport.Instance.AddCompression(webReq); + + requestFilter?.Invoke(webReq); + + if (ResultsFilter != null) + { + var result = ResultsFilter.GetString(webReq, requestBody); + return result; + } + + if (requestBody != null) + { + using var reqStream = PclExport.Instance.GetRequestStream(webReq); + using var writer = new StreamWriter(reqStream, UseEncoding); + await writer.WriteAsync(requestBody).ConfigAwait(); + } + else if (method != null && HasRequestBody(method)) + { + webReq.ContentLength = 0; + } + + using var webRes = await webReq.GetResponseAsync().ConfigAwait(); + responseFilter?.Invoke((HttpWebResponse)webRes); + using var stream = webRes.GetResponseStream(); + return await stream.ReadToEndAsync().ConfigAwait(); + } + + public static byte[] GetBytesFromUrl(this string url, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return url.SendBytesToUrl(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task GetBytesFromUrlAsync(this string url, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return url.SendBytesToUrlAsync(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, + token: token); + } + + public static byte[] PostBytesToUrl(this string url, byte[] requestBody = null, string contentType = null, + string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendBytesToUrl(url, method: "POST", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostBytesToUrlAsync(this string url, byte[] requestBody = null, + string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendBytesToUrlAsync(url, method: "POST", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static byte[] PutBytesToUrl(this string url, byte[] requestBody = null, string contentType = null, + string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendBytesToUrl(url, method: "PUT", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutBytesToUrlAsync(this string url, byte[] requestBody = null, string contentType = null, + string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendBytesToUrlAsync(url, method: "PUT", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static byte[] SendBytesToUrl(this string url, string method = null, + byte[] requestBody = null, string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + if (method != null) + webReq.Method = method; + + if (contentType != null) + webReq.ContentType = contentType; + + webReq.Accept = accept; + PclExport.Instance.AddCompression(webReq); + + requestFilter?.Invoke(webReq); + + if (ResultsFilter != null) + { + return ResultsFilter.GetBytes(webReq, requestBody); + } + + if (requestBody != null) + { + using var req = PclExport.Instance.GetRequestStream(webReq); + req.Write(requestBody, 0, requestBody.Length); + } + + using var webRes = PclExport.Instance.GetResponse(webReq); + responseFilter?.Invoke((HttpWebResponse)webRes); + + using var stream = webRes.GetResponseStream(); + return stream.ReadFully(); + } + + public static async Task SendBytesToUrlAsync(this string url, string method = null, + byte[] requestBody = null, string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + if (method != null) + webReq.Method = method; + if (contentType != null) + webReq.ContentType = contentType; + + webReq.Accept = accept; + PclExport.Instance.AddCompression(webReq); + + requestFilter?.Invoke(webReq); + + if (ResultsFilter != null) + { + var result = ResultsFilter.GetBytes(webReq, requestBody); + return result; + } + + if (requestBody != null) + { + using var req = PclExport.Instance.GetRequestStream(webReq); + await req.WriteAsync(requestBody, 0, requestBody.Length, token).ConfigAwait(); + } + + var webRes = await webReq.GetResponseAsync().ConfigAwait(); + responseFilter?.Invoke((HttpWebResponse)webRes); + + using var stream = webRes.GetResponseStream(); + return await stream.ReadFullyAsync(token).ConfigAwait(); + } + + public static Stream GetStreamFromUrl(this string url, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return url.SendStreamToUrl(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task GetStreamFromUrlAsync(this string url, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return url.SendStreamToUrlAsync(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, + token: token); + } + + public static Stream PostStreamToUrl(this string url, Stream requestBody = null, string contentType = null, + string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStreamToUrl(url, method: "POST", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostStreamToUrlAsync(this string url, Stream requestBody = null, + string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStreamToUrlAsync(url, method: "POST", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static Stream PutStreamToUrl(this string url, Stream requestBody = null, string contentType = null, + string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + return SendStreamToUrl(url, method: "PUT", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutStreamToUrlAsync(this string url, Stream requestBody = null, + string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + return SendStreamToUrlAsync(url, method: "PUT", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + /// + /// Returns HttpWebResponse Stream which must be disposed + /// + public static Stream SendStreamToUrl(this string url, string method = null, + Stream requestBody = null, string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + if (method != null) + webReq.Method = method; + + if (contentType != null) + webReq.ContentType = contentType; + + webReq.Accept = accept; + PclExport.Instance.AddCompression(webReq); + + requestFilter?.Invoke(webReq); + + if (ResultsFilter != null) + { + return new MemoryStream(ResultsFilter.GetBytes(webReq, requestBody.ReadFully())); + } + + if (requestBody != null) + { + using var req = PclExport.Instance.GetRequestStream(webReq); + requestBody.CopyTo(req); + } + + var webRes = PclExport.Instance.GetResponse(webReq); + responseFilter?.Invoke((HttpWebResponse)webRes); + + var stream = webRes.GetResponseStream(); + return stream; + } + + /// + /// Returns HttpWebResponse Stream which must be disposed + /// + public static async Task SendStreamToUrlAsync(this string url, string method = null, + Stream requestBody = null, string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + if (method != null) + webReq.Method = method; + if (contentType != null) + webReq.ContentType = contentType; + + webReq.Accept = accept; + PclExport.Instance.AddCompression(webReq); + + requestFilter?.Invoke(webReq); + + if (ResultsFilter != null) + { + return new MemoryStream(ResultsFilter.GetBytes(webReq, + await requestBody.ReadFullyAsync(token).ConfigAwait())); + } + + if (requestBody != null) + { + using var req = PclExport.Instance.GetRequestStream(webReq); + await requestBody.CopyToAsync(req, token).ConfigAwait(); + } + + var webRes = await webReq.GetResponseAsync().ConfigAwait(); + responseFilter?.Invoke((HttpWebResponse)webRes); + + var stream = webRes.GetResponseStream(); + return stream; + } + + public static bool IsAny300(this Exception ex) + { + var status = ex.GetStatus(); + return status >= HttpStatusCode.MultipleChoices && status < HttpStatusCode.BadRequest; + } + + public static bool IsAny400(this Exception ex) + { + var status = ex.GetStatus(); + return status >= HttpStatusCode.BadRequest && status < HttpStatusCode.InternalServerError; + } + + public static bool IsAny500(this Exception ex) + { + var status = ex.GetStatus(); + return status >= HttpStatusCode.InternalServerError && (int)status < 600; + } + + public static bool IsNotModified(this Exception ex) + { + return GetStatus(ex) == HttpStatusCode.NotModified; + } + + public static bool IsBadRequest(this Exception ex) + { + return GetStatus(ex) == HttpStatusCode.BadRequest; + } + + public static bool IsNotFound(this Exception ex) + { + return GetStatus(ex) == HttpStatusCode.NotFound; + } + + public static bool IsUnauthorized(this Exception ex) + { + return GetStatus(ex) == HttpStatusCode.Unauthorized; + } + + public static bool IsForbidden(this Exception ex) + { + return GetStatus(ex) == HttpStatusCode.Forbidden; + } + + public static bool IsInternalServerError(this Exception ex) + { + return GetStatus(ex) == HttpStatusCode.InternalServerError; + } + + public static HttpStatusCode? GetResponseStatus(this string url) + { + try + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + using (var webRes = PclExport.Instance.GetResponse(webReq)) + { + var httpRes = webRes as HttpWebResponse; + return httpRes?.StatusCode; + } + } + catch (Exception ex) + { + return ex.GetStatus(); + } + } + + public static HttpStatusCode? GetStatus(this Exception ex) + { + if (ex == null) + return null; + + if (ex is WebException webEx) + return GetStatus(webEx); + + if (ex is IHasStatusCode hasStatus) + return (HttpStatusCode)hasStatus.StatusCode; + + return null; + } + + public static HttpStatusCode? GetStatus(this WebException webEx) + { + var httpRes = webEx?.Response as HttpWebResponse; + return httpRes?.StatusCode; + } + + public static bool HasStatus(this Exception ex, HttpStatusCode statusCode) + { + return GetStatus(ex) == statusCode; + } + + public static string GetResponseBody(this Exception ex) + { + if (!(ex is WebException webEx) || webEx.Response == null || webEx.Status != WebExceptionStatus.ProtocolError) + return null; + + var errorResponse = (HttpWebResponse)webEx.Response; + using var responseStream = errorResponse.GetResponseStream(); + return responseStream.ReadToEnd(UseEncoding); + } + + public static async Task GetResponseBodyAsync(this Exception ex, CancellationToken token = default) + { + if (!(ex is WebException webEx) || webEx.Response == null || webEx.Status != WebExceptionStatus.ProtocolError) + return null; + + var errorResponse = (HttpWebResponse)webEx.Response; + using var responseStream = errorResponse.GetResponseStream(); + return await responseStream.ReadToEndAsync(UseEncoding).ConfigAwait(); + } + + public static string ReadToEnd(this WebResponse webRes) + { + using var stream = webRes.GetResponseStream(); + return stream.ReadToEnd(UseEncoding); + } + + public static Task ReadToEndAsync(this WebResponse webRes) + { + using var stream = webRes.GetResponseStream(); + return stream.ReadToEndAsync(UseEncoding); + } + + public static IEnumerable ReadLines(this WebResponse webRes) + { + using var stream = webRes.GetResponseStream(); + using var reader = new StreamReader(stream, UseEncoding, true, 1024, leaveOpen: true); + string line; + while ((line = reader.ReadLine()) != null) + { + yield return line; + } + } + + public static HttpWebResponse GetErrorResponse(this string url) + { + try + { + var webReq = WebRequest.Create(url); + using var webRes = PclExport.Instance.GetResponse(webReq); + webRes.ReadToEnd(); + return null; + } + catch (WebException webEx) + { + return (HttpWebResponse)webEx.Response; + } + } + + public static async Task GetErrorResponseAsync(this string url) + { + try + { + var webReq = WebRequest.Create(url); + using var webRes = await webReq.GetResponseAsync().ConfigAwait(); + await webRes.ReadToEndAsync().ConfigAwait(); + return null; + } + catch (WebException webEx) + { + return (HttpWebResponse)webEx.Response; + } + } + + public static void UploadFile(this WebRequest webRequest, Stream fileStream, string fileName, string mimeType, + string accept = null, Action requestFilter = null, string method = "POST", + string field = "file") + { + var httpReq = (HttpWebRequest)webRequest; + httpReq.Method = method; + + if (accept != null) + httpReq.Accept = accept; + + requestFilter?.Invoke(httpReq); + + var boundary = Guid.NewGuid().ToString("N"); + + httpReq.ContentType = "multipart/form-data; boundary=\"" + boundary + "\""; + + var boundaryBytes = ("\r\n--" + boundary + "--\r\n").ToAsciiBytes(); + + var headerBytes = GetHeaderBytes(fileName, mimeType, field, boundary); + + var contentLength = fileStream.Length + headerBytes.Length + boundaryBytes.Length; + PclExport.Instance.InitHttpWebRequest(httpReq, + contentLength: contentLength, allowAutoRedirect: false, keepAlive: false); + + if (ResultsFilter != null) + { + ResultsFilter.UploadStream(httpReq, fileStream, fileName); + return; + } + + using var outputStream = PclExport.Instance.GetRequestStream(httpReq); + outputStream.Write(headerBytes, 0, headerBytes.Length); + fileStream.CopyTo(outputStream, 4096); + outputStream.Write(boundaryBytes, 0, boundaryBytes.Length); + PclExport.Instance.CloseStream(outputStream); + } + + public static async Task UploadFileAsync(this WebRequest webRequest, Stream fileStream, string fileName, + string mimeType, + string accept = null, Action requestFilter = null, string method = "POST", + string field = "file", + CancellationToken token = default) + { + var httpReq = (HttpWebRequest)webRequest; + httpReq.Method = method; + + if (accept != null) + httpReq.Accept = accept; + + requestFilter?.Invoke(httpReq); + + var boundary = Guid.NewGuid().ToString("N"); + + httpReq.ContentType = "multipart/form-data; boundary=\"" + boundary + "\""; + + var boundaryBytes = ("\r\n--" + boundary + "--\r\n").ToAsciiBytes(); + + var headerBytes = GetHeaderBytes(fileName, mimeType, field, boundary); + + var contentLength = fileStream.Length + headerBytes.Length + boundaryBytes.Length; + PclExport.Instance.InitHttpWebRequest(httpReq, + contentLength: contentLength, allowAutoRedirect: false, keepAlive: false); + + if (ResultsFilter != null) + { + ResultsFilter.UploadStream(httpReq, fileStream, fileName); + return; + } + + using var outputStream = PclExport.Instance.GetRequestStream(httpReq); + await outputStream.WriteAsync(headerBytes, 0, headerBytes.Length, token).ConfigAwait(); + await fileStream.CopyToAsync(outputStream, 4096, token).ConfigAwait(); + await outputStream.WriteAsync(boundaryBytes, 0, boundaryBytes.Length, token).ConfigAwait(); + PclExport.Instance.CloseStream(outputStream); + } + + public static void UploadFile(this WebRequest webRequest, Stream fileStream, string fileName) + { + if (fileName == null) + throw new ArgumentNullException(nameof(fileName)); + var mimeType = MimeTypes.GetMimeType(fileName); + if (mimeType == null) + throw new ArgumentException("Mime-type not found for file: " + fileName); + + UploadFile(webRequest, fileStream, fileName, mimeType); + } + + public static async Task UploadFileAsync(this WebRequest webRequest, Stream fileStream, string fileName, + CancellationToken token = default) + { + if (fileName == null) + throw new ArgumentNullException(nameof(fileName)); + var mimeType = MimeTypes.GetMimeType(fileName); + if (mimeType == null) + throw new ArgumentException("Mime-type not found for file: " + fileName); + + await UploadFileAsync(webRequest, fileStream, fileName, mimeType, token: token).ConfigAwait(); + } + + public static string PostXmlToUrl(this string url, object data, + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "POST", requestBody: data.ToXml(), contentType: MimeTypes.Xml, + accept: MimeTypes.Xml, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static string PostCsvToUrl(this string url, object data, + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "POST", requestBody: data.ToCsv(), contentType: MimeTypes.Csv, + accept: MimeTypes.Csv, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static string PutXmlToUrl(this string url, object data, + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", requestBody: data.ToXml(), contentType: MimeTypes.Xml, + accept: MimeTypes.Xml, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static string PutCsvToUrl(this string url, object data, + Action requestFilter = null, Action responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", requestBody: data.ToCsv(), contentType: MimeTypes.Csv, + accept: MimeTypes.Csv, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static WebResponse PostFileToUrl(this string url, + FileInfo uploadFileInfo, string uploadFileMimeType, + string accept = null, + Action requestFilter = null) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + using (var fileStream = uploadFileInfo.OpenRead()) + { + var fileName = uploadFileInfo.Name; + + webReq.UploadFile(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, + method: "POST"); + } + + if (ResultsFilter != null) + return null; + + return webReq.GetResponse(); + } + + public static async Task PostFileToUrlAsync(this string url, + FileInfo uploadFileInfo, string uploadFileMimeType, + string accept = null, + Action requestFilter = null, CancellationToken token = default) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + using (var fileStream = uploadFileInfo.OpenRead()) + { + var fileName = uploadFileInfo.Name; + + await webReq.UploadFileAsync(fileStream, fileName, uploadFileMimeType, accept: accept, + requestFilter: requestFilter, method: "POST", token: token).ConfigAwait(); + } + + if (ResultsFilter != null) + return null; + + return await webReq.GetResponseAsync().ConfigAwait(); + } + + public static WebResponse PutFileToUrl(this string url, + FileInfo uploadFileInfo, string uploadFileMimeType, + string accept = null, + Action requestFilter = null) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + using (var fileStream = uploadFileInfo.OpenRead()) + { + var fileName = uploadFileInfo.Name; + + webReq.UploadFile(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, + method: "PUT"); + } + + if (ResultsFilter != null) + return null; + + return webReq.GetResponse(); + } + + public static async Task PutFileToUrlAsync(this string url, + FileInfo uploadFileInfo, string uploadFileMimeType, + string accept = null, + Action requestFilter = null, CancellationToken token = default) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + using (var fileStream = uploadFileInfo.OpenRead()) + { + var fileName = uploadFileInfo.Name; + + await webReq.UploadFileAsync(fileStream, fileName, uploadFileMimeType, accept: accept, + requestFilter: requestFilter, method: "PUT", token: token).ConfigAwait(); + } + + if (ResultsFilter != null) + return null; + + return await webReq.GetResponseAsync().ConfigAwait(); + } + + public static WebResponse UploadFile(this WebRequest webRequest, + FileInfo uploadFileInfo, string uploadFileMimeType) + { + using (var fileStream = uploadFileInfo.OpenRead()) + { + var fileName = uploadFileInfo.Name; + + webRequest.UploadFile(fileStream, fileName, uploadFileMimeType); + } + + if (ResultsFilter != null) + return null; + + return webRequest.GetResponse(); + } + + public static async Task UploadFileAsync(this WebRequest webRequest, + FileInfo uploadFileInfo, string uploadFileMimeType) + { + using (var fileStream = uploadFileInfo.OpenRead()) + { + var fileName = uploadFileInfo.Name; + + await webRequest.UploadFileAsync(fileStream, fileName, uploadFileMimeType).ConfigAwait(); + } + + if (ResultsFilter != null) + return null; + + return await webRequest.GetResponseAsync().ConfigAwait(); + } + + private static byte[] GetHeaderBytes(string fileName, string mimeType, string field, string boundary) + { + var header = "\r\n--" + boundary + + $"\r\nContent-Disposition: form-data; name=\"{field}\"; filename=\"{fileName}\"\r\nContent-Type: {mimeType}\r\n\r\n"; + + var headerBytes = header.ToAsciiBytes(); + return headerBytes; + } +} + + +public interface IHttpResultsFilter : IDisposable +{ + string GetString(HttpWebRequest webReq, string reqBody); + byte[] GetBytes(HttpWebRequest webReq, byte[] reqBody); + void UploadStream(HttpWebRequest webRequest, Stream fileStream, string fileName); +} + +public class HttpResultsFilter : IHttpResultsFilter +{ + private readonly IHttpResultsFilter previousFilter; + + public string StringResult { get; set; } + public byte[] BytesResult { get; set; } + + public Func StringResultFn { get; set; } + public Func BytesResultFn { get; set; } + public Action UploadFileFn { get; set; } + + public HttpResultsFilter(string stringResult = null, byte[] bytesResult = null) + { + StringResult = stringResult; + BytesResult = bytesResult; + + previousFilter = HttpUtils.ResultsFilter; + HttpUtils.ResultsFilter = this; + } + + public void Dispose() + { + HttpUtils.ResultsFilter = previousFilter; + } + + public string GetString(HttpWebRequest webReq, string reqBody) + { + return StringResultFn != null + ? StringResultFn(webReq, reqBody) + : StringResult; + } + + public byte[] GetBytes(HttpWebRequest webReq, byte[] reqBody) + { + return BytesResultFn != null + ? BytesResultFn(webReq, reqBody) + : BytesResult; + } + + public void UploadStream(HttpWebRequest webRequest, Stream fileStream, string fileName) + { + UploadFileFn?.Invoke(webRequest, fileStream, fileName); + } +} diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index a5551f4a3..ab7c7da07 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -2,2146 +2,221 @@ //License: https://raw.github.com/ServiceStack/ServiceStack/master/license.txt using System; -using System.Collections.Generic; using System.IO; using System.Net; using System.Text; -using System.Threading; using System.Threading.Tasks; -using ServiceStack.Text; -namespace ServiceStack -{ - public static partial class HttpUtils - { - public static string UserAgent = "ServiceStack.Text"; - - public static Encoding UseEncoding { get; set; } = PclExport.Instance.GetUTF8Encoding(false); - - [ThreadStatic] - public static IHttpResultsFilter ResultsFilter; - - public static string AddQueryParam(this string url, string key, object val, bool encode = true) - { - return url.AddQueryParam(key, val?.ToString(), encode); - } - - public static string AddQueryParam(this string url, object key, string val, bool encode = true) - { - return AddQueryParam(url, key?.ToString(), val, encode); - } - - public static string AddQueryParam(this string url, string key, string val, bool encode = true) - { - if (url == null) - url = ""; - - if (key == null || val == null) - return url; - - var prefix = string.Empty; - if (!url.EndsWith("?") && !url.EndsWith("&")) - { - prefix = url.IndexOf('?') == -1 ? "?" : "&"; - } - return url + prefix + key + "=" + (encode ? val.UrlEncode() : val); - } - - public static string SetQueryParam(this string url, string key, string val) - { - if (url == null) - url = ""; - - if (key == null || val == null) - return url; - - var qsPos = url.IndexOf('?'); - if (qsPos != -1) - { - var existingKeyPos = qsPos + 1 == url.IndexOf(key + "=", qsPos, StringComparison.Ordinal) - ? qsPos - : url.IndexOf("&" + key, qsPos, StringComparison.Ordinal); - - if (existingKeyPos != -1) - { - var endPos = url.IndexOf('&', existingKeyPos + 1); - if (endPos == -1) - endPos = url.Length; - - var newUrl = url.Substring(0, existingKeyPos + key.Length + 1) - + "=" - + val.UrlEncode() - + url.Substring(endPos); - return newUrl; - } - } - var prefix = qsPos == -1 ? "?" : "&"; - return url + prefix + key + "=" + val.UrlEncode(); - } - - public static string AddHashParam(this string url, string key, object val) - { - return url.AddHashParam(key, val?.ToString()); - } - - public static string AddHashParam(this string url, string key, string val) - { - if (url == null) - url = ""; - - if (key == null || val == null) - return url; - - var prefix = url.IndexOf('#') == -1 ? "#" : "/"; - return url + prefix + key + "=" + val.UrlEncode(); - } - - public static string SetHashParam(this string url, string key, string val) - { - if (url == null) - url = ""; - - if (key == null || val == null) - return url; - - var hPos = url.IndexOf('#'); - if (hPos != -1) - { - var existingKeyPos = hPos + 1 == url.IndexOf(key + "=", hPos, PclExport.Instance.InvariantComparison) - ? hPos - : url.IndexOf("/" + key, hPos, PclExport.Instance.InvariantComparison); - - if (existingKeyPos != -1) - { - var endPos = url.IndexOf('/', existingKeyPos + 1); - if (endPos == -1) - endPos = url.Length; - - var newUrl = url.Substring(0, existingKeyPos + key.Length + 1) - + "=" - + val.UrlEncode() - + url.Substring(endPos); - return newUrl; - } - } - var prefix = url.IndexOf('#') == -1 ? "#" : "/"; - return url + prefix + key + "=" + val.UrlEncode(); - } - - public static bool HasRequestBody(string httpMethod) - { - switch (httpMethod) - { - case HttpMethods.Get: - case HttpMethods.Delete: - case HttpMethods.Head: - case HttpMethods.Options: - return false; - } - - return true; - } - - public static string GetJsonFromUrl(this string url, - Action requestFilter = null, Action responseFilter = null) - { - return url.GetStringFromUrl(MimeTypes.Json, requestFilter, responseFilter); - } - - public static Task GetJsonFromUrlAsync(this string url, - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return url.GetStringFromUrlAsync(MimeTypes.Json, requestFilter, responseFilter, token: token); - } - - public static string GetXmlFromUrl(this string url, - Action requestFilter = null, Action responseFilter = null) - { - return url.GetStringFromUrl(MimeTypes.Xml, requestFilter, responseFilter); - } - - public static Task GetXmlFromUrlAsync(this string url, - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return url.GetStringFromUrlAsync(MimeTypes.Xml, requestFilter, responseFilter, token: token); - } - - public static string GetCsvFromUrl(this string url, - Action requestFilter = null, Action responseFilter = null) - { - return url.GetStringFromUrl(MimeTypes.Csv, requestFilter, responseFilter); - } - - public static Task GetCsvFromUrlAsync(this string url, - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return url.GetStringFromUrlAsync(MimeTypes.Csv, requestFilter, responseFilter, token: token); - } - - public static string GetStringFromUrl(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task GetStringFromUrlAsync(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PostStringToUrl(this string url, string requestBody = null, - string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "POST", - requestBody: requestBody, contentType: contentType, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PostStringToUrlAsync(this string url, string requestBody = null, - string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "POST", - requestBody: requestBody, contentType: contentType, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PostToUrl(this string url, string formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "POST", - contentType: MimeTypes.FormUrlEncoded, requestBody: formData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PostToUrlAsync(this string url, string formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "POST", - contentType: MimeTypes.FormUrlEncoded, requestBody: formData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PostToUrl(this string url, object formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - string postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; - - return SendStringToUrl(url, method: "POST", - contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PostToUrlAsync(this string url, object formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - string postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; - - return SendStringToUrlAsync(url, method: "POST", - contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PostJsonToUrl(this string url, string json, - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "POST", requestBody: json, contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PostJsonToUrlAsync(this string url, string json, - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "POST", requestBody: json, contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PostJsonToUrl(this string url, object data, - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "POST", requestBody: data.ToJson(), contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PostJsonToUrlAsync(this string url, object data, - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "POST", requestBody: data.ToJson(), contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PostXmlToUrl(this string url, string xml, - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "POST", requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, - requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PostXmlToUrlAsync(this string url, string xml, - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "POST", requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, - requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PostCsvToUrl(this string url, string csv, - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "POST", requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, - requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PostCsvToUrlAsync(this string url, string csv, - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "POST", requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, - requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PutStringToUrl(this string url, string requestBody = null, - string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "PUT", - requestBody: requestBody, contentType: contentType, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PutStringToUrlAsync(this string url, string requestBody = null, - string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "PUT", - requestBody: requestBody, contentType: contentType, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PutToUrl(this string url, string formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "PUT", - contentType: MimeTypes.FormUrlEncoded, requestBody: formData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PutToUrlAsync(this string url, string formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "PUT", - contentType: MimeTypes.FormUrlEncoded, requestBody: formData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PutToUrl(this string url, object formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - string postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; - - return SendStringToUrl(url, method: "PUT", - contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PutToUrlAsync(this string url, object formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - string postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; - - return SendStringToUrlAsync(url, method: "PUT", - contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PutJsonToUrl(this string url, string json, - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "PUT", requestBody: json, contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PutJsonToUrlAsync(this string url, string json, - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "PUT", requestBody: json, contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PutJsonToUrl(this string url, object data, - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "PUT", requestBody: data.ToJson(), contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PutJsonToUrlAsync(this string url, object data, - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "PUT", requestBody: data.ToJson(), contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PutXmlToUrl(this string url, string xml, - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "PUT", requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, - requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PutXmlToUrlAsync(this string url, string xml, - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "PUT", requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, - requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PutCsvToUrl(this string url, string csv, - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "PUT", requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, - requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PutCsvToUrlAsync(this string url, string csv, - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "PUT", requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, - requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PatchStringToUrl(this string url, string requestBody = null, - string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "PATCH", - requestBody: requestBody, contentType: contentType, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PatchStringToUrlAsync(this string url, string requestBody = null, - string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "PATCH", - requestBody: requestBody, contentType: contentType, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PatchToUrl(this string url, string formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "PATCH", - contentType: MimeTypes.FormUrlEncoded, requestBody: formData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PatchToUrlAsync(this string url, string formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "PATCH", - contentType: MimeTypes.FormUrlEncoded, requestBody: formData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PatchToUrl(this string url, object formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - string postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; - - return SendStringToUrl(url, method: "PATCH", - contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PatchToUrlAsync(this string url, object formData = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - string postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; - - return SendStringToUrlAsync(url, method: "PATCH", - contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PatchJsonToUrl(this string url, string json, - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "PATCH", requestBody: json, contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PatchJsonToUrlAsync(this string url, string json, - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "PATCH", requestBody: json, contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string PatchJsonToUrl(this string url, object data, - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "PATCH", requestBody: data.ToJson(), contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PatchJsonToUrlAsync(this string url, object data, - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "PATCH", requestBody: data.ToJson(), contentType: MimeTypes.Json, accept: MimeTypes.Json, - requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string DeleteFromUrl(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "DELETE", accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task DeleteFromUrlAsync(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "DELETE", accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string OptionsFromUrl(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "OPTIONS", accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task OptionsFromUrlAsync(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "OPTIONS", accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string HeadFromUrl(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "HEAD", accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task HeadFromUrlAsync(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStringToUrlAsync(url, method: "HEAD", accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static string SendStringToUrl(this string url, string method = null, - string requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - var webReq = (HttpWebRequest)WebRequest.Create(url); - if (method != null) - webReq.Method = method; - if (contentType != null) - webReq.ContentType = contentType; - - webReq.Accept = accept; - PclExport.Instance.AddCompression(webReq); - - requestFilter?.Invoke(webReq); - - if (ResultsFilter != null) - { - return ResultsFilter.GetString(webReq, requestBody); - } - - if (requestBody != null) - { - using var reqStream = PclExport.Instance.GetRequestStream(webReq); - using var writer = new StreamWriter(reqStream, UseEncoding); - writer.Write(requestBody); - } - else if (method != null && HasRequestBody(method)) - { - webReq.ContentLength = 0; - } - - using var webRes = webReq.GetResponse(); - using var stream = webRes.GetResponseStream(); - responseFilter?.Invoke((HttpWebResponse)webRes); - return stream.ReadToEnd(UseEncoding); - } - - public static async Task SendStringToUrlAsync(this string url, string method = null, string requestBody = null, - string contentType = null, string accept = "*/*", Action requestFilter = null, - Action responseFilter = null, CancellationToken token=default) - { - var webReq = (HttpWebRequest)WebRequest.Create(url); - if (method != null) - webReq.Method = method; - if (contentType != null) - webReq.ContentType = contentType; - - webReq.Accept = accept; - PclExport.Instance.AddCompression(webReq); - - requestFilter?.Invoke(webReq); - - if (ResultsFilter != null) - { - var result = ResultsFilter.GetString(webReq, requestBody); - return result; - } - - if (requestBody != null) - { - using var reqStream = PclExport.Instance.GetRequestStream(webReq); - using var writer = new StreamWriter(reqStream, UseEncoding); - await writer.WriteAsync(requestBody).ConfigAwait(); - } - - using var webRes = await webReq.GetResponseAsync().ConfigAwait(); - responseFilter?.Invoke((HttpWebResponse)webRes); - using var stream = webRes.GetResponseStream(); - return await stream.ReadToEndAsync().ConfigAwait(); - } - - public static byte[] GetBytesFromUrl(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return url.SendBytesToUrl(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task GetBytesFromUrlAsync(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return url.SendBytesToUrlAsync(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static byte[] PostBytesToUrl(this string url, byte[] requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return SendBytesToUrl(url, method: "POST", - contentType: contentType, requestBody: requestBody, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PostBytesToUrlAsync(this string url, byte[] requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendBytesToUrlAsync(url, method: "POST", - contentType: contentType, requestBody: requestBody, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static byte[] PutBytesToUrl(this string url, byte[] requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return SendBytesToUrl(url, method: "PUT", - contentType: contentType, requestBody: requestBody, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PutBytesToUrlAsync(this string url, byte[] requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendBytesToUrlAsync(url, method: "PUT", - contentType: contentType, requestBody: requestBody, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static byte[] SendBytesToUrl(this string url, string method = null, - byte[] requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - var webReq = (HttpWebRequest)WebRequest.Create(url); - if (method != null) - webReq.Method = method; - - if (contentType != null) - webReq.ContentType = contentType; - - webReq.Accept = accept; - PclExport.Instance.AddCompression(webReq); - - requestFilter?.Invoke(webReq); - - if (ResultsFilter != null) - { - return ResultsFilter.GetBytes(webReq, requestBody); - } - - if (requestBody != null) - { - using var req = PclExport.Instance.GetRequestStream(webReq); - req.Write(requestBody, 0, requestBody.Length); - } - - using var webRes = PclExport.Instance.GetResponse(webReq); - responseFilter?.Invoke((HttpWebResponse)webRes); - - using var stream = webRes.GetResponseStream(); - return stream.ReadFully(); - } - - public static async Task SendBytesToUrlAsync(this string url, string method = null, - byte[] requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - var webReq = (HttpWebRequest)WebRequest.Create(url); - if (method != null) - webReq.Method = method; - if (contentType != null) - webReq.ContentType = contentType; - - webReq.Accept = accept; - PclExport.Instance.AddCompression(webReq); - - requestFilter?.Invoke(webReq); - - if (ResultsFilter != null) - { - var result = ResultsFilter.GetBytes(webReq, requestBody); - return result; - } - - if (requestBody != null) - { - using var req = PclExport.Instance.GetRequestStream(webReq); - await req.WriteAsync(requestBody, 0, requestBody.Length, token).ConfigAwait(); - } - - var webRes = await webReq.GetResponseAsync().ConfigAwait(); - responseFilter?.Invoke((HttpWebResponse)webRes); - - using var stream = webRes.GetResponseStream(); - return await stream.ReadFullyAsync(token).ConfigAwait(); - } - - public static Stream GetStreamFromUrl(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return url.SendStreamToUrl(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task GetStreamFromUrlAsync(this string url, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return url.SendStreamToUrlAsync(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static Stream PostStreamToUrl(this string url, Stream requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return SendStreamToUrl(url, method: "POST", - contentType: contentType, requestBody: requestBody, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PostStreamToUrlAsync(this string url, Stream requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStreamToUrlAsync(url, method: "POST", - contentType: contentType, requestBody: requestBody, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - public static Stream PutStreamToUrl(this string url, Stream requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - return SendStreamToUrl(url, method: "PUT", - contentType: contentType, requestBody: requestBody, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static Task PutStreamToUrlAsync(this string url, Stream requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - return SendStreamToUrlAsync(url, method: "PUT", - contentType: contentType, requestBody: requestBody, - accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); - } - - /// - /// Returns HttpWebResponse Stream which must be disposed - /// - public static Stream SendStreamToUrl(this string url, string method = null, - Stream requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null) - { - var webReq = (HttpWebRequest)WebRequest.Create(url); - if (method != null) - webReq.Method = method; - - if (contentType != null) - webReq.ContentType = contentType; - - webReq.Accept = accept; - PclExport.Instance.AddCompression(webReq); - - requestFilter?.Invoke(webReq); - - if (ResultsFilter != null) - { - return new MemoryStream(ResultsFilter.GetBytes(webReq, requestBody.ReadFully())); - } - - if (requestBody != null) - { - using var req = PclExport.Instance.GetRequestStream(webReq); - requestBody.CopyTo(req); - } - - var webRes = PclExport.Instance.GetResponse(webReq); - responseFilter?.Invoke((HttpWebResponse)webRes); - - var stream = webRes.GetResponseStream(); - return stream; - } - - /// - /// Returns HttpWebResponse Stream which must be disposed - /// - public static async Task SendStreamToUrlAsync(this string url, string method = null, - Stream requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, CancellationToken token=default) - { - var webReq = (HttpWebRequest)WebRequest.Create(url); - if (method != null) - webReq.Method = method; - if (contentType != null) - webReq.ContentType = contentType; - - webReq.Accept = accept; - PclExport.Instance.AddCompression(webReq); - - requestFilter?.Invoke(webReq); - - if (ResultsFilter != null) - { - return new MemoryStream(ResultsFilter.GetBytes(webReq, await requestBody.ReadFullyAsync(token).ConfigAwait())); - } - - if (requestBody != null) - { - using var req = PclExport.Instance.GetRequestStream(webReq); - await requestBody.CopyToAsync(req, token).ConfigAwait(); - } - - var webRes = await webReq.GetResponseAsync().ConfigAwait(); - responseFilter?.Invoke((HttpWebResponse)webRes); - - var stream = webRes.GetResponseStream(); - return stream; - } - - public static bool IsAny300(this Exception ex) - { - var status = ex.GetStatus(); - return status >= HttpStatusCode.MultipleChoices && status < HttpStatusCode.BadRequest; - } - - public static bool IsAny400(this Exception ex) - { - var status = ex.GetStatus(); - return status >= HttpStatusCode.BadRequest && status < HttpStatusCode.InternalServerError; - } - - public static bool IsAny500(this Exception ex) - { - var status = ex.GetStatus(); - return status >= HttpStatusCode.InternalServerError && (int)status < 600; - } - - public static bool IsNotModified(this Exception ex) - { - return GetStatus(ex) == HttpStatusCode.NotModified; - } - - public static bool IsBadRequest(this Exception ex) - { - return GetStatus(ex) == HttpStatusCode.BadRequest; - } - - public static bool IsNotFound(this Exception ex) - { - return GetStatus(ex) == HttpStatusCode.NotFound; - } - - public static bool IsUnauthorized(this Exception ex) - { - return GetStatus(ex) == HttpStatusCode.Unauthorized; - } - - public static bool IsForbidden(this Exception ex) - { - return GetStatus(ex) == HttpStatusCode.Forbidden; - } - - public static bool IsInternalServerError(this Exception ex) - { - return GetStatus(ex) == HttpStatusCode.InternalServerError; - } - - public static HttpStatusCode? GetResponseStatus(this string url) - { - try - { - var webReq = (HttpWebRequest)WebRequest.Create(url); - using (var webRes = PclExport.Instance.GetResponse(webReq)) - { - var httpRes = webRes as HttpWebResponse; - return httpRes?.StatusCode; - } - } - catch (Exception ex) - { - return ex.GetStatus(); - } - } - - public static HttpStatusCode? GetStatus(this Exception ex) - { - if (ex == null) - return null; - - if (ex is WebException webEx) - return GetStatus(webEx); - - if (ex is IHasStatusCode hasStatus) - return (HttpStatusCode)hasStatus.StatusCode; - - return null; - } - - public static HttpStatusCode? GetStatus(this WebException webEx) - { - var httpRes = webEx?.Response as HttpWebResponse; - return httpRes?.StatusCode; - } - - public static bool HasStatus(this Exception ex, HttpStatusCode statusCode) - { - return GetStatus(ex) == statusCode; - } - - public static string GetResponseBody(this Exception ex) - { - if (!(ex is WebException webEx) || webEx.Response == null || webEx.Status != WebExceptionStatus.ProtocolError) - return null; - - var errorResponse = (HttpWebResponse)webEx.Response; - using var responseStream = errorResponse.GetResponseStream(); - return responseStream.ReadToEnd(UseEncoding); - } - - public static async Task GetResponseBodyAsync(this Exception ex, CancellationToken token=default) - { - if (!(ex is WebException webEx) || webEx.Response == null || webEx.Status != WebExceptionStatus.ProtocolError) - return null; - - var errorResponse = (HttpWebResponse)webEx.Response; - using var responseStream = errorResponse.GetResponseStream(); - return await responseStream.ReadToEndAsync(UseEncoding).ConfigAwait(); - } - - public static string ReadToEnd(this WebResponse webRes) - { - using var stream = webRes.GetResponseStream(); - return stream.ReadToEnd(UseEncoding); - } - - public static Task ReadToEndAsync(this WebResponse webRes) - { - using var stream = webRes.GetResponseStream(); - return stream.ReadToEndAsync(UseEncoding); - } - - public static IEnumerable ReadLines(this WebResponse webRes) - { - using var stream = webRes.GetResponseStream(); - using var reader = new StreamReader(stream, UseEncoding, true, 1024, leaveOpen:true); - string line; - while ((line = reader.ReadLine()) != null) - { - yield return line; - } - } - - public static HttpWebResponse GetErrorResponse(this string url) - { - try - { - var webReq = WebRequest.Create(url); - using var webRes = PclExport.Instance.GetResponse(webReq); - webRes.ReadToEnd(); - return null; - } - catch (WebException webEx) - { - return (HttpWebResponse)webEx.Response; - } - } - - public static async Task GetErrorResponseAsync(this string url) - { - try - { - var webReq = WebRequest.Create(url); - using var webRes = await webReq.GetResponseAsync().ConfigAwait(); - await webRes.ReadToEndAsync().ConfigAwait(); - return null; - } - catch (WebException webEx) - { - return (HttpWebResponse)webEx.Response; - } - } - - public static Task GetRequestStreamAsync(this WebRequest request) - { - return GetRequestStreamAsync((HttpWebRequest)request); - } - - public static Task GetRequestStreamAsync(this HttpWebRequest request) - { - var tcs = new TaskCompletionSource(); - - try - { - request.BeginGetRequestStream(iar => - { - try - { - var response = request.EndGetRequestStream(iar); - tcs.SetResult(response); - } - catch (Exception exc) - { - tcs.SetException(exc); - } - }, null); - } - catch (Exception exc) - { - tcs.SetException(exc); - } - - return tcs.Task; - } - - public static Task ConvertTo(this Task task) where TDerived : TBase - { - var tcs = new TaskCompletionSource(); - task.ContinueWith(t => tcs.SetResult(t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); - task.ContinueWith(t => tcs.SetException(t.Exception.InnerExceptions), TaskContinuationOptions.OnlyOnFaulted); - task.ContinueWith(t => tcs.SetCanceled(), TaskContinuationOptions.OnlyOnCanceled); - return tcs.Task; - } - - public static Task GetResponseAsync(this WebRequest request) - { - return GetResponseAsync((HttpWebRequest)request).ConvertTo(); - } - - public static Task GetResponseAsync(this HttpWebRequest request) - { - var tcs = new TaskCompletionSource(); - - try - { - request.BeginGetResponse(iar => - { - try - { - var response = (HttpWebResponse)request.EndGetResponse(iar); - tcs.SetResult(response); - } - catch (Exception exc) - { - tcs.SetException(exc); - } - }, null); - } - catch (Exception exc) - { - tcs.SetException(exc); - } - - return tcs.Task; - } - - private static byte[] GetHeaderBytes(string fileName, string mimeType, string field, string boundary) - { - var header = "\r\n--" + boundary + - $"\r\nContent-Disposition: form-data; name=\"{field}\"; filename=\"{fileName}\"\r\nContent-Type: {mimeType}\r\n\r\n"; - - var headerBytes = header.ToAsciiBytes(); - return headerBytes; - } - - public static void UploadFile(this WebRequest webRequest, Stream fileStream, string fileName, string mimeType, - string accept = null, Action requestFilter = null, string method = "POST", string field = "file") - { - var httpReq = (HttpWebRequest)webRequest; - httpReq.Method = method; - - if (accept != null) - httpReq.Accept = accept; - - requestFilter?.Invoke(httpReq); - - var boundary = Guid.NewGuid().ToString("N"); - - httpReq.ContentType = "multipart/form-data; boundary=\"" + boundary + "\""; - - var boundaryBytes = ("\r\n--" + boundary + "--\r\n").ToAsciiBytes(); - - var headerBytes = GetHeaderBytes(fileName, mimeType, field, boundary); - - var contentLength = fileStream.Length + headerBytes.Length + boundaryBytes.Length; - PclExport.Instance.InitHttpWebRequest(httpReq, - contentLength: contentLength, allowAutoRedirect: false, keepAlive: false); - - if (ResultsFilter != null) - { - ResultsFilter.UploadStream(httpReq, fileStream, fileName); - return; - } - - using var outputStream = PclExport.Instance.GetRequestStream(httpReq); - outputStream.Write(headerBytes, 0, headerBytes.Length); - fileStream.CopyTo(outputStream, 4096); - outputStream.Write(boundaryBytes, 0, boundaryBytes.Length); - PclExport.Instance.CloseStream(outputStream); - } - - public static async Task UploadFileAsync(this WebRequest webRequest, Stream fileStream, string fileName, string mimeType, - string accept = null, Action requestFilter = null, string method = "POST", string field = "file", - CancellationToken token=default) - { - var httpReq = (HttpWebRequest)webRequest; - httpReq.Method = method; - - if (accept != null) - httpReq.Accept = accept; - - requestFilter?.Invoke(httpReq); - - var boundary = Guid.NewGuid().ToString("N"); - - httpReq.ContentType = "multipart/form-data; boundary=\"" + boundary + "\""; - - var boundaryBytes = ("\r\n--" + boundary + "--\r\n").ToAsciiBytes(); - - var headerBytes = GetHeaderBytes(fileName, mimeType, field, boundary); - - var contentLength = fileStream.Length + headerBytes.Length + boundaryBytes.Length; - PclExport.Instance.InitHttpWebRequest(httpReq, - contentLength: contentLength, allowAutoRedirect: false, keepAlive: false); - - if (ResultsFilter != null) - { - ResultsFilter.UploadStream(httpReq, fileStream, fileName); - return; - } - - using var outputStream = PclExport.Instance.GetRequestStream(httpReq); - await outputStream.WriteAsync(headerBytes, 0, headerBytes.Length, token).ConfigAwait(); - await fileStream.CopyToAsync(outputStream, 4096, token).ConfigAwait(); - await outputStream.WriteAsync(boundaryBytes, 0, boundaryBytes.Length, token).ConfigAwait(); - PclExport.Instance.CloseStream(outputStream); - } - - public static void UploadFile(this WebRequest webRequest, Stream fileStream, string fileName) - { - if (fileName == null) - throw new ArgumentNullException(nameof(fileName)); - var mimeType = MimeTypes.GetMimeType(fileName); - if (mimeType == null) - throw new ArgumentException("Mime-type not found for file: " + fileName); - - UploadFile(webRequest, fileStream, fileName, mimeType); - } - - public static async Task UploadFileAsync(this WebRequest webRequest, Stream fileStream, string fileName, CancellationToken token=default) - { - if (fileName == null) - throw new ArgumentNullException(nameof(fileName)); - var mimeType = MimeTypes.GetMimeType(fileName); - if (mimeType == null) - throw new ArgumentException("Mime-type not found for file: " + fileName); - - await UploadFileAsync(webRequest, fileStream, fileName, mimeType, token: token).ConfigAwait(); - } - - public static string PostXmlToUrl(this string url, object data, - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "POST", requestBody: data.ToXml(), contentType: MimeTypes.Xml, accept: MimeTypes.Xml, - requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static string PostCsvToUrl(this string url, object data, - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "POST", requestBody: data.ToCsv(), contentType: MimeTypes.Csv, accept: MimeTypes.Csv, - requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static string PutXmlToUrl(this string url, object data, - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "PUT", requestBody: data.ToXml(), contentType: MimeTypes.Xml, accept: MimeTypes.Xml, - requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static string PutCsvToUrl(this string url, object data, - Action requestFilter = null, Action responseFilter = null) - { - return SendStringToUrl(url, method: "PUT", requestBody: data.ToCsv(), contentType: MimeTypes.Csv, accept: MimeTypes.Csv, - requestFilter: requestFilter, responseFilter: responseFilter); - } - - public static WebResponse PostFileToUrl(this string url, - FileInfo uploadFileInfo, string uploadFileMimeType, - string accept = null, - Action requestFilter = null) - { - var webReq = (HttpWebRequest)WebRequest.Create(url); - using (var fileStream = uploadFileInfo.OpenRead()) - { - var fileName = uploadFileInfo.Name; - - webReq.UploadFile(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "POST"); - } - - if (ResultsFilter != null) - return null; - - return webReq.GetResponse(); - } - - public static async Task PostFileToUrlAsync(this string url, - FileInfo uploadFileInfo, string uploadFileMimeType, - string accept = null, - Action requestFilter = null, CancellationToken token=default) - { - var webReq = (HttpWebRequest)WebRequest.Create(url); - using (var fileStream = uploadFileInfo.OpenRead()) - { - var fileName = uploadFileInfo.Name; +namespace ServiceStack; - await webReq.UploadFileAsync(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "POST", token: token).ConfigAwait(); - } - - if (ResultsFilter != null) - return null; - - return await webReq.GetResponseAsync().ConfigAwait(); - } +public static partial class HttpUtils +{ + public static string UserAgent = "ServiceStack.Text" + Text.Env.PlatformModifier; - public static WebResponse PutFileToUrl(this string url, - FileInfo uploadFileInfo, string uploadFileMimeType, - string accept = null, - Action requestFilter = null) - { - var webReq = (HttpWebRequest)WebRequest.Create(url); - using (var fileStream = uploadFileInfo.OpenRead()) - { - var fileName = uploadFileInfo.Name; + public static Encoding UseEncoding { get; set; } = PclExport.Instance.GetUTF8Encoding(false); - webReq.UploadFile(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "PUT"); - } + public static string AddQueryParam(this string url, string key, object val, bool encode = true) + { + return url.AddQueryParam(key, val?.ToString(), encode); + } - if (ResultsFilter != null) - return null; + public static string AddQueryParam(this string url, object key, string val, bool encode = true) + { + return AddQueryParam(url, key?.ToString(), val, encode); + } - return webReq.GetResponse(); - } + public static string AddQueryParam(this string url, string key, string val, bool encode = true) + { + if (url == null) + url = ""; - public static async Task PutFileToUrlAsync(this string url, - FileInfo uploadFileInfo, string uploadFileMimeType, - string accept = null, - Action requestFilter = null, CancellationToken token=default) + if (key == null || val == null) + return url; + + var prefix = string.Empty; + if (!url.EndsWith("?") && !url.EndsWith("&")) { - var webReq = (HttpWebRequest)WebRequest.Create(url); - using (var fileStream = uploadFileInfo.OpenRead()) - { - var fileName = uploadFileInfo.Name; - - await webReq.UploadFileAsync(fileStream, fileName, uploadFileMimeType, accept: accept, requestFilter: requestFilter, method: "PUT", token: token).ConfigAwait(); - } - - if (ResultsFilter != null) - return null; - - return await webReq.GetResponseAsync().ConfigAwait(); + prefix = url.IndexOf('?') == -1 ? "?" : "&"; } + return url + prefix + key + "=" + (encode ? val.UrlEncode() : val); + } - public static WebResponse UploadFile(this WebRequest webRequest, - FileInfo uploadFileInfo, string uploadFileMimeType) + public static string SetQueryParam(this string url, string key, string val) + { + if (url == null) + url = ""; + + if (key == null || val == null) + return url; + + var qsPos = url.IndexOf('?'); + if (qsPos != -1) { - using (var fileStream = uploadFileInfo.OpenRead()) - { - var fileName = uploadFileInfo.Name; - - webRequest.UploadFile(fileStream, fileName, uploadFileMimeType); - } - - if (ResultsFilter != null) - return null; + var existingKeyPos = qsPos + 1 == url.IndexOf(key + "=", qsPos, StringComparison.Ordinal) + ? qsPos + : url.IndexOf("&" + key, qsPos, StringComparison.Ordinal); - return webRequest.GetResponse(); - } - - public static async Task UploadFileAsync(this WebRequest webRequest, - FileInfo uploadFileInfo, string uploadFileMimeType) - { - using (var fileStream = uploadFileInfo.OpenRead()) + if (existingKeyPos != -1) { - var fileName = uploadFileInfo.Name; + var endPos = url.IndexOf('&', existingKeyPos + 1); + if (endPos == -1) + endPos = url.Length; - await webRequest.UploadFileAsync(fileStream, fileName, uploadFileMimeType).ConfigAwait(); + var newUrl = url.Substring(0, existingKeyPos + key.Length + 1) + + "=" + + val.UrlEncode() + + url.Substring(endPos); + return newUrl; } - - if (ResultsFilter != null) - return null; - - return await webRequest.GetResponseAsync().ConfigAwait(); } + var prefix = qsPos == -1 ? "?" : "&"; + return url + prefix + key + "=" + val.UrlEncode(); } - //Allow Exceptions to Customize HTTP StatusCode and StatusDescription returned - public interface IHasStatusCode - { - int StatusCode { get; } - } - - public interface IHasStatusDescription + public static string AddHashParam(this string url, string key, object val) { - string StatusDescription { get; } + return url.AddHashParam(key, val?.ToString()); } - public interface IHttpResultsFilter : IDisposable + public static string AddHashParam(this string url, string key, string val) { - string GetString(HttpWebRequest webReq, string reqBody); - byte[] GetBytes(HttpWebRequest webReq, byte[] reqBody); - void UploadStream(HttpWebRequest webRequest, Stream fileStream, string fileName); + if (url == null) + url = ""; + + if (key == null || val == null) + return url; + + var prefix = url.IndexOf('#') == -1 ? "#" : "/"; + return url + prefix + key + "=" + val.UrlEncode(); } - public class HttpResultsFilter : IHttpResultsFilter + public static string SetHashParam(this string url, string key, string val) { - private readonly IHttpResultsFilter previousFilter; - - public string StringResult { get; set; } - public byte[] BytesResult { get; set; } - - public Func StringResultFn { get; set; } - public Func BytesResultFn { get; set; } - public Action UploadFileFn { get; set; } - - public HttpResultsFilter(string stringResult = null, byte[] bytesResult = null) + if (url == null) + url = ""; + + if (key == null || val == null) + return url; + + var hPos = url.IndexOf('#'); + if (hPos != -1) { - StringResult = stringResult; - BytesResult = bytesResult; - - previousFilter = HttpUtils.ResultsFilter; - HttpUtils.ResultsFilter = this; - } + var existingKeyPos = hPos + 1 == url.IndexOf(key + "=", hPos, PclExport.Instance.InvariantComparison) + ? hPos + : url.IndexOf("/" + key, hPos, PclExport.Instance.InvariantComparison); - public void Dispose() - { - HttpUtils.ResultsFilter = previousFilter; - } + if (existingKeyPos != -1) + { + var endPos = url.IndexOf('/', existingKeyPos + 1); + if (endPos == -1) + endPos = url.Length; - public string GetString(HttpWebRequest webReq, string reqBody) - { - return StringResultFn != null - ? StringResultFn(webReq, reqBody) - : StringResult; + var newUrl = url.Substring(0, existingKeyPos + key.Length + 1) + + "=" + + val.UrlEncode() + + url.Substring(endPos); + return newUrl; + } } + var prefix = url.IndexOf('#') == -1 ? "#" : "/"; + return url + prefix + key + "=" + val.UrlEncode(); + } - public byte[] GetBytes(HttpWebRequest webReq, byte[] reqBody) + public static bool HasRequestBody(string httpMethod) + { + switch (httpMethod) { - return BytesResultFn != null - ? BytesResultFn(webReq, reqBody) - : BytesResult; + case HttpMethods.Get: + case HttpMethods.Delete: + case HttpMethods.Head: + case HttpMethods.Options: + return false; } - public void UploadStream(HttpWebRequest webRequest, Stream fileStream, string fileName) - { - UploadFileFn?.Invoke(webRequest, fileStream, fileName); - } + return true; } -} - -namespace ServiceStack -{ - public static class MimeTypes + + public static Task GetRequestStreamAsync(this WebRequest request) { - public static Dictionary ExtensionMimeTypes = new(); - public const string Utf8Suffix = "; charset=utf-8"; - - public const string Html = "text/html"; - public const string HtmlUtf8 = Html + Utf8Suffix; - public const string Css = "text/css"; - public const string Xml = "application/xml"; - public const string XmlText = "text/xml"; - public const string Json = "application/json"; - public const string ProblemJson = "application/problem+json"; - public const string JsonText = "text/json"; - public const string Jsv = "application/jsv"; - public const string JsvText = "text/jsv"; - public const string Csv = "text/csv"; - public const string ProtoBuf = "application/x-protobuf"; - public const string JavaScript = "text/javascript"; - public const string WebAssembly = "application/wasm"; - public const string Jar = "application/java-archive"; - public const string Dmg = "application/x-apple-diskimage"; - public const string Pkg = "application/x-newton-compatible-pkg"; - - public const string FormUrlEncoded = "application/x-www-form-urlencoded"; - public const string MultiPartFormData = "multipart/form-data"; - public const string JsonReport = "text/jsonreport"; - public const string Soap11 = "text/xml; charset=utf-8"; - public const string Soap12 = "application/soap+xml"; - public const string Yaml = "application/yaml"; - public const string YamlText = "text/yaml"; - public const string PlainText = "text/plain"; - public const string MarkdownText = "text/markdown"; - public const string MsgPack = "application/x-msgpack"; - public const string Wire = "application/x-wire"; - public const string Compressed = "application/x-compressed"; - public const string NetSerializer = "application/x-netserializer"; - public const string Excel = "application/excel"; - public const string MsWord = "application/msword"; - public const string Cert = "application/x-x509-ca-cert"; - - public const string ImagePng = "image/png"; - public const string ImageGif = "image/gif"; - public const string ImageJpg = "image/jpeg"; - public const string ImageSvg = "image/svg+xml"; - - public const string Bson = "application/bson"; - public const string Binary = "application/octet-stream"; - public const string ServerSentEvents = "text/event-stream"; - - public static string GetExtension(string mimeType) - { - switch (mimeType) - { - case ProtoBuf: - return ".pbuf"; - } + return GetRequestStreamAsync((HttpWebRequest)request); + } - var parts = mimeType.Split('/'); - if (parts.Length == 1) return "." + parts[0].LeftPart('+').LeftPart(';'); - if (parts.Length == 2) return "." + parts[1].LeftPart('+').LeftPart(';'); + public static Task GetRequestStreamAsync(this HttpWebRequest request) + { + var tcs = new TaskCompletionSource(); - throw new NotSupportedException("Unknown mimeType: " + mimeType); - } - - //Lower cases and trims left part of content-type prior ';' - public static string GetRealContentType(string contentType) + try { - if (contentType == null) - return null; - - int start = -1, end = -1; - - for(int i=0; i < contentType.Length; i++) + request.BeginGetRequestStream(iar => { - if (!char.IsWhiteSpace(contentType[i])) + try { - if (contentType[i] == ';') - break; - if (start == -1) - { - start = i; - } - end = i; + var response = request.EndGetRequestStream(iar); + tcs.SetResult(response); } - } - - return start != -1 - ? contentType.Substring(start, end - start + 1).ToLowerInvariant() - : null; - } - - //Compares two string from start to ';' char, case-insensitive, - //ignoring (trimming) spaces at start and end - public static bool MatchesContentType(string contentType, string matchesContentType) - { - if (contentType == null || matchesContentType == null) - return false; - - int start = -1, matchStart = -1, matchEnd = -1; - - for (var i=0; i < contentType.Length; i++) - { - if (char.IsWhiteSpace(contentType[i])) - continue; - start = i; - break; - } - - for (var i=0; i < matchesContentType.Length; i++) - { - if (char.IsWhiteSpace(matchesContentType[i])) - continue; - if (matchesContentType[i] == ';') - break; - if (matchStart == -1) - matchStart = i; - matchEnd = i; - } - - return start != -1 && matchStart != -1 && matchEnd != -1 - && string.Compare(contentType, start, - matchesContentType, matchStart, matchEnd - matchStart + 1, - StringComparison.OrdinalIgnoreCase) == 0; + catch (Exception exc) + { + tcs.SetException(exc); + } + }, null); } - - public static Func IsBinaryFilter { get; set; } - - public static bool IsBinary(string contentType) + catch (Exception exc) { - var userFilter = IsBinaryFilter?.Invoke(contentType); - if (userFilter != null) - return userFilter.Value; - - var realContentType = GetRealContentType(contentType); - switch (realContentType) - { - case ProtoBuf: - case MsgPack: - case Binary: - case Bson: - case Wire: - case Cert: - case Excel: - case MsWord: - case Compressed: - case WebAssembly: - case Jar: - case Dmg: - case Pkg: - return true; - } - - // Text format exceptions to below heuristics - switch (realContentType) - { - case ImageSvg: - return false; - } - - var primaryType = realContentType.LeftPart('/'); - var secondaryType = realContentType.RightPart('/'); - switch (primaryType) - { - case "image": - case "audio": - case "video": - return true; - } - - if (secondaryType.StartsWith("pkc") - || secondaryType.StartsWith("x-pkc") - || secondaryType.StartsWith("font") - || secondaryType.StartsWith("vnd.ms-")) - return true; - - return false; + tcs.SetException(exc); } - public static string GetMimeType(string fileNameOrExt) - { - if (string.IsNullOrEmpty(fileNameOrExt)) - throw new ArgumentNullException(nameof(fileNameOrExt)); - - var fileExt = fileNameOrExt.LastRightPart('.').ToLower(); - if (ExtensionMimeTypes.TryGetValue(fileExt, out var mimeType)) - { - return mimeType; - } - - switch (fileExt) - { - case "jpeg": - return "image/jpeg"; - case "gif": - return "image/gif"; - case "png": - return "image/png"; - case "tiff": - return "image/tiff"; - case "bmp": - return "image/bmp"; - case "webp": - return "image/webp"; - - case "jpg": - return "image/jpeg"; - - case "tif": - return "image/tiff"; - - case "svg": - return ImageSvg; - - case "ico": - return "image/x-icon"; - - case "htm": - case "html": - case "shtml": - return "text/html"; - - case "js": - return "text/javascript"; - case "ts": - return "text/typescript"; - case "jsx": - return "text/jsx"; - - case "csv": - return Csv; - case "css": - return Css; - - case "cs": - return "text/x-csharp"; - case "fs": - return "text/x-fsharp"; - case "vb": - return "text/x-vb"; - case "dart": - return "application/dart"; - case "go": - return "text/x-go"; - case "kt": - case "kts": - return "text/x-kotlin"; - case "java": - return "text/x-java"; - case "py": - return "text/x-python"; - case "groovy": - case "gradle": - return "text/x-groovy"; - - case "yml": - case "yaml": - return YamlText; - - case "sh": - return "text/x-sh"; - case "bat": - case "cmd": - return "application/bat"; - - case "xml": - case "csproj": - case "fsproj": - case "vbproj": - return "text/xml"; - - case "txt": - case "ps1": - return "text/plain"; - - case "sgml": - return "text/sgml"; - - case "mp3": - return "audio/mpeg3"; - - case "au": - case "snd": - return "audio/basic"; - - case "aac": - case "ac3": - case "aiff": - case "m4a": - case "m4b": - case "m4p": - case "mid": - case "midi": - case "wav": - return "audio/" + fileExt; - - case "qt": - case "mov": - return "video/quicktime"; - - case "mpg": - return "video/mpeg"; - - case "ogv": - return "video/ogg"; - - case "3gpp": - case "avi": - case "dv": - case "divx": - case "ogg": - case "mp4": - case "webm": - return "video/" + fileExt; - - case "rtf": - return "application/" + fileExt; - - case "xls": - case "xlt": - case "xla": - return Excel; - - case "xlsx": - return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; - case "xltx": - return "application/vnd.openxmlformats-officedocument.spreadsheetml.template"; - - case "doc": - case "dot": - return MsWord; - - case "docx": - return "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; - case "dotx": - return "application/vnd.openxmlformats-officedocument.wordprocessingml.template"; - - case "ppt": - case "oit": - case "pps": - case "ppa": - return "application/vnd.ms-powerpoint"; - - case "pptx": - return "application/vnd.openxmlformats-officedocument.presentationml.presentation"; - case "potx": - return "application/vnd.openxmlformats-officedocument.presentationml.template"; - case "ppsx": - return "application/vnd.openxmlformats-officedocument.presentationml.slideshow"; - - case "mdb": - return "application/vnd.ms-access"; - - case "cer": - case "crt": - case "der": - return Cert; - - case "p10": - return "application/pkcs10"; - case "p12": - return "application/x-pkcs12"; - case "p7b": - case "spc": - return "application/x-pkcs7-certificates"; - case "p7c": - case "p7m": - return "application/pkcs7-mime"; - case "p7r": - return "application/x-pkcs7-certreqresp"; - case "p7s": - return "application/pkcs7-signature"; - case "sst": - return "application/vnd.ms-pki.certstore"; - - case "gz": - case "tgz": - case "zip": - case "rar": - case "lzh": - case "z": - return Compressed; - - case "eot": - return "application/vnd.ms-fontobject"; - - case "ttf": - return "application/octet-stream"; - - case "woff": - return "application/font-woff"; - case "woff2": - return "application/font-woff2"; - - case "jar": - return Jar; - - case "aaf": - case "aca": - case "asd": - case "bin": - case "cab": - case "chm": - case "class": - case "cur": - case "db": - case "dat": - case "deploy": - case "dll": - case "dsp": - case "exe": - case "fla": - case "ics": - case "inf": - case "mix": - case "msi": - case "mso": - case "obj": - case "ocx": - case "prm": - case "prx": - case "psd": - case "psp": - case "qxd": - case "sea": - case "snp": - case "so": - case "sqlite": - case "toc": - case "u32": - case "xmp": - case "xsn": - case "xtp": - return Binary; - - case "wasm": - return WebAssembly; - - case "dmg": - return Dmg; - case "pkg": - return Pkg; - - default: - return "application/" + fileExt; - } - } + return tcs.Task; } - public static class HttpHeaders + public static Task ConvertTo(this Task task) where TDerived : TBase { - public const string XParamOverridePrefix = "X-Param-Override-"; - - public const string XHttpMethodOverride = "X-Http-Method-Override"; - - public const string XAutoBatchCompleted = "X-AutoBatch-Completed"; // How many requests were completed before first failure - - public const string XTag = "X-Tag"; - - public const string XUserAuthId = "X-UAId"; - - public const string XTrigger = "X-Trigger"; // Trigger Events on UserAgent - - public const string XForwardedFor = "X-Forwarded-For"; // IP Address - - public const string XForwardedPort = "X-Forwarded-Port"; // 80 - - public const string XForwardedProtocol = "X-Forwarded-Proto"; // http or https - - public const string XRealIp = "X-Real-IP"; - - public const string XLocation = "X-Location"; - - public const string XStatus = "X-Status"; - - public const string XPoweredBy = "X-Powered-By"; - - public const string Referer = "Referer"; - - public const string CacheControl = "Cache-Control"; - - public const string IfModifiedSince = "If-Modified-Since"; - - public const string IfUnmodifiedSince = "If-Unmodified-Since"; - - public const string IfNoneMatch = "If-None-Match"; - - public const string IfMatch = "If-Match"; - - public const string LastModified = "Last-Modified"; - - public const string Accept = "Accept"; - - public const string AcceptEncoding = "Accept-Encoding"; - - public const string ContentType = "Content-Type"; - - public const string ContentEncoding = "Content-Encoding"; - - public const string ContentLength = "Content-Length"; - - public const string ContentDisposition = "Content-Disposition"; - - public const string Location = "Location"; - - public const string SetCookie = "Set-Cookie"; - - public const string ETag = "ETag"; - - public const string Age = "Age"; - - public const string Expires = "Expires"; - - public const string Vary = "Vary"; - - public const string Authorization = "Authorization"; - - public const string WwwAuthenticate = "WWW-Authenticate"; - - public const string AllowOrigin = "Access-Control-Allow-Origin"; - - public const string AllowMethods = "Access-Control-Allow-Methods"; - - public const string AllowHeaders = "Access-Control-Allow-Headers"; - - public const string AllowCredentials = "Access-Control-Allow-Credentials"; - - public const string ExposeHeaders = "Access-Control-Expose-Headers"; - - public const string AccessControlMaxAge = "Access-Control-Max-Age"; - - public const string Origin = "Origin"; - - public const string RequestMethod = "Access-Control-Request-Method"; - - public const string RequestHeaders = "Access-Control-Request-Headers"; - - public const string AcceptRanges = "Accept-Ranges"; - - public const string ContentRange = "Content-Range"; - - public const string Range = "Range"; - - public const string SOAPAction = "SOAPAction"; - - public const string Allow = "Allow"; - - public const string AcceptCharset = "Accept-Charset"; - - public const string AcceptLanguage = "Accept-Language"; - - public const string Connection = "Connection"; - - public const string Cookie = "Cookie"; - - public const string ContentLanguage = "Content-Language"; - - public const string Expect = "Expect"; - - public const string Pragma = "Pragma"; - - public const string ProxyAuthenticate = "Proxy-Authenticate"; - - public const string ProxyAuthorization = "Proxy-Authorization"; - - public const string ProxyConnection = "Proxy-Connection"; - - public const string SetCookie2 = "Set-Cookie2"; - - public const string TE = "TE"; - - public const string Trailer = "Trailer"; - - public const string TransferEncoding = "Transfer-Encoding"; - - public const string Upgrade = "Upgrade"; - - public const string Via = "Via"; - - public const string Warning = "Warning"; - - public const string Date = "Date"; - public const string Host = "Host"; - public const string UserAgent = "User-Agent"; - - public static HashSet RestrictedHeaders = new(StringComparer.OrdinalIgnoreCase) - { - Accept, - Connection, - ContentLength, - ContentType, - Date, - Expect, - Host, - IfModifiedSince, - Range, - Referer, - TransferEncoding, - UserAgent, - ProxyConnection, - }; + var tcs = new TaskCompletionSource(); + task.ContinueWith(t => tcs.SetResult(t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); + task.ContinueWith(t => tcs.SetException(t.Exception.InnerExceptions), TaskContinuationOptions.OnlyOnFaulted); + task.ContinueWith(t => tcs.SetCanceled(), TaskContinuationOptions.OnlyOnCanceled); + return tcs.Task; } - public static class HttpMethods + public static Task GetResponseAsync(this WebRequest request) { - static readonly string[] allVerbs = { - "OPTIONS", "GET", "HEAD", "POST", "PUT", "DELETE", "TRACE", "CONNECT", // RFC 2616 - "PROPFIND", "PROPPATCH", "MKCOL", "COPY", "MOVE", "LOCK", "UNLOCK", // RFC 2518 - "VERSION-CONTROL", "REPORT", "CHECKOUT", "CHECKIN", "UNCHECKOUT", - "MKWORKSPACE", "UPDATE", "LABEL", "MERGE", "BASELINE-CONTROL", "MKACTIVITY", // RFC 3253 - "ORDERPATCH", // RFC 3648 - "ACL", // RFC 3744 - "PATCH", // https://datatracker.ietf.org/doc/draft-dusseault-http-patch/ - "SEARCH", // https://datatracker.ietf.org/doc/draft-reschke-webdav-search/ - "BCOPY", "BDELETE", "BMOVE", "BPROPFIND", "BPROPPATCH", "NOTIFY", - "POLL", "SUBSCRIBE", "UNSUBSCRIBE" //MS Exchange WebDav: http://msdn.microsoft.com/en-us/library/aa142917.aspx - }; - - public static HashSet AllVerbs = new(allVerbs); - - public static bool Exists(string httpMethod) => AllVerbs.Contains(httpMethod.ToUpper()); - public static bool HasVerb(string httpVerb) => Exists(httpVerb); - - public const string Get = "GET"; - public const string Put = "PUT"; - public const string Post = "POST"; - public const string Delete = "DELETE"; - public const string Options = "OPTIONS"; - public const string Head = "HEAD"; - public const string Patch = "PATCH"; + return GetResponseAsync((HttpWebRequest)request).ConvertTo(); } - public static class CompressionTypes + public static Task GetResponseAsync(this HttpWebRequest request) { - public static readonly string[] AllCompressionTypes = - { -#if NET6_0_OR_GREATER - Brotli, -#endif - Deflate, - GZip, - }; - -#if NET6_0_OR_GREATER - public const string Default = Brotli; -#else - public const string Default = Deflate; -#endif - - public const string Brotli = "br"; - public const string Deflate = "deflate"; - public const string GZip = "gzip"; - - public static bool IsValid(string compressionType) - { -#if NET6_0_OR_GREATER - return compressionType is Deflate or GZip or Brotli; -#else - return compressionType is Deflate or GZip; -#endif - } + var tcs = new TaskCompletionSource(); - public static void AssertIsValid(string compressionType) + try { - if (!IsValid(compressionType)) + request.BeginGetResponse(iar => { - throw new NotSupportedException(compressionType - + " is not a supported compression type. Valid types: " + string.Join(", ", AllCompressionTypes)); - } - } - - public static string GetExtension(string compressionType) - { - switch (compressionType) - { - case Brotli: - case Deflate: - case GZip: - return "." + compressionType; - default: - throw new NotSupportedException( - "Unknown compressionType: " + compressionType); - } + try + { + var response = (HttpWebResponse)request.EndGetResponse(iar); + tcs.SetResult(response); + } + catch (Exception exc) + { + tcs.SetException(exc); + } + }, null); } - } - - public static class HttpStatus - { - public static string GetStatusDescription(int statusCode) + catch (Exception exc) { - if (statusCode is >= 100 and < 600) - { - int i = statusCode / 100; - int j = statusCode % 100; - - if (j < Descriptions[i].Length) - return Descriptions[i][j]; - } - - return string.Empty; + tcs.SetException(exc); } - private static readonly string[][] Descriptions = - { - null, - new[] - { - /* 100 */ "Continue", - /* 101 */ "Switching Protocols", - /* 102 */ "Processing" - }, - new[] - { - /* 200 */ "OK", - /* 201 */ "Created", - /* 202 */ "Accepted", - /* 203 */ "Non-Authoritative Information", - /* 204 */ "No Content", - /* 205 */ "Reset Content", - /* 206 */ "Partial Content", - /* 207 */ "Multi-Status" - }, - new[] - { - /* 300 */ "Multiple Choices", - /* 301 */ "Moved Permanently", - /* 302 */ "Found", - /* 303 */ "See Other", - /* 304 */ "Not Modified", - /* 305 */ "Use Proxy", - /* 306 */ string.Empty, - /* 307 */ "Temporary Redirect" - }, - new[] - { - /* 400 */ "Bad Request", - /* 401 */ "Unauthorized", - /* 402 */ "Payment Required", - /* 403 */ "Forbidden", - /* 404 */ "Not Found", - /* 405 */ "Method Not Allowed", - /* 406 */ "Not Acceptable", - /* 407 */ "Proxy Authentication Required", - /* 408 */ "Request Timeout", - /* 409 */ "Conflict", - /* 410 */ "Gone", - /* 411 */ "Length Required", - /* 412 */ "Precondition Failed", - /* 413 */ "Request Entity Too Large", - /* 414 */ "Request-Uri Too Long", - /* 415 */ "Unsupported Media Type", - /* 416 */ "Requested Range Not Satisfiable", - /* 417 */ "Expectation Failed", - /* 418 */ string.Empty, - /* 419 */ string.Empty, - /* 420 */ string.Empty, - /* 421 */ string.Empty, - /* 422 */ "Unprocessable Entity", - /* 423 */ "Locked", - /* 424 */ "Failed Dependency" - }, - new[] - { - /* 500 */ "Internal Server Error", - /* 501 */ "Not Implemented", - /* 502 */ "Bad Gateway", - /* 503 */ "Service Unavailable", - /* 504 */ "Gateway Timeout", - /* 505 */ "Http Version Not Supported", - /* 506 */ string.Empty, - /* 507 */ "Insufficient Storage" - } - }; + return tcs.Task; } } + +//Allow Exceptions to Customize HTTP StatusCode and StatusDescription returned +public interface IHasStatusCode +{ + int StatusCode { get; } +} + +public interface IHasStatusDescription +{ + string StatusDescription { get; } +} \ No newline at end of file diff --git a/src/ServiceStack.Text/MimeTypes.cs b/src/ServiceStack.Text/MimeTypes.cs new file mode 100644 index 000000000..bd9e5430e --- /dev/null +++ b/src/ServiceStack.Text/MimeTypes.cs @@ -0,0 +1,452 @@ +using System; +using System.Collections.Generic; + +namespace ServiceStack; + +public static class MimeTypes +{ + public static Dictionary ExtensionMimeTypes = new(); + public const string Utf8Suffix = "; charset=utf-8"; + + public const string Html = "text/html"; + public const string HtmlUtf8 = Html + Utf8Suffix; + public const string Css = "text/css"; + public const string Xml = "application/xml"; + public const string XmlText = "text/xml"; + public const string Json = "application/json"; + public const string ProblemJson = "application/problem+json"; + public const string JsonText = "text/json"; + public const string Jsv = "application/jsv"; + public const string JsvText = "text/jsv"; + public const string Csv = "text/csv"; + public const string ProtoBuf = "application/x-protobuf"; + public const string JavaScript = "text/javascript"; + public const string WebAssembly = "application/wasm"; + public const string Jar = "application/java-archive"; + public const string Dmg = "application/x-apple-diskimage"; + public const string Pkg = "application/x-newton-compatible-pkg"; + + public const string FormUrlEncoded = "application/x-www-form-urlencoded"; + public const string MultiPartFormData = "multipart/form-data"; + public const string JsonReport = "text/jsonreport"; + public const string Soap11 = "text/xml; charset=utf-8"; + public const string Soap12 = "application/soap+xml"; + public const string Yaml = "application/yaml"; + public const string YamlText = "text/yaml"; + public const string PlainText = "text/plain"; + public const string MarkdownText = "text/markdown"; + public const string MsgPack = "application/x-msgpack"; + public const string Wire = "application/x-wire"; + public const string Compressed = "application/x-compressed"; + public const string NetSerializer = "application/x-netserializer"; + public const string Excel = "application/excel"; + public const string MsWord = "application/msword"; + public const string Cert = "application/x-x509-ca-cert"; + + public const string ImagePng = "image/png"; + public const string ImageGif = "image/gif"; + public const string ImageJpg = "image/jpeg"; + public const string ImageSvg = "image/svg+xml"; + + public const string Bson = "application/bson"; + public const string Binary = "application/octet-stream"; + public const string ServerSentEvents = "text/event-stream"; + + public static string GetExtension(string mimeType) + { + switch (mimeType) + { + case ProtoBuf: + return ".pbuf"; + } + + var parts = mimeType.Split('/'); + if (parts.Length == 1) return "." + parts[0].LeftPart('+').LeftPart(';'); + if (parts.Length == 2) return "." + parts[1].LeftPart('+').LeftPart(';'); + + throw new NotSupportedException("Unknown mimeType: " + mimeType); + } + + //Lower cases and trims left part of content-type prior ';' + public static string GetRealContentType(string contentType) + { + if (contentType == null) + return null; + + int start = -1, end = -1; + + for(int i=0; i < contentType.Length; i++) + { + if (!char.IsWhiteSpace(contentType[i])) + { + if (contentType[i] == ';') + break; + if (start == -1) + { + start = i; + } + end = i; + } + } + + return start != -1 + ? contentType.Substring(start, end - start + 1).ToLowerInvariant() + : null; + } + + //Compares two string from start to ';' char, case-insensitive, + //ignoring (trimming) spaces at start and end + public static bool MatchesContentType(string contentType, string matchesContentType) + { + if (contentType == null || matchesContentType == null) + return false; + + int start = -1, matchStart = -1, matchEnd = -1; + + for (var i=0; i < contentType.Length; i++) + { + if (char.IsWhiteSpace(contentType[i])) + continue; + start = i; + break; + } + + for (var i=0; i < matchesContentType.Length; i++) + { + if (char.IsWhiteSpace(matchesContentType[i])) + continue; + if (matchesContentType[i] == ';') + break; + if (matchStart == -1) + matchStart = i; + matchEnd = i; + } + + return start != -1 && matchStart != -1 && matchEnd != -1 + && string.Compare(contentType, start, + matchesContentType, matchStart, matchEnd - matchStart + 1, + StringComparison.OrdinalIgnoreCase) == 0; + } + + public static Func IsBinaryFilter { get; set; } + + public static bool IsBinary(string contentType) + { + var userFilter = IsBinaryFilter?.Invoke(contentType); + if (userFilter != null) + return userFilter.Value; + + var realContentType = GetRealContentType(contentType); + switch (realContentType) + { + case ProtoBuf: + case MsgPack: + case Binary: + case Bson: + case Wire: + case Cert: + case Excel: + case MsWord: + case Compressed: + case WebAssembly: + case Jar: + case Dmg: + case Pkg: + return true; + } + + // Text format exceptions to below heuristics + switch (realContentType) + { + case ImageSvg: + return false; + } + + var primaryType = realContentType.LeftPart('/'); + var secondaryType = realContentType.RightPart('/'); + switch (primaryType) + { + case "image": + case "audio": + case "video": + return true; + } + + if (secondaryType.StartsWith("pkc") + || secondaryType.StartsWith("x-pkc") + || secondaryType.StartsWith("font") + || secondaryType.StartsWith("vnd.ms-")) + return true; + + return false; + } + + public static string GetMimeType(string fileNameOrExt) + { + if (string.IsNullOrEmpty(fileNameOrExt)) + throw new ArgumentNullException(nameof(fileNameOrExt)); + + var fileExt = fileNameOrExt.LastRightPart('.').ToLower(); + if (ExtensionMimeTypes.TryGetValue(fileExt, out var mimeType)) + { + return mimeType; + } + + switch (fileExt) + { + case "jpeg": + return "image/jpeg"; + case "gif": + return "image/gif"; + case "png": + return "image/png"; + case "tiff": + return "image/tiff"; + case "bmp": + return "image/bmp"; + case "webp": + return "image/webp"; + + case "jpg": + return "image/jpeg"; + + case "tif": + return "image/tiff"; + + case "svg": + return ImageSvg; + + case "ico": + return "image/x-icon"; + + case "htm": + case "html": + case "shtml": + return "text/html"; + + case "js": + return "text/javascript"; + case "ts": + return "text/typescript"; + case "jsx": + return "text/jsx"; + + case "csv": + return Csv; + case "css": + return Css; + + case "cs": + return "text/x-csharp"; + case "fs": + return "text/x-fsharp"; + case "vb": + return "text/x-vb"; + case "dart": + return "application/dart"; + case "go": + return "text/x-go"; + case "kt": + case "kts": + return "text/x-kotlin"; + case "java": + return "text/x-java"; + case "py": + return "text/x-python"; + case "groovy": + case "gradle": + return "text/x-groovy"; + + case "yml": + case "yaml": + return YamlText; + + case "sh": + return "text/x-sh"; + case "bat": + case "cmd": + return "application/bat"; + + case "xml": + case "csproj": + case "fsproj": + case "vbproj": + return "text/xml"; + + case "txt": + case "ps1": + return "text/plain"; + + case "sgml": + return "text/sgml"; + + case "mp3": + return "audio/mpeg3"; + + case "au": + case "snd": + return "audio/basic"; + + case "aac": + case "ac3": + case "aiff": + case "m4a": + case "m4b": + case "m4p": + case "mid": + case "midi": + case "wav": + return "audio/" + fileExt; + + case "qt": + case "mov": + return "video/quicktime"; + + case "mpg": + return "video/mpeg"; + + case "ogv": + return "video/ogg"; + + case "3gpp": + case "avi": + case "dv": + case "divx": + case "ogg": + case "mp4": + case "webm": + return "video/" + fileExt; + + case "rtf": + return "application/" + fileExt; + + case "xls": + case "xlt": + case "xla": + return Excel; + + case "xlsx": + return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; + case "xltx": + return "application/vnd.openxmlformats-officedocument.spreadsheetml.template"; + + case "doc": + case "dot": + return MsWord; + + case "docx": + return "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; + case "dotx": + return "application/vnd.openxmlformats-officedocument.wordprocessingml.template"; + + case "ppt": + case "oit": + case "pps": + case "ppa": + return "application/vnd.ms-powerpoint"; + + case "pptx": + return "application/vnd.openxmlformats-officedocument.presentationml.presentation"; + case "potx": + return "application/vnd.openxmlformats-officedocument.presentationml.template"; + case "ppsx": + return "application/vnd.openxmlformats-officedocument.presentationml.slideshow"; + + case "mdb": + return "application/vnd.ms-access"; + + case "cer": + case "crt": + case "der": + return Cert; + + case "p10": + return "application/pkcs10"; + case "p12": + return "application/x-pkcs12"; + case "p7b": + case "spc": + return "application/x-pkcs7-certificates"; + case "p7c": + case "p7m": + return "application/pkcs7-mime"; + case "p7r": + return "application/x-pkcs7-certreqresp"; + case "p7s": + return "application/pkcs7-signature"; + case "sst": + return "application/vnd.ms-pki.certstore"; + + case "gz": + case "tgz": + case "zip": + case "rar": + case "lzh": + case "z": + return Compressed; + + case "eot": + return "application/vnd.ms-fontobject"; + + case "ttf": + return "application/octet-stream"; + + case "woff": + return "application/font-woff"; + case "woff2": + return "application/font-woff2"; + + case "jar": + return Jar; + + case "aaf": + case "aca": + case "asd": + case "bin": + case "cab": + case "chm": + case "class": + case "cur": + case "db": + case "dat": + case "deploy": + case "dll": + case "dsp": + case "exe": + case "fla": + case "ics": + case "inf": + case "mix": + case "msi": + case "mso": + case "obj": + case "ocx": + case "prm": + case "prx": + case "psd": + case "psp": + case "qxd": + case "sea": + case "snp": + case "so": + case "sqlite": + case "toc": + case "u32": + case "xmp": + case "xsn": + case "xtp": + return Binary; + + case "wasm": + return WebAssembly; + + case "dmg": + return Dmg; + case "pkg": + return Pkg; + + default: + return "application/" + fileExt; + } + } +} \ No newline at end of file From ee06690f035e196fa522bf281a033beaa590c1d7 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Fri, 28 Jan 2022 17:06:10 +0800 Subject: [PATCH 340/372] Reimplement HttpUtils to use HttpClient in net6.0 --- src/ServiceStack.Text/Env.cs | 4 +- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 957 ++++++++++++++++++ ...tils.Legacy.cs => HttpUtils.WebRequest.cs} | 141 +-- src/ServiceStack.Text/HttpUtils.cs | 139 ++- src/ServiceStack.Text/LicenseUtils.cs | 6 +- src/ServiceStack.Text/PclExport.NetCore.cs | 2 +- .../PclExport.NetStandard.cs | 5 +- src/ServiceStack.Text/PclExport.cs | 10 +- .../ServiceStack.Text.csproj | 3 + .../HttpUtilsMockTests.cs | 4 +- .../ServiceStack.Text.Tests.csproj | 1 + .../UseCases/GithubV3ApiTests.cs | 2 +- .../UseCases/StripeGateway.cs | 136 +-- 13 files changed, 1216 insertions(+), 194 deletions(-) create mode 100644 src/ServiceStack.Text/HttpUtils.HttpClient.cs rename src/ServiceStack.Text/{HttpUtils.Legacy.cs => HttpUtils.WebRequest.cs} (93%) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index edf3a4b2b..257d5db63 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -107,13 +107,11 @@ static Env() + VersionString + " " + PclExport.Instance.PlatformName + (IsLinux ? "/Linux" : IsOSX ? "/OSX" : IsUnix ? "/Unix" : IsWindows ? "/Windows" : "/UnknownOS") + (IsIOS ? "/iOS" : IsAndroid ? "/Android" : IsUWP ? "/UWP" : "") - + PlatformModifier + + (IsNet6 ? "/net6" : IsNetStandard20 ? "/std2.0" : IsNetFramework ? "/netfx" : "") + (IsMono ? "/Mono" : "") + $"/{LicenseUtils.Info}"; __releaseDate = new DateTime(2001,01,01); } - public static string PlatformModifier => (IsNet6 ? "/net6" : IsNetStandard20 ? "/std2.0" : IsNetFramework ? "/netfx" : "") + (IsMono ? "/Mono" : ""); - public static string VersionString { get; set; } public static decimal ServiceStackVersion = 6.01m; diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs new file mode 100644 index 000000000..dba1d5209 --- /dev/null +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -0,0 +1,957 @@ +#if NET6_0_OR_GREATER +#nullable enable + +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using ServiceStack.Text; + +namespace ServiceStack; + +public static partial class HttpUtils +{ + public static Func HandlerFactory { get; set; } = + () => new HttpClientHandler { + UseDefaultCredentials = true, + AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate, + }; + + public static Func ClientFactory { get; set; } = + url => new HttpClient(HandlerFactory(), disposeHandler:true); + + public static string GetJsonFromUrl(this string url, + Action? requestFilter = null, Action? responseFilter = null) + { + return url.GetStringFromUrl(MimeTypes.Json, requestFilter, responseFilter); + } + + public static Task GetJsonFromUrlAsync(this string url, + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return url.GetStringFromUrlAsync(MimeTypes.Json, requestFilter, responseFilter, token: token); + } + + public static string GetXmlFromUrl(this string url, + Action? requestFilter = null, Action? responseFilter = null) + { + return url.GetStringFromUrl(MimeTypes.Xml, requestFilter, responseFilter); + } + + public static Task GetXmlFromUrlAsync(this string url, + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return url.GetStringFromUrlAsync(MimeTypes.Xml, requestFilter, responseFilter, token: token); + } + + public static string GetCsvFromUrl(this string url, + Action? requestFilter = null, Action? responseFilter = null) + { + return url.GetStringFromUrl(MimeTypes.Csv, requestFilter, responseFilter); + } + + public static Task GetCsvFromUrlAsync(this string url, + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return url.GetStringFromUrlAsync(MimeTypes.Csv, requestFilter, responseFilter, token: token); + } + + public static string GetStringFromUrl(this string url, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task GetStringFromUrlAsync(this string url, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, + token: token); + } + + public static string PostStringToUrl(this string url, string? requestBody = null, + string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "POST", + requestBody: requestBody, contentType: contentType, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostStringToUrlAsync(this string url, string? requestBody = null, + string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "POST", + requestBody: requestBody, contentType: contentType, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PostToUrl(this string url, string? formData = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "POST", + contentType: MimeTypes.FormUrlEncoded, requestBody: formData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostToUrlAsync(this string url, string? formData = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "POST", + contentType: MimeTypes.FormUrlEncoded, requestBody: formData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PostToUrl(this string url, object? formData = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + string? postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; + + return SendStringToUrl(url, method: "POST", + contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostToUrlAsync(this string url, object? formData = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + string? postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; + + return SendStringToUrlAsync(url, method: "POST", + contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PostJsonToUrl(this string url, string json, + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "POST", requestBody: json, contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostJsonToUrlAsync(this string url, string json, + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "POST", requestBody: json, contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PostJsonToUrl(this string url, object data, + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "POST", requestBody: data.ToJson(), contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostJsonToUrlAsync(this string url, object data, + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "POST", requestBody: data.ToJson(), contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PostXmlToUrl(this string url, string xml, + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "POST", requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostXmlToUrlAsync(this string url, string xml, + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "POST", requestBody: xml, contentType: MimeTypes.Xml, + accept: MimeTypes.Xml, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PostCsvToUrl(this string url, string csv, + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "POST", requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostCsvToUrlAsync(this string url, string csv, + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "POST", requestBody: csv, contentType: MimeTypes.Csv, + accept: MimeTypes.Csv, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PutStringToUrl(this string url, string? requestBody = null, + string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", + requestBody: requestBody, contentType: contentType, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutStringToUrlAsync(this string url, string? requestBody = null, + string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PUT", + requestBody: requestBody, contentType: contentType, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PutToUrl(this string url, string? formData = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", + contentType: MimeTypes.FormUrlEncoded, requestBody: formData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutToUrlAsync(this string url, string? formData = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PUT", + contentType: MimeTypes.FormUrlEncoded, requestBody: formData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PutToUrl(this string url, object? formData = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + string? postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; + + return SendStringToUrl(url, method: "PUT", + contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutToUrlAsync(this string url, object? formData = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + string? postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; + + return SendStringToUrlAsync(url, method: "PUT", + contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PutJsonToUrl(this string url, string json, + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", requestBody: json, contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutJsonToUrlAsync(this string url, string json, + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PUT", requestBody: json, contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PutJsonToUrl(this string url, object data, + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", requestBody: data.ToJson(), contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutJsonToUrlAsync(this string url, object data, + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PUT", requestBody: data.ToJson(), contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PutXmlToUrl(this string url, string xml, + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutXmlToUrlAsync(this string url, string xml, + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PUT", requestBody: xml, contentType: MimeTypes.Xml, + accept: MimeTypes.Xml, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PutCsvToUrl(this string url, string csv, + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutCsvToUrlAsync(this string url, string csv, + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PUT", requestBody: csv, contentType: MimeTypes.Csv, + accept: MimeTypes.Csv, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PatchStringToUrl(this string url, string? requestBody = null, + string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "PATCH", + requestBody: requestBody, contentType: contentType, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PatchStringToUrlAsync(this string url, string? requestBody = null, + string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PATCH", + requestBody: requestBody, contentType: contentType, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PatchToUrl(this string url, string? formData = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "PATCH", + contentType: MimeTypes.FormUrlEncoded, requestBody: formData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PatchToUrlAsync(this string url, string? formData = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PATCH", + contentType: MimeTypes.FormUrlEncoded, requestBody: formData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PatchToUrl(this string url, object? formData = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + string? postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; + + return SendStringToUrl(url, method: "PATCH", + contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PatchToUrlAsync(this string url, object? formData = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + string? postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; + + return SendStringToUrlAsync(url, method: "PATCH", + contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PatchJsonToUrl(this string url, string json, + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "PATCH", requestBody: json, contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PatchJsonToUrlAsync(this string url, string json, + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PATCH", requestBody: json, contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string PatchJsonToUrl(this string url, object data, + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "PATCH", requestBody: data.ToJson(), contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PatchJsonToUrlAsync(this string url, object data, + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "PATCH", requestBody: data.ToJson(), contentType: MimeTypes.Json, + accept: MimeTypes.Json, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static string DeleteFromUrl(this string url, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "DELETE", accept: accept, requestFilter: requestFilter, + responseFilter: responseFilter); + } + + public static Task DeleteFromUrlAsync(this string url, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "DELETE", accept: accept, requestFilter: requestFilter, + responseFilter: responseFilter, token: token); + } + + public static string OptionsFromUrl(this string url, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "OPTIONS", accept: accept, requestFilter: requestFilter, + responseFilter: responseFilter); + } + + public static Task OptionsFromUrlAsync(this string url, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "OPTIONS", accept: accept, requestFilter: requestFilter, + responseFilter: responseFilter, token: token); + } + + public static string HeadFromUrl(this string url, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "HEAD", accept: accept, requestFilter: requestFilter, + responseFilter: responseFilter); + } + + public static Task HeadFromUrlAsync(this string url, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStringToUrlAsync(url, method: "HEAD", accept: accept, requestFilter: requestFilter, + responseFilter: responseFilter, token: token); + } + + public static string SendStringToUrl(this string url, string method = HttpMethods.Post, + string? requestBody = null, string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + var client = ClientFactory(url); + var httpReq = new HttpRequestMessage(new HttpMethod(method), url); + httpReq.Headers.Add(HttpHeaders.Accept, accept); + + if (requestBody != null) + { + httpReq.Content = new StringContent(requestBody, UseEncoding); + if (contentType != null) + httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + } + requestFilter?.Invoke(httpReq); + + var httpRes = client.Send(httpReq); + responseFilter?.Invoke(httpRes); + httpRes.EnsureSuccessStatusCode(); + return httpRes.Content.ReadAsStream().ReadToEnd(UseEncoding); + } + + public static async Task SendStringToUrlAsync(this string url, string method = HttpMethods.Post, + string? requestBody = null, + string? contentType = null, string accept = "*/*", Action? requestFilter = null, + Action? responseFilter = null, CancellationToken token = default) + { + var client = ClientFactory(url); + var httpReq = new HttpRequestMessage(new HttpMethod(method), url); + httpReq.Headers.Add(HttpHeaders.Accept, accept); + + if (requestBody != null) + { + httpReq.Content = new StringContent(requestBody, UseEncoding); + if (contentType != null) + httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + } + requestFilter?.Invoke(httpReq); + + var httpRes = await client.SendAsync(httpReq, token).ConfigAwait(); + responseFilter?.Invoke(httpRes); + httpRes.EnsureSuccessStatusCode(); + return await httpRes.Content.ReadAsStringAsync(token).ConfigAwait(); + } + + public static byte[] GetBytesFromUrl(this string url, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return url.SendBytesToUrl(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task GetBytesFromUrlAsync(this string url, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return url.SendBytesToUrlAsync(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, + token: token); + } + + public static byte[] PostBytesToUrl(this string url, byte[]? requestBody = null, string? contentType = null, + string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return SendBytesToUrl(url, method: "POST", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostBytesToUrlAsync(this string url, byte[]? requestBody = null, + string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendBytesToUrlAsync(url, method: "POST", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static byte[] PutBytesToUrl(this string url, byte[]? requestBody = null, string? contentType = null, + string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return SendBytesToUrl(url, method: "PUT", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutBytesToUrlAsync(this string url, byte[]? requestBody = null, string? contentType = null, + string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendBytesToUrlAsync(url, method: "PUT", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static byte[] SendBytesToUrl(this string url, string method = HttpMethods.Post, + byte[]? requestBody = null, string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + var client = ClientFactory(url); + var httpReq = new HttpRequestMessage(new HttpMethod(method), url); + httpReq.Headers.Add(HttpHeaders.Accept, accept); + + if (requestBody != null) + { + httpReq.Content = new ReadOnlyMemoryContent(requestBody); + if (contentType != null) + httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + } + requestFilter?.Invoke(httpReq); + + var httpRes = client.Send(httpReq); + responseFilter?.Invoke(httpRes); + httpRes.EnsureSuccessStatusCode(); + return httpRes.Content.ReadAsStream().ReadFully(); + } + + public static async Task SendBytesToUrlAsync(this string url, string method = HttpMethods.Post, + byte[]? requestBody = null, string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + var client = ClientFactory(url); + var httpReq = new HttpRequestMessage(new HttpMethod(method), url); + httpReq.Headers.Add(HttpHeaders.Accept, accept); + + if (requestBody != null) + { + httpReq.Content = new ReadOnlyMemoryContent(requestBody); + if (contentType != null) + httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + } + requestFilter?.Invoke(httpReq); + + var httpRes = await client.SendAsync(httpReq, token).ConfigAwait(); + responseFilter?.Invoke(httpRes); + httpRes.EnsureSuccessStatusCode(); + return await (await httpRes.Content.ReadAsStreamAsync(token).ConfigAwait()).ReadFullyAsync(token).ConfigAwait(); + } + + public static Stream GetStreamFromUrl(this string url, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return url.SendStreamToUrl(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task GetStreamFromUrlAsync(this string url, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return url.SendStreamToUrlAsync(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, + token: token); + } + + public static Stream PostStreamToUrl(this string url, Stream? requestBody = null, string? contentType = null, + string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStreamToUrl(url, method: "POST", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PostStreamToUrlAsync(this string url, Stream? requestBody = null, + string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStreamToUrlAsync(url, method: "POST", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + public static Stream PutStreamToUrl(this string url, Stream? requestBody = null, string? contentType = null, + string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStreamToUrl(url, method: "PUT", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static Task PutStreamToUrlAsync(this string url, Stream? requestBody = null, + string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return SendStreamToUrlAsync(url, method: "PUT", + contentType: contentType, requestBody: requestBody, + accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); + } + + /// + /// Returns HttpWebResponse Stream which must be disposed + /// + public static Stream SendStreamToUrl(this string url, string method = HttpMethods.Post, + Stream? requestBody = null, string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + var client = ClientFactory(url); + var httpReq = new HttpRequestMessage(new HttpMethod(method), url); + httpReq.Headers.Add(HttpHeaders.Accept, accept); + + if (requestBody != null) + { + httpReq.Content = new StreamContent(requestBody); + if (contentType != null) + httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + } + requestFilter?.Invoke(httpReq); + + var httpRes = client.Send(httpReq); + responseFilter?.Invoke(httpRes); + httpRes.EnsureSuccessStatusCode(); + return httpRes.Content.ReadAsStream(); + } + + /// + /// Returns HttpWebResponse Stream which must be disposed + /// + public static async Task SendStreamToUrlAsync(this string url, string method = HttpMethods.Post, + Stream? requestBody = null, string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + var client = ClientFactory(url); + var httpReq = new HttpRequestMessage(new HttpMethod(method), url); + httpReq.Headers.Add(HttpHeaders.Accept, accept); + + if (requestBody != null) + { + httpReq.Content = new StreamContent(requestBody); + if (contentType != null) + httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + } + requestFilter?.Invoke(httpReq); + + var httpRes = await client.SendAsync(httpReq, token).ConfigAwait(); + responseFilter?.Invoke(httpRes); + httpRes.EnsureSuccessStatusCode(); + return await httpRes.Content.ReadAsStreamAsync(token).ConfigAwait(); + } + + public static HttpStatusCode? GetResponseStatus(this string url) + { + try + { + var client = ClientFactory(url); + var httpReq = new HttpRequestMessage(new HttpMethod(HttpMethods.Get), url); + httpReq.Headers.Add(HttpHeaders.Accept, "*/*"); + var httpRes = client.Send(httpReq); + return httpRes.StatusCode; + } + catch (Exception ex) + { + return ex.GetStatus(); + } + } + + public static HttpResponseMessage? GetErrorResponse(this string url) + { + var client = ClientFactory(url); + var httpReq = new HttpRequestMessage(new HttpMethod(HttpMethods.Get), url); + httpReq.Headers.Add(HttpHeaders.Accept, "*/*"); + var httpRes = client.Send(httpReq); + return httpRes.IsSuccessStatusCode + ? null + : httpRes; + } + + public static async Task GetErrorResponseAsync(this string url, CancellationToken token=default) + { + var client = ClientFactory(url); + var httpReq = new HttpRequestMessage(new HttpMethod(HttpMethods.Get), url); + httpReq.Headers.Add(HttpHeaders.Accept, "*/*"); + var httpRes = await client.SendAsync(httpReq, token).ConfigAwait(); + return httpRes.IsSuccessStatusCode + ? null + : httpRes; + } + + public static string ReadToEnd(this HttpResponseMessage webRes) + { + using var stream = webRes.Content.ReadAsStream(); + return stream.ReadToEnd(UseEncoding); + } + + public static Task ReadToEndAsync(this HttpResponseMessage webRes) + { + using var stream = webRes.Content.ReadAsStream(); + return stream.ReadToEndAsync(UseEncoding); + } + + public static IEnumerable ReadLines(this HttpResponseMessage webRes) + { + using var stream = webRes.Content.ReadAsStream(); + using var reader = new StreamReader(stream, UseEncoding, true, 1024, leaveOpen: true); + string? line; + while ((line = reader.ReadLine()) != null) + { + yield return line; + } + } + + public static HttpResponseMessage UploadFile(this HttpRequestMessage httpReq, Stream fileStream, string fileName, + string? mimeType = null, string accept = "*/*", string method = HttpMethods.Post, string field = "file", + Action? requestFilter = null, Action? responseFilter = null) + { + if (httpReq.RequestUri == null) + throw new ArgumentException(nameof(httpReq.RequestUri)); + + httpReq.Method = new HttpMethod(method); + httpReq.Headers.Add(HttpHeaders.Accept, accept); + requestFilter?.Invoke(httpReq); + + using var content = new MultipartFormDataContent(); + var fileBytes = fileStream.ReadFully(); + using var fileContent = new ByteArrayContent(fileBytes, 0, fileBytes.Length); + fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") + { + Name = "file", + FileName = fileName + }; + fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(mimeType ?? MimeTypes.GetMimeType(fileName)); + content.Add(fileContent, "file", fileName); + + var client = ClientFactory(httpReq.RequestUri!.ToString()); + var httpRes = client.Send(httpReq); + responseFilter?.Invoke(httpRes); + httpRes.EnsureSuccessStatusCode(); + return httpRes; + } + + public static async Task UploadFileAsync(this HttpRequestMessage httpReq, Stream fileStream, string fileName, + string? mimeType = null, string accept = "*/*", string method = HttpMethods.Post, string field = "file", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + if (httpReq.RequestUri == null) + throw new ArgumentException(nameof(httpReq.RequestUri)); + + httpReq.Method = new HttpMethod(method); + httpReq.Headers.Add(HttpHeaders.Accept, accept); + requestFilter?.Invoke(httpReq); + + using var content = new MultipartFormDataContent(); + var fileBytes = await fileStream.ReadFullyAsync(token).ConfigAwait(); + using var fileContent = new ByteArrayContent(fileBytes, 0, fileBytes.Length); + fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") + { + Name = "file", + FileName = fileName + }; + fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(mimeType ?? MimeTypes.GetMimeType(fileName)); + content.Add(fileContent, "file", fileName); + + var client = ClientFactory(httpReq.RequestUri!.ToString()); + var httpRes = await client.SendAsync(httpReq, token).ConfigAwait(); + responseFilter?.Invoke(httpRes); + httpRes.EnsureSuccessStatusCode(); + return httpRes; + } + + public static void UploadFile(this HttpRequestMessage httpReq, Stream fileStream, string fileName) + { + if (fileName == null) + throw new ArgumentNullException(nameof(fileName)); + var mimeType = MimeTypes.GetMimeType(fileName); + if (mimeType == null) + throw new ArgumentException("Mime-type not found for file: " + fileName); + + UploadFile(httpReq, fileStream, fileName, mimeType); + } + + public static async Task UploadFileAsync(this HttpRequestMessage webRequest, Stream fileStream, string fileName, + CancellationToken token = default) + { + if (fileName == null) + throw new ArgumentNullException(nameof(fileName)); + var mimeType = MimeTypes.GetMimeType(fileName); + if (mimeType == null) + throw new ArgumentException("Mime-type not found for file: " + fileName); + + await UploadFileAsync(webRequest, fileStream, fileName, mimeType, token: token).ConfigAwait(); + } + + public static string PostXmlToUrl(this string url, object data, + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "POST", requestBody: data.ToXml(), contentType: MimeTypes.Xml, + accept: MimeTypes.Xml, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static string PostCsvToUrl(this string url, object data, + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "POST", requestBody: data.ToCsv(), contentType: MimeTypes.Csv, + accept: MimeTypes.Csv, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static string PutXmlToUrl(this string url, object data, + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", requestBody: data.ToXml(), contentType: MimeTypes.Xml, + accept: MimeTypes.Xml, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static string PutCsvToUrl(this string url, object data, + Action? requestFilter = null, Action? responseFilter = null) + { + return SendStringToUrl(url, method: "PUT", requestBody: data.ToCsv(), contentType: MimeTypes.Csv, + accept: MimeTypes.Csv, + requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static HttpResponseMessage PostFileToUrl(this string url, + FileInfo uploadFileInfo, string uploadFileMimeType, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + var webReq = new HttpRequestMessage(HttpMethod.Post, url); + using var fileStream = uploadFileInfo.OpenRead(); + var fileName = uploadFileInfo.Name; + + return webReq.UploadFile(fileStream, fileName, uploadFileMimeType, accept: accept, + method: HttpMethods.Post, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static async Task PostFileToUrlAsync(this string url, + FileInfo uploadFileInfo, string uploadFileMimeType, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + var webReq = new HttpRequestMessage(HttpMethod.Post, url); + await using var fileStream = uploadFileInfo.OpenRead(); + var fileName = uploadFileInfo.Name; + + return await webReq.UploadFileAsync(fileStream, fileName, uploadFileMimeType, accept: accept, + method: HttpMethods.Post, requestFilter: requestFilter, responseFilter: responseFilter, token: token).ConfigAwait(); + } + + public static HttpResponseMessage PutFileToUrl(this string url, + FileInfo uploadFileInfo, string uploadFileMimeType, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { + var webReq = new HttpRequestMessage(HttpMethod.Put, url); + using var fileStream = uploadFileInfo.OpenRead(); + var fileName = uploadFileInfo.Name; + + return webReq.UploadFile(fileStream, fileName, uploadFileMimeType, accept: accept, + method: HttpMethods.Post, requestFilter: requestFilter, responseFilter: responseFilter); + } + + public static async Task PutFileToUrlAsync(this string url, + FileInfo uploadFileInfo, string uploadFileMimeType, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + var webReq = new HttpRequestMessage(HttpMethod.Put, url); + await using var fileStream = uploadFileInfo.OpenRead(); + var fileName = uploadFileInfo.Name; + + return await webReq.UploadFileAsync(fileStream, fileName, uploadFileMimeType, accept: accept, + method: HttpMethods.Post, requestFilter: requestFilter, responseFilter: responseFilter, token: token).ConfigAwait(); + } + + public static HttpRequestMessage With(this HttpRequestMessage httpReq, + string? accept = null, + string? userAgent = null, + Dictionary? headers = null) + { + if (accept != null) + httpReq.Headers.Add(HttpHeaders.Accept, accept); + + if (userAgent != null) + httpReq.Headers.UserAgent.Add(new ProductInfoHeaderValue(userAgent)); + + if (headers != null) + { + foreach (var entry in headers) + { + httpReq.Headers.Add(entry.Key, entry.Value); + } + } + + return httpReq; + } + +} + +#endif diff --git a/src/ServiceStack.Text/HttpUtils.Legacy.cs b/src/ServiceStack.Text/HttpUtils.WebRequest.cs similarity index 93% rename from src/ServiceStack.Text/HttpUtils.Legacy.cs rename to src/ServiceStack.Text/HttpUtils.WebRequest.cs index 4bb8ba9d9..d368f4f60 100644 --- a/src/ServiceStack.Text/HttpUtils.Legacy.cs +++ b/src/ServiceStack.Text/HttpUtils.WebRequest.cs @@ -1,3 +1,4 @@ +#if !NET6_0_OR_GREATER using System; using System.Collections.Generic; using System.IO; @@ -773,54 +774,6 @@ public static async Task SendStreamToUrlAsync(this string url, string me return stream; } - public static bool IsAny300(this Exception ex) - { - var status = ex.GetStatus(); - return status >= HttpStatusCode.MultipleChoices && status < HttpStatusCode.BadRequest; - } - - public static bool IsAny400(this Exception ex) - { - var status = ex.GetStatus(); - return status >= HttpStatusCode.BadRequest && status < HttpStatusCode.InternalServerError; - } - - public static bool IsAny500(this Exception ex) - { - var status = ex.GetStatus(); - return status >= HttpStatusCode.InternalServerError && (int)status < 600; - } - - public static bool IsNotModified(this Exception ex) - { - return GetStatus(ex) == HttpStatusCode.NotModified; - } - - public static bool IsBadRequest(this Exception ex) - { - return GetStatus(ex) == HttpStatusCode.BadRequest; - } - - public static bool IsNotFound(this Exception ex) - { - return GetStatus(ex) == HttpStatusCode.NotFound; - } - - public static bool IsUnauthorized(this Exception ex) - { - return GetStatus(ex) == HttpStatusCode.Unauthorized; - } - - public static bool IsForbidden(this Exception ex) - { - return GetStatus(ex) == HttpStatusCode.Forbidden; - } - - public static bool IsInternalServerError(this Exception ex) - { - return GetStatus(ex) == HttpStatusCode.InternalServerError; - } - public static HttpStatusCode? GetResponseStatus(this string url) { try @@ -838,74 +791,6 @@ public static bool IsInternalServerError(this Exception ex) } } - public static HttpStatusCode? GetStatus(this Exception ex) - { - if (ex == null) - return null; - - if (ex is WebException webEx) - return GetStatus(webEx); - - if (ex is IHasStatusCode hasStatus) - return (HttpStatusCode)hasStatus.StatusCode; - - return null; - } - - public static HttpStatusCode? GetStatus(this WebException webEx) - { - var httpRes = webEx?.Response as HttpWebResponse; - return httpRes?.StatusCode; - } - - public static bool HasStatus(this Exception ex, HttpStatusCode statusCode) - { - return GetStatus(ex) == statusCode; - } - - public static string GetResponseBody(this Exception ex) - { - if (!(ex is WebException webEx) || webEx.Response == null || webEx.Status != WebExceptionStatus.ProtocolError) - return null; - - var errorResponse = (HttpWebResponse)webEx.Response; - using var responseStream = errorResponse.GetResponseStream(); - return responseStream.ReadToEnd(UseEncoding); - } - - public static async Task GetResponseBodyAsync(this Exception ex, CancellationToken token = default) - { - if (!(ex is WebException webEx) || webEx.Response == null || webEx.Status != WebExceptionStatus.ProtocolError) - return null; - - var errorResponse = (HttpWebResponse)webEx.Response; - using var responseStream = errorResponse.GetResponseStream(); - return await responseStream.ReadToEndAsync(UseEncoding).ConfigAwait(); - } - - public static string ReadToEnd(this WebResponse webRes) - { - using var stream = webRes.GetResponseStream(); - return stream.ReadToEnd(UseEncoding); - } - - public static Task ReadToEndAsync(this WebResponse webRes) - { - using var stream = webRes.GetResponseStream(); - return stream.ReadToEndAsync(UseEncoding); - } - - public static IEnumerable ReadLines(this WebResponse webRes) - { - using var stream = webRes.GetResponseStream(); - using var reader = new StreamReader(stream, UseEncoding, true, 1024, leaveOpen: true); - string line; - while ((line = reader.ReadLine()) != null) - { - yield return line; - } - } - public static HttpWebResponse GetErrorResponse(this string url) { try @@ -1187,8 +1072,29 @@ private static byte[] GetHeaderBytes(string fileName, string mimeType, string fi var headerBytes = header.ToAsciiBytes(); return headerBytes; } -} + public static HttpWebRequest With(this HttpWebRequest httpReq, + string accept = null, + string userAgent = null, + Dictionary headers = null) + { + if (accept != null) + httpReq.Headers.Add(HttpHeaders.Accept, accept); + + if (userAgent != null) + httpReq.UserAgent = userAgent; + + if (headers != null) + { + foreach (var entry in headers) + { + httpReq.Headers[entry.Key] = entry.Value; + } + } + + return httpReq; + } +} public interface IHttpResultsFilter : IDisposable { @@ -1241,3 +1147,4 @@ public void UploadStream(HttpWebRequest webRequest, Stream fileStream, string fi UploadFileFn?.Invoke(webRequest, fileStream, fileName); } } +#endif diff --git a/src/ServiceStack.Text/HttpUtils.cs b/src/ServiceStack.Text/HttpUtils.cs index ab7c7da07..d96edc574 100644 --- a/src/ServiceStack.Text/HttpUtils.cs +++ b/src/ServiceStack.Text/HttpUtils.cs @@ -2,18 +2,31 @@ //License: https://raw.github.com/ServiceStack/ServiceStack/master/license.txt using System; +using System.Collections.Generic; using System.IO; using System.Net; using System.Text; +using System.Threading; using System.Threading.Tasks; +using ServiceStack.Text; namespace ServiceStack; public static partial class HttpUtils { - public static string UserAgent = "ServiceStack.Text" + Text.Env.PlatformModifier; + public static string UserAgent = "ServiceStack.Text" + +#if NET6_0_OR_GREATER + "/net6" +#elif NETSTANDARD2_0 + "/std2.0" +#elif NETFX + "/net472" +#else + "/unknown" +#endif +; - public static Encoding UseEncoding { get; set; } = PclExport.Instance.GetUTF8Encoding(false); + public static Encoding UseEncoding { get; set; } = new UTF8Encoding(false); public static string AddQueryParam(this string url, string key, object val, bool encode = true) { @@ -208,6 +221,128 @@ public static Task GetResponseAsync(this HttpWebRequest request return tcs.Task; } + + public static bool IsAny300(this Exception ex) + { + var status = ex.GetStatus(); + return status is >= HttpStatusCode.MultipleChoices and < HttpStatusCode.BadRequest; + } + + public static bool IsAny400(this Exception ex) + { + var status = ex.GetStatus(); + return status is >= HttpStatusCode.BadRequest and < HttpStatusCode.InternalServerError; + } + + public static bool IsAny500(this Exception ex) + { + var status = ex.GetStatus(); + return status >= HttpStatusCode.InternalServerError && (int)status < 600; + } + + public static bool IsNotModified(this Exception ex) + { + return GetStatus(ex) == HttpStatusCode.NotModified; + } + + public static bool IsBadRequest(this Exception ex) + { + return GetStatus(ex) == HttpStatusCode.BadRequest; + } + + public static bool IsNotFound(this Exception ex) + { + return GetStatus(ex) == HttpStatusCode.NotFound; + } + + public static bool IsUnauthorized(this Exception ex) + { + return GetStatus(ex) == HttpStatusCode.Unauthorized; + } + + public static bool IsForbidden(this Exception ex) + { + return GetStatus(ex) == HttpStatusCode.Forbidden; + } + + public static bool IsInternalServerError(this Exception ex) + { + return GetStatus(ex) == HttpStatusCode.InternalServerError; + } + + public static HttpStatusCode? GetStatus(this Exception ex) + { +#if NET6_0_OR_GREATER + if (ex is System.Net.Http.HttpRequestException httpEx) + return GetStatus(httpEx); +#endif + + if (ex is WebException webEx) + return GetStatus(webEx); + + if (ex is IHasStatusCode hasStatus) + return (HttpStatusCode)hasStatus.StatusCode; + + return null; + } + +#if NET6_0_OR_GREATER + public static HttpStatusCode? GetStatus(this System.Net.Http.HttpRequestException ex) => ex.StatusCode; +#endif + + public static HttpStatusCode? GetStatus(this WebException webEx) + { + var httpRes = webEx?.Response as HttpWebResponse; + return httpRes?.StatusCode; + } + + public static bool HasStatus(this Exception ex, HttpStatusCode statusCode) + { + return GetStatus(ex) == statusCode; + } + + public static string GetResponseBody(this Exception ex) + { + if (!(ex is WebException webEx) || webEx.Response == null || webEx.Status != WebExceptionStatus.ProtocolError) + return null; + + var errorResponse = (HttpWebResponse)webEx.Response; + using var responseStream = errorResponse.GetResponseStream(); + return responseStream.ReadToEnd(UseEncoding); + } + + public static async Task GetResponseBodyAsync(this Exception ex, CancellationToken token = default) + { + if (!(ex is WebException webEx) || webEx.Response == null || webEx.Status != WebExceptionStatus.ProtocolError) + return null; + + var errorResponse = (HttpWebResponse)webEx.Response; + using var responseStream = errorResponse.GetResponseStream(); + return await responseStream.ReadToEndAsync(UseEncoding).ConfigAwait(); + } + + public static string ReadToEnd(this WebResponse webRes) + { + using var stream = webRes.GetResponseStream(); + return stream.ReadToEnd(UseEncoding); + } + + public static Task ReadToEndAsync(this WebResponse webRes) + { + using var stream = webRes.GetResponseStream(); + return stream.ReadToEndAsync(UseEncoding); + } + + public static IEnumerable ReadLines(this WebResponse webRes) + { + using var stream = webRes.GetResponseStream(); + using var reader = new StreamReader(stream, UseEncoding, true, 1024, leaveOpen: true); + string line; + while ((line = reader.ReadLine()) != null) + { + yield return line; + } + } } //Allow Exceptions to Customize HTTP StatusCode and StatusDescription returned diff --git a/src/ServiceStack.Text/LicenseUtils.cs b/src/ServiceStack.Text/LicenseUtils.cs index 1a97e3e00..2fb47aec7 100644 --- a/src/ServiceStack.Text/LicenseUtils.cs +++ b/src/ServiceStack.Text/LicenseUtils.cs @@ -821,10 +821,8 @@ public static bool VerifyLicenseKeyTextFallback(this string licenseKeyText, out public static bool VerifySha1Data(this System.Security.Cryptography.RSACryptoServiceProvider RSAalg, byte[] unsignedData, byte[] encryptedData) { - using (var sha = new System.Security.Cryptography.SHA1CryptoServiceProvider()) - { - return RSAalg.VerifyData(unsignedData, sha, encryptedData); - } + using var sha = System.Security.Cryptography.SHA1.Create(); + return RSAalg.VerifyData(unsignedData, sha, encryptedData); } } } \ No newline at end of file diff --git a/src/ServiceStack.Text/PclExport.NetCore.cs b/src/ServiceStack.Text/PclExport.NetCore.cs index 14d8f89e4..b12bee3be 100644 --- a/src/ServiceStack.Text/PclExport.NetCore.cs +++ b/src/ServiceStack.Text/PclExport.NetCore.cs @@ -1,4 +1,4 @@ -#if NETCORE && !NETSTANDARD2_0 +#if (NETCORE || NET6_0_OR_GREATER) && !NETSTANDARD2_0 using System; using ServiceStack.Text; diff --git a/src/ServiceStack.Text/PclExport.NetStandard.cs b/src/ServiceStack.Text/PclExport.NetStandard.cs index 976e21fe9..e536fec6f 100644 --- a/src/ServiceStack.Text/PclExport.NetStandard.cs +++ b/src/ServiceStack.Text/PclExport.NetStandard.cs @@ -19,10 +19,9 @@ namespace ServiceStack { public class NetStandardPclExport : PclExport { - public static NetStandardPclExport Provider = new NetStandardPclExport(); + public static NetStandardPclExport Provider = new(); - static string[] allDateTimeFormats = new string[] - { + static string[] allDateTimeFormats = { "yyyy-MM-ddTHH:mm:ss.FFFFFFFzzzzzz", "yyyy-MM-ddTHH:mm:ss.FFFFFFF", "yyyy-MM-ddTHH:mm:ss.FFFFFFFZ", diff --git a/src/ServiceStack.Text/PclExport.cs b/src/ServiceStack.Text/PclExport.cs index c97a8be6b..74926ea04 100644 --- a/src/ServiceStack.Text/PclExport.cs +++ b/src/ServiceStack.Text/PclExport.cs @@ -26,13 +26,13 @@ public static class Platforms public const string Net45 = "Net45"; } - public static PclExport Instance + public static PclExport Instance = #if NETFX - = new Net45PclExport() + new Net45PclExport() #elif NETSTANDARD2_0 - = new NetStandardPclExport() -#elif NETCORE - = new NetCorePclExport() + new NetStandardPclExport() +#elif NETCORE || NET6_0_OR_GREATER + new NetCorePclExport() #endif ; diff --git a/src/ServiceStack.Text/ServiceStack.Text.csproj b/src/ServiceStack.Text/ServiceStack.Text.csproj index df4781b18..23980e788 100644 --- a/src/ServiceStack.Text/ServiceStack.Text.csproj +++ b/src/ServiceStack.Text/ServiceStack.Text.csproj @@ -12,6 +12,9 @@ JSON;Text;Serializer;CSV;JSV;HTTP;Auto Mapping;Dump;Reflection;JS;Utils;Fast 1591 + + $(DefineConstants);NETFX;NET472 + $(DefineConstants);NETCORE;NETSTANDARD;NETSTANDARD2_0 diff --git a/tests/ServiceStack.Text.Tests/HttpUtilsMockTests.cs b/tests/ServiceStack.Text.Tests/HttpUtilsMockTests.cs index 88093707f..9870126e4 100644 --- a/tests/ServiceStack.Text.Tests/HttpUtilsMockTests.cs +++ b/tests/ServiceStack.Text.Tests/HttpUtilsMockTests.cs @@ -1,4 +1,5 @@ -// Copyright (c) ServiceStack, Inc. All Rights Reserved. +#if !NET6_0_OR_GREATER +// Copyright (c) ServiceStack, Inc. All Rights Reserved. // License: https://raw.github.com/ServiceStack/ServiceStack/master/license.txt using System.Collections.Generic; @@ -217,3 +218,4 @@ public async Task Can_Mock_BytesFn_Api_responses_Async() } } +#endif diff --git a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj index 00dadf020..d57516471 100644 --- a/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj +++ b/tests/ServiceStack.Text.Tests/ServiceStack.Text.Tests.csproj @@ -49,6 +49,7 @@ + $(DefineConstants);NETCORE;NETSTANDARD2_0 diff --git a/tests/ServiceStack.Text.Tests/UseCases/GithubV3ApiTests.cs b/tests/ServiceStack.Text.Tests/UseCases/GithubV3ApiTests.cs index f59da56ce..a08107de5 100644 --- a/tests/ServiceStack.Text.Tests/UseCases/GithubV3ApiTests.cs +++ b/tests/ServiceStack.Text.Tests/UseCases/GithubV3ApiTests.cs @@ -37,7 +37,7 @@ public class GithubV3ApiGateway public T GetJson(string route, params object[] routeArgs) { return GithubApiBaseUrl.AppendPath(route.Fmt(routeArgs)) - .GetJsonFromUrl(requestFilter:x => x.UserAgent = "ServiceStack.Text.Tests") + .GetJsonFromUrl(requestFilter:x => x.With(userAgent:"ServiceStack.Text.Tests")) .FromJson(); } diff --git a/tests/ServiceStack.Text.Tests/UseCases/StripeGateway.cs b/tests/ServiceStack.Text.Tests/UseCases/StripeGateway.cs index d65035b02..7936f6f01 100644 --- a/tests/ServiceStack.Text.Tests/UseCases/StripeGateway.cs +++ b/tests/ServiceStack.Text.Tests/UseCases/StripeGateway.cs @@ -4,11 +4,15 @@ using System; using System.Collections.Generic; using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; using System.Runtime.Serialization; using System.Text; +using System.Threading; using System.Threading.Tasks; using ServiceStack.Stripe.Types; using ServiceStack.Text; +using ServiceStack; namespace ServiceStack.Stripe { @@ -572,6 +576,8 @@ public class StripeGateway : IRestGateway private string publishableKey; public ICredentials Credentials { get; set; } private string UserAgent { get; set; } + + public HttpClient Client { get; set; } public StripeGateway(string apiKey, string publishableKey = null) { @@ -581,28 +587,13 @@ public StripeGateway(string apiKey, string publishableKey = null) Timeout = TimeSpan.FromSeconds(60); UserAgent = "servicestack .net stripe v1"; Currency = Currencies.UnitedStatesDollar; + Client = new HttpClient(new HttpClientHandler { + Credentials = Credentials, + AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate, + }, disposeHandler:true); JsConfig.InitStatics(); } - - protected virtual void InitRequest(HttpWebRequest req, string method, string idempotencyKey) - { - req.Accept = MimeTypes.Json; - req.Credentials = Credentials; - - if (method == HttpMethods.Post || method == HttpMethods.Put) - req.ContentType = MimeTypes.FormUrlEncoded; - - if (!string.IsNullOrWhiteSpace(idempotencyKey)) - req.Headers["Idempotency-Key"] = idempotencyKey; - - req.Headers["Stripe-Version"] = APIVersion; - - PclExport.Instance.Config(req, - userAgent: UserAgent, - timeout: Timeout, - preAuthenticate: true); - } - + protected virtual void HandleStripeException(WebException ex) { string errorBody = ex.GetResponseBody(); @@ -618,56 +609,87 @@ protected virtual void HandleStripeException(WebException ex) } } - protected virtual string Send(string relativeUrl, string method, string body, string idempotencyKey) + private HttpRequestMessage PrepareRequest(string relativeUrl, string method, string requestBody, string idempotencyKey) { - try - { - var url = BaseUrl.CombineWith(relativeUrl); - var response = url.SendStringToUrl(method: method, requestBody: body, requestFilter: req => - { - InitRequest(req, method, idempotencyKey); - }); + var url = BaseUrl.CombineWith(relativeUrl); - return response; - } - catch (WebException ex) + var httpReq = new HttpRequestMessage(new HttpMethod(method), url); + + httpReq.Headers.UserAgent.Add(new ProductInfoHeaderValue(UserAgent)); + httpReq.Headers.Add(HttpHeaders.Accept, MimeTypes.Json); + + if (!string.IsNullOrWhiteSpace(idempotencyKey)) + httpReq.Headers.Add("Idempotency-Key", idempotencyKey); + + httpReq.Headers.Add("Stripe-Version", APIVersion); + + if (requestBody != null) { - string errorBody = ex.GetResponseBody(); - var errorStatus = ex.GetStatus() ?? HttpStatusCode.BadRequest; + httpReq.Content = new StringContent(requestBody, Encoding.UTF8); + if (method is HttpMethods.Post or HttpMethods.Put) + httpReq.Content!.Headers.ContentType = new MediaTypeHeaderValue(MimeTypes.FormUrlEncoded); + } - if (ex.IsAny400()) + return httpReq; + } + + private Exception CreateException(HttpResponseMessage httpRes) + { +#if NET6_0_OR_GREATER + return new HttpRequestException(httpRes.ReasonPhrase, null, httpRes.StatusCode); +#else + return new HttpRequestException(httpRes.ReasonPhrase); +#endif + } + + protected virtual string Send(string relativeUrl, string method, string requestBody, string idempotencyKey) + { + var httpReq = PrepareRequest(relativeUrl, method, requestBody, idempotencyKey); + +#if NET6_0_OR_GREATER + var httpRes = Client.Send(httpReq); + var responseBody = httpRes.Content.ReadAsStream().ReadToEnd(Encoding.UTF8); +#else + var httpRes = Client.SendAsync(httpReq).GetAwaiter().GetResult(); + var responseBody = httpRes.Content.ReadAsStreamAsync().GetAwaiter().GetResult().ReadToEnd(Encoding.UTF8); +#endif + + if (httpRes.IsSuccessStatusCode) + return responseBody; + + if (httpRes.StatusCode is >= HttpStatusCode.BadRequest and < HttpStatusCode.InternalServerError) + { + var result = responseBody.FromJson(); + throw new StripeException(result.Error) { - var result = errorBody.FromJson(); - throw new StripeException(result.Error) - { - StatusCode = errorStatus - }; - } - - throw; + StatusCode = httpRes.StatusCode + }; } + + httpRes.EnsureSuccessStatusCode(); + throw CreateException(httpRes); // should never reach here } - protected virtual async Task SendAsync(string relativeUrl, string method, string body, string idempotencyKey) + protected virtual async Task SendAsync(string relativeUrl, string method, string requestBody, string idempotencyKey, CancellationToken token=default) { - try + var httpReq = PrepareRequest(relativeUrl, method, requestBody, idempotencyKey); + + var httpRes = await Client.SendAsync(httpReq, token).ConfigAwait(); + var responseBody = await (await httpRes.Content.ReadAsStreamAsync()).ReadToEndAsync(Encoding.UTF8).ConfigAwait(); + if (httpRes.IsSuccessStatusCode) + return responseBody; + + if (httpRes.StatusCode is >= HttpStatusCode.BadRequest and < HttpStatusCode.InternalServerError) { - var url = BaseUrl.CombineWith(relativeUrl); - var response = await url.SendStringToUrlAsync(method: method, requestBody: body, requestFilter: req => + var result = responseBody.FromJson(); + throw new StripeException(result.Error) { - InitRequest(req, method, idempotencyKey); - }); - - return response; + StatusCode = httpRes.StatusCode + }; } - catch (Exception ex) - { - var webEx = ex.UnwrapIfSingleException() as WebException; - if (webEx != null) - HandleStripeException(webEx); - throw; - } + httpRes.EnsureSuccessStatusCode(); + throw CreateException(httpRes); // should never reach here } public class ConfigScope : IDisposable From e586113fec6449161672ff3fd858c6c866719434 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 29 Jan 2022 00:24:50 +0800 Subject: [PATCH 341/372] Add client overloads for .net6 HttpClient --- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 330 ++++++++++++------ src/ServiceStack.Text/HttpUtils.WebRequest.cs | 25 ++ .../UseCases/GithubV3ApiTests.cs | 5 +- 3 files changed, 257 insertions(+), 103 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index dba1d5209..8f3db9b9e 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -4,10 +4,10 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; -using System.Text; using System.Threading; using System.Threading.Tasks; using ServiceStack.Text; @@ -16,14 +16,34 @@ namespace ServiceStack; public static partial class HttpUtils { - public static Func HandlerFactory { get; set; } = - () => new HttpClientHandler { - UseDefaultCredentials = true, - AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate, - }; + private class HttpClientFactory + { + private readonly Lazy lazyHandler; + internal HttpClientFactory(HttpClientHandler handler) => + lazyHandler = new Lazy(() => handler, LazyThreadSafetyMode.ExecutionAndPublication); + public HttpClient CreateClient() => new(lazyHandler.Value, disposeHandler: false); + } + + // Ok to use HttpClientHandler which now uses SocketsHttpHandler + // https://github.com/dotnet/runtime/blob/main/src/libraries/System.Net.Http/src/System/Net/Http/HttpClientHandler.cs#L16 + public static HttpClientHandler HttpClientHandler { get; set; } = new() { + UseDefaultCredentials = true, + AutomaticDecompression = DecompressionMethods.Brotli | DecompressionMethods.Deflate | DecompressionMethods.GZip, + }; + + // This was the least desirable end to this sadness https://github.com/dotnet/aspnetcore/issues/28385 + // Requires + // public static IHttpClientFactory ClientFactory { get; set; } = new ServiceCollection() + // .AddHttpClient() + // .Configure(options => + // options.HttpMessageHandlerBuilderActions.Add(builder => builder.PrimaryHandler = HandlerFactory)) + // .BuildServiceProvider().GetRequiredService(); + + // Escape & BYO IHttpClientFactory + private static HttpClientFactory clientFactory = new(HttpClientHandler); + public static Func CreateClient { get; set; } = () => clientFactory.CreateClient(); - public static Func ClientFactory { get; set; } = - url => new HttpClient(HandlerFactory(), disposeHandler:true); + public static HttpClient Create() => CreateClient(); public static string GetJsonFromUrl(this string url, Action? requestFilter = null, Action? responseFilter = null) @@ -67,22 +87,23 @@ public static Task GetCsvFromUrlAsync(this string url, public static string GetStringFromUrl(this string url, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + return SendStringToUrl(url, method:HttpMethods.Get, accept: accept, + requestFilter: requestFilter, responseFilter: responseFilter); } public static Task GetStringFromUrlAsync(this string url, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, - token: token); + return SendStringToUrlAsync(url, method:HttpMethods.Get, accept: accept, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string PostStringToUrl(this string url, string? requestBody = null, string? contentType = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "POST", + return SendStringToUrl(url, method:HttpMethods.Post, requestBody: requestBody, contentType: contentType, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -92,7 +113,7 @@ public static Task PostStringToUrlAsync(this string url, string? request Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "POST", + return SendStringToUrlAsync(url, method:HttpMethods.Post, requestBody: requestBody, contentType: contentType, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -100,7 +121,7 @@ public static Task PostStringToUrlAsync(this string url, string? request public static string PostToUrl(this string url, string? formData = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "POST", + return SendStringToUrl(url, method:HttpMethods.Post, contentType: MimeTypes.FormUrlEncoded, requestBody: formData, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -109,7 +130,7 @@ public static Task PostToUrlAsync(this string url, string? formData = nu Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "POST", + return SendStringToUrlAsync(url, method:HttpMethods.Post, contentType: MimeTypes.FormUrlEncoded, requestBody: formData, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -119,7 +140,7 @@ public static string PostToUrl(this string url, object? formData = null, string { string? postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; - return SendStringToUrl(url, method: "POST", + return SendStringToUrl(url, method:HttpMethods.Post, contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -130,7 +151,7 @@ public static Task PostToUrlAsync(this string url, object? formData = nu { string? postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; - return SendStringToUrlAsync(url, method: "POST", + return SendStringToUrlAsync(url, method:HttpMethods.Post, contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -138,7 +159,7 @@ public static Task PostToUrlAsync(this string url, object? formData = nu public static string PostJsonToUrl(this string url, string json, Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "POST", requestBody: json, contentType: MimeTypes.Json, + return SendStringToUrl(url, method:HttpMethods.Post, requestBody: json, contentType: MimeTypes.Json, accept: MimeTypes.Json, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -147,7 +168,7 @@ public static Task PostJsonToUrlAsync(this string url, string json, Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "POST", requestBody: json, contentType: MimeTypes.Json, + return SendStringToUrlAsync(url, method:HttpMethods.Post, requestBody: json, contentType: MimeTypes.Json, accept: MimeTypes.Json, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -155,7 +176,7 @@ public static Task PostJsonToUrlAsync(this string url, string json, public static string PostJsonToUrl(this string url, object data, Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "POST", requestBody: data.ToJson(), contentType: MimeTypes.Json, + return SendStringToUrl(url, method:HttpMethods.Post, requestBody: data.ToJson(), contentType: MimeTypes.Json, accept: MimeTypes.Json, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -164,7 +185,7 @@ public static Task PostJsonToUrlAsync(this string url, object data, Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "POST", requestBody: data.ToJson(), contentType: MimeTypes.Json, + return SendStringToUrlAsync(url, method:HttpMethods.Post, requestBody: data.ToJson(), contentType: MimeTypes.Json, accept: MimeTypes.Json, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -172,7 +193,7 @@ public static Task PostJsonToUrlAsync(this string url, object data, public static string PostXmlToUrl(this string url, string xml, Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "POST", requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, + return SendStringToUrl(url, method:HttpMethods.Post, requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -180,7 +201,7 @@ public static Task PostXmlToUrlAsync(this string url, string xml, Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "POST", requestBody: xml, contentType: MimeTypes.Xml, + return SendStringToUrlAsync(url, method:HttpMethods.Post, requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -188,7 +209,7 @@ public static Task PostXmlToUrlAsync(this string url, string xml, public static string PostCsvToUrl(this string url, string csv, Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "POST", requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, + return SendStringToUrl(url, method:HttpMethods.Post, requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -196,7 +217,7 @@ public static Task PostCsvToUrlAsync(this string url, string csv, Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "POST", requestBody: csv, contentType: MimeTypes.Csv, + return SendStringToUrlAsync(url, method:HttpMethods.Post, requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -205,7 +226,7 @@ public static string PutStringToUrl(this string url, string? requestBody = null, string? contentType = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "PUT", + return SendStringToUrl(url, method:HttpMethods.Put, requestBody: requestBody, contentType: contentType, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -215,7 +236,7 @@ public static Task PutStringToUrlAsync(this string url, string? requestB Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "PUT", + return SendStringToUrlAsync(url, method:HttpMethods.Put, requestBody: requestBody, contentType: contentType, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -223,7 +244,7 @@ public static Task PutStringToUrlAsync(this string url, string? requestB public static string PutToUrl(this string url, string? formData = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "PUT", + return SendStringToUrl(url, method:HttpMethods.Put, contentType: MimeTypes.FormUrlEncoded, requestBody: formData, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -232,7 +253,7 @@ public static Task PutToUrlAsync(this string url, string? formData = nul Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "PUT", + return SendStringToUrlAsync(url, method:HttpMethods.Put, contentType: MimeTypes.FormUrlEncoded, requestBody: formData, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -242,7 +263,7 @@ public static string PutToUrl(this string url, object? formData = null, string a { string? postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; - return SendStringToUrl(url, method: "PUT", + return SendStringToUrl(url, method:HttpMethods.Put, contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -253,7 +274,7 @@ public static Task PutToUrlAsync(this string url, object? formData = nul { string? postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; - return SendStringToUrlAsync(url, method: "PUT", + return SendStringToUrlAsync(url, method:HttpMethods.Put, contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -261,7 +282,7 @@ public static Task PutToUrlAsync(this string url, object? formData = nul public static string PutJsonToUrl(this string url, string json, Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "PUT", requestBody: json, contentType: MimeTypes.Json, + return SendStringToUrl(url, method:HttpMethods.Put, requestBody: json, contentType: MimeTypes.Json, accept: MimeTypes.Json, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -270,7 +291,7 @@ public static Task PutJsonToUrlAsync(this string url, string json, Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "PUT", requestBody: json, contentType: MimeTypes.Json, + return SendStringToUrlAsync(url, method:HttpMethods.Put, requestBody: json, contentType: MimeTypes.Json, accept: MimeTypes.Json, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -278,7 +299,7 @@ public static Task PutJsonToUrlAsync(this string url, string json, public static string PutJsonToUrl(this string url, object data, Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "PUT", requestBody: data.ToJson(), contentType: MimeTypes.Json, + return SendStringToUrl(url, method:HttpMethods.Put, requestBody: data.ToJson(), contentType: MimeTypes.Json, accept: MimeTypes.Json, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -287,7 +308,7 @@ public static Task PutJsonToUrlAsync(this string url, object data, Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "PUT", requestBody: data.ToJson(), contentType: MimeTypes.Json, + return SendStringToUrlAsync(url, method:HttpMethods.Put, requestBody: data.ToJson(), contentType: MimeTypes.Json, accept: MimeTypes.Json, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -295,7 +316,7 @@ public static Task PutJsonToUrlAsync(this string url, object data, public static string PutXmlToUrl(this string url, string xml, Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "PUT", requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, + return SendStringToUrl(url, method:HttpMethods.Put, requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -303,7 +324,7 @@ public static Task PutXmlToUrlAsync(this string url, string xml, Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "PUT", requestBody: xml, contentType: MimeTypes.Xml, + return SendStringToUrlAsync(url, method:HttpMethods.Put, requestBody: xml, contentType: MimeTypes.Xml, accept: MimeTypes.Xml, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -311,7 +332,7 @@ public static Task PutXmlToUrlAsync(this string url, string xml, public static string PutCsvToUrl(this string url, string csv, Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "PUT", requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, + return SendStringToUrl(url, method:HttpMethods.Put, requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -319,7 +340,7 @@ public static Task PutCsvToUrlAsync(this string url, string csv, Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "PUT", requestBody: csv, contentType: MimeTypes.Csv, + return SendStringToUrlAsync(url, method:HttpMethods.Put, requestBody: csv, contentType: MimeTypes.Csv, accept: MimeTypes.Csv, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -328,7 +349,7 @@ public static string PatchStringToUrl(this string url, string? requestBody = nul string? contentType = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "PATCH", + return SendStringToUrl(url, method:HttpMethods.Patch, requestBody: requestBody, contentType: contentType, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -338,7 +359,7 @@ public static Task PatchStringToUrlAsync(this string url, string? reques Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "PATCH", + return SendStringToUrlAsync(url, method:HttpMethods.Patch, requestBody: requestBody, contentType: contentType, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -346,7 +367,7 @@ public static Task PatchStringToUrlAsync(this string url, string? reques public static string PatchToUrl(this string url, string? formData = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "PATCH", + return SendStringToUrl(url, method:HttpMethods.Patch, contentType: MimeTypes.FormUrlEncoded, requestBody: formData, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -355,7 +376,7 @@ public static Task PatchToUrlAsync(this string url, string? formData = n Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "PATCH", + return SendStringToUrlAsync(url, method:HttpMethods.Patch, contentType: MimeTypes.FormUrlEncoded, requestBody: formData, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -365,7 +386,7 @@ public static string PatchToUrl(this string url, object? formData = null, string { string? postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; - return SendStringToUrl(url, method: "PATCH", + return SendStringToUrl(url, method:HttpMethods.Patch, contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -376,7 +397,7 @@ public static Task PatchToUrlAsync(this string url, object? formData = n { string? postFormData = formData != null ? QueryStringSerializer.SerializeToString(formData) : null; - return SendStringToUrlAsync(url, method: "PATCH", + return SendStringToUrlAsync(url, method:HttpMethods.Patch, contentType: MimeTypes.FormUrlEncoded, requestBody: postFormData, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -384,7 +405,7 @@ public static Task PatchToUrlAsync(this string url, object? formData = n public static string PatchJsonToUrl(this string url, string json, Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "PATCH", requestBody: json, contentType: MimeTypes.Json, + return SendStringToUrl(url, method:HttpMethods.Patch, requestBody: json, contentType: MimeTypes.Json, accept: MimeTypes.Json, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -393,7 +414,7 @@ public static Task PatchJsonToUrlAsync(this string url, string json, Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "PATCH", requestBody: json, contentType: MimeTypes.Json, + return SendStringToUrlAsync(url, method:HttpMethods.Patch, requestBody: json, contentType: MimeTypes.Json, accept: MimeTypes.Json, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -401,7 +422,7 @@ public static Task PatchJsonToUrlAsync(this string url, string json, public static string PatchJsonToUrl(this string url, object data, Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "PATCH", requestBody: data.ToJson(), contentType: MimeTypes.Json, + return SendStringToUrl(url, method:HttpMethods.Patch, requestBody: data.ToJson(), contentType: MimeTypes.Json, accept: MimeTypes.Json, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -410,7 +431,7 @@ public static Task PatchJsonToUrlAsync(this string url, object data, Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "PATCH", requestBody: data.ToJson(), contentType: MimeTypes.Json, + return SendStringToUrlAsync(url, method:HttpMethods.Patch, requestBody: data.ToJson(), contentType: MimeTypes.Json, accept: MimeTypes.Json, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -418,7 +439,7 @@ public static Task PatchJsonToUrlAsync(this string url, object data, public static string DeleteFromUrl(this string url, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "DELETE", accept: accept, requestFilter: requestFilter, + return SendStringToUrl(url, method:HttpMethods.Delete, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -426,14 +447,14 @@ public static Task DeleteFromUrlAsync(this string url, string accept = " Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "DELETE", accept: accept, requestFilter: requestFilter, + return SendStringToUrlAsync(url, method:HttpMethods.Delete, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string OptionsFromUrl(this string url, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "OPTIONS", accept: accept, requestFilter: requestFilter, + return SendStringToUrl(url, method:HttpMethods.Options, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -441,14 +462,14 @@ public static Task OptionsFromUrlAsync(this string url, string accept = Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "OPTIONS", accept: accept, requestFilter: requestFilter, + return SendStringToUrlAsync(url, method:HttpMethods.Options, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static string HeadFromUrl(this string url, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "HEAD", accept: accept, requestFilter: requestFilter, + return SendStringToUrl(url, method:HttpMethods.Head, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -456,15 +477,21 @@ public static Task HeadFromUrlAsync(this string url, string accept = "*/ Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStringToUrlAsync(url, method: "HEAD", accept: accept, requestFilter: requestFilter, + return SendStringToUrlAsync(url, method:HttpMethods.Head, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } - + public static string SendStringToUrl(this string url, string method = HttpMethods.Post, string? requestBody = null, string? contentType = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - var client = ClientFactory(url); + return Create().SendStringToUrl(url, method, requestBody, contentType, accept, requestFilter, responseFilter); + } + + public static string SendStringToUrl(this HttpClient client, string url, string method = HttpMethods.Post, + string? requestBody = null, string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { var httpReq = new HttpRequestMessage(new HttpMethod(method), url); httpReq.Headers.Add(HttpHeaders.Accept, accept); @@ -482,12 +509,20 @@ public static string SendStringToUrl(this string url, string method = HttpMethod return httpRes.Content.ReadAsStream().ReadToEnd(UseEncoding); } - public static async Task SendStringToUrlAsync(this string url, string method = HttpMethods.Post, + public static Task SendStringToUrlAsync(this string url, + string method = HttpMethods.Post, string? requestBody = null, + string? contentType = null, string accept = "*/*", Action? requestFilter = null, + Action? responseFilter = null, CancellationToken token = default) + { + return Create().SendStringToUrlAsync(url, method, requestBody, contentType, accept, + requestFilter, responseFilter, token); + } + + public static async Task SendStringToUrlAsync(this HttpClient client, string url, string method = HttpMethods.Post, string? requestBody = null, string? contentType = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - var client = ClientFactory(url); var httpReq = new HttpRequestMessage(new HttpMethod(method), url); httpReq.Headers.Add(HttpHeaders.Accept, accept); @@ -523,7 +558,7 @@ public static byte[] PostBytesToUrl(this string url, byte[]? requestBody = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return SendBytesToUrl(url, method: "POST", + return SendBytesToUrl(url, method:HttpMethods.Post, contentType: contentType, requestBody: requestBody, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -533,7 +568,7 @@ public static Task PostBytesToUrlAsync(this string url, byte[]? requestB Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendBytesToUrlAsync(url, method: "POST", + return SendBytesToUrlAsync(url, method:HttpMethods.Post, contentType: contentType, requestBody: requestBody, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -542,7 +577,7 @@ public static byte[] PutBytesToUrl(this string url, byte[]? requestBody = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return SendBytesToUrl(url, method: "PUT", + return SendBytesToUrl(url, method:HttpMethods.Put, contentType: contentType, requestBody: requestBody, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -552,7 +587,7 @@ public static Task PutBytesToUrlAsync(this string url, byte[]? requestBo Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendBytesToUrlAsync(url, method: "PUT", + return SendBytesToUrlAsync(url, method:HttpMethods.Put, contentType: contentType, requestBody: requestBody, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -561,7 +596,14 @@ public static byte[] SendBytesToUrl(this string url, string method = HttpMethods byte[]? requestBody = null, string? contentType = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - var client = ClientFactory(url); + return Create().SendBytesToUrl(url, method, requestBody, contentType, accept, + requestFilter, responseFilter); + } + + public static byte[] SendBytesToUrl(this HttpClient client, string url, string method = HttpMethods.Post, + byte[]? requestBody = null, string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { var httpReq = new HttpRequestMessage(new HttpMethod(method), url); httpReq.Headers.Add(HttpHeaders.Accept, accept); @@ -579,12 +621,20 @@ public static byte[] SendBytesToUrl(this string url, string method = HttpMethods return httpRes.Content.ReadAsStream().ReadFully(); } - public static async Task SendBytesToUrlAsync(this string url, string method = HttpMethods.Post, + public static Task SendBytesToUrlAsync(this string url, string method = HttpMethods.Post, + byte[]? requestBody = null, string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return Create().SendBytesToUrlAsync(url, method, requestBody, contentType, accept, + requestFilter, responseFilter, token); + } + + public static async Task SendBytesToUrlAsync(this HttpClient client, string url, string method = HttpMethods.Post, byte[]? requestBody = null, string? contentType = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - var client = ClientFactory(url); var httpReq = new HttpRequestMessage(new HttpMethod(method), url); httpReq.Headers.Add(HttpHeaders.Accept, accept); @@ -620,7 +670,7 @@ public static Stream PostStreamToUrl(this string url, Stream? requestBody = null string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return SendStreamToUrl(url, method: "POST", + return SendStreamToUrl(url, method:HttpMethods.Post, contentType: contentType, requestBody: requestBody, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -630,7 +680,7 @@ public static Task PostStreamToUrlAsync(this string url, Stream? request Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStreamToUrlAsync(url, method: "POST", + return SendStreamToUrlAsync(url, method:HttpMethods.Post, contentType: contentType, requestBody: requestBody, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -639,7 +689,7 @@ public static Stream PutStreamToUrl(this string url, Stream? requestBody = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return SendStreamToUrl(url, method: "PUT", + return SendStreamToUrl(url, method:HttpMethods.Put, contentType: contentType, requestBody: requestBody, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -649,19 +699,23 @@ public static Task PutStreamToUrlAsync(this string url, Stream? requestB Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return SendStreamToUrlAsync(url, method: "PUT", + return SendStreamToUrlAsync(url, method:HttpMethods.Put, contentType: contentType, requestBody: requestBody, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } - /// - /// Returns HttpWebResponse Stream which must be disposed - /// public static Stream SendStreamToUrl(this string url, string method = HttpMethods.Post, Stream? requestBody = null, string? contentType = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - var client = ClientFactory(url); + return Create().SendStreamToUrl(url, method, requestBody, contentType, accept, + requestFilter, responseFilter); + } + + public static Stream SendStreamToUrl(this HttpClient client, string url, string method = HttpMethods.Post, + Stream? requestBody = null, string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null) + { var httpReq = new HttpRequestMessage(new HttpMethod(method), url); httpReq.Headers.Add(HttpHeaders.Accept, accept); @@ -679,15 +733,20 @@ public static Stream SendStreamToUrl(this string url, string method = HttpMethod return httpRes.Content.ReadAsStream(); } - /// - /// Returns HttpWebResponse Stream which must be disposed - /// - public static async Task SendStreamToUrlAsync(this string url, string method = HttpMethods.Post, + public static Task SendStreamToUrlAsync(this string url, string method = HttpMethods.Post, + Stream? requestBody = null, string? contentType = null, string accept = "*/*", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return Create().SendStreamToUrlAsync(url, method, requestBody, contentType, accept, + requestFilter, responseFilter, token); + } + + public static async Task SendStreamToUrlAsync(this HttpClient client, string url, string method = HttpMethods.Post, Stream? requestBody = null, string? contentType = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - var client = ClientFactory(url); var httpReq = new HttpRequestMessage(new HttpMethod(method), url); httpReq.Headers.Add(HttpHeaders.Accept, accept); @@ -709,7 +768,7 @@ public static async Task SendStreamToUrlAsync(this string url, string me { try { - var client = ClientFactory(url); + var client = Create(); var httpReq = new HttpRequestMessage(new HttpMethod(HttpMethods.Get), url); httpReq.Headers.Add(HttpHeaders.Accept, "*/*"); var httpRes = client.Send(httpReq); @@ -723,7 +782,7 @@ public static async Task SendStreamToUrlAsync(this string url, string me public static HttpResponseMessage? GetErrorResponse(this string url) { - var client = ClientFactory(url); + var client = Create(); var httpReq = new HttpRequestMessage(new HttpMethod(HttpMethods.Get), url); httpReq.Headers.Add(HttpHeaders.Accept, "*/*"); var httpRes = client.Send(httpReq); @@ -734,7 +793,7 @@ public static async Task SendStreamToUrlAsync(this string url, string me public static async Task GetErrorResponseAsync(this string url, CancellationToken token=default) { - var client = ClientFactory(url); + var client = Create(); var httpReq = new HttpRequestMessage(new HttpMethod(HttpMethods.Get), url); httpReq.Headers.Add(HttpHeaders.Accept, "*/*"); var httpRes = await client.SendAsync(httpReq, token).ConfigAwait(); @@ -766,8 +825,17 @@ public static IEnumerable ReadLines(this HttpResponseMessage webRes) } } - public static HttpResponseMessage UploadFile(this HttpRequestMessage httpReq, Stream fileStream, string fileName, - string? mimeType = null, string accept = "*/*", string method = HttpMethods.Post, string field = "file", + public static HttpResponseMessage UploadFile(this HttpRequestMessage httpReq, Stream fileStream, + string fileName, string? mimeType = null, string accept = "*/*", string method = HttpMethods.Post, string field = "file", + Action? requestFilter = null, Action? responseFilter = null) + { + return Create().UploadFile(httpReq, fileStream, fileName, mimeType, accept, method, field, + requestFilter, responseFilter); + } + + + public static HttpResponseMessage UploadFile(this HttpClient client, HttpRequestMessage httpReq, Stream fileStream, + string fileName, string? mimeType = null, string accept = "*/*", string method = HttpMethods.Post, string field = "file", Action? requestFilter = null, Action? responseFilter = null) { if (httpReq.RequestUri == null) @@ -788,14 +856,24 @@ public static HttpResponseMessage UploadFile(this HttpRequestMessage httpReq, St fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(mimeType ?? MimeTypes.GetMimeType(fileName)); content.Add(fileContent, "file", fileName); - var client = ClientFactory(httpReq.RequestUri!.ToString()); var httpRes = client.Send(httpReq); responseFilter?.Invoke(httpRes); httpRes.EnsureSuccessStatusCode(); return httpRes; } - public static async Task UploadFileAsync(this HttpRequestMessage httpReq, Stream fileStream, string fileName, + public static Task UploadFileAsync(this HttpRequestMessage httpReq, Stream fileStream, + string fileName, + string? mimeType = null, string accept = "*/*", string method = HttpMethods.Post, string field = "file", + Action? requestFilter = null, Action? responseFilter = null, + CancellationToken token = default) + { + return Create().UploadFileAsync(httpReq, fileStream, fileName, mimeType, accept, method, field, + requestFilter, responseFilter, token); + } + + public static async Task UploadFileAsync(this HttpClient client, + HttpRequestMessage httpReq, Stream fileStream, string fileName, string? mimeType = null, string accept = "*/*", string method = HttpMethods.Post, string field = "file", Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) @@ -818,7 +896,6 @@ public static async Task UploadFileAsync(this HttpRequestMe fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(mimeType ?? MimeTypes.GetMimeType(fileName)); content.Add(fileContent, "file", fileName); - var client = ClientFactory(httpReq.RequestUri!.ToString()); var httpRes = await client.SendAsync(httpReq, token).ConfigAwait(); responseFilter?.Invoke(httpRes); httpRes.EnsureSuccessStatusCode(); @@ -851,7 +928,7 @@ public static async Task UploadFileAsync(this HttpRequestMessage webRequest, Str public static string PostXmlToUrl(this string url, object data, Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "POST", requestBody: data.ToXml(), contentType: MimeTypes.Xml, + return SendStringToUrl(url, method:HttpMethods.Post, requestBody: data.ToXml(), contentType: MimeTypes.Xml, accept: MimeTypes.Xml, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -859,7 +936,7 @@ public static string PostXmlToUrl(this string url, object data, public static string PostCsvToUrl(this string url, object data, Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "POST", requestBody: data.ToCsv(), contentType: MimeTypes.Csv, + return SendStringToUrl(url, method:HttpMethods.Post, requestBody: data.ToCsv(), contentType: MimeTypes.Csv, accept: MimeTypes.Csv, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -867,7 +944,7 @@ public static string PostCsvToUrl(this string url, object data, public static string PutXmlToUrl(this string url, object data, Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "PUT", requestBody: data.ToXml(), contentType: MimeTypes.Xml, + return SendStringToUrl(url, method:HttpMethods.Put, requestBody: data.ToXml(), contentType: MimeTypes.Xml, accept: MimeTypes.Xml, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -875,7 +952,7 @@ public static string PutXmlToUrl(this string url, object data, public static string PutCsvToUrl(this string url, object data, Action? requestFilter = null, Action? responseFilter = null) { - return SendStringToUrl(url, method: "PUT", requestBody: data.ToCsv(), contentType: MimeTypes.Csv, + return SendStringToUrl(url, method:HttpMethods.Put, requestBody: data.ToCsv(), contentType: MimeTypes.Csv, accept: MimeTypes.Csv, requestFilter: requestFilter, responseFilter: responseFilter); } @@ -930,28 +1007,79 @@ public static async Task PutFileToUrlAsync(this string url, method: HttpMethods.Post, requestFilter: requestFilter, responseFilter: responseFilter, token: token).ConfigAwait(); } + public static string? GetHeader(this HttpRequestMessage res, string name) => + res.Headers.TryGetValues(name, out var values) ? values.FirstOrDefault() : null; + + public static string? GetHeader(this HttpResponseMessage res, string name) => + res.Headers.TryGetValues(name, out var values) ? values.FirstOrDefault() : null; + + public static HttpRequestMessage WithHeader(this HttpRequestMessage httpReq, string name, string value) + { + if (name.Equals(HttpHeaders.Authorization, StringComparison.OrdinalIgnoreCase)) + { + httpReq.Headers.Authorization = + new AuthenticationHeaderValue(value.LeftPart(' '), value.RightPart(' ')); + } + else if (name.Equals(HttpHeaders.UserAgent)) + { + if (value.IndexOf('/') >= 0) + { + var product = value.LastLeftPart('/'); + var version = value.LastRightPart('/'); + httpReq.Headers.UserAgent.Add(new ProductInfoHeaderValue(product, version)); + } + else + { + // Avoid format excetions + var commentFmt = value[0] == '(' && value[^1] == ')' ? value : $"({value})"; + httpReq.Headers.UserAgent.Add(new ProductInfoHeaderValue(commentFmt)); + } + } + else + { + httpReq.Headers.Add(name, value); + } + return httpReq; + } + public static HttpRequestMessage With(this HttpRequestMessage httpReq, string? accept = null, string? userAgent = null, - Dictionary? headers = null) + KeyValuePair? authorization = null, + Dictionary? headers = null) { + headers ??= new Dictionary(); + if (accept != null) - httpReq.Headers.Add(HttpHeaders.Accept, accept); - + headers[HttpHeaders.Accept] = accept; if (userAgent != null) - httpReq.Headers.UserAgent.Add(new ProductInfoHeaderValue(userAgent)); + headers[HttpHeaders.UserAgent] = userAgent; + if (authorization != null) + httpReq.Headers.Authorization = + new AuthenticationHeaderValue(authorization.Value.Key, authorization.Value.Value); - if (headers != null) + foreach (var entry in headers) { - foreach (var entry in headers) - { - httpReq.Headers.Add(entry.Key, entry.Value); - } + httpReq.WithHeader(entry.Key, entry.Value); } return httpReq; } - + + public static void DownloadFileTo(this string downloadUrl, string fileName, + Dictionary? headers = null) + { + var client = Create(); + var httpReq = new HttpRequestMessage(HttpMethod.Get, downloadUrl) + .With(accept:"*/*", headers:headers); + + var httpRes = client.Send(httpReq); + httpRes.EnsureSuccessStatusCode(); + + using var fs = new FileStream(fileName, FileMode.CreateNew); + var bytes = httpRes.Content.ReadAsStream().ReadFully(); + fs.Write(bytes); + } } #endif diff --git a/src/ServiceStack.Text/HttpUtils.WebRequest.cs b/src/ServiceStack.Text/HttpUtils.WebRequest.cs index d368f4f60..eedfd66fa 100644 --- a/src/ServiceStack.Text/HttpUtils.WebRequest.cs +++ b/src/ServiceStack.Text/HttpUtils.WebRequest.cs @@ -1073,9 +1073,29 @@ private static byte[] GetHeaderBytes(string fileName, string mimeType, string fi return headerBytes; } + public static string GetHeader(this HttpWebRequest res, string name) => + res.Headers.Get(name); + public static string GetHeader(this HttpWebResponse res, string name) => + res.Headers.Get(name); + + public static void DownloadFileTo(this string downloadUrl, string fileName, + Dictionary headers = null) + { + var webClient = new WebClient(); + if (headers != null) + { + foreach (var entry in headers) + { + webClient.Headers[entry.Key] = entry.Value; + } + } + webClient.DownloadFile(downloadUrl, fileName); + } + public static HttpWebRequest With(this HttpWebRequest httpReq, string accept = null, string userAgent = null, + KeyValuePair? authorization = null, Dictionary headers = null) { if (accept != null) @@ -1084,6 +1104,11 @@ public static HttpWebRequest With(this HttpWebRequest httpReq, if (userAgent != null) httpReq.UserAgent = userAgent; + if (authorization != null) + { + httpReq.Headers[HttpHeaders.Authorization] = authorization.Value.Key + " " + authorization.Value.Value; + } + if (headers != null) { foreach (var entry in headers) diff --git a/tests/ServiceStack.Text.Tests/UseCases/GithubV3ApiTests.cs b/tests/ServiceStack.Text.Tests/UseCases/GithubV3ApiTests.cs index a08107de5..0c891ca67 100644 --- a/tests/ServiceStack.Text.Tests/UseCases/GithubV3ApiTests.cs +++ b/tests/ServiceStack.Text.Tests/UseCases/GithubV3ApiTests.cs @@ -36,8 +36,9 @@ public class GithubV3ApiGateway public T GetJson(string route, params object[] routeArgs) { - return GithubApiBaseUrl.AppendPath(route.Fmt(routeArgs)) - .GetJsonFromUrl(requestFilter:x => x.With(userAgent:"ServiceStack.Text.Tests")) + var url = GithubApiBaseUrl.AppendUrlPathsRaw(route.Fmt(routeArgs)); + return url + .GetJsonFromUrl(requestFilter:x => x.With(userAgent:$"ServiceStack/{Env.VersionString}")) .FromJson(); } From bd47922689bb6cd29b7004782e12b4ef50e4726c Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 29 Jan 2022 10:10:58 +0800 Subject: [PATCH 342/372] Replace With to use more flexible + binary resilient HttpRequestConfig --- src/ServiceStack.Text/HttpRequestConfig.cs | 27 ++++++ src/ServiceStack.Text/HttpStatus.cs | 90 +++++++++++++++++++ src/ServiceStack.Text/HttpUtils.HttpClient.cs | 48 ++++++---- src/ServiceStack.Text/HttpUtils.WebRequest.cs | 51 ++++++----- .../UseCases/GithubV3ApiTests.cs | 2 +- 5 files changed, 179 insertions(+), 39 deletions(-) create mode 100644 src/ServiceStack.Text/HttpRequestConfig.cs create mode 100644 src/ServiceStack.Text/HttpStatus.cs diff --git a/src/ServiceStack.Text/HttpRequestConfig.cs b/src/ServiceStack.Text/HttpRequestConfig.cs new file mode 100644 index 000000000..5195519b9 --- /dev/null +++ b/src/ServiceStack.Text/HttpRequestConfig.cs @@ -0,0 +1,27 @@ +#nullable enable + +using System; +using System.Collections.Generic; +using System.Text; + +namespace ServiceStack; + +public class HttpRequestConfig +{ + public string? Accept { get; set; } + public string? UserAgent { get; set; } + public string? ContentType { get; set; } + public KeyValuePair? Authorization { get; set; } + public Dictionary? Headers { get; set; } + + public string AuthBearer + { + set => Authorization = new("Bearer", value); + } + + public KeyValuePair AuthBasic + { + set => Authorization = new("Basic", + Convert.ToBase64String(Encoding.UTF8.GetBytes(value.Key + ":" + value.Value))); + } +} diff --git a/src/ServiceStack.Text/HttpStatus.cs b/src/ServiceStack.Text/HttpStatus.cs new file mode 100644 index 000000000..a60925b96 --- /dev/null +++ b/src/ServiceStack.Text/HttpStatus.cs @@ -0,0 +1,90 @@ +namespace ServiceStack.Text; + +public static class HttpStatus +{ + public static string GetStatusDescription(int statusCode) + { + if (statusCode is >= 100 and < 600) + { + int i = statusCode / 100; + int j = statusCode % 100; + + if (j < Descriptions[i].Length) + return Descriptions[i][j]; + } + + return string.Empty; + } + + private static readonly string[][] Descriptions = + { + null, + new[] + { + /* 100 */ "Continue", + /* 101 */ "Switching Protocols", + /* 102 */ "Processing" + }, + new[] + { + /* 200 */ "OK", + /* 201 */ "Created", + /* 202 */ "Accepted", + /* 203 */ "Non-Authoritative Information", + /* 204 */ "No Content", + /* 205 */ "Reset Content", + /* 206 */ "Partial Content", + /* 207 */ "Multi-Status" + }, + new[] + { + /* 300 */ "Multiple Choices", + /* 301 */ "Moved Permanently", + /* 302 */ "Found", + /* 303 */ "See Other", + /* 304 */ "Not Modified", + /* 305 */ "Use Proxy", + /* 306 */ string.Empty, + /* 307 */ "Temporary Redirect" + }, + new[] + { + /* 400 */ "Bad Request", + /* 401 */ "Unauthorized", + /* 402 */ "Payment Required", + /* 403 */ "Forbidden", + /* 404 */ "Not Found", + /* 405 */ "Method Not Allowed", + /* 406 */ "Not Acceptable", + /* 407 */ "Proxy Authentication Required", + /* 408 */ "Request Timeout", + /* 409 */ "Conflict", + /* 410 */ "Gone", + /* 411 */ "Length Required", + /* 412 */ "Precondition Failed", + /* 413 */ "Request Entity Too Large", + /* 414 */ "Request-Uri Too Long", + /* 415 */ "Unsupported Media Type", + /* 416 */ "Requested Range Not Satisfiable", + /* 417 */ "Expectation Failed", + /* 418 */ string.Empty, + /* 419 */ string.Empty, + /* 420 */ string.Empty, + /* 421 */ string.Empty, + /* 422 */ "Unprocessable Entity", + /* 423 */ "Locked", + /* 424 */ "Failed Dependency" + }, + new[] + { + /* 500 */ "Internal Server Error", + /* 501 */ "Not Implemented", + /* 502 */ "Bad Gateway", + /* 503 */ "Service Unavailable", + /* 504 */ "Gateway Timeout", + /* 505 */ "Http Version Not Supported", + /* 506 */ string.Empty, + /* 507 */ "Insufficient Storage" + } + }; +} \ No newline at end of file diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index 8f3db9b9e..7038f276f 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -1007,6 +1007,9 @@ public static async Task PutFileToUrlAsync(this string url, method: HttpMethods.Post, requestFilter: requestFilter, responseFilter: responseFilter, token: token).ConfigAwait(); } + public static void AddHeader(this HttpRequestMessage res, string name, string value) => + res.WithHeader(name, value); + public static string? GetHeader(this HttpRequestMessage res, string name) => res.Headers.TryGetValues(name, out var values) ? values.FirstOrDefault() : null; @@ -1020,7 +1023,13 @@ public static HttpRequestMessage WithHeader(this HttpRequestMessage httpReq, str httpReq.Headers.Authorization = new AuthenticationHeaderValue(value.LeftPart(' '), value.RightPart(' ')); } - else if (name.Equals(HttpHeaders.UserAgent)) + else if (name.Equals(HttpHeaders.ContentType, StringComparison.OrdinalIgnoreCase)) + { + if (httpReq.Content == null) + throw new NotSupportedException("Can't set ContentType before Content is populated"); + httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(value); + } + else if (name.Equals(HttpHeaders.UserAgent, StringComparison.OrdinalIgnoreCase)) { if (value.IndexOf('/') >= 0) { @@ -1030,7 +1039,7 @@ public static HttpRequestMessage WithHeader(this HttpRequestMessage httpReq, str } else { - // Avoid format excetions + // Avoid format exceptions var commentFmt = value[0] == '(' && value[^1] == ')' ? value : $"({value})"; httpReq.Headers.UserAgent.Add(new ProductInfoHeaderValue(commentFmt)); } @@ -1042,22 +1051,24 @@ public static HttpRequestMessage WithHeader(this HttpRequestMessage httpReq, str return httpReq; } - public static HttpRequestMessage With(this HttpRequestMessage httpReq, - string? accept = null, - string? userAgent = null, - KeyValuePair? authorization = null, - Dictionary? headers = null) + public static HttpRequestMessage With(this HttpRequestMessage httpReq, Action configure) { - headers ??= new Dictionary(); - - if (accept != null) - headers[HttpHeaders.Accept] = accept; - if (userAgent != null) - headers[HttpHeaders.UserAgent] = userAgent; - if (authorization != null) + var config = new HttpRequestConfig(); + configure(config); + + config.Headers ??= new Dictionary(); + var headers = config.Headers; + + if (config.Accept != null) + headers[HttpHeaders.Accept] = config.Accept; + if (config.UserAgent != null) + headers[HttpHeaders.UserAgent] = config.UserAgent; + if (config.ContentType != null) + headers[HttpHeaders.ContentType] = config.ContentType; + if (config.Authorization != null) httpReq.Headers.Authorization = - new AuthenticationHeaderValue(authorization.Value.Key, authorization.Value.Value); - + new AuthenticationHeaderValue(config.Authorization.Value.Key, config.Authorization.Value.Value); + foreach (var entry in headers) { httpReq.WithHeader(entry.Key, entry.Value); @@ -1071,7 +1082,10 @@ public static void DownloadFileTo(this string downloadUrl, string fileName, { var client = Create(); var httpReq = new HttpRequestMessage(HttpMethod.Get, downloadUrl) - .With(accept:"*/*", headers:headers); + .With(c => { + c.Accept = "*/*"; + c.Headers = headers; + }); var httpRes = client.Send(httpReq); httpRes.EnsureSuccessStatusCode(); diff --git a/src/ServiceStack.Text/HttpUtils.WebRequest.cs b/src/ServiceStack.Text/HttpUtils.WebRequest.cs index eedfd66fa..41685d848 100644 --- a/src/ServiceStack.Text/HttpUtils.WebRequest.cs +++ b/src/ServiceStack.Text/HttpUtils.WebRequest.cs @@ -1073,11 +1073,6 @@ private static byte[] GetHeaderBytes(string fileName, string mimeType, string fi return headerBytes; } - public static string GetHeader(this HttpWebRequest res, string name) => - res.Headers.Get(name); - public static string GetHeader(this HttpWebResponse res, string name) => - res.Headers.Get(name); - public static void DownloadFileTo(this string downloadUrl, string fileName, Dictionary headers = null) { @@ -1091,27 +1086,41 @@ public static void DownloadFileTo(this string downloadUrl, string fileName, } webClient.DownloadFile(downloadUrl, fileName); } - - public static HttpWebRequest With(this HttpWebRequest httpReq, - string accept = null, - string userAgent = null, - KeyValuePair? authorization = null, - Dictionary headers = null) + + public static void AddHeader(this HttpWebRequest res, string name, string value) => + res.Headers[name] = value; + public static string GetHeader(this HttpWebRequest res, string name) => + res.Headers.Get(name); + public static string GetHeader(this HttpWebResponse res, string name) => + res.Headers.Get(name); + + public static HttpWebRequest WithHeader(this HttpWebRequest httpReq, string name, string value) { - if (accept != null) - httpReq.Headers.Add(HttpHeaders.Accept, accept); + httpReq.Headers[name] = value; + return httpReq; + } + + public static HttpWebRequest With(this HttpWebRequest httpReq, Action configure) + { + var config = new HttpRequestConfig(); + configure(config); + + if (config.Accept != null) + httpReq.Headers.Add(HttpHeaders.Accept, config.Accept); - if (userAgent != null) - httpReq.UserAgent = userAgent; + if (config.UserAgent != null) + httpReq.UserAgent = config.UserAgent; - if (authorization != null) - { - httpReq.Headers[HttpHeaders.Authorization] = authorization.Value.Key + " " + authorization.Value.Value; - } + if (config.ContentType != null) + httpReq.ContentType = config.ContentType; - if (headers != null) + if (config.Authorization != null) + httpReq.Headers[HttpHeaders.Authorization] = + config.Authorization.Value.Key + " " + config.Authorization.Value.Value; + + if (config.Headers != null) { - foreach (var entry in headers) + foreach (var entry in config.Headers) { httpReq.Headers[entry.Key] = entry.Value; } diff --git a/tests/ServiceStack.Text.Tests/UseCases/GithubV3ApiTests.cs b/tests/ServiceStack.Text.Tests/UseCases/GithubV3ApiTests.cs index 0c891ca67..5df6bc232 100644 --- a/tests/ServiceStack.Text.Tests/UseCases/GithubV3ApiTests.cs +++ b/tests/ServiceStack.Text.Tests/UseCases/GithubV3ApiTests.cs @@ -38,7 +38,7 @@ public T GetJson(string route, params object[] routeArgs) { var url = GithubApiBaseUrl.AppendUrlPathsRaw(route.Fmt(routeArgs)); return url - .GetJsonFromUrl(requestFilter:x => x.With(userAgent:$"ServiceStack/{Env.VersionString}")) + .GetJsonFromUrl(requestFilter:x => x.With(c => c.UserAgent = $"ServiceStack/{Env.VersionString}")) .FromJson(); } From e89af4c45d8d05722dd1703b8cce7fab96402f81 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 02:23:41 +0800 Subject: [PATCH 343/372] bump to v6.0.2 --- src/Directory.Build.props | 2 +- src/ServiceStack.Text/Env.cs | 2 +- tests/Directory.Build.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index a118be095..6bfa3e383 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 6.0.0 + 6.0.2 ServiceStack ServiceStack, Inc. © 2008-2022 ServiceStack, Inc diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 257d5db63..3cc38fea5 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -114,7 +114,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 6.01m; + public static decimal ServiceStackVersion = 6.02m; public static bool IsLinux { get; set; } diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 187fbd040..046281905 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 6.0.0 + 6.0.2 latest false From ccb18764ef55acacd6cd63c7e0238456fce3a1ce Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 03:06:47 +0800 Subject: [PATCH 344/372] Update HttpUtils.HttpClient.cs --- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index 7038f276f..e986414c7 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -1012,9 +1012,28 @@ public static void AddHeader(this HttpRequestMessage res, string name, string va public static string? GetHeader(this HttpRequestMessage res, string name) => res.Headers.TryGetValues(name, out var values) ? values.FirstOrDefault() : null; - - public static string? GetHeader(this HttpResponseMessage res, string name) => - res.Headers.TryGetValues(name, out var values) ? values.FirstOrDefault() : null; + + public static Dictionary> HeadersResolver { get; set; } = new(StringComparer.OrdinalIgnoreCase) + { + [HttpHeaders.ContentType] = res => res.Content.Headers.ContentType?.MediaType, + [HttpHeaders.Expires] = res => res.Content.Headers.Expires?.ToString(), + [HttpHeaders.ContentDisposition] = res => res.Content.Headers.ContentDisposition?.ToString(), + [HttpHeaders.ContentEncoding] = res => res.Content.Headers.ContentEncoding?.ToString(), + [HttpHeaders.ContentLength] = res => res.Content.Headers.ContentLength?.ToString(), + [HttpHeaders.ETag] = res => res.Headers.ETag?.Tag.ToString(), + [HttpHeaders.Vary] = res => string.Join(',', res.Headers.Vary), + [HttpHeaders.CacheControl] = res => res.Headers.CacheControl?.ToString(), + }; + + public static string? GetHeader(this HttpResponseMessage res, string name) + { + if (HeadersResolver.TryGetValue(name, out var fn)) + return fn(res); + + return res.Headers.TryGetValues(name, out var values) + ? values.FirstOrDefault() + : null; + } public static HttpRequestMessage WithHeader(this HttpRequestMessage httpReq, string name, string value) { From b8ac3c48f09e2739d09530e437cf472b18d97c71 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 10:26:20 +0800 Subject: [PATCH 345/372] Improve GetHeaders + Add MatchesContentType ext --- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 47 +++++++++++-------- src/ServiceStack.Text/HttpUtils.WebRequest.cs | 6 +++ .../UseCases/ServiceStack_Text_UseCase.cs | 19 ++++---- 3 files changed, 45 insertions(+), 27 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index e986414c7..353d08c46 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -1010,29 +1010,32 @@ public static async Task PutFileToUrlAsync(this string url, public static void AddHeader(this HttpRequestMessage res, string name, string value) => res.WithHeader(name, value); - public static string? GetHeader(this HttpRequestMessage res, string name) => - res.Headers.TryGetValues(name, out var values) ? values.FirstOrDefault() : null; - - public static Dictionary> HeadersResolver { get; set; } = new(StringComparer.OrdinalIgnoreCase) - { - [HttpHeaders.ContentType] = res => res.Content.Headers.ContentType?.MediaType, - [HttpHeaders.Expires] = res => res.Content.Headers.Expires?.ToString(), - [HttpHeaders.ContentDisposition] = res => res.Content.Headers.ContentDisposition?.ToString(), - [HttpHeaders.ContentEncoding] = res => res.Content.Headers.ContentEncoding?.ToString(), - [HttpHeaders.ContentLength] = res => res.Content.Headers.ContentLength?.ToString(), - [HttpHeaders.ETag] = res => res.Headers.ETag?.Tag.ToString(), - [HttpHeaders.Vary] = res => string.Join(',', res.Headers.Vary), - [HttpHeaders.CacheControl] = res => res.Headers.CacheControl?.ToString(), - }; + public static string? GetHeader(this HttpRequestMessage req, string name) + { + if (RequestHeadersResolver.TryGetValue(name, out var fn)) + return fn(req); + + return req.Headers.TryGetValues(name, out var headers) + ? headers.FirstOrDefault() + : req.Content?.Headers.TryGetValues(name, out var contentHeaders) == true + ? contentHeaders!.FirstOrDefault() + : null; + } + public static Dictionary> RequestHeadersResolver { get; set; } = new(StringComparer.OrdinalIgnoreCase) { + }; + public static Dictionary> ResponseHeadersResolver { get; set; } = new(StringComparer.OrdinalIgnoreCase) { + }; public static string? GetHeader(this HttpResponseMessage res, string name) { - if (HeadersResolver.TryGetValue(name, out var fn)) + if (ResponseHeadersResolver.TryGetValue(name, out var fn)) return fn(res); - - return res.Headers.TryGetValues(name, out var values) - ? values.FirstOrDefault() - : null; + + return res.Headers.TryGetValues(name, out var headers) + ? headers.FirstOrDefault() + : res.Content?.Headers.TryGetValues(name, out var contentHeaders) == true + ? contentHeaders!.FirstOrDefault() + : null; } public static HttpRequestMessage WithHeader(this HttpRequestMessage httpReq, string name, string value) @@ -1115,4 +1118,10 @@ public static void DownloadFileTo(this string downloadUrl, string fileName, } } +public static class HttpClientExt +{ + public static bool MatchesContentType(this HttpResponseMessage res, string matchesContentType) => + MimeTypes.MatchesContentType(res.GetHeader(HttpHeaders.ContentType), matchesContentType); +} + #endif diff --git a/src/ServiceStack.Text/HttpUtils.WebRequest.cs b/src/ServiceStack.Text/HttpUtils.WebRequest.cs index 41685d848..d504490ff 100644 --- a/src/ServiceStack.Text/HttpUtils.WebRequest.cs +++ b/src/ServiceStack.Text/HttpUtils.WebRequest.cs @@ -1181,4 +1181,10 @@ public void UploadStream(HttpWebRequest webRequest, Stream fileStream, string fi UploadFileFn?.Invoke(webRequest, fileStream, fileName); } } + +public static class HttpClientExt +{ + public static bool MatchesContentType(this HttpWebResponse res, string matchesContentType) => + MimeTypes.MatchesContentType(res.Headers[HttpHeaders.ContentType], matchesContentType); +} #endif diff --git a/tests/ServiceStack.Text.Tests/UseCases/ServiceStack_Text_UseCase.cs b/tests/ServiceStack.Text.Tests/UseCases/ServiceStack_Text_UseCase.cs index d881a8ab2..30a6922fc 100644 --- a/tests/ServiceStack.Text.Tests/UseCases/ServiceStack_Text_UseCase.cs +++ b/tests/ServiceStack.Text.Tests/UseCases/ServiceStack_Text_UseCase.cs @@ -1,5 +1,4 @@ -#if !NETCORE -using System.Collections.Generic; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using NUnit.Framework; @@ -25,18 +24,22 @@ public void Dump_and_Write_GitHub_Organization_Repos_to_CSV() { var orgName = "ServiceStack"; - var orgRepos = "https://api.github.com/orgs/{0}/repos".Fmt(orgName) - .GetJsonFromUrl(httpReq => httpReq.UserAgent = "ServiceStack.Text") + var orgRepos = $"https://api.github.com/orgs/{orgName}/repos" + .GetJsonFromUrl(req => req.With(c => c.UserAgent = "ServiceStack.Text"), + responseFilter: res => + { + var contentType = res.GetHeader(HttpHeaders.ContentType); + Assert.That(res.MatchesContentType(MimeTypes.Json)); + }) .FromJson>(); - "Writing {0} Github Repositories:".Print(orgName); + $"Writing {orgName} Github Repositories:".Print(); orgRepos.PrintDump(); //recursive, pretty-format dump of any C# POCOs - var csvFilePath = "~/{0}-repos.csv".Fmt(orgName).MapAbsolutePath(); + var csvFilePath = $"~/{orgName}-repos.csv".MapAbsolutePath(); File.WriteAllText(csvFilePath, orgRepos.ToCsv()); - Process.Start(csvFilePath); + if (Env.IsNetFramework) Process.Start(csvFilePath); } } } -#endif \ No newline at end of file From db2e1201b9f25887cf5657095b3759179b020e0a Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 10:45:03 +0800 Subject: [PATCH 346/372] Add GetContentLength() ext method --- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 3 +++ src/ServiceStack.Text/HttpUtils.WebRequest.cs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index 353d08c46..74712a740 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -1122,6 +1122,9 @@ public static class HttpClientExt { public static bool MatchesContentType(this HttpResponseMessage res, string matchesContentType) => MimeTypes.MatchesContentType(res.GetHeader(HttpHeaders.ContentType), matchesContentType); + + public static long? GetContentLength(this HttpResponseMessage res) => + res.Content.Headers.ContentLength; } #endif diff --git a/src/ServiceStack.Text/HttpUtils.WebRequest.cs b/src/ServiceStack.Text/HttpUtils.WebRequest.cs index d504490ff..aa5268739 100644 --- a/src/ServiceStack.Text/HttpUtils.WebRequest.cs +++ b/src/ServiceStack.Text/HttpUtils.WebRequest.cs @@ -1186,5 +1186,8 @@ public static class HttpClientExt { public static bool MatchesContentType(this HttpWebResponse res, string matchesContentType) => MimeTypes.MatchesContentType(res.Headers[HttpHeaders.ContentType], matchesContentType); + + public static long? GetContentLength(this HttpWebResponse res) => + res.ContentLength == -1 ? null : res.ContentLength; } #endif From 8c6929d8942a8c81e5bd161fe559e5cd80cacf34 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 10:53:29 +0800 Subject: [PATCH 347/372] Add code docs --- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 14 ++++++++++++++ src/ServiceStack.Text/HttpUtils.WebRequest.cs | 13 ++++++++++++- src/ServiceStack.Text/MimeTypes.cs | 5 +++-- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index 74712a740..504d84200 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -1010,6 +1010,9 @@ public static async Task PutFileToUrlAsync(this string url, public static void AddHeader(this HttpRequestMessage res, string name, string value) => res.WithHeader(name, value); + /// + /// Returns first Request Header in HttpRequestMessage Headers and Content.Headers + /// public static string? GetHeader(this HttpRequestMessage req, string name) { if (RequestHeadersResolver.TryGetValue(name, out var fn)) @@ -1026,6 +1029,10 @@ public static void AddHeader(this HttpRequestMessage res, string name, string va }; public static Dictionary> ResponseHeadersResolver { get; set; } = new(StringComparer.OrdinalIgnoreCase) { }; + + /// + /// Returns first Response Header in HttpResponseMessage Headers and Content.Headers + /// public static string? GetHeader(this HttpResponseMessage res, string name) { if (ResponseHeadersResolver.TryGetValue(name, out var fn)) @@ -1073,6 +1080,10 @@ public static HttpRequestMessage WithHeader(this HttpRequestMessage httpReq, str return httpReq; } + /// + /// Populate HttpRequestMessage with a simpler, untyped API + /// Syntax compatible with HttpWebRequest + /// public static HttpRequestMessage With(this HttpRequestMessage httpReq, Action configure) { var config = new HttpRequestConfig(); @@ -1120,6 +1131,9 @@ public static void DownloadFileTo(this string downloadUrl, string fileName, public static class HttpClientExt { + /// + /// Case-insensitive, trimmed compare of two content types from start to ';', i.e. without charset suffix + /// public static bool MatchesContentType(this HttpResponseMessage res, string matchesContentType) => MimeTypes.MatchesContentType(res.GetHeader(HttpHeaders.ContentType), matchesContentType); diff --git a/src/ServiceStack.Text/HttpUtils.WebRequest.cs b/src/ServiceStack.Text/HttpUtils.WebRequest.cs index aa5268739..a56e56c77 100644 --- a/src/ServiceStack.Text/HttpUtils.WebRequest.cs +++ b/src/ServiceStack.Text/HttpUtils.WebRequest.cs @@ -1100,6 +1100,10 @@ public static HttpWebRequest WithHeader(this HttpWebRequest httpReq, string name return httpReq; } + /// + /// Populate HttpRequestMessage with a simpler, untyped API + /// Syntax compatible with HttpClient's HttpRequestMessage + /// public static HttpWebRequest With(this HttpWebRequest httpReq, Action configure) { var config = new HttpRequestConfig(); @@ -1184,9 +1188,16 @@ public void UploadStream(HttpWebRequest webRequest, Stream fileStream, string fi public static class HttpClientExt { + /// + /// Case-insensitive, trimmed compare of two content types from start to ';', i.e. without charset suffix + /// public static bool MatchesContentType(this HttpWebResponse res, string matchesContentType) => MimeTypes.MatchesContentType(res.Headers[HttpHeaders.ContentType], matchesContentType); - + + /// + /// Returns null for unknown Content-length + /// Syntax + Behavior compatible with HttpClient HttpResponseMessage + /// public static long? GetContentLength(this HttpWebResponse res) => res.ContentLength == -1 ? null : res.ContentLength; } diff --git a/src/ServiceStack.Text/MimeTypes.cs b/src/ServiceStack.Text/MimeTypes.cs index bd9e5430e..4dfe3b122 100644 --- a/src/ServiceStack.Text/MimeTypes.cs +++ b/src/ServiceStack.Text/MimeTypes.cs @@ -94,8 +94,9 @@ public static string GetRealContentType(string contentType) : null; } - //Compares two string from start to ';' char, case-insensitive, - //ignoring (trimming) spaces at start and end + /// + /// Case-insensitive, trimmed compare of two content types from start to ';', i.e. without charset suffix + /// public static bool MatchesContentType(string contentType, string matchesContentType) { if (contentType == null || matchesContentType == null) From 2d7eacc6b7c551a656e2e17183643b1b3de24116 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 11:59:32 +0800 Subject: [PATCH 348/372] refactor HttpRequestConfig to use typed records --- src/ServiceStack.Text/HttpRequestConfig.cs | 45 +++++++++++++++++-- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 17 +++---- src/ServiceStack.Text/HttpUtils.WebRequest.cs | 40 +++++++++++++---- src/ServiceStack.Text/PclExport.cs | 5 --- 4 files changed, 81 insertions(+), 26 deletions(-) diff --git a/src/ServiceStack.Text/HttpRequestConfig.cs b/src/ServiceStack.Text/HttpRequestConfig.cs index 5195519b9..516cadd5d 100644 --- a/src/ServiceStack.Text/HttpRequestConfig.cs +++ b/src/ServiceStack.Text/HttpRequestConfig.cs @@ -11,17 +11,54 @@ public class HttpRequestConfig public string? Accept { get; set; } public string? UserAgent { get; set; } public string? ContentType { get; set; } - public KeyValuePair? Authorization { get; set; } - public Dictionary? Headers { get; set; } + public HttpHeader? Authorization { get; set; } + public RangeHeader? Range { get; set; } + public List Headers { get; set; } = new(); public string AuthBearer { set => Authorization = new("Bearer", value); } - public KeyValuePair AuthBasic + public HttpHeader AuthBasic { set => Authorization = new("Basic", - Convert.ToBase64String(Encoding.UTF8.GetBytes(value.Key + ":" + value.Value))); + Convert.ToBase64String(Encoding.UTF8.GetBytes(value.Name + ":" + value.Value))); + } +} + +public record HttpHeader +{ + public HttpHeader(string name, string value) + { + this.Name = name; + this.Value = value; + } + + public string Name { get; } + public string Value { get; } + + public void Deconstruct(out string name, out string value) + { + name = this.Name; + value = this.Value; + } +} + +public record RangeHeader +{ + public RangeHeader(long from, long? to = null) + { + this.From = from; + this.To = to; + } + + public long From { get; } + public long? To { get; } + + public void Deconstruct(out long from, out long? to) + { + from = this.From; + to = this.To; } } diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index 504d84200..24bfa77c6 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -1089,35 +1089,36 @@ public static HttpRequestMessage With(this HttpRequestMessage httpReq, Action(); var headers = config.Headers; if (config.Accept != null) - headers[HttpHeaders.Accept] = config.Accept; + headers.Add(new(HttpHeaders.Accept, config.Accept)); if (config.UserAgent != null) - headers[HttpHeaders.UserAgent] = config.UserAgent; + headers.Add(new(HttpHeaders.UserAgent, config.UserAgent)); if (config.ContentType != null) - headers[HttpHeaders.ContentType] = config.ContentType; + headers.Add(new(HttpHeaders.ContentType, config.ContentType)); if (config.Authorization != null) httpReq.Headers.Authorization = - new AuthenticationHeaderValue(config.Authorization.Value.Key, config.Authorization.Value.Value); + new AuthenticationHeaderValue(config.Authorization.Name, config.Authorization.Value); + if (config.Range != null) + httpReq.Headers.Range = new RangeHeaderValue(config.Range.From, config.Range.To); foreach (var entry in headers) { - httpReq.WithHeader(entry.Key, entry.Value); + httpReq.WithHeader(entry.Name, entry.Value); } return httpReq; } public static void DownloadFileTo(this string downloadUrl, string fileName, - Dictionary? headers = null) + List? headers = null) { var client = Create(); var httpReq = new HttpRequestMessage(HttpMethod.Get, downloadUrl) .With(c => { c.Accept = "*/*"; - c.Headers = headers; + if (headers != null) c.Headers = headers; }); var httpRes = client.Send(httpReq); diff --git a/src/ServiceStack.Text/HttpUtils.WebRequest.cs b/src/ServiceStack.Text/HttpUtils.WebRequest.cs index a56e56c77..1a31b6e8b 100644 --- a/src/ServiceStack.Text/HttpUtils.WebRequest.cs +++ b/src/ServiceStack.Text/HttpUtils.WebRequest.cs @@ -1074,18 +1074,40 @@ private static byte[] GetHeaderBytes(string fileName, string mimeType, string fi } public static void DownloadFileTo(this string downloadUrl, string fileName, - Dictionary headers = null) + List headers = null) { var webClient = new WebClient(); if (headers != null) { - foreach (var entry in headers) + foreach (var header in headers) { - webClient.Headers[entry.Key] = entry.Value; + webClient.Headers[header.Name] = header.Value; } } webClient.DownloadFile(downloadUrl, fileName); } + + public static void SetRange(this HttpWebRequest request, long from, long? to) + { + var rangeSpecifier = "bytes"; + var curRange = request.Headers[HttpRequestHeader.Range]; + + if (string.IsNullOrEmpty(curRange)) + { + curRange = rangeSpecifier + "="; + } + else + { + if (string.Compare(curRange.Substring(0, curRange.IndexOf('=')), rangeSpecifier, StringComparison.OrdinalIgnoreCase) != 0) + throw new NotSupportedException("Invalid Range: " + curRange); + curRange = string.Empty; + } + curRange += from.ToString(); + if (to != null) { + curRange += "-" + to; + } + request.Headers[HttpRequestHeader.Range] = curRange; + } public static void AddHeader(this HttpWebRequest res, string name, string value) => res.Headers[name] = value; @@ -1120,14 +1142,14 @@ public static HttpWebRequest With(this HttpWebRequest httpReq, Action Date: Mon, 31 Jan 2022 12:14:35 +0800 Subject: [PATCH 349/372] Use generic reusable names for Headers --- src/ServiceStack.Text/HttpRequestConfig.cs | 16 ++++++++-------- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 2 +- src/ServiceStack.Text/HttpUtils.WebRequest.cs | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/ServiceStack.Text/HttpRequestConfig.cs b/src/ServiceStack.Text/HttpRequestConfig.cs index 516cadd5d..6c300c184 100644 --- a/src/ServiceStack.Text/HttpRequestConfig.cs +++ b/src/ServiceStack.Text/HttpRequestConfig.cs @@ -11,25 +11,25 @@ public class HttpRequestConfig public string? Accept { get; set; } public string? UserAgent { get; set; } public string? ContentType { get; set; } - public HttpHeader? Authorization { get; set; } - public RangeHeader? Range { get; set; } - public List Headers { get; set; } = new(); + public NameValue? Authorization { get; set; } + public LongRange? Range { get; set; } + public List Headers { get; set; } = new(); public string AuthBearer { set => Authorization = new("Bearer", value); } - public HttpHeader AuthBasic + public NameValue AuthBasic { set => Authorization = new("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes(value.Name + ":" + value.Value))); } } -public record HttpHeader +public record NameValue { - public HttpHeader(string name, string value) + public NameValue(string name, string value) { this.Name = name; this.Value = value; @@ -45,9 +45,9 @@ public void Deconstruct(out string name, out string value) } } -public record RangeHeader +public record LongRange { - public RangeHeader(long from, long? to = null) + public LongRange(long from, long? to = null) { this.From = from; this.To = to; diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index 24bfa77c6..16402ec12 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -1112,7 +1112,7 @@ public static HttpRequestMessage With(this HttpRequestMessage httpReq, Action? headers = null) + List? headers = null) { var client = Create(); var httpReq = new HttpRequestMessage(HttpMethod.Get, downloadUrl) diff --git a/src/ServiceStack.Text/HttpUtils.WebRequest.cs b/src/ServiceStack.Text/HttpUtils.WebRequest.cs index 1a31b6e8b..a9cc03fc9 100644 --- a/src/ServiceStack.Text/HttpUtils.WebRequest.cs +++ b/src/ServiceStack.Text/HttpUtils.WebRequest.cs @@ -1074,7 +1074,7 @@ private static byte[] GetHeaderBytes(string fileName, string mimeType, string fi } public static void DownloadFileTo(this string downloadUrl, string fileName, - List headers = null) + List headers = null) { var webClient = new WebClient(); if (headers != null) From 5dda58d217103bf6caead6ade0f62a51180d655d Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 13:18:27 +0800 Subject: [PATCH 350/372] Replace HttpRequestConfig helpers with methods --- src/ServiceStack.Text/HttpRequestConfig.cs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/ServiceStack.Text/HttpRequestConfig.cs b/src/ServiceStack.Text/HttpRequestConfig.cs index 6c300c184..f5f408693 100644 --- a/src/ServiceStack.Text/HttpRequestConfig.cs +++ b/src/ServiceStack.Text/HttpRequestConfig.cs @@ -15,16 +15,10 @@ public class HttpRequestConfig public LongRange? Range { get; set; } public List Headers { get; set; } = new(); - public string AuthBearer - { - set => Authorization = new("Bearer", value); - } - - public NameValue AuthBasic - { - set => Authorization = new("Basic", - Convert.ToBase64String(Encoding.UTF8.GetBytes(value.Name + ":" + value.Value))); - } + public void SetAuthBearer(string value) => Authorization = new("Bearer", value); + public void SetAuthBasic(string name, string value) => + Authorization = new("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes(name + ":" + value))); + public void SetRange(long from, long? to = null) => Range = new(from, to); } public record NameValue From da747ae95e03e8217e228f5c8e3d9c34c98f4509 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 13:19:09 +0800 Subject: [PATCH 351/372] Update HttpRequestConfig.cs --- src/ServiceStack.Text/HttpRequestConfig.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ServiceStack.Text/HttpRequestConfig.cs b/src/ServiceStack.Text/HttpRequestConfig.cs index f5f408693..3158d52e8 100644 --- a/src/ServiceStack.Text/HttpRequestConfig.cs +++ b/src/ServiceStack.Text/HttpRequestConfig.cs @@ -19,6 +19,8 @@ public class HttpRequestConfig public void SetAuthBasic(string name, string value) => Authorization = new("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes(name + ":" + value))); public void SetRange(long from, long? to = null) => Range = new(from, to); + + public void AddHeader(string name, string value) => Headers.Add(new(name, value)); } public record NameValue From 5a4702ad90402899498a4cbd23beb9542e38eea0 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 15:40:45 +0800 Subject: [PATCH 352/372] Update HttpUtils.WebRequest.cs --- src/ServiceStack.Text/HttpUtils.WebRequest.cs | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.WebRequest.cs b/src/ServiceStack.Text/HttpUtils.WebRequest.cs index a9cc03fc9..31d482acf 100644 --- a/src/ServiceStack.Text/HttpUtils.WebRequest.cs +++ b/src/ServiceStack.Text/HttpUtils.WebRequest.cs @@ -1089,24 +1089,10 @@ public static void DownloadFileTo(this string downloadUrl, string fileName, public static void SetRange(this HttpWebRequest request, long from, long? to) { - var rangeSpecifier = "bytes"; - var curRange = request.Headers[HttpRequestHeader.Range]; - - if (string.IsNullOrEmpty(curRange)) - { - curRange = rangeSpecifier + "="; - } + if (to != null) + request.AddRange(from, to.Value); else - { - if (string.Compare(curRange.Substring(0, curRange.IndexOf('=')), rangeSpecifier, StringComparison.OrdinalIgnoreCase) != 0) - throw new NotSupportedException("Invalid Range: " + curRange); - curRange = string.Empty; - } - curRange += from.ToString(); - if (to != null) { - curRange += "-" + to; - } - request.Headers[HttpRequestHeader.Range] = curRange; + request.AddRange(from); } public static void AddHeader(this HttpWebRequest res, string name, string value) => From 616f3bc248b687df4f443133eb2abd00f4614180 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 15:47:45 +0800 Subject: [PATCH 353/372] Add explicit Referer Header --- src/ServiceStack.Text/HttpRequestConfig.cs | 1 + src/ServiceStack.Text/HttpUtils.HttpClient.cs | 6 ++++++ src/ServiceStack.Text/HttpUtils.WebRequest.cs | 3 +++ 3 files changed, 10 insertions(+) diff --git a/src/ServiceStack.Text/HttpRequestConfig.cs b/src/ServiceStack.Text/HttpRequestConfig.cs index 3158d52e8..7eeb1d4fc 100644 --- a/src/ServiceStack.Text/HttpRequestConfig.cs +++ b/src/ServiceStack.Text/HttpRequestConfig.cs @@ -11,6 +11,7 @@ public class HttpRequestConfig public string? Accept { get; set; } public string? UserAgent { get; set; } public string? ContentType { get; set; } + public string? Referer { get; set; } public NameValue? Authorization { get; set; } public LongRange? Range { get; set; } public List Headers { get; set; } = new(); diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index 16402ec12..16ffb5132 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -1058,6 +1058,10 @@ public static HttpRequestMessage WithHeader(this HttpRequestMessage httpReq, str throw new NotSupportedException("Can't set ContentType before Content is populated"); httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(value); } + else if (name.Equals(HttpHeaders.Referer, StringComparison.OrdinalIgnoreCase)) + { + httpReq.Headers.Referrer = new Uri(value); + } else if (name.Equals(HttpHeaders.UserAgent, StringComparison.OrdinalIgnoreCase)) { if (value.IndexOf('/') >= 0) @@ -1097,6 +1101,8 @@ public static HttpRequestMessage With(this HttpRequestMessage httpReq, Action Date: Mon, 31 Jan 2022 16:19:02 +0800 Subject: [PATCH 354/372] Fix Accept + Add Except --- src/ServiceStack.Text/HttpRequestConfig.cs | 1 + src/ServiceStack.Text/HttpUtils.HttpClient.cs | 2 ++ src/ServiceStack.Text/HttpUtils.WebRequest.cs | 5 ++++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/HttpRequestConfig.cs b/src/ServiceStack.Text/HttpRequestConfig.cs index 7eeb1d4fc..bf7036ff2 100644 --- a/src/ServiceStack.Text/HttpRequestConfig.cs +++ b/src/ServiceStack.Text/HttpRequestConfig.cs @@ -12,6 +12,7 @@ public class HttpRequestConfig public string? UserAgent { get; set; } public string? ContentType { get; set; } public string? Referer { get; set; } + public string? Expect { get; set; } public NameValue? Authorization { get; set; } public LongRange? Range { get; set; } public List Headers { get; set; } = new(); diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index 16ffb5132..2064e74f9 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -1108,6 +1108,8 @@ public static HttpRequestMessage With(this HttpRequestMessage httpReq, Action Date: Mon, 31 Jan 2022 17:12:09 +0800 Subject: [PATCH 355/372] Add TransferEncoding chunked --- src/ServiceStack.Text/HttpRequestConfig.cs | 4 +++- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 10 ++++++++++ src/ServiceStack.Text/HttpUtils.WebRequest.cs | 5 +++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/HttpRequestConfig.cs b/src/ServiceStack.Text/HttpRequestConfig.cs index bf7036ff2..0f9ec75e9 100644 --- a/src/ServiceStack.Text/HttpRequestConfig.cs +++ b/src/ServiceStack.Text/HttpRequestConfig.cs @@ -12,7 +12,9 @@ public class HttpRequestConfig public string? UserAgent { get; set; } public string? ContentType { get; set; } public string? Referer { get; set; } - public string? Expect { get; set; } + public string? Expect { get; set; } + public string[]? TransferEncoding { get; set; } + public bool? TransferEncodingChunked { get; set; } public NameValue? Authorization { get; set; } public LongRange? Range { get; set; } public List Headers { get; set; } = new(); diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index 2064e74f9..fde630971 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -1111,6 +1111,16 @@ public static HttpRequestMessage With(this HttpRequestMessage httpReq, Action 0) + { + foreach (var enc in config.TransferEncoding) + { + httpReq.Headers.TransferEncoding.Add(new(enc)); + } + } + foreach (var entry in headers) { httpReq.WithHeader(entry.Name, entry.Value); diff --git a/src/ServiceStack.Text/HttpUtils.WebRequest.cs b/src/ServiceStack.Text/HttpUtils.WebRequest.cs index 6f972d2b4..85de06867 100644 --- a/src/ServiceStack.Text/HttpUtils.WebRequest.cs +++ b/src/ServiceStack.Text/HttpUtils.WebRequest.cs @@ -1139,6 +1139,11 @@ public static HttpWebRequest With(this HttpWebRequest httpReq, Action 0) + httpReq.TransferEncoding = string.Join(", ", config.TransferEncoding); + foreach (var entry in config.Headers) { httpReq.Headers[entry.Name] = entry.Value; From 717bc657ab9cc25a2de9b57dcae780cb77652999 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 18:37:58 +0800 Subject: [PATCH 356/372] explicitly specify http methods --- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index fde630971..fae8e729f 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -543,14 +543,14 @@ public static async Task SendStringToUrlAsync(this HttpClient client, st public static byte[] GetBytesFromUrl(this string url, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return url.SendBytesToUrl(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + return url.SendBytesToUrl(method:HttpMethods.Get, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); } public static Task GetBytesFromUrlAsync(this string url, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return url.SendBytesToUrlAsync(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, + return url.SendBytesToUrlAsync(method:HttpMethods.Get, accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, token: token); } @@ -596,8 +596,8 @@ public static byte[] SendBytesToUrl(this string url, string method = HttpMethods byte[]? requestBody = null, string? contentType = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return Create().SendBytesToUrl(url, method, requestBody, contentType, accept, - requestFilter, responseFilter); + return Create().SendBytesToUrl(url, method:method, requestBody:requestBody, contentType:contentType, accept:accept, + requestFilter:requestFilter, responseFilter:responseFilter); } public static byte[] SendBytesToUrl(this HttpClient client, string url, string method = HttpMethods.Post, @@ -655,15 +655,16 @@ public static async Task SendBytesToUrlAsync(this HttpClient client, str public static Stream GetStreamFromUrl(this string url, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return url.SendStreamToUrl(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter); + return url.SendStreamToUrl(method:HttpMethods.Get, accept: accept, + requestFilter: requestFilter, responseFilter: responseFilter); } public static Task GetStreamFromUrlAsync(this string url, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return url.SendStreamToUrlAsync(accept: accept, requestFilter: requestFilter, responseFilter: responseFilter, - token: token); + return url.SendStreamToUrlAsync(method:HttpMethods.Get, accept: accept, + requestFilter: requestFilter, responseFilter: responseFilter, token: token); } public static Stream PostStreamToUrl(this string url, Stream? requestBody = null, string? contentType = null, @@ -708,8 +709,8 @@ public static Stream SendStreamToUrl(this string url, string method = HttpMethod Stream? requestBody = null, string? contentType = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return Create().SendStreamToUrl(url, method, requestBody, contentType, accept, - requestFilter, responseFilter); + return Create().SendStreamToUrl(url, method:method, requestBody:requestBody, contentType:contentType, accept:accept, + requestFilter:requestFilter, responseFilter:responseFilter); } public static Stream SendStreamToUrl(this HttpClient client, string url, string method = HttpMethods.Post, @@ -738,8 +739,8 @@ public static Task SendStreamToUrlAsync(this string url, string method = Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return Create().SendStreamToUrlAsync(url, method, requestBody, contentType, accept, - requestFilter, responseFilter, token); + return Create().SendStreamToUrlAsync(url, method:method, requestBody:requestBody, contentType:contentType, accept:accept, + requestFilter:requestFilter, responseFilter:responseFilter, token); } public static async Task SendStreamToUrlAsync(this HttpClient client, string url, string method = HttpMethods.Post, @@ -826,7 +827,7 @@ public static IEnumerable ReadLines(this HttpResponseMessage webRes) } public static HttpResponseMessage UploadFile(this HttpRequestMessage httpReq, Stream fileStream, - string fileName, string? mimeType = null, string accept = "*/*", string method = HttpMethods.Post, string field = "file", + string fileName, string mimeType, string accept = "*/*", string method = HttpMethods.Post, string field = "file", Action? requestFilter = null, Action? responseFilter = null) { return Create().UploadFile(httpReq, fileStream, fileName, mimeType, accept, method, field, From 71202487f59f48a1710953b8c87d5fa7f4e82430 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 18:45:20 +0800 Subject: [PATCH 357/372] Add more liberal UserAgent --- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index fae8e729f..6a1b9061f 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -1065,18 +1065,7 @@ public static HttpRequestMessage WithHeader(this HttpRequestMessage httpReq, str } else if (name.Equals(HttpHeaders.UserAgent, StringComparison.OrdinalIgnoreCase)) { - if (value.IndexOf('/') >= 0) - { - var product = value.LastLeftPart('/'); - var version = value.LastRightPart('/'); - httpReq.Headers.UserAgent.Add(new ProductInfoHeaderValue(product, version)); - } - else - { - // Avoid format exceptions - var commentFmt = value[0] == '(' && value[^1] == ')' ? value : $"({value})"; - httpReq.Headers.UserAgent.Add(new ProductInfoHeaderValue(commentFmt)); - } + httpReq.Headers.UserAgent.ParseAdd(value); } else { From 8b06357a36a49e3f38b21e46389cd1e034670f4b Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 18:53:35 +0800 Subject: [PATCH 358/372] override accept or consistent behavior --- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index 6a1b9061f..0517d7654 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -1086,7 +1086,10 @@ public static HttpRequestMessage With(this HttpRequestMessage httpReq, Action Date: Mon, 31 Jan 2022 18:57:28 +0800 Subject: [PATCH 359/372] Update HttpUtils.HttpClient.cs --- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index 0517d7654..d825f1452 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -485,7 +485,8 @@ public static string SendStringToUrl(this string url, string method = HttpMethod string? requestBody = null, string? contentType = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null) { - return Create().SendStringToUrl(url, method, requestBody, contentType, accept, requestFilter, responseFilter); + return Create().SendStringToUrl(url, method:method, requestBody:requestBody, + contentType:contentType, accept:accept, requestFilter:requestFilter, responseFilter:responseFilter); } public static string SendStringToUrl(this HttpClient client, string url, string method = HttpMethods.Post, @@ -514,8 +515,8 @@ public static Task SendStringToUrlAsync(this string url, string? contentType = null, string accept = "*/*", Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return Create().SendStringToUrlAsync(url, method, requestBody, contentType, accept, - requestFilter, responseFilter, token); + return Create().SendStringToUrlAsync(url, method:method, requestBody:requestBody, contentType:contentType, accept:accept, + requestFilter:requestFilter, responseFilter:responseFilter, token); } public static async Task SendStringToUrlAsync(this HttpClient client, string url, string method = HttpMethods.Post, From e50d0c6e03d8434c29ac22c8d6925a75b21026c3 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 18:59:21 +0800 Subject: [PATCH 360/372] Update HttpUtils.HttpClient.cs --- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index d825f1452..c29868704 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -48,40 +48,40 @@ internal HttpClientFactory(HttpClientHandler handler) => public static string GetJsonFromUrl(this string url, Action? requestFilter = null, Action? responseFilter = null) { - return url.GetStringFromUrl(MimeTypes.Json, requestFilter, responseFilter); + return url.GetStringFromUrl(accept:MimeTypes.Json, requestFilter, responseFilter); } public static Task GetJsonFromUrlAsync(this string url, Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return url.GetStringFromUrlAsync(MimeTypes.Json, requestFilter, responseFilter, token: token); + return url.GetStringFromUrlAsync(accept:MimeTypes.Json, requestFilter, responseFilter, token: token); } public static string GetXmlFromUrl(this string url, Action? requestFilter = null, Action? responseFilter = null) { - return url.GetStringFromUrl(MimeTypes.Xml, requestFilter, responseFilter); + return url.GetStringFromUrl(accept:MimeTypes.Xml, requestFilter, responseFilter); } public static Task GetXmlFromUrlAsync(this string url, Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return url.GetStringFromUrlAsync(MimeTypes.Xml, requestFilter, responseFilter, token: token); + return url.GetStringFromUrlAsync(accept:MimeTypes.Xml, requestFilter, responseFilter, token: token); } public static string GetCsvFromUrl(this string url, Action? requestFilter = null, Action? responseFilter = null) { - return url.GetStringFromUrl(MimeTypes.Csv, requestFilter, responseFilter); + return url.GetStringFromUrl(accept:MimeTypes.Csv, requestFilter, responseFilter); } public static Task GetCsvFromUrlAsync(this string url, Action? requestFilter = null, Action? responseFilter = null, CancellationToken token = default) { - return url.GetStringFromUrlAsync(MimeTypes.Csv, requestFilter, responseFilter, token: token); + return url.GetStringFromUrlAsync(accept:MimeTypes.Csv, requestFilter, responseFilter, token: token); } public static string GetStringFromUrl(this string url, string accept = "*/*", From 5f0e936c211d3cd836d0db3023fddcc7035b4698 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 19:04:11 +0800 Subject: [PATCH 361/372] Update HttpUtils.HttpClient.cs --- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index c29868704..93a3df57c 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -1058,7 +1058,10 @@ public static HttpRequestMessage WithHeader(this HttpRequestMessage httpReq, str { if (httpReq.Content == null) throw new NotSupportedException("Can't set ContentType before Content is populated"); - httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(value); + httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(value.LeftPart(';')); + var charset = value.RightPart(';'); + if (charset != null && charset.IndexOf("charset", StringComparison.OrdinalIgnoreCase) >= 0) + httpReq.Content.Headers.ContentType.CharSet = charset.RightPart('='); } else if (name.Equals(HttpHeaders.Referer, StringComparison.OrdinalIgnoreCase)) { From 271bb2877cbe951f42c7dc80c9f2114030f86d31 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 20:34:39 +0800 Subject: [PATCH 362/372] extract WebRequest ext methods --- src/ServiceStack.Text/HttpUtils.WebRequest.cs | 59 +++++++++++++------ 1 file changed, 41 insertions(+), 18 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.WebRequest.cs b/src/ServiceStack.Text/HttpUtils.WebRequest.cs index 85de06867..9579d2259 100644 --- a/src/ServiceStack.Text/HttpUtils.WebRequest.cs +++ b/src/ServiceStack.Text/HttpUtils.WebRequest.cs @@ -455,6 +455,21 @@ public static string SendStringToUrl(this string url, string method = null, Action requestFilter = null, Action responseFilter = null) { var webReq = (HttpWebRequest)WebRequest.Create(url); + return SendStringToUrl(webReq, method, requestBody, contentType, accept, requestFilter, responseFilter); + } + + public static async Task SendStringToUrlAsync(this string url, string method = null, + string requestBody = null, + string contentType = null, string accept = "*/*", Action requestFilter = null, + Action responseFilter = null, CancellationToken token = default) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + return await SendStringToUrlAsync(webReq, method, requestBody, contentType, accept, requestFilter, responseFilter); + } + + public static string SendStringToUrl(this HttpWebRequest webReq, string method, string requestBody, string contentType, + string accept, Action requestFilter, Action responseFilter) + { if (method != null) webReq.Method = method; if (contentType != null) @@ -486,13 +501,11 @@ public static string SendStringToUrl(this string url, string method = null, responseFilter?.Invoke((HttpWebResponse)webRes); return stream.ReadToEnd(UseEncoding); } - - public static async Task SendStringToUrlAsync(this string url, string method = null, - string requestBody = null, - string contentType = null, string accept = "*/*", Action requestFilter = null, - Action responseFilter = null, CancellationToken token = default) + + public static async Task SendStringToUrlAsync(this HttpWebRequest webReq, + string method, string requestBody, string contentType, string accept, + Action requestFilter, Action responseFilter) { - var webReq = (HttpWebRequest)WebRequest.Create(url); if (method != null) webReq.Method = method; if (contentType != null) @@ -583,6 +596,21 @@ public static byte[] SendBytesToUrl(this string url, string method = null, Action requestFilter = null, Action responseFilter = null) { var webReq = (HttpWebRequest)WebRequest.Create(url); + return SendBytesToUrl(webReq, method, requestBody, contentType, accept, requestFilter, responseFilter); + } + + public static async Task SendBytesToUrlAsync(this string url, string method = null, + byte[] requestBody = null, string contentType = null, string accept = "*/*", + Action requestFilter = null, Action responseFilter = null, + CancellationToken token = default) + { + var webReq = (HttpWebRequest)WebRequest.Create(url); + return await SendBytesToUrlAsync(webReq, method, requestBody, contentType, accept, requestFilter, responseFilter, token); + } + + public static byte[] SendBytesToUrl(this HttpWebRequest webReq, string method, byte[] requestBody, string contentType, + string accept, Action requestFilter, Action responseFilter) + { if (method != null) webReq.Method = method; @@ -611,13 +639,10 @@ public static byte[] SendBytesToUrl(this string url, string method = null, using var stream = webRes.GetResponseStream(); return stream.ReadFully(); } - - public static async Task SendBytesToUrlAsync(this string url, string method = null, - byte[] requestBody = null, string contentType = null, string accept = "*/*", - Action requestFilter = null, Action responseFilter = null, - CancellationToken token = default) + + public static async Task SendBytesToUrlAsync(this HttpWebRequest webReq, string method, byte[] requestBody, + string contentType, string accept, Action requestFilter, Action responseFilter, CancellationToken token) { - var webReq = (HttpWebRequest)WebRequest.Create(url); if (method != null) webReq.Method = method; if (contentType != null) @@ -646,7 +671,7 @@ public static async Task SendBytesToUrlAsync(this string url, string met using var stream = webRes.GetResponseStream(); return await stream.ReadFullyAsync(token).ConfigAwait(); } - + public static Stream GetStreamFromUrl(this string url, string accept = "*/*", Action requestFilter = null, Action responseFilter = null) { @@ -779,11 +804,9 @@ public static async Task SendStreamToUrlAsync(this string url, string me try { var webReq = (HttpWebRequest)WebRequest.Create(url); - using (var webRes = PclExport.Instance.GetResponse(webReq)) - { - var httpRes = webRes as HttpWebResponse; - return httpRes?.StatusCode; - } + using var webRes = PclExport.Instance.GetResponse(webReq); + var httpRes = webRes as HttpWebResponse; + return httpRes?.StatusCode; } catch (Exception ex) { From 4a4eea8a857c1c4a86c8f4a0d80ee6099b1aa978 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 20:54:49 +0800 Subject: [PATCH 363/372] Use CreateHttp method --- src/ServiceStack.Text/HttpUtils.WebRequest.cs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.WebRequest.cs b/src/ServiceStack.Text/HttpUtils.WebRequest.cs index 9579d2259..0f776e07b 100644 --- a/src/ServiceStack.Text/HttpUtils.WebRequest.cs +++ b/src/ServiceStack.Text/HttpUtils.WebRequest.cs @@ -454,7 +454,7 @@ public static string SendStringToUrl(this string url, string method = null, string requestBody = null, string contentType = null, string accept = "*/*", Action requestFilter = null, Action responseFilter = null) { - var webReq = (HttpWebRequest)WebRequest.Create(url); + var webReq = WebRequest.CreateHttp(url); return SendStringToUrl(webReq, method, requestBody, contentType, accept, requestFilter, responseFilter); } @@ -463,7 +463,7 @@ public static async Task SendStringToUrlAsync(this string url, string me string contentType = null, string accept = "*/*", Action requestFilter = null, Action responseFilter = null, CancellationToken token = default) { - var webReq = (HttpWebRequest)WebRequest.Create(url); + var webReq = WebRequest.CreateHttp(url); return await SendStringToUrlAsync(webReq, method, requestBody, contentType, accept, requestFilter, responseFilter); } @@ -595,7 +595,7 @@ public static byte[] SendBytesToUrl(this string url, string method = null, byte[] requestBody = null, string contentType = null, string accept = "*/*", Action requestFilter = null, Action responseFilter = null) { - var webReq = (HttpWebRequest)WebRequest.Create(url); + var webReq = WebRequest.CreateHttp(url); return SendBytesToUrl(webReq, method, requestBody, contentType, accept, requestFilter, responseFilter); } @@ -604,7 +604,7 @@ public static async Task SendBytesToUrlAsync(this string url, string met Action requestFilter = null, Action responseFilter = null, CancellationToken token = default) { - var webReq = (HttpWebRequest)WebRequest.Create(url); + var webReq = WebRequest.CreateHttp(url); return await SendBytesToUrlAsync(webReq, method, requestBody, contentType, accept, requestFilter, responseFilter, token); } @@ -731,7 +731,7 @@ public static Stream SendStreamToUrl(this string url, string method = null, Stream requestBody = null, string contentType = null, string accept = "*/*", Action requestFilter = null, Action responseFilter = null) { - var webReq = (HttpWebRequest)WebRequest.Create(url); + var webReq = WebRequest.CreateHttp(url); if (method != null) webReq.Method = method; @@ -769,7 +769,7 @@ public static async Task SendStreamToUrlAsync(this string url, string me Action requestFilter = null, Action responseFilter = null, CancellationToken token = default) { - var webReq = (HttpWebRequest)WebRequest.Create(url); + var webReq = WebRequest.CreateHttp(url); if (method != null) webReq.Method = method; if (contentType != null) @@ -803,7 +803,7 @@ public static async Task SendStreamToUrlAsync(this string url, string me { try { - var webReq = (HttpWebRequest)WebRequest.Create(url); + var webReq = WebRequest.CreateHttp(url); using var webRes = PclExport.Instance.GetResponse(webReq); var httpRes = webRes as HttpWebResponse; return httpRes?.StatusCode; @@ -980,7 +980,7 @@ public static WebResponse PostFileToUrl(this string url, string accept = null, Action requestFilter = null) { - var webReq = (HttpWebRequest)WebRequest.Create(url); + var webReq = WebRequest.CreateHttp(url); using (var fileStream = uploadFileInfo.OpenRead()) { var fileName = uploadFileInfo.Name; @@ -1000,7 +1000,7 @@ public static async Task PostFileToUrlAsync(this string url, string accept = null, Action requestFilter = null, CancellationToken token = default) { - var webReq = (HttpWebRequest)WebRequest.Create(url); + var webReq = WebRequest.CreateHttp(url); using (var fileStream = uploadFileInfo.OpenRead()) { var fileName = uploadFileInfo.Name; @@ -1020,7 +1020,7 @@ public static WebResponse PutFileToUrl(this string url, string accept = null, Action requestFilter = null) { - var webReq = (HttpWebRequest)WebRequest.Create(url); + var webReq = WebRequest.CreateHttp(url); using (var fileStream = uploadFileInfo.OpenRead()) { var fileName = uploadFileInfo.Name; @@ -1040,7 +1040,7 @@ public static async Task PutFileToUrlAsync(this string url, string accept = null, Action requestFilter = null, CancellationToken token = default) { - var webReq = (HttpWebRequest)WebRequest.Create(url); + var webReq = WebRequest.CreateHttp(url); using (var fileStream = uploadFileInfo.OpenRead()) { var fileName = uploadFileInfo.Name; From b05dfff0fec30193db4680445c19812bec3d33d1 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 31 Jan 2022 20:55:07 +0800 Subject: [PATCH 364/372] Fix ContentType parsing in HttpClient utils --- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index 93a3df57c..b2ed24252 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -500,7 +500,7 @@ public static string SendStringToUrl(this HttpClient client, string url, string { httpReq.Content = new StringContent(requestBody, UseEncoding); if (contentType != null) - httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + httpReq.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType); } requestFilter?.Invoke(httpReq); @@ -531,7 +531,7 @@ public static async Task SendStringToUrlAsync(this HttpClient client, st { httpReq.Content = new StringContent(requestBody, UseEncoding); if (contentType != null) - httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + httpReq.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType); } requestFilter?.Invoke(httpReq); @@ -612,7 +612,7 @@ public static byte[] SendBytesToUrl(this HttpClient client, string url, string m { httpReq.Content = new ReadOnlyMemoryContent(requestBody); if (contentType != null) - httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + httpReq.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType); } requestFilter?.Invoke(httpReq); @@ -643,7 +643,7 @@ public static async Task SendBytesToUrlAsync(this HttpClient client, str { httpReq.Content = new ReadOnlyMemoryContent(requestBody); if (contentType != null) - httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + httpReq.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType); } requestFilter?.Invoke(httpReq); @@ -725,7 +725,7 @@ public static Stream SendStreamToUrl(this HttpClient client, string url, string { httpReq.Content = new StreamContent(requestBody); if (contentType != null) - httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + httpReq.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType); } requestFilter?.Invoke(httpReq); @@ -756,7 +756,7 @@ public static async Task SendStreamToUrlAsync(this HttpClient client, st { httpReq.Content = new StreamContent(requestBody); if (contentType != null) - httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + httpReq.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType); } requestFilter?.Invoke(httpReq); @@ -1058,10 +1058,7 @@ public static HttpRequestMessage WithHeader(this HttpRequestMessage httpReq, str { if (httpReq.Content == null) throw new NotSupportedException("Can't set ContentType before Content is populated"); - httpReq.Content.Headers.ContentType = new MediaTypeHeaderValue(value.LeftPart(';')); - var charset = value.RightPart(';'); - if (charset != null && charset.IndexOf("charset", StringComparison.OrdinalIgnoreCase) >= 0) - httpReq.Content.Headers.ContentType.CharSet = charset.RightPart('='); + httpReq.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(value); } else if (name.Equals(HttpHeaders.Referer, StringComparison.OrdinalIgnoreCase)) { @@ -1097,7 +1094,11 @@ public static HttpRequestMessage With(this HttpRequestMessage httpReq, Action Date: Tue, 1 Feb 2022 21:22:49 +0800 Subject: [PATCH 365/372] bump to v6.0.3 --- src/Directory.Build.props | 2 +- src/ServiceStack.Text/Env.cs | 2 +- tests/Directory.Build.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 6bfa3e383..9a112079b 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 6.0.2 + 6.0.3 ServiceStack ServiceStack, Inc. © 2008-2022 ServiceStack, Inc diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 3cc38fea5..8cdbc2d22 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -114,7 +114,7 @@ static Env() public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 6.02m; + public static decimal ServiceStackVersion = 6.03m; public static bool IsLinux { get; set; } diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 046281905..7eb7717ea 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,7 +1,7 @@ - 6.0.2 + 6.0.3 latest false From b1c24737de9abe99a9eb13c562837d8998d76274 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Tue, 1 Feb 2022 22:26:21 +0800 Subject: [PATCH 366/372] Update README.md --- README.md | 861 +----------------------------------------------------- 1 file changed, 2 insertions(+), 859 deletions(-) diff --git a/README.md b/README.md index 5432e6189..33ef5488e 100644 --- a/README.md +++ b/README.md @@ -1,860 +1,3 @@ -Follow [@ServiceStack](https://twitter.com/servicestack), [view the docs](https://docs.servicestack.net), use [StackOverflow](https://stackoverflow.com/questions/ask?tags=servicestack,servicestack.text) or [Customer Forums](https://forums.servicestack.net/) for support. +Follow [@ServiceStack](https://twitter.com/servicestack), [view the docs](https://docs.servicestack.net), use [StackOverflow](https://stackoverflow.com/questions/ask?tags=servicestack,servicestack.redis) or [Customer Forums](https://forums.servicestack.net/) for support. -## [FREE high-perf Text Serializers](https://docs.servicestack.net/releases/v4.0.62#servicestacktext-is-now-free) and Core Utils powering [servicestack.net](https://servicestack.net) - -ServiceStack.Text is an **independent, dependency-free** serialization library containing ServiceStack's core high-performance utils and text processing functionality, including: - - - [JSON](https://github.com/ServiceStack/ServiceStack.Text), - [JSV](https://docs.servicestack.net/jsv-format) and - [CSV](https://docs.servicestack.net/csv-format) Text Serializers - - [AutoMapping Utils](https://docs.servicestack.net/auto-mapping) - - [HTTP Utils](https://docs.servicestack.net/http-utils) - - [Dump Utils](https://docs.servicestack.net/dump-utils) - - [Fast Reflection Utils](https://docs.servicestack.net/reflection-utils) - - Several String Extensions, Collection extensions, Reflection Utils and lots more. - -### [Mobile Apps Support](https://github.com/ServiceStackApps/HelloMobile) - -### Try out [ServiceStack.Text Live](https://gist.cafe/c71b3f0123b3d9d08c1b11c98c2ff379) - -A great way to try out ServiceStack.Text is on [gist.cafe](https://gist.cafe) which lets you immediately -run and explore all ServiceStack.Text features from the comfort of your browser with zero software install: - -[![](https://raw.githubusercontent.com/ServiceStack/docs/master/docs/images/gistcafe/gistcafe-csharp.png)](https://gist.cafe/c71b3f0123b3d9d08c1b11c98c2ff379) - -## Simple API - -Like most of the interfaces in ServiceStack, the API is simple. Methods that you would commonly use include: - -### Convenience Serialization Extension Methods - -```csharp -string ToJson(T) -T FromJson() - -string ToJsv(T) -T FromJsv() - -string ToCsv(T) -T FromCsv() - -string ToXml(T) -T FromXml() -``` - -### Explicit API - -#### JSON - -```csharp -string JsonSerializer.SerializeToString(T value) -void JsonSerializer.SerializeToWriter(T value, TextWriter writer) - -T JsonSerializer.DeserializeFromString(string value) -T JsonSerializer.DeserializeFromReader(TextReader reader) -``` - -#### JSV - -```csharp -string TypeSerializer.SerializeToString(T value) -void TypeSerializer.SerializeToWriter(T value, TextWriter writer) - -T TypeSerializer.DeserializeFromString(string value) -T TypeSerializer.DeserializeFromReader(TextReader reader) -``` - -#### CSV - -```csharp -string CsvSerializer.SerializeToString(T value) -void CsvSerializer.SerializeToWriter(T value, TextWriter writer) - -T CsvSerializer.DeserializeFromString(string value) -T CsvSerializer.DeserializeFromReader(TextReader reader) -``` - -Where *T* can be any .NET POCO type. That's all there is - the API was intentionally left simple :) - -### Dump Utils - -Dump / Diagnostic Extensions: - -```csharp -T Dump() -T Print() -T PrintDump() -string Fmt(args) -``` - -### Dynamic JSON parsing API - -```csharp -JsonObject.Parse() -JsonArrayObjects.Parse() -``` - -### Pretty Print JSON - -You can format JSON into a more readable format with the `IndentJson()` extension method, e.g: - -```csharp -var prettyJson = dto.ToJson().IndentJson(); -``` - -URL Extensions: - -```csharp -string GetStringFromUrl() -string GetJsonFromUrl() -string GetResponseStatus() -string UrlEncode() / UrlDecode() -string HexEscape() / HexUnescape() -string UrlFormat() / AppendPath() / AppendPaths() / WithTrailingSlash() -string AddQueryParam() / SetQueryParam() AddHashParam() / SetHashParam() -string WithoutExtension() / ParentDirectory() / ReadAllText() -``` - -#### Stream Extensions: - -```csharp -Stream WriteTo(Stream) / CopyTo() -Stream ReadLines() -Stream ReadFully() / ReadExactly() -``` - -#### String Utils: - -```csharp -string SplitOnFirst() / SplitOnLast() -string IndexOfAny() -string StripHtml() / ToCamelCase() -string SafeSubstring() -string ToUtf8Bytes() / FromUtf8Bytes() -string LeftPart() / LastLeftPart() / RightPart() / LastRightPart() -``` - -more String, Reflection, List, Dictionary, DateTime extensions... - -### Supports Dynamic JSON - -Although usually used to (de)serialize C#/.NET POCO types, it also includes a flexible API allowing you to deserialize any -JSON payload without it's concrete type, see these real-world examples: - - - [Parsing GitHub's v3 API with typed DTOs](https://github.com/ServiceStack/ServiceStack.Text/blob/master/tests/ServiceStack.Text.Tests/UseCases/GithubV3ApiTests.cs) - - [Parsing GitHub's JSON response](https://github.com/ServiceStack/ServiceStack.Text/blob/master/tests/ServiceStack.Text.Tests/UseCases/GitHubRestTests.cs) - - [Parsing Google Maps JSON Response](https://github.com/ServiceStack/ServiceStack.Text/blob/master/tests/ServiceStack.Text.Tests/UseCases/GMapDirectionsTests.cs) - - [Parsing Centroid](https://github.com/ServiceStack/ServiceStack.Text/blob/master/tests/ServiceStack.Text.Tests/UseCases/CentroidTests.cs) - -Also a thin **.NET 4.0 Dynamic JSON** wrapper around ServiceStack's JSON library is included in the -[ServiceStack.Razor](https://github.com/ServiceStack/ServiceStack.Text/blob/master/src/ServiceStack.Text/Pcl.Dynamic.cs) -project. It provides a dynamic, but more succinct API than the above options. - -### JS Utils - -ServiceStack.Text APIs for deserializing arbitrary JSON requires specifying the Type to deserialize into. An alternative flexible approach to read any arbitrary JavaScript or JSON data structures is to use the high-performance and memory efficient JSON utils in -[#Script](https://sharpscript.net/) implementation of JavaScript. - -```csharp -JSON.parse("1") //= int 1 -JSON.parse("1.1") //= double 1.1 -JSON.parse("'a'") //= string "a" -JSON.parse("{a:1}") //= new Dictionary { {"a", 1 } } -JSON.parse("[{a:1}]") //= new List { new Dictionary { { "a", 1 } } } -``` - -#### Eval - -Since JS Utils is an essential part of [#Script](https://sharpscript.net/) it allows for advanced scenarios like implementing a text DSL or scripting language for executing custom logic or business rules you want to be able to change without having to compile or redeploy your App. It uses [#Script Context](https://sharpscript.net/docs/methods) which lets you evaluate the script within a custom scope that defines what functions -and arguments it has access to, e.g.: - -```csharp -public class CustomMethods : ScriptMethods -{ - public string reverse(string text) => new string(text.Reverse().ToArray()); -} - -var scope = JS.CreateScope( - args: new Dictionary { { "arg", "value"} }, - functions: new CustomMethods()); - -JS.eval("arg", scope) //= "value" -JS.eval("reverse(arg)", scope) //= "eulav" -JS.eval("3.itemsOf(arg.reverse().padRight(8, '_'))", scope) //= ["eulav___", "eulav___", "eulav___"] - -//= { a: ["eulav___", "eulav___", "eulav___"] } -JS.eval("{a: 3.itemsOf(arg.reverse().padRight(8, '_')) }", scope) -``` - -ServiceStack's JS Utils is available in the [ServiceStack.Common](https://www.nuget.org/packages/ServiceStack.Common) NuGet package. - -## Install ServiceStack.Text - - PM> Install-Package ServiceStack.Text - -> From v4.0.62+ [ServiceStack.Text is now free!](https://docs.servicestack.net/releases/v4.0.62#servicestacktext-is-now-free) - -## Copying - -Since September 2013, ServiceStack source code is available under GNU Affero General Public License/FOSS License Exception, see license.txt in the source. Alternative commercial licensing is also available, contact team@servicestack.net for details. - -## Contributing - -Contributors need to approve the [Contributor License Agreement](https://docs.google.com/forms/d/16Op0fmKaqYtxGL4sg7w_g-cXXyCoWjzppgkuqzOeKyk/viewform) before any code will be reviewed, see the [Contributing wiki](https://github.com/ServiceStack/ServiceStack/wiki/Contributing) for more details. - -## ServiceStack.JsonSerializer - -For reasons outlined [in this blog post](https://github.com/ServiceStackV3/mythz_blog/blob/master/pages/344.md) I decided to re-use *TypeSerializer's* text processing-core to create ServiceStack.JsonSerializer - the fastest JSON Serializer for .NET. -Based on the [Northwind Benchmarks](http://mono.servicestack.net/benchmarks/) it's *3.6x* faster than .NET's BCL JsonDataContractSerializer and *3x* faster than the previous fastest JSON serializer benchmarked - [JSON.NET](http://json.codeplex.com/). - -A comprehensive set of other .NET benchmarks are maintained at [servicestack.net/benchmarks](http://mono.servicestack.net/benchmarks/) and [in the wiki](https://github.com/ServiceStack/ServiceStack/wiki/Real-world-performance). - -## ServiceStack.CsvSerializer -As CSV is an important format in many data access and migration scenarios, it became [the latest format included in ServiceStack](https://github.com/ServiceStack/ServiceStack/wiki/CSV-Format) which allows all your existing web services to take advantage of the new format without config or code-changes. As its built using the same tech that makes the JSON and JSV serializers so fast, we expect it to be the fastest POCO CSV Serializer for .NET. - -## ServiceStack.TypeSerializer and the JSV-format -Included in this project is `TypeSerializer` - A fast and compact text-based serializer for .NET. It's a light-weight compact Text Serializer which can be used to serialize .NET data types inc custom POCO's and DataContract's. More info on its JSV Format can be found on the [introductory post](https://github.com/ServiceStackV3/mythz_blog/blob/master/pages/176.md). - -## T.Dump() Extension method -Another useful library to have in your .NET toolbox is the [T.Dump() Extension Method](https://github.com/ServiceStackV3/mythz_blog/blob/master/pages/202.md). Under the hood it uses a *Pretty Print* Output of the JSV Format to recursively dump the contents of any .NET object. Example usage and output: - -```csharp -var model = new TestModel(); -model.PrintDump(); - -//Example Output -{ - Int: 1, - String: One, - DateTime: 2010-04-11, - Guid: c050437f6fcd46be9b2d0806a0860b3e, - EmptyIntList: [], - IntList: - [ - 1, - 2, - 3 - ], - StringList: - [ - one, - two, - three - ], - StringIntMap: - { - a: 1, - b: 2, - c: 3 - } -} -``` - -# ServiceStack's JsonSerializer - -ServiceStack's JsonSerializer is optimized for serializing C# POCO types in and out of JSON as fast, compact and cleanly as possible. In most cases C# objects serializes as you would expect them to without added json extensions or serializer-specific artefacts. - -JsonSerializer provides a simple API that allows you to serialize any .NET generic or runtime type into a string, TextWriter/TextReader or Stream. - -### Serialization API - -```csharp -string SerializeToString(T) -void SerializeToWriter(T, TextWriter) -void SerializeToStream(T, Stream) -string SerializeToString(object, Type) -void SerializeToWriter(object, Type, TextWriter) -void SerializeToStream(object, Type, Stream) -``` - -### Deserialization API - -```csharp -T DeserializeFromString(string) -T DeserializeFromReader(TextReader) -object DeserializeFromString(string, Type) -object DeserializeFromReader(reader, Type) -object DeserializeFromStream(Type, Stream) -T DeserializeFromStream(Stream) -``` - -### Extension methods - -```csharp -string ToJson(this T) -T FromJson(this string) -``` - -Convenient **ToJson/FromJson** extension methods are also included reducing the amount of code required, e.g: - -```csharp -new []{ 1, 2, 3 }.ToJson() //= [1,2,3] -"[1,2,3]".FromJson() //= int []{ 1, 2, 3 } -``` - -## JSON Format - -JSON is a lightweight text serialization format with a spec that's so simple that it fits on one page: [https://www.json.org](https://www.json.org). - -The only valid values in JSON are: - - * string - * number - * object - * array - * true - * false - * null - -Where most allowed values are scalar and the only complex types available are objects and arrays. Although limited, the above set of types make a good fit and can express most programming data structures. - -### number, true, false types - -All C# boolean and numeric data types are stored as-is without quotes. - -### null type - -For the most compact output null values are omitted from the serialized by default. If you want to include null values set the global configuration: - -```csharp -JsConfig.Init(new Config { IncludeNullValues = true }); -``` - -### string type - -All other scalar values are stored as strings that are surrounded with double quotes. - -### C# Structs and Value Types - -Because a C# struct is a value type whose public properties are normally just convenience properties around a single scalar value, they are ignored instead the **TStruct.ToString()** method is used to serialize and either the **static TStruct.Parse()** method or **new TStruct(string)** constructor will be used to deserialize the value type if it exists. - -### array type - -Any List, Queue, Stack, Array, Collection, Enumerables including custom enumerable types are stored in exactly the same way as a JavaScript array literal, i.e: - - [1,2,3,4,5] - -All elements in an array must be of the same type. If a custom type is both an IEnumerable and has properties it will be treated as an array and the extra properties will be ignored. - -### object type - -The JSON object type is the most flexible and is how most complex .NET types are serialized. The JSON object type is a key-value pair JavaScript object literal where the key is always a double-quoted string. - -Any IDictionary is serialized into a standard JSON object, i.e: - - {"A":1,"B":2,"C":3,"D":4} - -Which happens to be the same as C# POCO types (inc. Interfaces) with the values: - -`new MyClass { A=1, B=2, C=3, D=4 }` - - {"A":1,"B":2,"C":3,"D":4} - -Only public properties on reference types are serialized with the C# Property Name used for object key and the Property Value as the value. At the moment it is not possible to customize the Property Name. - -JsonSerializer also supports serialization of anonymous types in much the same way: - -`new { A=1, B=2, C=3, D=4 }` - - {"A":1,"B":2,"C":3,"D":4} - -### Parsing JSON Dates - -The default WCF Date that's returned in ServiceStack.Text can be converted with: - -```js -function todate (s) { - return new Date(parseFloat(/Date\(([^)]+)\)/.exec(s)[1])); -}; -``` - -Which if you're using the [servicestack-client](https://docs.servicestack.net/servicestack-client-umd) npm package can be resolved with: - -```ts -import { todate } from "servicestack-client"; -var date = todate(wcfDateString); -``` - -Or if using [ss-utils.js](https://docs.servicestack.net/ss-utils-js) that's built into ServiceStack: - -```js -var date = $.ss.todate(wcfDateString); -``` - -If you change ServiceStack.Text default serialization of Date to either use the ISO8601 date format: - -```csharp -JsConfig.DateHandler = DateHandler.ISO8601; -``` - -It can be parsed natively with: - -```js -new Date(dateString) -``` - -Likewise when configured to return: - -```csharp -JsConfig.DateHandler = DateHandler.UnixTimeMs; -``` - -It can also be converted natively with: - -```js -new Date(unixTimeMs) -``` - -## Global Default JSON Configuration - -The JSON/JSV and CSV serialization can be customized globally by configuring the `JsConfig` or type-specific `JsConfig` static classes with your preferred defaults. Global static configuration can be configured once on **Startup** using `JsConfig.Init()`, e.g: - -```csharp -JsConfig.Init(new Config { - DateHandler = DateHandler.ISO8601, - AlwaysUseUtc = true, - TextCase = TextCase.CamelCase, - ExcludeDefaultValues = true, -}); -``` - -The following is a list of `bool` options you can use to configure many popular preferences: - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAlias
IncludeNullValuesinv
IncludeNullValuesInDictionariesinvid
IncludeDefaultEnumside
IncludePublicFieldsipf
IncludeTypeInfoiti
ExcludeTypeInfoeti
ExcludeDefaultValuesedv
ConvertObjectTypesIntoStringDictionarycotisd
TreatEnumAsIntegerteai
TryToParsePrimitiveTypeValuesttpptv
TryToParseNumericTypettpnt
ThrowOnDeserializationErrortode
EscapeUnicodeeu
EscapeHtmlCharsehc
PreferInterfacespi
SkipDateTimeConversionsdtc
AlwaysUseUtcauu
AssumeUtcau
AppendUtcOffsetauo
EscapeHtmlCharsehc
EscapeUnicodeeu
EmitCamelCaseNameseccn
EmitLowercaseUnderscoreNameselun
- -### DateHandler (dh) - - - - - - - - - - -
TimestampOffsetto
DCJSCompatibledcjsc
ISO8601iso8601
ISO8601DateOnlyiso8601do
ISO8601DateTimeiso8601dt
RFC1123rfc1123
UnixTimeut
UnixTimeMsutm
- -### TimeSpanHandler (tsh) - - - - -
DurationFormatdf
StandardFormatsf
- -### TextCase (tc) - - - - - - -
Defaultd
PascalCasepc
CamelCasecc
SnakeCasesc
- -### PropertyConvention (pc) - - - - -
Stricts
Lenientl
- -### Custom Config Scopes - -If you need to use different serialization settings from the global static defaults you can use `JsConfig.With()` to create a scoped configuration -using property initializers: - -```csharp -using (JsConfig.With(new Config { - TextCase == TextCase.CamelCase, - PropertyConvention = PropertyConvention.Lenient -})) -{ - return text.FromJson(); -} -``` - -#### Create Custom Scopes using String config - -You can also create a custom config scope from a string manually using `JsConfig.CreateScope()` where you can use the full config name or their aliases, e.g: - -```csharp -using (JsConfig.CreateScope("IncludeNullValues,EDV,dh:ut")) -{ - var json = dto.ToJson(); -} -``` - -This feature is used to provide a number of different [JSON customizations in ServiceStack Services](https://docs.servicestack.net/customize-json-responses). - -### Type Configuration - -If you can't change the definition of a Type (e.g. because its in the BCL), you can specify a custom serialization / -deserialization routine to use instead. E.g. here's how you can add support for `System.Drawing.Color` and customize how `Guid` and `TimeSpan` Types are serialized: - -```csharp -JsConfig.SerializeFn = c => c.ToString().Replace("Color ","").Replace("[","").Replace("]",""); -JsConfig.DeSerializeFn = System.Drawing.Color.FromName; - -JsConfig.SerializeFn = guid => guid.ToString("D"); -JsConfig.SerializeFn = time => - (time.Ticks < 0 ? "-" : "") + time.ToString("hh':'mm':'ss'.'fffffff"); -``` - -## Strict Parsing - -By default ServiceStack Serializers will try to deserialize as much as possible without error, if you prefer you can opt-in to stricter parsing with: - -```csharp -Env.StrictMode = true; -``` - -Where it will instead fail fast and throw Exceptions on deserialization errors. - -## Custom Serialization - -Although JsonSerializer is optimized for serializing .NET POCO types, it still provides some options to change the convention-based serialization routine. - -### Using Structs to Customize JSON - -This makes it possible to customize the serialization routine and provide an even more compact wire format. - -E.g. Instead of using a JSON object to represent a point - - { Width=20, Height=10 } - -You could use a struct and reduce it to just: - - "20x10" - -By overriding **ToString()** and providing a static **Size ParseJson()** method: - -```csharp -public struct Size -{ - public double Width { get; set; } - public double Height { get; set; } - - public override string ToString() - { - return Width + "x" + Height; - } - - public static Size ParseJson(string json) - { - var size = json.Split('x'); - return new Size { - Width = double.Parse(size[0]), - Height = double.Parse(size[1]) - }; - } -} -``` - -Which would change it to the more compact JSON output: - -```csharp - new Size { Width = 20, Height = 10 }.ToJson() // = "20x10" -``` - -That allows you to deserialize it back in the same way: - -```csharp - var size = "20x10".FromJson(); -``` - -### Using Custom IEnumerable class to serialize a JSON array - -In addition to using a Struct you can optionally use a custom C# IEnumerable type to provide a strong-typed wrapper around a JSON array: - -```csharp -public class Point : IEnumerable -{ - double[] points = new double[2]; - - public double X - { - get { return points[0]; } - set { points[0] = value; } - } - - public double Y - { - get { return points[1]; } - set { points[1] = value; } - } - - public IEnumerator GetEnumerator() - { - foreach (var point in points) - yield return point; - } -} -``` - -Which serializes the Point into a compact JSON array: - -```csharp - new Point { X = 1, Y = 2 }.ToJson() // = [1,2] -``` - -## Custom Deserialization - -Because the same wire format shared between Dictionaries, POCOs and anonymous types, in most cases what you serialize with one type can be deserialized with another, i.e. an Anonymous type can be deserialized back into a Dictionary which can be deserialized into a strong-typed POCO and vice-versa. - -Although the JSON Serializer is best optimized for serializing and deserializing .NET types, it's flexible enough to consume 3rd party JSON apis although this generally requires custom de-serialization to convert it into an idiomatic .NET type. - -[GitHubRestTests.cs](https://github.com/ServiceStack/ServiceStack.Text/blob/master/tests/ServiceStack.Text.Tests/UseCases/GitHubRestTests.cs) - - 1. Using [JsonObject](https://github.com/ServiceStack/ServiceStack.Text/blob/master/src/ServiceStack.Text/JsonObject.cs) - 2. Using Generic .NET Collection classes - 3. Using Customized DTO's in the shape of the 3rd party JSON response - -[CentroidTests](https://github.com/ServiceStack/ServiceStack.Text/blob/master/tests/ServiceStack.Text.Tests/UseCases/CentroidTests.cs) is another example that uses the JsonObject to parse a complex custom JSON response. - -## Late-bound Object and Interface Runtime Types - -In order to be able to deserialize late-bound objects like `object`, `interface` properties or `abstract` classes ServiceStack needs to emit type information -in the JSON payload. By default it uses `__type` property name, but can be customized with: - -```csharp -JsConfig.TypeAttr = "$type"; -``` - -You can also configure what Type Information is emitted with: - -```csharp -JsConfig.TypeWriter = type => type.Name; -``` - -Which will just emit the name of the Type (e.g `Dog`) instead of the full Type Name. - -By default ServiceStack will scan all loaded Assemblies to find the Type, but you can tell it to use your own Type Resolver implementation by overriding `TypeFinder`, e.g: - -```csharp -JsConfig.TypeFinder = typeInfo => => -{ - var regex = new Regex(@"^(?[^:]+):#(?.*)$"); - var match = regex.Match(value); - var typeName = string.Format("{0}.{1}", match.Groups["namespace"].Value, match.Groups["type"].Value.Replace(".", "+")); - return MyFindType(typeName); -}; -``` - -### Runtime Type Whitelist - -ServiceStack only allows you to serialize "known safe Types" in late-bound properties which uses a whitelist that's pre-populated with a safe-list of -popular Data Types, DTOs and Request DTOs with the default configuration below: - -```csharp -// Allow deserializing types with [DataContract] or [RuntimeSerializable] attributes -JsConfig.AllowRuntimeTypeWithAttributesNamed = new HashSet -{ - nameof(DataContractAttribute), - nameof(RuntimeSerializableAttribute), // new in ServiceStack.Text -}; - -// Allow deserializing types implementing any of the interfaces below -JsConfig.AllowRuntimeTypeWithInterfacesNamed = new HashSet -{ - "IConvertible", - "ISerializable", - "IRuntimeSerializable", // new in ServiceStack.Text - "IMeta", - "IReturn`1", - "IReturnVoid", -}; - -// Allow object property in ServiceStack.Messaging MQ classes -JsConfig.AllowRuntimeTypeInTypesWithNamespaces = new HashSet -{ - "ServiceStack.Messaging", -}; -``` - -The above rules can be extended to allow your own conventions. If you just need to allow a specific Type you can instead just implement: - -```csharp -JsConfig.AllowRuntimeType = type => type == typeof(MyType); -``` - -If you’re in a trusted intranet environment this can also be used to disable the whitelist completely by allowing all Types to be deserialized into object properties with: - -```csharp -JsConfig.AllowRuntimeType = _ => true; -``` - -### Custom Enum Serialization - -You can use `[EnumMember]` to change what Enum value gets serialized, e.g: - -```csharp -[DataContract] -public enum Day -{ - [EnumMember(Value = "MON")] - Monday, - [EnumMember(Value = "TUE")] - Tuesday, - [EnumMember(Value = "WED")] - Wednesday, - [EnumMember(Value = "THU")] - Thursday, - [EnumMember(Value = "FRI")] - Friday, - [EnumMember(Value = "SAT")] - Saturday, - [EnumMember(Value = "SUN")] - Sunday, -} - -class EnumMemberDto -{ - public Day Day { get; set; } -} - -var dto = new EnumMemberDto {Day = Day.Sunday}; -var json = dto.ToJson(); //= {"Day":"SUN"} - -var fromDto = json.FromJson(); -fromDto.Day //= Day.Sunday -``` - -## TypeSerializer Details (JSV Format) - -Out of the box .NET provides a fairly quick but verbose Xml DataContractSerializer or a slightly more compact but slower JsonDataContractSerializer. -Both of these options are fragile and likely to break with any significant schema changes. -TypeSerializer addresses these shortcomings by being both smaller and significantly faster than the most popular options. -It's also more resilient, e.g. a strongly-typed POCO object can be deserialized back into a loosely-typed string Dictionary and vice-versa. - -With that in mind, TypeSerializer's main features are: - - - Fastest and most compact text-serializer for .NET - - Human readable and writeable, self-describing text format - - Non-invasive and configuration-free - - Resilient to schema changes - - Serializes / De-serializes any .NET data type (by convention) - + Supports custom, compact serialization of structs by overriding `ToString()` and `static T Parse(string)` methods - + Can serialize inherited, interface or 'late-bound objects' data types - + Respects opt-in DataMember custom serialization for DataContract dto types. - -These characteristics make it ideal for use anywhere you need to store or transport .NET data-types, e.g. for text blobs in a ORM, data in and out of a key-value store or as the text-protocol in .NET to .NET web services. - -As such, it's utilized within ServiceStack's other components: - - OrmLite - to store complex types on table models as text blobs in a database field and - - [ServiceStack.Redis](https://github.com/ServiceStack/ServiceStack.Redis) - to store rich POCO data types into the very fast [redis](http://redis.io) instances. - -You may also be interested in the very useful [T.Dump() extension method](https://github.com/ServiceStackV3/mythz_blog/blob/master/pages/202.md) for recursively viewing the contents of any C# POCO Type. - ---- - -# Performance -Type Serializer is actually the fastest and most compact *text serializer* available for .NET. -Out of all the serializers benchmarked, it is the only one to remain competitive with [protobuf-net's](http://code.google.com/p/protobuf-net/) very fast implementation of [Protocol Buffers](http://code.google.com/apis/protocolbuffers/) - google's high-speed binary protocol. - -Below is a series of benchmarks serialize the different tables in the [Northwind database](https://github.com/ServiceStackV3/ServiceStack.Benchmarks/blob/master/tests/ServiceStack.Northwind.Tests/Support/NorthwindData.cs) (3202 records) with the most popular serializers available for .NET: - -### Combined results for serializing / deserialzing a single row of each table in the Northwind database 1,000,000 times -_[view the detailed benchmarks](http://mono.servicestack.net/benchmarks/)_ - - - - - - - - - - - - - - - - - -
SerializerSizePeformance
Microsoft DataContractSerializer4.68x6.72x
Microsoft JsonDataContractSerializer2.24x10.18x
Microsoft BinaryFormatter5.62x9.06x
NewtonSoft.Json2.30x8.15x
ProtoBuf.net1x1x
ServiceStack TypeSerializer1.78x1.92x
- -_number of times larger in size and slower in performance than the best - lower is better_ - -Microsoft's JavaScriptSerializer was also benchmarked but excluded as it was up to 280x times slower - basically don't use it, ever. - - -# JSV Text Format (JSON + CSV) - -Type Serializer uses a hybrid CSV-style escaping + JavaScript-like text-based format that is optimized for both size and speed. I'm naming this JSV-format (i.e. JSON + CSV) - -In many ways it is similar to JavaScript, e.g. any List, Array, Collection of ints, longs, etc are stored in exactly the same way, i.e: - - [1,2,3,4,5] - -Any IDictionary is serialized like JavaScript, i.e: - - {A:1,B:2,C:3,D:4} - -Which also happens to be the same as C# POCO class with the values - -`new MyClass { A=1, B=2, C=3, D=4 }` - - {A:1,B:2,C:3,D:4} - -JSV is *white-space significant*, which means normal string values can be serialized without quotes, e.g: - -`new MyClass { Foo="Bar", Greet="Hello World!"}` is serialized as: - - {Foo:Bar,Greet:Hello World!} - - -### CSV escaping - -Any string with any of the following characters: `[]{},"` -is escaped using CSV-style escaping where the value is wrapped in double quotes, e.g: - -`new MyClass { Name = "Me, Junior" }` is serialized as: - - {Name:"Me, Junior"} - -A value with a double quote is escaped with another double quote e.g: - -`new MyClass { Size = "2\" x 1\"" }` is serialized as: - - {Size:"2"" x 1"""} - - -## Rich support for resilience and schema versioning -To better illustrate the resilience of `TypeSerializer` and the JSV Format check out a real world example of it when it's used to [Painlessly migrate between old and new types in Redis](https://github.com/ServiceStack/ServiceStack.Redis/wiki/MigrationsUsingSchemalessNoSql). - -Support for dynamic payloads and late-bound objects is explained in the post [Versatility of JSV Late-bound objects](http://www.servicestack.net/mythz_blog/?p=314). - - -# Community Resources - - - [ServiceStack.Text has nice extension method called Dump and has a few friends - web archive](https://web.archive.org/web/20150318193203/http://blogs.lessthandot.com/index.php/desktopdev/mstech/servicestack-text-has-a-nice/) by [@chrissie1](https://twitter.com/chrissie1) - - [JSON.NET vs ServiceStack - web archive](https://web.archive.org/web/20140721081359/http://daniel.wertheim.se/2011/02/07/json-net-vs-servicestack/) - - [GithubSharp with ServiceStack.Text](https://github.com/xamarin/GithubSharp/tree/servicestack) by [@XTZGZoReX](https://twitter.com/XTZGZoReX) +# Read ServiceStack.Text Docs at [docs.servicestack.net/text](https://docs.servicestack.net/text/) From e7535a32eb04455ae74dfdefd1a32a1bbec690ad Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 2 Feb 2022 14:00:58 +0800 Subject: [PATCH 367/372] Update PCL Platform names --- src/ServiceStack.Text/PclExport.NetCore.cs | 6 +++--- .../{PclExport.Net45.cs => PclExport.NetFx.cs} | 8 ++++---- src/ServiceStack.Text/PclExport.cs | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) rename src/ServiceStack.Text/{PclExport.Net45.cs => PclExport.NetFx.cs} (99%) diff --git a/src/ServiceStack.Text/PclExport.NetCore.cs b/src/ServiceStack.Text/PclExport.NetCore.cs index b12bee3be..7cf1fc8f3 100644 --- a/src/ServiceStack.Text/PclExport.NetCore.cs +++ b/src/ServiceStack.Text/PclExport.NetCore.cs @@ -6,11 +6,11 @@ namespace ServiceStack { - public class NetCorePclExport : NetStandardPclExport + public class Net6PclExport : NetStandardPclExport { - public NetCorePclExport() + public Net6PclExport() { - this.PlatformName = Platforms.NetCore; + this.PlatformName = Platforms.Net6; ReflectionOptimizer.Instance = EmitReflectionOptimizer.Provider; } diff --git a/src/ServiceStack.Text/PclExport.Net45.cs b/src/ServiceStack.Text/PclExport.NetFx.cs similarity index 99% rename from src/ServiceStack.Text/PclExport.Net45.cs rename to src/ServiceStack.Text/PclExport.NetFx.cs index 73bc305be..9df18991b 100644 --- a/src/ServiceStack.Text/PclExport.Net45.cs +++ b/src/ServiceStack.Text/PclExport.NetFx.cs @@ -23,11 +23,11 @@ namespace ServiceStack { - public class Net45PclExport : PclExport + public class NetFxPclExport : PclExport { - public static Net45PclExport Provider = new Net45PclExport(); + public static NetFxPclExport Provider = new NetFxPclExport(); - public Net45PclExport() + public NetFxPclExport() { this.DirSep = Path.DirectorySeparatorChar; this.AltDirSep = Path.DirectorySeparatorChar == '/' ? '\\' : '/'; @@ -37,7 +37,7 @@ public Net45PclExport() this.InvariantComparer = StringComparer.InvariantCulture; this.InvariantComparerIgnoreCase = StringComparer.InvariantCultureIgnoreCase; - this.PlatformName = Platforms.Net45; + this.PlatformName = Platforms.NetFX; ReflectionOptimizer.Instance = EmitReflectionOptimizer.Provider; } diff --git a/src/ServiceStack.Text/PclExport.cs b/src/ServiceStack.Text/PclExport.cs index fb957324f..9ba3c9cd1 100644 --- a/src/ServiceStack.Text/PclExport.cs +++ b/src/ServiceStack.Text/PclExport.cs @@ -21,18 +21,18 @@ public abstract class PclExport { public static class Platforms { - public const string NetStandard = "NETStandard"; - public const string NetCore = "NetCore"; - public const string Net45 = "Net45"; + public const string NetStandard = "NETStd"; + public const string Net6 = "NET6"; + public const string NetFX = "NETFX"; } public static PclExport Instance = #if NETFX - new Net45PclExport() + new NetFxPclExport() #elif NETSTANDARD2_0 new NetStandardPclExport() #elif NETCORE || NET6_0_OR_GREATER - new NetCorePclExport() + new Net6PclExport() #endif ; From f08f789a75a3850bb32a9cea567da8a450132ea2 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 2 Feb 2022 14:01:22 +0800 Subject: [PATCH 368/372] Make HttpUtils use lazy factories to prevent static init exceptions in Blazor --- src/ServiceStack.Text/HttpUtils.HttpClient.cs | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/ServiceStack.Text/HttpUtils.HttpClient.cs b/src/ServiceStack.Text/HttpUtils.HttpClient.cs index b2ed24252..a90a6d862 100644 --- a/src/ServiceStack.Text/HttpUtils.HttpClient.cs +++ b/src/ServiceStack.Text/HttpUtils.HttpClient.cs @@ -19,14 +19,14 @@ public static partial class HttpUtils private class HttpClientFactory { private readonly Lazy lazyHandler; - internal HttpClientFactory(HttpClientHandler handler) => - lazyHandler = new Lazy(() => handler, LazyThreadSafetyMode.ExecutionAndPublication); + internal HttpClientFactory(Func handler) => + lazyHandler = new Lazy(() => handler(), LazyThreadSafetyMode.ExecutionAndPublication); public HttpClient CreateClient() => new(lazyHandler.Value, disposeHandler: false); } // Ok to use HttpClientHandler which now uses SocketsHttpHandler // https://github.com/dotnet/runtime/blob/main/src/libraries/System.Net.Http/src/System/Net/Http/HttpClientHandler.cs#L16 - public static HttpClientHandler HttpClientHandler { get; set; } = new() { + public static Func HttpClientHandlerFactory { get; set; } = () => new() { UseDefaultCredentials = true, AutomaticDecompression = DecompressionMethods.Brotli | DecompressionMethods.Deflate | DecompressionMethods.GZip, }; @@ -38,10 +38,21 @@ internal HttpClientFactory(HttpClientHandler handler) => // .Configure(options => // options.HttpMessageHandlerBuilderActions.Add(builder => builder.PrimaryHandler = HandlerFactory)) // .BuildServiceProvider().GetRequiredService(); - + // Escape & BYO IHttpClientFactory - private static HttpClientFactory clientFactory = new(HttpClientHandler); - public static Func CreateClient { get; set; } = () => clientFactory.CreateClient(); + private static HttpClientFactory? clientFactory; + public static Func CreateClient { get; set; } = () => { + try + { + clientFactory ??= new(HttpClientHandlerFactory); + return clientFactory.CreateClient(); + } + catch (Exception ex) + { + Tracer.Instance.WriteError(ex); + return new HttpClient(); + } + }; public static HttpClient Create() => CreateClient(); From 8261d3b965f6c181a8bd504ab0c17617c4c4924e Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 2 Feb 2022 14:01:28 +0800 Subject: [PATCH 369/372] Update Env.cs --- src/ServiceStack.Text/Env.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 8cdbc2d22..003d2d40a 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -106,7 +106,8 @@ static Env() ServerUserAgent = "ServiceStack/" + VersionString + " " + PclExport.Instance.PlatformName - + (IsLinux ? "/Linux" : IsOSX ? "/OSX" : IsUnix ? "/Unix" : IsWindows ? "/Windows" : "/UnknownOS") + (IsIOS ? "/iOS" : IsAndroid ? "/Android" : IsUWP ? "/UWP" : "") + + (IsLinux ? "/Linux" : IsOSX ? "/macOS" : IsUnix ? "/Unix" : IsWindows ? "/Windows" : "/UnknownOS") + + (IsIOS ? "/iOS" : IsAndroid ? "/Android" : IsUWP ? "/UWP" : "") + (IsNet6 ? "/net6" : IsNetStandard20 ? "/std2.0" : IsNetFramework ? "/netfx" : "") + (IsMono ? "/Mono" : "") + $"/{LicenseUtils.Info}"; __releaseDate = new DateTime(2001,01,01); From 0c5b55c0154390b47b7ad0097c959badaf9d34d5 Mon Sep 17 00:00:00 2001 From: Chris Thames Date: Sat, 5 Feb 2022 18:54:59 -0600 Subject: [PATCH 370/372] Update DateTimeExtensions.cs DateTimeOffset (#537) Include DateTimeOffset arg to extension method ToUnixTimeMs. Made the assumption to use 'UtcDateTime' to use original DateTime implementation. Possibly a better way exists. Note 1: Due to `private static ToDateTimeSinceUnixEpoch` and `internal DateTimeSerializer.LocalTimeZone` had to re-implement to get it to work. Note 2: `ToUnixTimeMsAlt` should probably also have a DateTimeOffset implementation, but I did not implement. --- src/ServiceStack.Text/DateTimeExtensions.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ServiceStack.Text/DateTimeExtensions.cs b/src/ServiceStack.Text/DateTimeExtensions.cs index 0373037f3..4c79c3792 100644 --- a/src/ServiceStack.Text/DateTimeExtensions.cs +++ b/src/ServiceStack.Text/DateTimeExtensions.cs @@ -45,6 +45,12 @@ public static long ToUnixTimeMsAlt(this DateTime dateTime) { return (dateTime.ToStableUniversalTime().Ticks - UnixEpoch) / TimeSpan.TicksPerMillisecond; } + + public static long ToUnixTimeMs(this DateTimeOffset dateTimeOffset) + { + var universal = ToDateTimeSinceUnixEpoch(dateTimeOffset); + return (long)universal.TotalMilliseconds; + } public static long ToUnixTimeMs(this DateTime dateTime) { @@ -56,6 +62,9 @@ public static long ToUnixTime(this DateTime dateTime) { return (dateTime.ToDateTimeSinceUnixEpoch().Ticks) / TimeSpan.TicksPerSecond; } + + private static TimeSpan ToDateTimeSinceUnixEpoch(this DateTimeOffset dateTimeOffset) + => ToDateTimeSinceUnixEpoch(dateTimeOffset.UtcDateTime); private static TimeSpan ToDateTimeSinceUnixEpoch(this DateTime dateTime) { From fb5396b5c8b227f54b9ff2e9dd33116c6f0fbda5 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 6 Feb 2022 09:07:10 +0800 Subject: [PATCH 371/372] Update DateTimeExtensions.cs collapse DateTimeOffset UnixTimeMs impls --- src/ServiceStack.Text/DateTimeExtensions.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/ServiceStack.Text/DateTimeExtensions.cs b/src/ServiceStack.Text/DateTimeExtensions.cs index 4c79c3792..23910f6ac 100644 --- a/src/ServiceStack.Text/DateTimeExtensions.cs +++ b/src/ServiceStack.Text/DateTimeExtensions.cs @@ -46,11 +46,8 @@ public static long ToUnixTimeMsAlt(this DateTime dateTime) return (dateTime.ToStableUniversalTime().Ticks - UnixEpoch) / TimeSpan.TicksPerMillisecond; } - public static long ToUnixTimeMs(this DateTimeOffset dateTimeOffset) - { - var universal = ToDateTimeSinceUnixEpoch(dateTimeOffset); - return (long)universal.TotalMilliseconds; - } + public static long ToUnixTimeMs(this DateTimeOffset dateTimeOffset) => + (long)ToDateTimeSinceUnixEpoch(dateTimeOffset.UtcDateTime).TotalMilliseconds; public static long ToUnixTimeMs(this DateTime dateTime) { @@ -62,9 +59,6 @@ public static long ToUnixTime(this DateTime dateTime) { return (dateTime.ToDateTimeSinceUnixEpoch().Ticks) / TimeSpan.TicksPerSecond; } - - private static TimeSpan ToDateTimeSinceUnixEpoch(this DateTimeOffset dateTimeOffset) - => ToDateTimeSinceUnixEpoch(dateTimeOffset.UtcDateTime); private static TimeSpan ToDateTimeSinceUnixEpoch(this DateTime dateTime) { From 6426a6f0e0788b3caf239d17b886fefd7c4e4592 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Wed, 16 Feb 2022 12:39:17 +0800 Subject: [PATCH 372/372] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 33ef5488e..50e856543 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ Follow [@ServiceStack](https://twitter.com/servicestack), [view the docs](https://docs.servicestack.net), use [StackOverflow](https://stackoverflow.com/questions/ask?tags=servicestack,servicestack.redis) or [Customer Forums](https://forums.servicestack.net/) for support. # Read ServiceStack.Text Docs at [docs.servicestack.net/text](https://docs.servicestack.net/text/) + +### This repository [has moved](https://docs.servicestack.net/mono-repo) to [github.com/ServiceStack/ServiceStack/ServiceStack.Text](https://github.com/ServiceStack/ServiceStack/tree/main/ServiceStack.Text)

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�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 - - - $(MSBuildProjectDirectory)\..\ - - - - - $([System.IO.Path]::Combine($(SolutionDir), ".nuget")) - $([System.IO.Path]::Combine($(ProjectDir), "packages.config")) - $([System.IO.Path]::Combine($(SolutionDir), "packages")) - - - - - $(SolutionDir).nuget - packages.config - $(SolutionDir)packages - - - - - $(NuGetToolsPath)\NuGet.exe - "$(NuGetExePath)" - mono --runtime=v4.0.30319 $(NuGetExePath) - - $(TargetDir.Trim('\\')) - - - "" - - - false - - - false - - - $(NuGetCommand) install "$(PackagesConfig)" -source $(PackageSources) -o "$(PackagesDir)" - $(NuGetCommand) pack "$(ProjectPath)" -p Configuration=$(Configuration) -o "$(PackageOutputDir)" -symbols - - - - RestorePackages; - $(BuildDependsOn); - - - - - $(BuildDependsOn); - BuildPackage; - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From ac87ffdb94bb984f8ed1b063ab0b037f9cebac75 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sat, 15 Dec 2018 22:12:16 +0800 Subject: [PATCH 033/372] fix build.proj --- build/build.proj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/build.proj b/build/build.proj index a505afd63..d77b3049b 100644 --- a/build/build.proj +++ b/build/build.proj @@ -51,7 +51,7 @@ ServiceStackVersion = \d+\.\d+m; - ServiceStackVersion = $(EnvVersion)m; + ServiceStackVersion = $(MajorVersion).$(MinorVersion)$(PatchVersion)m; From 819afbd70798faab639f56ac9cf7cec604fd358c Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 16 Dec 2018 22:01:03 +0800 Subject: [PATCH 034/372] update Build.projs --- src/Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 8f18b7ca6..f64b397c8 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -24,7 +24,7 @@ true - + $(DefineConstants);NET45 True False From de693ebe7a430ca8c24aa78550f6475fc1ee7905 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Sun, 16 Dec 2018 23:28:55 +0800 Subject: [PATCH 035/372] build Northwind.Common --- build/build.proj | 6 ++++++ src/ServiceStack.Text/Env.cs | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/build/build.proj b/build/build.proj index d77b3049b..44c8dc542 100644 --- a/build/build.proj +++ b/build/build.proj @@ -39,6 +39,12 @@ + + + + diff --git a/src/ServiceStack.Text/Env.cs b/src/ServiceStack.Text/Env.cs index 028322d0b..aa20104e7 100644 --- a/src/ServiceStack.Text/Env.cs +++ b/src/ServiceStack.Text/Env.cs @@ -99,12 +99,12 @@ static Env() VersionString = ServiceStackVersion.ToString(CultureInfo.InvariantCulture); - __releaseDate = new DateTime(2001,01,01); + __releaseDate = new DateTime(2018,12,16); } public static string VersionString { get; set; } - public static decimal ServiceStackVersion = 5.00m; + public static decimal ServiceStackVersion = 5.41m; public static bool IsLinux { get; set; } From 8513adaad391673176c9157d3c1311ac6f002ca6 Mon Sep 17 00:00:00 2001 From: Demis Bellot Date: Mon, 17 Dec 2018 01:29:38 +0800 Subject: [PATCH 036/372] revert false case switch back to existing setting --- src/ServiceStack.Text/JsConfig.cs | 11 ++++++----- src/ServiceStack.Text/JsConfigScope.cs | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/ServiceStack.Text/JsConfig.cs b/src/ServiceStack.Text/JsConfig.cs index 53a8399d0..250e45f1f 100644 --- a/src/ServiceStack.Text/JsConfig.cs +++ b/src/ServiceStack.Text/JsConfig.cs @@ -100,11 +100,11 @@ public static JsConfigScope CreateScope(string config, JsConfigScope scope = nul break; case "eccn": case "emitcamelcasenames": - scope.TextCase = boolValue ? TextCase.CamelCase : TextCase.Default; + scope.TextCase = boolValue ? TextCase.CamelCase : scope.TextCase; break; case "elun": case "emitlowercaseunderscorenames": - scope.TextCase = boolValue ? TextCase.SnakeCase : TextCase.Default; + scope.TextCase = boolValue ? TextCase.SnakeCase : scope.TextCase; break; case "pi": case "preferinterfaces": @@ -785,7 +785,7 @@ internal static Config GetConfig() public static bool? EmitCamelCaseNames { get => TextCase == TextCase.CamelCase; - set => TextCase = value == true ? TextCase.CamelCase : TextCase.Default; + set => TextCase = value == true ? TextCase.CamelCase : TextCase; } ///

u`~u-4R_QwH34fjNiJ#YXwiBMQTDPA`_yNKP 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