From bcc936526b8aebf05224d158bd84c0eb55a3c068 Mon Sep 17 00:00:00 2001 From: Alessio Dal Santo Date: Wed, 6 Aug 2025 00:21:50 +0200 Subject: [PATCH] fix: Risolve errori di deserializzazione JSON con valori decimali in Salesforce API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Aggiunge configurazione JsonSerializerOptions per garantire compatibilità con Salesforce - Implementa normalizzazione automatica di valori numerici con virgola decimale (es. "0,00" → 0.00) - Sostituisce PostAsJsonAsync con StringContent personalizzato per controllo completo della serializzazione - Aggiunge metodi NormalizeNumericValues e IsNumericWithComma per conversione formato decimale - Aggiorna TransformValue per utilizzare InvariantCulture nelle conversioni numeriche - Applica normalizzazione in CreateEntityAsync e metodi Composite (BatchCreate/BatchUpdate) - Aggiunge logging dettagliato per tracciare le normalizzazioni numeriche Risolve: "Impossibile deserializzare l'istanza di double da VALUE_STRING valore 0,00" - Il problema era causato dall'invio di valori decimali nel formato italiano (virgola) invece del formato americano (punto) richiesto da Salesforce API - La soluzione garantisce che tutti i valori numerici vengano sempre serializzati nel formato corretto per Salesforce indipendentemente dalla cultura locale --- .vscode/tasks.json | 16 +++ .../SalesforceServiceClient.cs | 131 ++++++++++++++++-- Data_Coupler/Pages/DataCoupler.razor.cs | 7 +- Data_Coupler/wwwroot/data/credentials.db-shm | Bin 32768 -> 32768 bytes SALESFORCE_JSON_SERIALIZATION_FIX.md | 0 5 files changed, 143 insertions(+), 11 deletions(-) create mode 100644 SALESFORCE_JSON_SERIALIZATION_FIX.md diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 84736b8..c0b1c6e 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -27,6 +27,22 @@ "options": { "cwd": "${workspaceFolder}/Data_Coupler" } + }, + { + "label": "Publish Data_Coupler", + "type": "shell", + "command": "dotnet", + "args": [ + "publish", + "--configuration", + "Release", + "--output", + "${workspaceFolder}/publish", + "--project", + "Data_Coupler/Data_Coupler.csproj" + ], + "group": "build", + "problemMatcher": [] } ] } \ No newline at end of file diff --git a/DataConnection/REST/Implementations/SalesforceServiceClient.cs b/DataConnection/REST/Implementations/SalesforceServiceClient.cs index a7b4fd2..dd3308e 100644 --- a/DataConnection/REST/Implementations/SalesforceServiceClient.cs +++ b/DataConnection/REST/Implementations/SalesforceServiceClient.cs @@ -23,6 +23,17 @@ namespace DataConnection.REST.Implementations private string? _instanceUrl; private DateTime _tokenExpiry; + /// + /// Configurazione JSON per garantire la compatibilità con Salesforce API + /// Utilizza sempre la cultura invariante per i numeri per evitare problemi con virgole/punti decimali + /// + private static readonly JsonSerializerOptions SalesforceJsonOptions = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + NumberHandling = JsonNumberHandling.WriteAsString | JsonNumberHandling.AllowReadingFromString, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }; + public SalesforceServiceClient(HttpClient httpClient, RestServiceOptions options) : base(httpClient, options) { @@ -392,9 +403,19 @@ namespace DataConnection.REST.Implementations Console.WriteLine($"--- Salesforce Entity Creation Attempt ---"); Console.WriteLine($"SObject: {entityName}"); Console.WriteLine($"Target URL: {createUri}"); - Console.WriteLine($"Data: {System.Text.Json.JsonSerializer.Serialize(entityData)}"); + Console.WriteLine($"Data: {JsonSerializer.Serialize(entityData, SalesforceJsonOptions)}"); - var response = await _httpClient.PostAsJsonAsync(createUri, entityData, cancellationToken); + // Normalizza i valori numerici per evitare problemi con virgole decimali + var normalizedData = NormalizeNumericValues(entityData); + + // Usa StringContent con configurazione JSON specifica per Salesforce + var jsonContent = new StringContent( + JsonSerializer.Serialize(normalizedData, SalesforceJsonOptions), + System.Text.Encoding.UTF8, + "application/json" + ); + + var response = await _httpClient.PostAsync(createUri, jsonContent, cancellationToken); if (!response.IsSuccessStatusCode) { @@ -414,7 +435,7 @@ namespace DataConnection.REST.Implementations return entityData; // Return original data if no response content // Salesforce returns creation result with Id and success status - var creationResult = System.Text.Json.JsonSerializer.Deserialize>(responseContent); + var creationResult = JsonSerializer.Deserialize>(responseContent, SalesforceJsonOptions); // Merge the original data with the creation result (which includes the new Id) if (creationResult != null) @@ -653,6 +674,76 @@ namespace DataConnection.REST.Implementations return await AuthenticateAsync(cancellationToken); } + /// + /// Normalizza i valori numerici in un dictionary per garantire compatibilità con Salesforce API + /// Converte valori decimali con virgola in formato con punto decimale + /// + private static Dictionary NormalizeNumericValues(Dictionary data) + { + var normalizedData = new Dictionary(); + bool hasNormalized = false; + + foreach (var kvp in data) + { + var value = kvp.Value; + + if (value != null) + { + // Se è una stringa che rappresenta un numero decimale con virgola, convertila + if (value is string stringValue && IsNumericWithComma(stringValue)) + { + if (decimal.TryParse(stringValue, System.Globalization.NumberStyles.Number, + System.Globalization.CultureInfo.CurrentCulture, out decimal decimalValue)) + { + // Converte in double usando cultura invariante per garantire punto decimale + var normalizedValue = double.Parse(decimalValue.ToString(System.Globalization.CultureInfo.InvariantCulture)); + normalizedData[kvp.Key] = normalizedValue; + Console.WriteLine($"NUMERIC NORMALIZATION: {kvp.Key}: '{stringValue}' → {normalizedValue}"); + hasNormalized = true; + } + else + { + normalizedData[kvp.Key] = value; + } + } + // Se è già un decimal, convertilo in double con cultura invariante + else if (value is decimal dec) + { + var normalizedValue = double.Parse(dec.ToString(System.Globalization.CultureInfo.InvariantCulture)); + normalizedData[kvp.Key] = normalizedValue; + Console.WriteLine($"DECIMAL NORMALIZATION: {kvp.Key}: {dec} → {normalizedValue}"); + hasNormalized = true; + } + else + { + normalizedData[kvp.Key] = value; + } + } + else + { + normalizedData[kvp.Key] = value!; + } + } + + if (hasNormalized) + { + Console.WriteLine($"NORMALIZATION SUMMARY: Processed {data.Count} fields, normalized {normalizedData.Count(kvp => kvp.Value is double)} numeric values"); + } + + return normalizedData; + } + + /// + /// Verifica se una stringa rappresenta un numero con virgola decimale + /// + private static bool IsNumericWithComma(string value) + { + if (string.IsNullOrEmpty(value)) return false; + + // Pattern per numeri con virgola: opzionale segno, cifre, virgola, cifre + return System.Text.RegularExpressions.Regex.IsMatch(value.Trim(), @"^[+-]?\d+,\d+$"); + } + // --- Nested classes for deserializing Salesforce responses --- private class SalesforceTokenResponse { @@ -928,17 +1019,27 @@ namespace DataConnection.REST.Implementations for (int i = 0; i < batch.Count; i++) { + // Normalizza i valori numerici per evitare problemi con virgole decimali + var normalizedData = NormalizeNumericValues(batch[i]); + var subrequest = new SalesforceCompositeSubRequest { Method = "POST", Url = $"/services/data/v60.0/sobjects/{entityName}/", ReferenceId = $"create_{startIndex + i}", - Body = batch[i] + Body = normalizedData }; compositeRequest.CompositeRequest.Add(subrequest); } - var response = await _httpClient.PostAsJsonAsync(compositeUri, compositeRequest, cancellationToken); + // Usa StringContent con configurazione JSON specifica per Salesforce + var jsonContent = new StringContent( + JsonSerializer.Serialize(compositeRequest, SalesforceJsonOptions), + System.Text.Encoding.UTF8, + "application/json" + ); + + var response = await _httpClient.PostAsync(compositeUri, jsonContent, cancellationToken); if (!response.IsSuccessStatusCode) { @@ -956,7 +1057,7 @@ namespace DataConnection.REST.Implementations } var responseContent = await response.Content.ReadAsStringAsync(cancellationToken); - var compositeResponse = JsonSerializer.Deserialize(responseContent); + var compositeResponse = JsonSerializer.Deserialize(responseContent, SalesforceJsonOptions); var results = new List(); @@ -975,7 +1076,7 @@ namespace DataConnection.REST.Implementations { if (subResponse.Body is JsonElement bodyElement) { - var bodyDict = JsonSerializer.Deserialize>(bodyElement.GetRawText()); + var bodyDict = JsonSerializer.Deserialize>(bodyElement.GetRawText(), SalesforceJsonOptions); result.CreatedData = bodyDict; // Extract the created ID @@ -1082,18 +1183,28 @@ namespace DataConnection.REST.Implementations var entityId = kvp.Key; var entityData = kvp.Value; + // Normalizza i valori numerici per evitare problemi con virgole decimali + var normalizedData = NormalizeNumericValues(entityData); + var subrequest = new SalesforceCompositeSubRequest { Method = "PATCH", Url = $"/services/data/v60.0/sobjects/{entityName}/{entityId}", ReferenceId = $"update_{startIndex + index}", - Body = entityData + Body = normalizedData }; compositeRequest.CompositeRequest.Add(subrequest); index++; } - var response = await _httpClient.PostAsJsonAsync(compositeUri, compositeRequest, cancellationToken); + // Usa StringContent con configurazione JSON specifica per Salesforce + var jsonContent = new StringContent( + JsonSerializer.Serialize(compositeRequest, SalesforceJsonOptions), + System.Text.Encoding.UTF8, + "application/json" + ); + + var response = await _httpClient.PostAsync(compositeUri, jsonContent, cancellationToken); if (!response.IsSuccessStatusCode) { @@ -1112,7 +1223,7 @@ namespace DataConnection.REST.Implementations } var responseContent = await response.Content.ReadAsStringAsync(cancellationToken); - var compositeResponse = JsonSerializer.Deserialize(responseContent); + var compositeResponse = JsonSerializer.Deserialize(responseContent, SalesforceJsonOptions); var results = new List(); diff --git a/Data_Coupler/Pages/DataCoupler.razor.cs b/Data_Coupler/Pages/DataCoupler.razor.cs index f555451..dc20a3d 100644 --- a/Data_Coupler/Pages/DataCoupler.razor.cs +++ b/Data_Coupler/Pages/DataCoupler.razor.cs @@ -1627,7 +1627,12 @@ public partial class DataCoupler : ComponentBase case "edm.decimal": case "edm.double": - if (decimal.TryParse(value.ToString(), out decimal decVal)) + // Usa InvariantCulture per garantire che i decimali usino il punto come separatore + if (decimal.TryParse(value.ToString(), System.Globalization.NumberStyles.Number, + System.Globalization.CultureInfo.InvariantCulture, out decimal decVal)) + return decVal; + // Fallback: prova con la cultura corrente nel caso il valore usi la virgola + if (decimal.TryParse(value.ToString(), out decVal)) return decVal; break; diff --git a/Data_Coupler/wwwroot/data/credentials.db-shm b/Data_Coupler/wwwroot/data/credentials.db-shm index c8d0cbb69b63498788b73e7fe4af78b0c83a663e..fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10 100644 GIT binary patch delta 40 XcmZo@U}|V!S|G4-LIFQ+{DBz&R3#B9 literal 32768 zcmeGCL#!~&(g5l%+qP}nwr$&Zmu=g&ZQHhO+d6ylPj2qy49@JUNp&in9z5wzDyhae zqy_lD0Q|qj|DVhOjseD+v;~Rr|8oET9rgGB6aQELFaIa-pTK_t{|Wpj@Snhc0{;p8 zC-9%Ze**sr{3r0A!2kCGFlpE{YyP1$U=Nm5Xf8hA%@^0Cqpw)$_0HM|J`Qp*mWR+? zyxyURng;!Ii9%p$OP=k6)IqbtB+}&)30Jy+b!|A$1aIR4<^yB@YJvZ%0G&8pO4o~s zP7iNR$j4s&3m0hGHN1WXsSzi)B_i85aQvQFlKD=vEnD5dA~16Xd@Tm&S;DPnt!KK5 z7!&nZJ-;;8y5d&1#6HW{?QqZRZ6)RZ!1_1CoVK9PyZ;>~8U0g@kabA|+!R!zSA&Z{ z)czhjR%2oaQ(e~j?Ph-?jUF6_d!iBV9#!2|2s82!h(h2gGh!F!8x37PkC9dv$121R zFc}jAUI}TEaIFt{fiD<9X%RF4bvT%eKLeEUDcJd(Oe*lYUn9U4bA$E;plYMX$(g52 zTVN*H%{zTH^yfJY78bYKI<~a^H!4I11n^3B4a*O$cqNaYM^ICZRzQ)NV46Hd8}%2^ z4!%%nx|{M@(YD&Dpe~O7B5q#lLIL3M>RU&v&gzmzx!eG_5{8bl%QviavGWcU(1D)7 z$adj46CYejcIV}+>>>s0G=LG(O6&aTciuKERAt+p zk1d)2GR&$w_KJF~u+@|Jr1D*Vr6Yo|LA23Pw%i)ahjdjjy=!tpR_i2i;usIZiQE;M zC0DX=WNErPw_*9TYqh5OaamvXET&1#O#%BU`06OIDPrY1y+=mCj_yH(`>UYJGU$FM z(PW8PR;->F=9IM3wF#=1v}oIfE`;xQis-swK=Sbd1wrBoUhjf1XZvR-BY1^yrY4OC z^Kb0ArWux>r=AYU6_rZgk;b!7R+Oqgwq%MrYtTx~x+UaPhFS%Rt1!G7LpV z``y_=(bhXhA<|vhYwHQr2aKVX6opwYBw82q5V;^CGlXtLqYYOv0tq3yhzaa__ zKzR<~7f&uGz||%K1bT}VW=iGjv;x?!?n7VVUyHB^$hlYNlyTUjlsmAoykP7FgnfDn zl$jbRb;08mS@CdOBzy8JF01_TW4#IE@0)rpNVi|$4b2woh5RXBR?oHTITMU;ZrjPF zA)s6s2D^7^N-h-=Pv#*uTeQeOM6h;2+%tn#0y*TAEw9s8=BE59y5Aul1@G~G-ZU9e zW+vYm(87IVujKvRQiq0>Fr{Wk75(PHN}iTIxC zDPPjft$U~?t-k1Eo0$a(+*I%0o-7#M$eX$HbhOViNZBtiUv!Y)agREv z=0#bQ31O4$k&8B#_lh#|GQZ&Qy96{8Vap#95hK)s6fB6Tty5$WqNPc{qHWCODad<{ z<>I}VVDQ;We6Pf8Pw`)s9oCS|OC{b&2dnjf7CK1X9!ZKX1L-&Wl-`dy1euN=*4hS! z-*&ct%K4@Xfgzix9tL_jEU5ZZb#EPFn*XXM8v5cpO^!{^*THwp&O>As8Y79;{f{-A zrN-L@fe?kNI#w-NZU+#=kXG(TF&F6^abg>W66%kp2?g3pN8AFkpW>{Ci$U9RWJZQzv_Pl?3N=uj>dHWfE zW-$3CC`d;uN;If;6f_#aCfM|OYryOLX&sXa^1MsdFK)?!Mu$o zsQ|Em4`S^tgCqHFb|u!rQm@+UkWR>#i4Pi49EqEXy9 z8nlW24 z%ySff1Zf*U{R#FG%fhME>_O>4zz!W}NzPqjAAuneok&r%@0SkHffsVx+s`xGt{I35 zbzT>=(B1%n>WUbD9~f;b<2kL(uXY{f4h(Jf?L>ENVa@$exLkcLYM?Ba5)oyv#9O~F zaR@VRDe(Fl?IXqxW_gh!R0t8;PDKyOgqc@ss^H#+I+9rep~}wwVu8RHZ_^5lI6B9) zc9U69Unwxm-}4w1l@^qPJj=}-4hMf+yu-g(0`0+{hU4H;ZH0c*`JB4}OdY}Ze|gI4 z!a*g+FlYXb&ey{fzm(-YG^s6>d;Y+05*qkUSXs@(xcY|Vqv-eLT-j9IUpO`(L+eVn zKl$amrB^)mNZdMrDrp+3p##FQcd6G`T(Y)pY8+vQiG|2na%psFF@{oIEiC?IJoAKv z@&&l=rg6}&@k2#SnR%YjKlQ`*%{_%>S`|Alv&9&(_O+wY*;gr!SiO&^dsvwoD$1Im zh8%V1!sV+!u&5j_rld&FzFhqNa6v?}HuAEYFnK@un|%N7T{d*a$;P}}F}K)B5#2mp z{r>Q&0SEW1PGV8#pqPaFo|Q;le#yJUFx^Uehe~bPYgK8kK6ALn0Sz3j( z-{jEB1T$_6$ll_x96os-yQAwI9Kr_k&FsdoDV4-_c-7EOIhnm z;eDcpu}zT+4k;Xjh;&H^ zRQy!QX2ws>fKOkE1_HuQpF>V=z@6+L0?&*5VB%r3QtVv2&NK{^<$nPu9LFXZX>DXendr~k?@?`pB* zQA>T{XDqHHc6TK8)Ws!`NrJ-M1y@)85bB$9=1 z=VRvKztu}{!PP$OZdRfhycPT%d7*MXdg{HyF2iJn$<+&Z8D8Pl*=k2n--$GIsmR2m=$9>|9KsbdhpI4DP@sle>Nol zGqR#lTA@6^#l*XQ1`N)JYqnH+#L%e)s!=4)UNQ;cuj<$~xy(B;bh3pQmpQHjIZj!@ zna`*F)6x>E%V@{2G5f`yqycuEL0h-!N5i-UkeRqPn@HJ`n-R`(g;*v{m**Fmvdz$# zzJSikfXE-E)eNm4-n^i6;84syL6mmQ_iC%}jBT0u5%&j*xuL8P{{&>4ttILs@T&6Q zsk*}3ezYh9A=9g+dE}Ji*7E5B34H#qcf+|`#p|=U`uingw?uiFq1ibIReEh@B5hg; zLov)mE&u1Qw$Kd1Q&pVnU<{@$3CaK&DO zf`6}@1vCojySrdcbQ!^vPfy@ns$4D@ISUsv1NUtHuQqAJA!dsV&z(%QIcxc&xlu;b zO4e$79|O{4VprI;yuYFaN^I6IW+@W!9y+PB4cZ8iw77E|*d(zohMZ{ms5oDg*(w~-m7}OT|I~779hnn1O z1mP$i;JZu9r+Ki&DmEy>9JriJUtG5q!P~oviH9)B1n?c~-R z)0g7`_PvF}R&-@VnZLaVMdZ#%*?HI}E&cxWSCq=+z#(}Giv&Z+zUloS7%ENt`?egn zElWU*HdOXk=gEXJ3a#tgy~Vgtv>7fJxt;Q^YkRhK-=IYE{ay5xIZd@Q+6F4c$IY4} z3XJVzN+Se{n@NWX#A@07jTrNotE}EgQFEp!)+mE;s|I3w{6(Y-#I!2>iA>zWgfnnm z&EML;FO3knJXQk5p3M5q@N2y7UTsII?B%6d6@zyEVe4MPG8%Ny=VhOuXe_$4)2o|qSNzj*TbUycRM*czW9ka4ymWQWyY;h z{?tI|--VB$c-JkpU8u2k)jKU4uMiFw@m6yVXKmC)%<^rZfljqhMov;9#t&>LP>Llk z?|Cs^`ny;ddB%hqrZwZ*-j=6&Jo>e>clSXbt^oSA za&djh^B<5W0cM1_WagMSgy+*o;Q*KLW3k6{B0E@<>N z3A}_GmiBb*eVi3Bxxuqxl;0dm+<#w2t*uEkWEY^fB~U=UnKAsYm}J~0rI*VA?SrfP z_Viqmka0HZiG1ZlfX80K5DZvF0WbxGT?WIMG#U#W(&N_YX)R~HcGl&g z@RdiXFOnvr<8>wLa8pw7KtUJbJC#G)z-GSh6?93=2ZU&ks_-a;D@Dt0e5RBdcbpx5 zlS;V&3Y~#v#WcDMT{~%beG#v zMBnaEO_35^GuuE!3zFbnaq>xhg6|Cs!j=E&(leh5(yX}}$A{-Y)&dk# z>Ez2rfs_01b-E*&R}}^CuEV-oUxtG=r^v1gGGZsFg->8{-Q%*Tfo?(a)BvJ>qw$`T zr>!j~FuR4R#@Dl5&1SZePSzuxdBl+y!ReeGZzgI$3LykzNTTlUSODZf zBvOVaNGiP&eyQx|T8V)Mq9YNQ6TD)cj@-l0&!DQh+xMI%@_cH8S8JHpkjbmLyOjx1 z+lI25CwoAt*YW`Tuc4xf%}Nu2USZpB+}0x*>7#QRWJ=X*b~e7;tB&1#CSM5c`Q&>gyDDkxhL7HWhD%roDMF2k;OaE588xSY?`^*vMQm2oreSp;i%%%dOZZuG* zTx&EVcukA#n%sgc_0lVUKj)MS%O4V9Bw)Xqa@NckUuY{1dT;z%YOYOkvlU@_{4{C4+vj12bmhfGe}mXO$CzH8$-%~~OSbh$ za##h8aQ$%B23OYH({x|QN;C21t>%Jphq??3&i}eEdSO4&!pQ1~jrC-cgiZ)eqca?L zhzG6i=t=ZL((a4)rdz{QebkVsj!S>Zi{9zDEJ7}Ox&d38Llm$$qG{F59Mkt4`ZGfH z^fmA(2WEG0+W81h^XAjxtI(Y6pr1h8v9Io%Er^!7(`!2uF6`u)O5Yv5EM%&a5)Oe# z>*iyyq;{I&yID}PzmdNcKT9~OnVXOZ=;qU>mg)HoeNoLZRk{yz{Ub*`hinYAd5Njt z??;%SBfUCtg`uL9HK%fEdrP21#MUaAPLh|flK$kie~xHkZq|1F0`;jdar2QU|XnB#bTmwr44T4UKj^im&-?3`wRR@HJajzD3;u^ z^_i*;=tB1m71vx|u(g$)2C;vI6Temoe=a1gw}DakwZuavoe>C5GRKmg&7+%=UDR4< zDxji=81_oGZ9}^MM1}ZcvQQ6O?N6%K+cBw7IV;deKERANFjZ6gCHaQ2?!EY>(sMF5 zsYhle5?au)?*aETR@j_86`#Fxw4-D+T?@!ohdP36c3~dN^Aqy# z95EIn_hY}Qq5Ydv;a4?^J3p_(yTGY#5$P!wK5r-0HZbljet?kM=Tnf!LrYE2h6k=R z6*9^xDGQ9s9ff9Z!gXUxKCm~Z2LPrfeL9N^kPwSbkX^*{m)~R$3x_=P=q0t+*(B#7 z+J)^RRjSNg3p*rl@s#Ju+aLuq9&?_&P%I&nfhNkHvZHMCH&R;4dm4@4#v9d^bivd~ zjT#sm0{ke#0Kl}rAO~}q(#Cjo5rt(cv_~@Xz3pfehqqeq$0AX8^3?nzg*2Puva(V> zoijD;d^yUzF-!F2Dn^47pEdA8cM66>vBKK4B@}YRQJtfi21>OrSCDy*8~2Cii3hof zvVH*F!1_eoGM!G8pX9zMo1lavzXn`yMA=y2F8CMB7yXBAb+Mm-9IZ$=i>e0ago+wX z3+LTwvArG${N^7T`XN#`l=^BLPVp2>&^kShNjiH8&Qb|^Kxj;q*ICkGV;!eunEfuQx%1tpXu+$LMzFL*q??%U zve$K@sG7`-8g$pV|LSbi?Z=}`gJhn*iNBo^Nk9tvn_ zp8bjjYX)1tS&w%XEg91g*c>#Fh{Hn_8(}b#-ph{D-1_-dDO};z6zo5HZAT~AfULF| z$tuL+z*Z2Q=7o#)mxkr}7vW;EdE;ry!}jc{;Z2Sml9@zqtkR|6$}l!d*M4MQJj>R* z!jsmJvJ(ALSxw8m8G^DhE_s$su1uTxKnfXJC?SXpd*3=MIJP*WU>PQ}{MIUz>o7x# z6^=TS*58!^=%i57&N*zYsl$}Lq2hdL+|Qa5(@jZD#36?qZl9FT@k;W(vhJo5J)(T- zA883NfT4bcnFvY+WTYG)v>_2`y-}yog4IMo3G{>L|7@0Zr#as{afwZ|K(9pW7FA04 zH@s2knKHgG1YCP~0^|G1IjYO63|ePp2$v0lW7s<1-cf{M!Ih44Oxwfaitlcw+UN zPtL841Thbt36?eT$y;_pZIU3P(G~j$U8hC(OfVU|J_OX!)igv+5G_(ipX!=Y3D0JD z`qY+-$m|aEwYG%>&gyzyOt@~+yq8<&sfy2FsZ}Ioz9Qs-b5;%vHa}YL|0?gKZaxO; zWK)b6Iz%~$VOVGXuKY>9%g9sR+esCrxCpfwXNDL>$9a|OlBqhw zEKM*ldV1g`kdhr9yW`rHDo2*Yr z04pi*d_w!O%xgA_1cL!?>yVzmCPS9nj&PIUBtp~LGbFFlXJSr*Pv`PgR>a2JHfxtX zdzn`c!SS3Vr9j=!Wd18qv2j$J#{X_;bxGb+-{K8vZ3|H|2Y5mS^wf*;LyoU^xtM4@ zA+19s<*h$|&TaZvO}LUMGSxmw^8iQ}W_!=E?p_R#uZ2L$e$zE()J&{JN0=#~?Izk1 z8%U`nVFw2arRCYV$)dFT%dEYVOg|0G?KyU0TIi#>7NY$W{MLRahkHeen_Gnem;aCG ztvCOS$}`J;?Wo723xuW!?KtY;Nh~hd(Xlugmy`goh!SALS?9g$hF+XxvbB02Qgdz@ z6;5LUfasRjtBunYh*r-jA#_o|gbuzGMp94`V~PZyz>10%G4l38BqYAqB~*DBMky#| zKRo2-1C-3XAQa!mriIYCUz=o{SjdJls1NP#GnC8`&MfiCVu- z$_3l0sX+GKxO-cO7HPwhMb?qyn`>tn@a>EZGUqtPV{^VJ+p13#@M2sT+&fD-aa1r# zmt^U+Gb(d^IUi;?A-e!UDNI_yM~J%S z!~S~{{RZZA^NhGyde0Hg0AR~pln+H%y52%Y_H{^O1BZVWW)d!~@sSZi-ciRp)FEpZltRsppwVpjL)MGy~W`645>jROh8Kh_b`X4{(q~sNzzU5E`iK#>1 zc9)y!?U&kPsOph`dgydaI|(Ex)A1z=(J6ZywubgK=RXqPWxc7!7mR^9)*aaGXkz%g zRHqH4PajNUK62e)h3Jty|I#4jsgfvHH8cw@~Ddf7{ul;w`G7ZdxD>)(aP{ zs3?3aH6*(jNW89T)|Fe3k(Zy(a97U2hgZ|l;o|}qFrm!&mY@rO&|IltO6l)dp89KU6gKWma~p6L#P(o_dq?Htz*_$K~QlBk_l zvI<#2mb7Q+ZR|C-{dHK`A2#Dl-AVMdGWqZ8#W9-vTK5@5Kus`U6iyFu$ z{951CHal&B7HrnNMM2N)6WoeBPBHB+fNx~FS4?J>7itW>LIx zSbRt^9C7~YC}J)FVt5)b4sv$xu{cagfh*`D+t3#f@_)oIG{uGAL*ytx=c%?dt4;~9TJN6D zUlXAO6{Su~0j3E1H7ZS)nsL7D(nscc-5T61X^yzqjvkddKD>5|1iDp3bJ(sEsx#vJ z`P444MjppF;e*y%hq$mdDIX$~PE($Z$r5itiR`J~kOy=~`ZG+{Lo_%UNDBkI)DI;9 zeFClC_~mCj1bES%B6VGB^B~u}SU~vjq^m&7w1VL4ninSwfCv>#^Yp4$5}gAb^3spKxjOp+1z$i=xP)~2>^%FnmOB`%zQwu*do zPz3b89HG7Brl@|uL9>@k72EX3`*&2a+sKiw;ni$Z0W*t{)^qc%@nZ$Vcjkvjh4;2@ zs08P3dq9X&WnnsU&0k8~tPo8gl%RS8rXS&mlCRq=gt*AS1zV z(A?1$8rkUCvrt%b_^q#bMG6f0v{Ko4ov>wh!4o%OL$&5|5Sr^zEEvkLm zuI_G30P|0Y{`+z?^rV-4kpS9=jn*z1eM$OYX`O2_*;`&*B=0AtaaPB3Zq!@dF=9k* zWSzO^z@a1-YOy~PomPe^1POm9(lbC~pSmT%+Zy%8QAzSO+Sy)HudQhGQHH}SVLcBp zjBS#W{MpDofDUnUsjYHyWb8k36y}7x4E$Ga>VZD}hfdfL>YNpEL{j!zbRMlsn9 z`~FMDX~3M{+)wdXmo5AkdPPl_jcQ=X(pgK$uI+4OXsR^yHt!79E^E*yfsCkD*NhJL zNZJ8YI48Vw_?HGHvMCo;d}>C~Fe4c+gRvTfE)|IQeeHvN@} zf383163Xon3)OTw9%uCk(*>E)XWoyWB|OlZD7!5##9GC8lYT(;#YtS^2eA&eT*Gta z3W(N51ZobOo#i?TMs+R=o-0j$(av@GK~HnO5nzo|)bb&XqotBHEAxBxw^3e1jr0gs z_KQ~%K9Net+1ED^UZ_SI5!c*WuSeCMowwky$_KxO87VbHm2%{fd`fQ-hYZ!T?M;3Y z1CojsCs%Bku6rTFbl@u(5sT|uiA)pH&@4btYkOF?;F02xJtfTj7eAFc^YhJvPM!?Q zpG4el???Xk^AUKY+k~!kwUs>7y<2X}77Jv+>i!7|f8HF@4z&I!ZUt)SG@lavZ3Sr7 z4bBH2#U`V09O5oRCy;qlNWfaIF=>Jot*fYPoXh$Bt}GiXDjz0qY_;4CAhdC_CExCX8s=J>u!AQ46nn^nZL+G_!!x_{@|3f1j6kkjMzwGNGi;So^y z+dJs)pd3t6zNLUAzw`mynm1YCF`Z0IH9I|awz;h}D-p*hE(=z5j^I=jAY%_4 zjyM|wrw~i!999mkcBtC2fsh?v4XS;%?6wLWDWOq3%DUs28J|CojS*~WaOmAmMG(`S z=3$GdeLLwQqT6f^4Q8WD>G0c!K@zJAGxEnHwH77w$g2=6fXhT|feqiKdT>;Q%o(W` z*2WN5c2BU9-FnbJLUkPjxq~*&AG(bu78}Kx)?y>DX5jF!USb;Je&|VG*qfyHV0eUN zYx@1pm2+-Pqv*F_CAtoZeTJhfmJNuy4o+L9*Ddlqh)oP~cvhI0p`1xX|53d;ll3aN z4T{cpAMb^o{%h@>l=_n>T`CvDN>hT!2d~}ej18@$&rTJjJEJ=9A(7`C1`LQKjb|iF zJmDB?O>f}z#++4CWwD|37HL@NAIyxuG=b?1Ll{o6ndp~0b5`K6%Iv8)jU(MqR!@bR zrv)%00g!liTJedyo<&G;BBC_gh+BX>TI_+5m%H`yrHMk1_0pJn*@#Gn)H z%I7UKmP*Dt3hFoLmsypGSh#^UO%ongKZX1<3N33}g(|>|4by0|_S3PYkV3dVc7RJ* zy}Jy+n_{hpwP{;p&Y0p{n}JV!(>+)Xc|Wd2Ur1Hr)H$M1XZ|%6nB-AF&&P8e-~{GetzV=bo7h%AQUWK*ku?Obv%&^K5X@zJAw1}BI_PR# zH7CX)X*M2PhqS-ia2C5ArOM%|Ax>DLR84H+g@dtY3A~1LdYdH*iQ6BJ$zk3MAfQ}+ zg<0y?)qdlduimXb2~cI~=P{#6-7_V=meo>RmU!IeUWGmlFq~|rX{?VWU6H=hK|OjN zqL3k)R)5W$9wn9^!X}QH!X8pO^5~QYsVuA9YKkolk^vcL=hf;14nbc~1pXa&N*-d8 z1?i+PTBinHxIS<|De2u}xS-QOYN0^D82F7!w3o*;S^IOUK|Pf@1s#Por@DASHB!)$ zhsnJ%8N-sHP;Q8o)@+J{ZKp-D}HXhw^eaIFY z+_DcRhbKJ8!PMLGaThwH%_Gn7p1}Zuv{<=;b@$MyGidN3Y04G41+(gu^hwll$tBUN zMy3dUxRfshH+5PI2M>9^M#?nh_`WAP^q}1TKI`D0m#MIW(~zwxo-rKyFe6lR0W^#p z1$&TqJtFY<#=l>{R1n?`ItVUJ{P&UzMbsf98u+(3mGFzs0a74(M{w`itraP=PS{x9 z%4MC7Ri%!5nRF`YxI@-dU7HM1d;~dF+!zCm$xAC?tL0b0A#B8&<^k{rJ_-iIpsY6@=zh#62+8l)ulf6Jk)Mx1umEdWs`!cqpWEUF$fyC3A^~&X56vi~ zHd<71rW1^p29-X|#KQLie%;a+;zg$MO2VEH1?f40p`rA-DMfICOuuKO8b#OK-~0R! zN@*#-?0K!w!sGnHp8#o`K_I8kc_>4Z4vG&7TFZ8Qobk^$h{J=!%!dk-kme=I3U1}; z#Wz>zo>JQRX~;-&D&uhL&a!s0iL{8vP`Ap&r+*8-*A|?FfCjm_+!q6$xbOsKXn)Y~ zbJ<6CWUYC=%hcDaQ#A$(Zo(qHri;SI{Sz03TTQYH-U2b_$3-s`>%?bm%|Gcdh*@FC zL3t*q0kkB}Q&U*kCpHO1uM(yg?r6SJxql*$9;pdpE1AKqHj{kSay4p_Lgp_!qtHrh z)}*%?Iw#Uk)XEo0d)1+lhua&QnG-C8Tw^4P-O>N#W`)2zRrZf8P_K4E``$FlwSFGmmh!-O}yI}D>X)3-q+M}4V5{AaOE;AzsTtuR(LZ0 z(aVB4&*3DK2_iAc?`x+6QmsZ;7y{jfsZS@+aN%!!0l;k_wax-pEVIFtP;Q`aL@E1@LTA6dZ!N1oeNBGSqB&nRGDT zM;Tl}ph^{-5o=nq)px}D{{?=9a8EKOi+9?CdoX!Il2;=qhMU0XeG zvIM*ViEnxD>-)s>^kH&TWcM~z*!>~)O~@r_1+Fx71Zqw5{`08C=jzifAO_tAh4u2? z(#8+6!e;k=$Y}f_3}9tTXdiBaO!*E%M7f)$1oQ+wGB$Ro!ty!BElJ+Z7|qsQ0Y@Q_ z#n{9O^e>(tuvoRE$XqI3*7H*kEPwL%$~H+Og6c>(jFw|)GQi-Yhiu{&Tt&s*k2dn$Nfz9sG9DBd;lBI2#kMug zkPh-9PfO$6m-1$^^yHR|!b%5`Gz=_y3=D*RmGw|WNF$x&d-X5eLrsW&VY=tewh8>Trc;8+h&xY&4R^M??~>Q3S+K@OfAuwLDS@*X zsx4|2Q$aTX$4xRE!cNDC+uGRTxcUAgZ%dN<@6f#Rd&QH3X|N@pWSRi%)kn)GCiwU zG;gJKB=<~LoAlBB2QblCo7@W?M5VxDbeZgSI<-BtgQdbTe zn0KsDlbGY31N|T|yn{)qf~9gcJ{Xd0Rr(+wwmm$0v^7}~8?S04VwqbUSIW>mB1(7y zZ`Fp=QV)YgPNjFQsV2(TFH)#UOI*jZ5FU{XyQi@7Bfx1u`MVi*Z!YE?V$xOhQ5(f~ zGkyd^0zrx z6`abEeWm_=O_+q^roJcr%OA=NpH53^`Q-0A`-~`fX~;w7@0!SFaO7F_J~jMOl~K?! z*F0Zdr&x+sed%@Dg<0GVl3Ku3)15|>dfD?pMT{wOqy0;L2-N~ko!UYf%F~zo`NlB!MeZvruR@k`=93991VkMs*=cD*rXSrKC3|7gx;DS6$ z)dOT6c=ki}@U3#2JVQMR?l+8^74=Cor#9fnk8eKNSu=EpS2G40g#NLG{!c;trb z1H2FabHDEx&3@i{YYGkQ+mgnKqdJ;b z9`!Y#u+Nk)YX0I;clAy_|MUx85y`ZfH%Buua)CVjY7$oW$VHiT%SsTb_m|$!JK<#PNPsrEhS zLd%D1dkG3Z3lHP#{4G|zfokChBcR7xWO5Uz6nd9`!bXEL-&+}7R@4A$B3rF_ENqe5 zH~Cl@5b-JjrAp}5jDkdu8c3p$GariW90!a0`3pKQT+`SvaQ+1rQ-`pwAAOJrG>_in z+|C01XD0I_oRd?d47Iz%Q0IZK)NyJq^ow3x4NR2QWld!(X;GPAgRtRO9{NjThL6pQS zNkAPHX}pK;bm67e@R93%@P1=GDa0mSH82MgX^n&KDqJ?OjN(@Im!pDa5D^LFcnvUl zKCJN@3@VP2m(&4Q8YlFi`^9m8#)_v?`um?wA4>xAXEGO_*!a13z94^+{UYGUL{*$( z+Bfq*r}yz_M|4AzFT2;I1D>Zx&qFtm-y*l*XUm5mBsqpj3civYdgo(=gjc8 zNYA69xv97ET4WKSwuI!9k~DdwdqI~SQM}A}G%Mv{^dAI= zn*I;t))XxJL#5<-KAO(C&%-R;J3i7>O5SWs5eEX28dU)O>FblUE^BU(;s-Rwvp}o- zXiZ2T_pHM0RHQO@l-PQtbwvrk=K=+5+1rgK^s@(SYmRm>jTE+>_=o^iu1t?lM|8i1 z;iaa&n+_zDt{tjV_(CDGD#dja1glDzXF@BfHF5`{bTI5)^ijO#SdY|(Vn&OCwb^x) zfZ08>1e%bKMQML>&j7b-Fw8oWOQXD>>JBFP?6TE5C?Q7Gv>tcX4|dMozCKCQJYV%2 zf0%iB{kUZQzkc-u}MN0*{Z;tP7P%Jz5*FHNmKJOJPxjBjQ*R$7B+YtB@c?m4_0p~TQU)yF^K-3fTINPsy6wuJ0a1##N0~+O?9q9eQ4}$ z($i>&euwWt@myq#MAdiP-i1$^R$xLRx#4YdUo4)}ma2bOcpRiJEmqw|@d$QoEbNK6 zqAd_wAPX%m+*^rhBHfNL4JbTgk5#x@nh4tB@&FI5V{&akJ?l$H{$TUej|)mQB4V{! z3t1pXP&np4IYNrkyglN=4f9~5bc9qF9F%klMk9=ld2!^veHS61<4_MH`(cf8#?>KW zPKPp*$eXs}vP-`fm_r}S_uo@hz59*x`Okafc?i{{e4{P=AF)o%i##<+qd^KacXuuC zJ7Q~!>Lfm@d}7BF^xN}{sVk5eKVfVuYjr<|S(2K+b3=)9>I!gmO5A@iV?AOj_KRcU zEzhIVw*|1ZEwZ~vU1I#g_K&pYBlY*Q4+ikyL6n<@Zd@WQP5Rh?${tlBkPiR&Wxtdv zo@01cJ1E<1O5x@S(*cuP)i0zJy;sU3PfpwcLrcbYN!0$X%~h!EfG_cdb%y?SR2RRy zxrM|D@wpKBK&MRIQvB8gvix*PK}yYisR%n$WA=!V5iOERJYs*c+PH<}SaW-$`@UI3}VtR5GvvSzG2k0OeWzWgxXjcQ!7h?N zotgzjBiB79L|GmaPpFF(K1sQT^gNwN$?0uGh3<%;|0+#w!#R$z62>-cFxWN>6Eay4jCK1_J4$%zc6)k(L z?V#njjJ{Ehd4Veux2{=;^cg8$Si=c2elV&a?`EBvlz!`;p$kbxQQAFiX296#C z&vSlOt`@d6zh0S3_9cLT&^W*(mxkmSS%E|)ys!G6YvI#trW2Xv9*Xq*yR?zAuBEMV z`@n=C-S0&l5yjE+P>A!oq8jeBFh$FZhvCX}D9AvzSc+kB4I_jWV2kf!zVuq4f!ZaZ zJ?EocRz6;I6eLxHh5ibRt39meByU&7*QTu9ajVlQen$jsuyu2P+blvRLVLZL|1{x; zKamo7uJv9&OpGnaVKg8pZINlk{-StzCMCNQ7>EV_{+c1CGDdl!e z`xL=XcF4TO7oQro;H2){0ci@|BdS3>xz!3Zh>Ow1vPsczvwwQWF%>Zp$VD3mJvi!4 z5|`~PtW|Hc%EKjCYoWLgU&m4}ckfK5)<5)(l$@ZGN{<~72upvcyZ~bM4GIMLiAbR} zqt>q|L*Fopsi#Z6_UVDH@JprZMaBq28B+9b=FMP|# z3r3`zNxbMi^VLx!!N7cqCZsxm(REVb_BVWo5T?u;D#EZ*8wLX-j8`Vuf9dJaPRQ4!+Tm1%>)rv$FydWBDEcD0`-Mq7;;Hm0S zWJp8;foi(M7{}KxS8dc;&nMWfu{v1B$K}YjaGZ|w#i~j8y`IcRvt$CQ8|@j#(ZBm1 zpv@wv5S*!Nl=)sb-d_>&9kg_4s2r(a{oE~t;YD}lsh>I8w1vHN6iUMCHs9uUpaIb||{fD{+o6!wU!pG`E zbpf0Zct#J-b=z(DoTb{c;HeNqk3wD}G2#>8F`|lGCv@h%ev$ZA%5b?hSHGK7%TnG! zsqiQ_u>5_Ei12`;x{i5XqM1#fh!2aBtYmtW5v)?z9*|wZp%U{L=+7MHWF9YC_#4XZ z{|Or~>6J zNI#il_0pBpT>CU#jff9$aKfW8Q3J{dv?EP*nG)Ue*^hedYNjH?pm7p@SX&VN)N^+0 zQd`O`1si;W+YqJ}-Kn@B4+1w@t7Ccb-*F?vfm6BM5z2aFFFaK{dp5U;Hg^Ga$v1uv zBsD*@Cmyk{$6Rwa0FA{*d|T`2^)!W@!GAs^W327nh}vY}tW8Z^z{(4(F6d|#s-0$$ z)Jp&mJ~sLd>*Ev1&}@Qq6yzI>p$Kp<*}=01fRXj~RulX)vr(fyJ^4H;rE&~a^`-_U zpox=Dr7=%;Pblp@@7n~&BvV4{%rThYxeZ@oTkBYVUGLo7HgSH+wZ~! zQI?@RrFo<2V51Arh^=K}#FWgys_zSw!05IhJ!#~9wNqTV6UF))Wa|Q)!6NEZ8U^b* zorSs(%xh%$`^uu2tsI{0T_;5J9BLc93`!LSVh^R=7Pk<)u>XGeK`-=lBtM&SiufW5 z?@0BTY@$F-Q=o&0>(4VYSF|IFJeFF!ZsHy-6z5lAI-mC>E4~mE&3q%urr4&{(}fT> z0&V0#DMU}r1*xugNhhRzRX#H@7#ErF{#q)6$ZVD6?3iav&)sdfGHaKyZqO0Bqd$jg zaH6=2O26otbZ)!+02%M+-HqS~fuUfa1X&1CvSDmX2=-;iFjK)Vv5QWeBqaC8o5i1?GGH>hlh;umWMgQSL52l)ndqyFiI`urBS{YmV|YW zmEQ6d-#AqJFIR0)I5A5$BW$jVa#CIAU9Uqu&6cels5N+4fp-+ZoxzbCTukoANDazGyx)Wa^yDfo3r(`%;ze!hdL zHNUCvNoyVf?sI!^q<>ptCPm1>b?%UAN6sZ_CQ=7pnA| zVaM6SKB>(3)=37-{3*90&wGCmLT2qd=##$c(T(8NHfHjtG_kQ7yV*7z6GSET>3t+6 z`V;L)f@g}4L94u4WgtK@G!DcHS{0A_888h4YT(IjkqD(Zm)CKo@Jg6ba5#;j+fY1Y z%o}n>KZWIRxCmDLuW*oS-Hu6C<+Qq*xC9kAk6)x`Py zWhkx}#&3yBv{?}K-^nywV!~Xz%IW(POfIH{G`}3QMh32Ott9ykvgZKj)49Y- zIxgp-n25y@q6br{P_`R&ZBu0VUaHsEv-4lO_x5|!Vw6Q_fWPGnE55g)3ds?C-$j{{7*|t#km~-KLHBTe1(R0kf_t_zACxk96Kb3jh@Yobu9c^gt-(^6(H;WL}b`hoeO zoM!(&DbVDWU5tU|!_BmLR~39#D@^C1J;Io|dZ2=kVr`bc(c+j`iG;AqCm`X?Ti@hx z8G-QGV0_g}>h&R8iMFB`42n8l$1UX_P{;_v|4w#x<#d6Zz&j{Xb^c6%B^A^{2~<{u z?KVDr2}MzcE`%)C&$~>tbp3D&p}I6=gxK+l_8LAThFXS}{ z()3YEdwU_bz{BYNrjR*BJej4^z~+4kRL$R3nXt_kmR#p&Zl$*2PI7H-VaT=Um3^k6 zQMwcC{q>k6FGb3N%cFr=bsN^HGDe{Iwc{plM?0lOMhmquU&$f9MD$yODomKeTEVV`*KFV1leUaaSw@*hoc8Oj>VPw6&( z*-8B9qqsu)fTaY}UCxMlcpby+$y7b|Kq~%P$wE%Hl!uOh2rf1SD!|N_r_%aqH@+~s ziGiiLfK6tk!2jWrmA8)F#+~Bnkv}s31BzqNFR%;kTjueh<|~eSW>+4rxD9|N8OC!a zrTCkl@e>M3iy9F5D28h{p+%OeTLn6>$3@W|04}5_U`@4;0ZoYWZ~$A6YO=M(x)o?9 zzS2izvCyja`BtPha`Ih}@wUV*8VXSS#eQ9w-L7ri$)%Smbt67Ke;(rT_FoPweMsu>%&(Xph%4cHic{9>){5Xg4U&!cQ zf%coMYXqU$xhzbfL#BdlWh$XZ=PZkNV%*PZpsUTAzK92as9M+9NnVxjtx4qG5rM?z znQk9~xM>4@>8P7DhTonf6i$CQ07xj2s93{!|1OG~;Gc$)o%A z5dytt{Mrv1O{r5T^rmV^(m~uLyX92pTza z-`8@b$zT(;8!zf77scZyXLR~uJnH;|sZF*&MUJLw>{5{t>z9V>xb1x1fcUVHkY+sE9L@CnaGG|4u|IjA#;;S9DIt1lsh%UCdfV1=ETMrm3W zD(@INLL+^{)8%vk(I%o0XN8oxJ4=VhaVJQ2Uvu!+Ij0MfE6=4I#8e805*?4%%EpH=%ox&H{Hf)_*Xoaz_CAgvl(l6IpeSbU} zxeV@i)HvXe>;V?x9FPcND=jhqq0UrzltW5^s-Pa=GzJ)>1Pa#;JT$;Fh}YE2kMw6w z(TV{hfQ+x`z$lbSHkyKV^_FD}LNLk{WOXF54fUI4Eo@oPt*(lZ>-X8h{AYi1QiXJ8 zUbx{Z*xN)-Pv#ch!!Mk7{a5LL@Sv6@T`p}wL8u_IQ`Dl(H{tE0FxaA-m97tgG6MHGQ6I_E(;S$A-(WCP2$eEMT1~MEn{5I{aP6$3b`nc>Zluh&-94+&4|zg1q0E zlH2ED$55AY6^@r5OYgbV-vs~3NwOX{|BKt!+PVTQ(IYj+%q zw~1q}gi#O96&5I*1DpK&Oyw0KfS#hyqoSeOtiwXA`~wtFjU|qYfT}e zk18n)T6(g0Z-_!N%ksZp#&@FSo=rpEFpdqegxG zKI?F&>MjamAo3jQKq&+F>nF&*XZtC3O}%X65*Z)>#t(1at>9M$k9-}BSHgN8CSL+8 zdK%!ChL*TM6l{S=o4RjAIQe^uMN7^P4%AJ6{mD22Vf8mPWJ2+(;yC5z8pE93sW*=a zlwB-E%k+KHe7H`Asu-d>F@C&e_$v3~xUu*V@H3R5WO^Hi_=2IT@d#j>$oPfUB=jLG z!UEU4{RkA{ju(Pcl_))Fw9BrS>dWx{)uv>xTg~{sPBEmxM=uFkwuzp2MAEJmv&TP2 zrQGT|YCGQLY;#Httx=WSz7-a8HWBYobOC%XmAXpQy{(L-Xe2r3~B3n!VS9-MwZ72@>FkN zt)R#KILee1oT29i+NM+rs$RevdGsi5d6lwC+##I-@a6d+$!fQ)nf={Zg6ORzqqnk4 zc+8(I+S{tHd6mVBn}yZt`rfd=CKWG5Z%H5F`{jo_uGGh&&L6I-t$cv%6j~V_?xtU@8~H7gS1-OKPI8jA0rgnk%gp@3Kq!PP4xXm zCz&jtA|3o64Y2oh-|R{hjiip?Bgx%D->=fTexMob&BXg=9E*{ zMwxqZ{>a#~wY$4c30|CIAWuNaReR<(vNxf>agSZb_eyfPYM*~uUA*cVHh7?%Cm^6# zM<-nqtC4_+MS|3^o5W28`z2?jknd`DJ#gEbZ^YhAbo~Fc)P?(!kqp2!DQS2nWC=kj z3;RBU0vQyQuw{Jh{@G|0o&Sh{odFNoowQ3DN`y`w$WTdl&s6a${AUYSZy?ybqCgx+ z8)`sWZ`A$vWg}yqD`5OyaCkTUisGs1M^U~lWd!kLPbzj+T%?VuKCM` z(VB?ciqEnOiy~xf+)&4XZH{NqZ9Do8V|QTK#I4^@l{jCN~?V&*iSmfJ0WsV&+;nimoB1XzAkVpb(`x$M*pVa^MXUMTJ6;>H_liVe13AA?v zki1gn-Vrl7NT-!VO={br>L{yeF-%eDBh=t$Bc_fXadWYx9M>~DyATcUrpB5%xu{7gE(}Hx#U)< z;Rc58=UaUR=XR*K?4fB|mkrz0Njjq}_b6OM%pkc#yiSVBUrlivOuGo2zV!%l@zD>q zwuoael)V8e4+m;vr6T7Wqo0o+6tKVn-A22|YlYz>%|DjfKpeZ)`OBx1vwO_w_(aZ0 z$QDEa={PuWMQ3~+dGPFS<s8rz!>6R0IAB3Q_mU%^ZWb;DSV<~hIRh}$KjezDg(s~ zYV)sVjITgn=~7y3+R;CbqMDK^u-;|q6S^%w3Z^8HbTdra?0+t z8D5$cJQcg?u1kV?gxCr7q$UyxY!By+dT{%QAH(5Pf~tUyKJb)+$1akXfa#=A=B|MI zJD5Yj<>oY{xS2HUsng)!uxHHbQH8$b0--@?HzYW4fHA zLKe97aGPsELp<6a$xk*8*)32PuJ}BK^E!}bU0ErxW{%d&V&qn+OU$N`zp!fU_l1x8 z)h0kkC%11vU(-vjjJFdwp{N#YpiBx8XXhkE-pcjh)+B`S7_LJ}%|l79_K-$;u5PHcSL9tgO67iTcr}rLf%Px!Fq3Wr zy4r}UI07=zK?r-bPP>ZCk0+}BrXW00l?jm(=oaL`Kc>`8W9XDWDm-|Oy*h1btiLEv zi}mxuUBVkq=Pz)%ZFAiqtxva{z+F1TX%k`CTQ`V;KSwHOX9!ph!{!w(62p1Pkm2{1 zM?rvm;9M{5wmzq+^H{l1%g^iAm0hna@;yWRVrV4IvB9#`_v3w9w@mv%4;hdd1TMC| z%w~=ZAG*qaDAWgpGjI5InOMnFU8yM#Pf{y_<5an`*9Kmuo5Wg>te~Y$B=?N+y%(hX zPYcLtKm+@~31=xm*u(yEb%Yy{S8tgr%?2D1Tg8GpC64|pLM5QNz(eZF&%TDN0_VS^ z6SW*MD14tqVW21e=^3=V`L-FiGz>W=yDo8z+C_W=459~9LdhEzo z;Vgfq|Lv^lP?B$vkk% z#2a#DJCvVQ?I5eleXhwB-Bi(*yqu#)`)J?P@KV+yjXnRq%M5Em^cj%YW(Yyo5v-P3 zXV53Phc6~x86E%F(u3Q)fG0SeLzTazH;SwQoXy>AanF%%tV3G zCSbko`f1m3g!ZA@AAtU*{*@hAgd77$rOCcrsy1#asMx+*AZw4MAr6#PTS$HL{Zg_2pP&1H+0Hv5s@a9Kt6Du8 zS|<)}V^WIw-bAY0gum0+q7Q2BW;d-F&UjD~!z&QFr-L2A;&(bg9L`uXTw*-_qIkH} z)P5)9*K;IcTKwQoElw4q7|NBDXod1*{lL2$Oh?{WX1kUKYM^Q(RS+v;-iL1)bg)0V z@7S)pb8|!e#~eeTcUeGP*3;PK6%dOKM?4Xy!Z-C%kdB19r1dul`(NdPQGc`jH3eC4 zHWO>^Hm+zugl)NiPf$8ZS6HGOEl{<04%cz0udF#0rq%7G?S=BfN=OIPzh}s?K-!id zA4r9r_FJZ@?+~RH+5IgdVl{sQk?U_gd-8R=$3j%G;HciaIE5K|P{?X=a=BUDDm%s~ z?zfCDtj554^in!X!YNp6t=}Z-yTf*>dZ9%}=6qtXox} z$Z)2wub26~;q$#fd@)Qnw%p3w3Ul@hc7U#RZ)OP&)Plq=oYWwj!A7eW{6gsJ(EXg>|es zgN7IfdVL~_1rH0Qr8b3Lo8YLh+w$5q6zS1RFXD+~-*tCk_XjFO#!Xt1C4+_E>s?q8 zWqDHl#1sco6|yhc(e_hv!E@7vC}>E68;rmkw7?Je$;o)r}GbCpgNVj4Y~ktoU047C$eAKn~_VP$ITIOo-^1?2yTU) z9xo}1g+_)3UA%I9F&f%7U5D;VPeZ2Ut$iv!0yUo{qB%W;`QU}KhIhWW;`N-Xbe1Zd zzP8Wn?HpwT{|TLBOwnVjUcHK{9)SWjRvK{0IfhTtbJx2{_mA>7^q@>WjLYMNPPk^4 zqqes-80SH`^z9*V1*`8vdxdVXF*QH?w`yc@p^&|G$r?b7HZ%A)_^ctALuTS@^o z-tYr7`yT5(VjT4yi^GT6C?+Lw)IX&ecWDqzTRL?kD&vw;;8F{zTFe0$t{z-)-Eg0! z6(IpBP`wDT@jE8rkj;H36@k?PIGQmsl>Ea*b*4eXJBM(*F8WQa-g`IV<1%LKOU@Wo z0{aofnerQliye?qtTzE|8Au?DMlJ zfV42B$cHs=-hBx8W4V(}cb*^Og)~MlzBc}v*CyafM1S`hQ-}!}{K0Lj*06t-Ucf@@ z{D{cdwjcOd{U=^fMH!wLC|NzTKCbZ;wbEcC4fGtlv(MY)N#o7o?Z^s<7XG7DVDlCk(6Zn+>@gG^w7*^hgc5V8$MU`Zuqa z9+s0H?$pHB4|k3HBCrQmEwudyYsBEu$Y-@7N%BpfdC-mcpZP9CC4qiqwubiv7NziS zOR^O6Upb14XM8#O=!T-Wpjb4$ZT#HmixT02^(-q2lc{1;Wim^VQh2;38hBaR;SP2x z@>*!Qn<;m;tzlYng#%nzo=?DVfNHX0Z`p@Au+|w+nC_tNbP!4a&J}(Z0!)l-Lj|7~ zaJTAl=qGEc`^w;p4);Ed^^@48y1l27jGOEM!IL>iB2pm1KbA9OW@8?D~w<^ zrtj~?NDEO4{r4&(p4C{nm?xs?-}_xYjW zyfdH4ItGBGqNI`y)3MvIe3+7Zf)P4`Tv$r86L8lLIs3nz6RwJ)8leQ4JX6 z=oH^QK@rxMSKX0dhIH$Oc(TTIHrLM?*@|bAB_vL-W^eiN>YoCCnv<{rRgAfxL4P&L z5T|Lem`Y@@Y=LBV2-;?0a}qVGv3aMfogDVrkO>0t8f>OrGW*$VcMVZKwo^As4X9iG zy9KfKMJk1-3WbNa5{A|W;?TanuSC_t_X_+pW!MSmjRo2j;-<-?!e}x2=#S60QH?{l zo9?7&mu)K$GNWFIk9MdwK_q_FV&t}-@GUiIWFI-3(f`A0lA2zaI+Bfi_vqct=4U6d zO6ta0Wiws!h`OhmCP|#zAB1Hh7;wVa2fPIP=6uo@M>6Vj^gZsW2=Z`!nf&X zaP}KNMau5?X5o`p1}N5|vV6~dQCZiTXJfL2t!CzsRbB&~vtA?d10-^-62WlJXaUd| z_r{EeH1c&HWqWX!y|hx6M%^A9TV}6twn&J<)7fapt(VZlMOyd%0x{XZ{B+313-`)}3c2W%x{uhWyY9bVwxgAKpNTS zw{n;=E~?K|+?4@%H*+!56KNzedW6x}ouDYnX+>WL5oIQ7mWdWayxu!;sQk3vrB_#h zrSf+775*v4sR5v!qP(PnQZrC0yl2)Ppd+`7J)~FhIYeJ1B>+!cJVZwL^8}&Q5;bbd zO(BkUSYDN!4maA~`B&l6iV)5dw)G5+hbtJy;(gkmjl+(k@kWTm3XD5NV$TSE%7?vH z4=Q?ne1#lFFJ|Px8kl3_|E>%AwSCDhbM3tZIK+T5rFIY+7nbe#$_{&xg5&gIrC%q& zP62Yf>_MLgCzKFaJB*vxHF50l&(lT;`2_O!DMoldFDHQ-0b)to9lkPdG^i~7pWWKu zv&HJ8;W0y(MvcP~E)w^OO(>)|9^oDn7yp>;b}pV^Gw4EOD?owrGZ+PDE;+MRJ`&oi zb4;~>Z+(18pJLjJKv=f;b<8F>MlE<=^XGB!_RkHfg}ns1fOR^&dQE#IQ4`ku4$HvT ztu5FdG*A&;H4z^--GF>&Xbl`k@m4Z0f0v?)L{5xcs>4@0Q?&~^AdH>z;gHIq5W+OH zfzS~7PQ17conVnyh*GHmEIn|8xl4f=sBEA~iOCny=ZH=>*Ai+$*$V@3(A=M?T&tT2 z<VmATc zN!u~1S5}2<8oT`FEk7NfWF_m5O&_c1X9p5`LFQb3$vlkzaB}ELR8RYr4_T{GztnGU zbOOL&UJrb(5Ry@0p9#AFYrePH(hJSS@Sq@i6 zxFoU{D)cT7<`l6dU7Xn^A^g2x${O5ay>+a0&;ty_(R1$_SZD|E{nfSL{`z5Y0G{OP zKx1Y@9XHx@gN@G_U^P>{OE^jpjhttk|NXjr(`MmM`GD((A(V={5s;72d?m z%OJm1oy!hVVo9H~LZzAGWSrdWy}3FOlXdz%CHorpwYL4TIt@}=x>d$8{Kx_D)~N_) z%CV1O<=HTzLn*9On_jPaih_7^hZV_mmH~T=?h=R2ID|diB=I2-k8#_EY`nqgkbjTy#PD#v7z{AkKl5qhWDO2%x#Il7AN(Yh;5Or!|(UT)3 z1L|KRrAbwCIpYO48yPW%qkR8NfSMPudZo(S4nV`|9uZ(f)Jg{11e6wd=v_0FL6Nbw z;h|z;=k5{yZ5!;LyK^@gtbz6=`mxkElxMFNYgfT5<-uK_Dba> zIKJjJ)Bi=`3}R}>z!_d5kMs2iV=zM#ED}Ah|D4AQ-ul{uP5qL1q^suuw@P66W;Jpk7bsHo4kYIfjDl4P2TbKv5DvMj>W82(`u|O<7 z5@)8VI$a?3bv9{}<}*zm8PW#;EO;Eo%g2X0e)`}eKHs+T=j}|MQ$AMkIvjZ#4kbI> z&|N4yvljhtv^CT-kk^Fm93KYS)P9U)yKoyG#UM5K>UfSH(gZ^40ODa=Nz)Y$KR@29 zVKA{5AFuqCFl#eeeW+`(C|-A11aV_#OkVa(#!Iw zYhHNx!jM0p!zx}tu)X$UT%6!CDv^RA9dYz2+}sm)SO9UbsMZA_oi`v$RAeXK$}V*VB606+ua#108d2|Ip#@f; zoAC+!)R=j_f}%!R1H1Esny|yrl-WI;1Jxix05H5##q=IfK0$t zpD+^93nnllA5<;>AvvHYUT`V#m~TeN&2<$)b~)C(HB5r8)*X}-zj;ue3d%HrD28be zhv3qE)?q}1Y>|qMlsmeLwD8WOQq)Od%Y$JKt>^<@S+%54r|*5X?@d0@Ef`qj zoShw@t7Zzhq*JLecZF3fr?kpPb4@P)sn(mYb$^B`o|glhN;2cQ)9gGqIw#_r;Mvr zIpmTa^uqRH&0O^+y|M~iRBTJM{y}tOM23+jX7j%fNHK~!r(=P3t}=Zi$!Z+c20ydB z(PAV&S|@Js7E))2O|CXVCTK*tSO+hCi&zITy1ju@pO+W#dfBom7Fb@88 z0C)~sI2Aa%Dx0EiZur#GdS{%KL6>9o75Rmd01!+9w@^61jSE9NDr)gXv^oXSiitr& zl;(>?u9$`KTk^oI@YzOCrmO1hc=RHNFx2L|&s;K026`|a1-u|V$2CJmThpoM=`S3X z%=K1aKF2j;l8|SV8Y8w2St2rn!1#)4)0XIhoon zxWs*j(-zmjVb>@LPo95dKYE<(dt#kRpofZuE(XhSK0szqfj@mo6i_S%*~1t~Z!YY- zRd4wAH;aee%%2W?WI~SIIfL~yMUb$wmZnJ~aieFLxz4UItm1H=okCJzl+3ipfj6o) z&}@uaj|sz1Rks%zvdPCDuOJGy%z{YBW3J}U_s8majVv=);h-+SCF4TOt7OULyyQ$J z{e}bGZD@)GK{1lvJcgTW4kK)1(zQrDI9^zcIxc8DF%&Ay1V?FEIuG8q@!f|=p@*Y z&Axj)m+6(wXKkU67PrE9t}>6L>j#H>F?N3bFMt{GrQ!a5563>WX2n$F@(ljLMjqSd zX82^qQv0%8`6f-clYgmb4->b)V!r7XGW=&rZ#rtJ7NPoGSIj9*&FKR@Ca!J*2n$VZk#b-}pAiiwV(8tqJM%OoXCq{@m8d4+2`ntdJJe zT+`qiS(q8e6TiIc(|v0}pru44xpCeZa@B62hSJSaQ0g&2ObX8N298><{tQeNLLyr~ zaFEJDR}x5Te?|FqxIJ*1^(o*>dPTW?2p4?+rI?^L_SO_w%X0 z4t>JT{rLcR&P}EWyP$0|&flmjKsGPMTV!44Xg}NxOF}Ny#(TsK2VHC+8GD`CiK9_A zQ8*(o)^qh?>b<7=rh}CK?}X!)Z7~{VoD?+Pn~Q8dR_6i%!QAMdXt~do%wS`gMcR zwqkBMrQmXO@IPwDcN$v)6H&m(Dte)n+#iN~z)SF3caPg#?J^zL6eyRa A@c;k- diff --git a/SALESFORCE_JSON_SERIALIZATION_FIX.md b/SALESFORCE_JSON_SERIALIZATION_FIX.md new file mode 100644 index 0000000..e69de29