diff options
author | Andrew Arnott <andrewarnott@gmail.com> | 2008-12-22 18:40:10 -0800 |
---|---|---|
committer | Andrew <andrewarnott@gmail.com> | 2008-12-22 18:40:10 -0800 |
commit | 2f58f95c811bd365bcea57f417d05eb9f74700a6 (patch) | |
tree | 240ab0631ef49c3fe26c438f050d2199c798a0b7 | |
parent | 3ee3885ca827f8af889bd4908a32d034a383e5c0 (diff) | |
download | DotNetOpenAuth-2f58f95c811bd365bcea57f417d05eb9f74700a6.zip DotNetOpenAuth-2f58f95c811bd365bcea57f417d05eb9f74700a6.tar.gz DotNetOpenAuth-2f58f95c811bd365bcea57f417d05eb9f74700a6.tar.bz2 |
Added DH tests
-rw-r--r-- | src/DotNetOpenAuth.Test/DotNetOpenAuth.Test.csproj | 4 | ||||
-rw-r--r-- | src/DotNetOpenAuth.Test/OpenId/DiffieHellmanTests.cs | 63 | ||||
-rw-r--r-- | src/DotNetOpenAuth.Test/OpenId/dhpriv.txt | 29 |
3 files changed, 96 insertions, 0 deletions
diff --git a/src/DotNetOpenAuth.Test/DotNetOpenAuth.Test.csproj b/src/DotNetOpenAuth.Test/DotNetOpenAuth.Test.csproj index 3e96069..9d181c5 100644 --- a/src/DotNetOpenAuth.Test/DotNetOpenAuth.Test.csproj +++ b/src/DotNetOpenAuth.Test/DotNetOpenAuth.Test.csproj @@ -108,6 +108,7 @@ <Compile Include="OpenId\ChannelElements\ExtensionsBindingElementTests.cs" />
<Compile Include="OpenId\ChannelElements\KeyValueFormEncodingTests.cs" />
<Compile Include="Messaging\Bindings\StandardReplayProtectionBindingElementTests.cs" />
+ <Compile Include="OpenId\DiffieHellmanTests.cs" />
<Compile Include="OpenId\Extensions\SimpleRegistration\ClaimsResponseTests.cs" />
<Compile Include="OpenId\Extensions\ExtensionTestBase.cs" />
<Compile Include="OpenId\Extensions\SimpleRegistration\ClaimsRequestTests.cs" />
@@ -180,6 +181,9 @@ <EmbeddedResource Include="OpenId\Discovery\xrdsdiscovery\XrdsReferencedInHead.html" />
<EmbeddedResource Include="OpenId\Discovery\xrdsdiscovery\XrdsReferencedInHttpHeader.html" />
</ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="OpenId\dhpriv.txt" />
+ </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="..\..\tools\DotNetOpenAuth.Versioning.targets" />
</Project>
\ No newline at end of file diff --git a/src/DotNetOpenAuth.Test/OpenId/DiffieHellmanTests.cs b/src/DotNetOpenAuth.Test/OpenId/DiffieHellmanTests.cs new file mode 100644 index 0000000..a5ad752 --- /dev/null +++ b/src/DotNetOpenAuth.Test/OpenId/DiffieHellmanTests.cs @@ -0,0 +1,63 @@ +//-----------------------------------------------------------------------
+// <copyright file="DiffieHellmanTests.cs" company="Jason Alexander, Andrew Arnott">
+// Copyright (c) Jason Alexander, Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOpenAuth.Test.OpenId {
+ using System;
+ using System.IO;
+ using DotNetOpenAuth.OpenId;
+ using DotNetOpenAuth.OpenId.Messages;
+ using Microsoft.VisualStudio.TestTools.UnitTesting;
+ using Org.Mentalis.Security.Cryptography;
+
+ [TestClass]
+ public class DiffieHellmanTests {
+ [TestMethod]
+ public void Test() {
+ string s1 = Test1();
+ string s2 = Test1();
+
+ Assert.AreNotEqual(s1, s2, "Secret keys should NOT be the same.");
+ }
+
+ [TestMethod]
+ public void TestPublic() {
+ TextReader reader = new StringReader(TestSupport.LoadEmbeddedFile("dhpriv.txt"));
+
+ try {
+ string line;
+ while ((line = reader.ReadLine()) != null) {
+ string[] parts = line.Trim().Split(' ');
+ byte[] x = Convert.FromBase64String(parts[0]);
+ DiffieHellmanManaged dh = new DiffieHellmanManaged(AssociateDiffieHellmanRequest.DefaultMod, AssociateDiffieHellmanRequest.DefaultGen, x);
+ byte[] pub = dh.CreateKeyExchange();
+ byte[] y = Convert.FromBase64String(parts[1]);
+
+ if (y[0] == 0 && y[1] <= 127)
+ y.CopyTo(y, 1);
+
+ Assert.AreEqual(
+ Convert.ToBase64String(y),
+ Convert.ToBase64String(DiffieHellmanUtilities.EnsurePositive(pub)),
+ line);
+ }
+ } finally {
+ reader.Close();
+ }
+ }
+
+ private static string Test1() {
+ DiffieHellman dh1 = new DiffieHellmanManaged();
+ DiffieHellman dh2 = new DiffieHellmanManaged();
+
+ string secret1 = Convert.ToBase64String(dh1.DecryptKeyExchange(dh2.CreateKeyExchange()));
+ string secret2 = Convert.ToBase64String(dh2.DecryptKeyExchange(dh1.CreateKeyExchange()));
+
+ Assert.AreEqual(secret1, secret2, "Secret keys do not match for some reason.");
+
+ return secret1;
+ }
+ }
+}
diff --git a/src/DotNetOpenAuth.Test/OpenId/dhpriv.txt b/src/DotNetOpenAuth.Test/OpenId/dhpriv.txt new file mode 100644 index 0000000..3dc843b --- /dev/null +++ b/src/DotNetOpenAuth.Test/OpenId/dhpriv.txt @@ -0,0 +1,29 @@ +ALoiAzCdasNc/t7MCd3BY7fTDx5qIVKWvYLryQ7Q3uNcNst3aoL9n6FQe1C206UinrA09ql2OROhMVX0kyATCRvoNKLEDM9zfGqqQIloMFMNy5X+0169UWhQy6V/0L6nKU7hRAgs3W8FUD5xijB3EM4zUxG3CPazdftlIvUr/R45 AMcX69rlxfc7lHnl1FY87FHf6U7KITe1gyuU1bPnIuAkaBiB0SOdRO7Uom2HY0uudFj6F14Q+/Th3DkaJ+lLDqH9Vm93OZ5YEHAmmMqlpOKzXUcU+9mz2d0ML4Nlr+yeMbmttlysrNgjvwozARCZvSqJ8haY0dK5xe9/LTOlJlqa
+AIL26kKBfCaXyXNgrtahVTPqY3DAW4iwkZHfEeWRV4EuHnCvNdG+2NHRXbjokKnR3+MfZZHrJXj+UzID6ce0DyhYIOMR59CP4fvEOydG3XVzTuIsDK2SqLAZd/8LDVe0jTRL0LKG4Ai3+4mdlDarFyHNRZ91VFTpPFomQS4mv/NT fXB3HGZWLUNc1WQzkHN7b1rTWC0rGqJvgPohU+CDnZrKU259i/8cEGFqGWMzL4ReR5bEV/LjbGFSUfa5TvrP8yHyRnQrQ3ZaGW0f1Wz6rJioODqoapQQK+AwgREsROZyCPw8KAjYLz1mDNRpLENg03vB5TKU9eNh3FZAJf5GBO8=
+AIbDYlOTUXENW4WFDkuTGzD+ae65BfcdnaKEMBgvL0bizGrG+0rf7fXtWPEEVBqGQ9h/hP/v0oTIV2rcjpweTmyP9GqIFRQv1pIFrIR03qnsWYXyA3Tw3JXBsKwgxAiyOiOuxj+T4rSHdObYT7BDa8jDPCIItF6wh7rROTu935Nj AMLcirsSlIwh/xKAzE7BJnUlrHC+VaMP/dNyWbQ5B9GCpjNGz3z/fdO+8FYrfiYTNlNsMFQQKAPNSXwcPsg0gL1NZ6hL1TbJBmGm9d3Jfp1V55SYfjNrmLR7/1F+EBdCuUhTR6LRTMCWHZbJQv1Ay0csxBHYo9xRBHLUQOrLdV8L
+IycdHiy5VfT/ZTw5HfnBt7kPV2S5GxZjy6EDWpd9ViQ3iBj3qTehio5pMx6Tl+dbN0H77cmNldORs6XIJHxmvPYWjh41BKV+EBUQnbHWgSjY2LqSMG4Q5LrLoN1sVCrxctY4CClne1GP040wppGy+Zn+d8AxUxZlHcoYQmoUD74= AJNfL6W94ntqdMR1PE0NJAPKs8Ph3gh+dGBW2hgBOlDUKuSmKW3UcLXrlASks2bwlrCIR8mOuS/mJ6Zfh8toCZV0nRgTMFMV1TNtIgj9V+NdW+IEH7EjxvTPDwtSSBgvfrnHjWW6XBxjoFgrlMIsHn147oLueJJuLvr3FFweuHnc
+AKZQ42fsyLxL+z5y01Ezo2ul+AGNsWuXWZnsqQcuusX8pHocv/vxaWptpqUFqymjSURaLS93ZBHD3LuT43K7J9DDLllTqNNzg80fI2mEebxMUbfzSOEc7t4coTh3vXCMWvJYo5fDXquCy0RVGwPZ2I92UKoBSaKjN6fiU8MM9XDt JLHWENrxcrEwdQbMqFMBaAtgVClL3B4/lByGPZVjAu7HorZFkxYHU7yi9VPQWl3hd6NhFIZLe7MYfCv9It/baeRdZqtiQWA3/qeJ+boynZpZUQY8TeDUgE12O4ykjoRzppircP5xl1f5VyFz0K0vZcCegxK9uXUT1vNTaGqWEAI=
+a6H2Qz+qz5bPOdhGUMiRJtBiunYJ6YH0ehDC+X86qP2SY1EzQLgyrcXo9xeKE3Ck+bv+Bvja8vjaqYqsDYg2vfuR7LnRn7D7NyecyCOeu6raHoBR9gFh/BkI38unT/0DmFlPVHAaYNMwa9rXFonwz5ofYp0hedoElipV0wBmzdI= SMUtiopT5lVwfPW5a3lpnEc+fkx+K6l3Ni5fDlrjbQBKcnDrcupG6nieDLILvh3LV0EmTwSwthKCTDCIs3h8df+bN1eCsvWC8z0189Czsis5Xf6KxXfcu2JfkmEJOWxWC+fbHA8kGml4ASPCT7BV1dTyutw3u0YrONTDUGsr0xM=
+IIr7ddoKHJm0gqF90Tsxy6UDG3Bgeftso/3UAdGg0G1Nd3vMC0VLKF7qbXyfNVqUKE/EORBFl3GIDfO8EhtLaTzXNjPiCxJf8ZWLkfUhFjNm6SawFmlm49baC+iqj320clwcFwmx/LvCyKoqYEC1aTyR4af1qXH4j9znIiqDG7s= Md3Piz5CAmGY03uAfAUcvYEOS/VKGjaKkNw0sQ6axFtk2LlB0ua/7taXf3qBiZ77tQ/+HvHJCb7SgfC3wB23MVlApVGeY27X/GJl2ushWXizRgaJi5vw/OEd4/yebve3JeIeHqWurSHqQX0xHVx4c68OUW2mBzmb7UbvTDIRsrg=
+NTVz/x3JkOztoqz1gx8haCyPhjDDV2qpBX3bpxcTbGMbPVJV0y6hLYPiGjSduAU8C2HYiFwgA00dWOYy2XzgS/g49cxK/tdUt9CJwoHlbHzi4nns5wCCTYNk/odmYZKYBNjZqPkW07WCog8gjFCVdyZGfP3TCphdjrcpyR6ZNhg= OkRF5I0PiazSLqZcCUx0U5kWQJ/o15TKP463BX9lbm6NVmabNPSd4JLGAmSdYFL/pxUKVR1he9yjfUoLgTWYWzgmsb5F7PX0ZZkXu/SYbc3wGWpME7L7YSiqZxX0LHj4L7/EbTt4eOY0vTdHHFoiyVquW4REdIfA24ko1Ck/JvU=
+O9p26iA+A2aNOrbJjOAXfUgj/ood14BbxXJZ+bTc4eLMg8sVwuqzHFR8r5tjQA22o3ArQdpjRPD3PJdgLoW6Tc4Gf8rzJocBjP/3z7qYYWZn7mPCE7dxr1Yx2IWtaBRP91u973JnuL5dVFylcJbux/ytTxLeAnlTO3uHdXyO5Fo= ALGCzqcx3faQXN003Nv2SWaJRCSL6XC3SHKnjkksSkx4gbqBakvZ0nA8U8qo7LWwNUOemzRaPq1GrIt5nDISdoAiASq4x99BryyGnMoR70ePtDheEm1HZjm9uEDJJMN5/BIhkOrXxBG9106ibYMRmY4UAhfNgGFBWJx0CYv6IeYJ
+Lz7K9D02Xsh3wc0l7AykAu+PZt3ZKzyAFwChEoHUVEVDWy/zRaQjacy71rXYlC01q4EV2AsaSvp9CAMnUiemngZS8vIdoIb1MH2nAW174QiewbDLWqjuzv3yplWEll3dMen1Z9UbUYTDR/5Fd6fr2YUeUPyGMyChRlhlg1ak5qQ= YBpfdy7Hnq58tt52gP0VInClCymn5UJbT5oi40Y1t9NFx72ZknkMxgECAl/BAF2KWYZAsDGoWTspitnYcKFtnbnXyy/pdSXzIygq7ZNJQ7zliOdnEYE24/S/PHbE873CV5LxBdZJP5dgNzdbXT3IMtMu39aWM9LmMfTue5gSY7s=
+ALtCZG2F7IEbNfTXUvcdIqHs4KM56+2550sTvQrRGdpBxcW3R7tRtmgJsIE3+QcBFA0oHpD+8Ai3K9qJzD5xmFH42tZqCzEmnFQ2xiYqhEPhZRaDCChqy8aOtB8NfFKSqEF8ukttK00rhBnS8b/a2n8OWfYq85TQTa6op7hNakDr B7C95XzVCMc2EMwXtNjRYqeIw5/0BPKn7b4kiVLCNEuNTLKx1LHxXVtLJEN2uhtsK8EOUuZWuvaqbET5f6AM8YOyUsArnsqsrNGXvrpLoy6SVEPG4gLRMS0QZhxKqJXYt9BXa3pkR+5rywrUkJLmItf0diqgCGqztx2DTKkW6LA=
+dpLNIfL7pIfO1uzINTKejcV74jVbBkuaq6j/zzMzGNd11iueF3LUM1gBixBSC0kAkNnPDq8NN8vRZ+v1D0REKnBT4pebu4vKeZ+6lJhRq0M8raA17ljSpDATUlP78EqfLVO+qZI0h+gH+Uv3ta7EG5old+JKGeiReTcBwv99H9g= AMkyhD/cHlzqeKrUbdVz199YelKtSRVtYaACYD9aWe/+bkL9NH3ZFcgKfrNlf2zxLeI6jc6Fq8m2MsgYgzMeC92Fbq0V/Sf4fqCSgxsYuGMeZoN3XRrmZFhnfaZzEBGa+x4KGmnPeABlVaxXo/RlPLKAC3sPHjDDXeWOOzUEweUr
+YXRoPaclsYK65uX7UOCBsAcHQLpJFWmva2WxGbdPOVoVb7c7AgYTwdnUxwhU7DB+I2hMaZHFaC8ENJq4dNOnjkaPhLlbDOpOWEm8oaWXaqZ+Ts2AWPV4rmqTMeabYMz0Nu1C6Ps4yob0G1m7V1FdPeFDHXb2ee3i5Lfve6fflDY= AL/Bfo7ejUJAdoj1Wfit3J4uvHQXGzj8RWlvQ9W5VOQIB/lp9/jXbaoAfrcfUmyGZ7DuBFH3LML4gIIKJaG+1YY+bJWyYp1rO7JIkG6cC6hYyDD7StBX+2UlOD5RF/K1ATobJdYF2XXrNQBnrAJJRQbm48eX4n+nrweZqc/9lRRf
+AIs4+CtsykmU+iP9UGUrjlRXovcXeioRiLpSkz3UijqPd3ih2uf2ArxK0uMEEuvVDhrbJ2fa6T99SeWxIE99EfK0EXJh8aVtY/wrkx+k1Qank8wOvOz7O8ZhYqNoCeLnAt688Bozt8zvdF1Zmq1GL3PksB+rEtgX7KA6nOhErP0b AIPMliWxz34CSBI5847dOwg5gxAhlQH6j1LsV76JA7MRxkr3XaKmQH85P3CMynSOrLdTlsAUHZC/7nN6DLkpF6GT5Iw/tjwdx731FxZGJcaH3WzVKfwEE8vFiNdYmRQH+PB/0O20D+jaTgapwuk/aXkS6qPfgkXdFqUaof8lB52k
+AM+USJ+Rp8V8iJ9WLvzgRLPGYOzl3LItcbSXKKOb4FRPwaxF8kBoR2P9k+h9sT3ThkjFEADpkENV/VyLD1PAfhMy3cPe2tj4FTBK9JR5r1tstO0vDqDhgoEQF3/npTa4vNmu4Qf7z7YXIAc2W9VmZUUHKgI45URtZnvsbUjBPkGw AKYkkIGB6PhuZxOkxOYjGLmW2+fAhR8AosV2M/BFsOWTlR7PzeaUXMicGE2c1NCbf4HKyVrJujB5J9FSdLPQ2BVRTE3ggS602B92NZjm+WxXtvldnHCO+chIViniphgK03U6afOxBXjx4EBjF+BOLOx4GeIYpmuIj9jguB8Q++Vw
+MKnMxNBsGImCcon+j9GjdHrxPJjsCW0aFtUatI958reEKCnx9Uw4kC5d6zIcNTdx4GPOxxHnEsUD1Djst7Q95+285qBVVQ6q8GQ5+ct52RmAeo+1UylxbCY3vfc9EvcX+CCY2L5LAyCQk9gdf1BID1UghYC67yEUerH1UFObgBg= ALNy1gvhT9K5l98SXwvMOV6DmheDkILvzcuHEvk+QiramVmhFjbIGXteBhHTDciTAVTlAbzq6jU20zLXlbAtRJ6OETRMEHhBFbQ7xaDHiuZU/RboOi6Cu4cEmklfgmgkG/x1AK0dNsTd8kvBMfKoF98o4kI9SV6vDzatZebuVWQC
+DjYiEZuhQ0PoubF0oc7ikZ1iM4pjv36NkliOSHUR3UVHhF1LjWGAhkefvRmmFKW1mQqPs50/NZInOBhMPtKZI8YCs3mMd3PXIelil/WnurFZVMFz/V/Gta66NiYMsOBve/MaEmcqUMBQVxfBSe152kJvWlJI2SEmdjccmFRXfLc= bQYU3zXoxkJrfpKAJYpKJ1NpflFkOzGcxoOnYzJaW/4kY+X8M8l0jMRXBlPjwKjqWrIcUNJQQ6Kh8p2MFVg8FiOC0iBa1P3X4dxYnkO6lfSKUG+LP4Hm/+YpOstsY3Yg4OWzErdbxk/OgWdmncdqqzClasKy72qUexGiq7bPQ/c=
+Gd1SZqi4z4+FeDYtBzEVbdGNMSBurfRcKPtf4b2pDDhKB48PjfYxyCx9WD2oV8apiFJMiHiTRvUUiqsAkpgt4jNkeUIYgndD2N1Og/2o7N9H6UN9BsqCDIIZMg4YKdQ9n/pzoFssmgvxYF/uJsYC+2mo2KLV02HvxdZsAeI22Fs= WhAvx15RHiSqKsk2FBwYBZlx+sqt0Jg+vpw17QHz+h335EYOFxUiIRS+DBwxYMn8Ob/7DF41i96O8xk7bU768ASvjyWUn0XDL3XwYjPz4BCFLIutytzwJ9PEhjCfP9WOXRVnx0PpLt86M9c/ONBtwWLA++xD4ECJ6xX7ucYuFUU=
+BtxpG1qgtOK5jqUN3C+8kiCjp7ndZi2CyfJiGHpG/IxxOerOBW/jHuni2eVzsoQc1a4KcwVKY1q/RnQWZhzGY/sVLU1Gv3E7fm27A1pZblxKxCDiffqRI8KzC7S9ETKGro4dSlHmbIJEq+cRhdqkyS8Z36hted35wKfTGAu98vE= V70Wwr+k+JnYEiqgxV4xq4LNiOeJzSLFy8LxX4nCOWRcS86LRA5+k1gE0yr89snUIgLylKeNFn5Ns135OzOBS4KLWdpzq9QR6bxTXIAc31NCtO6AjTYOz28Psgdo04ChcSrndUXV+M5iNZ1QILj7605c7c167MruDtWyHLb3dr8=
+M8h40nf7qVdMDes2YyTeXhjbWcnipaxV6ie+e0QUqh4EH4rBfcXIhg/ZEo2JTcz9bZnrhi1fOXvmroYwDwmGgeKdgU/jpKwXmo9DQXwTn91+RHamo5QSTdz/UaIZpMGCMwKtV/p/XC8jZZ+a55DlOAvbPcYqPBv2+25SnQTvyss= e6b5r1OR3q1+yVtu6JkYtl7ljLI6zeJ9oNI7fqOGpWzJ02ughlfPDjwbaRd+U0jWIsbydJ/t3Ghgv9mO15JJ+wovbAE/cKELQ7HQ2RyaECA7QOX04VX9tBRs56fvDGqtrMZcQzbIBCLEwoKuHiYbNWkaU1x+OS/Ra8k5U1bcxvA=
+JZrJGiM/Ti6lvsJ+JDPFjkdqLVksGj4wxHOfyAXkR4s8xe1L4HpNaKtCXDNB3FPvZSm5d3Ukcpo8RY0c+D+nuqt1As78JCi155E/PIA3f6GKnkaUh+aZyfdi8RuGqmIiDqUt3wf/BzRon3eDACVJvOKq3jLGnp5HitU/lw++olU= AI6an9hXFuBkeN+HXpN8ydgxa5eNBqg1drWFLcDJvd3SdlK5llDUBy3iDxAh8e6Ci6/qE8ch/wZq3sVsXMzasaV6bgRA96OrlrTdPh4jprP8xJ8U0A3drDhbgUnM9ZiBdACzYQixI+x+gXNi/9u8sz+OmY2qQd0GFkeMzDDSqm/j
+AIPirUSO7mEIbkTANS/1m9yjn8GfWJzby3NrcU/ed5Q79qxS7c8hRtowy/Ne8EyTcN10BmLiSk5U3ug9QqdaDY7n56CNcTf2nYLxes1qjO7COrsMpcB4zwGu9pDFFm+pJUwXUbAw3qc+zF3ittzlvptPppYX0h5uAw1eLcEio4mD KsE13DLIMAfW4kbBKTwtRqBbzDwTeHTq2TPSCNzKoNySARItMB1RC6r/7C871z0TI3LmniBg5WxsPLLYD4oG39/fTKCthX3r/+x4bS64d+LG1FQ9xwdHHv93cEP20Dy4N3+RDnirKRyCac7iWkjKpoHolQ2KHnOvdaIbH1ZCcuM=
+LNZYmPoFqd7O5yfNSzFAEa5RU7B4DD/C7GgAPaX7c75I3iEgavEztUGl5nMtnsn2UVoezA2WFMRmWdx9MBt5aOj47/fe+xPyH0UUb3nhypvHDu43ReJ4x9yf6p0wtcipdflb2oAYzcyXAelZ1vguRoZz0MUecwnO5vNmMjmv9Xg= AKMPDFZkfuo7TjUTnXpgvJ4HT3Nw4zxRnwj7lGKWd5AGOwYkhQ5hmd/Mm1gvh16V5BmKH5IO6m5MKcWVZ2xsYbvvpgrNfe4RHJ8j2NJ69570VkW7rl26BvVXNvOGKQj7BtkIuMnNCaIQgqfpRW1xUIfyzlQWW2FSokZVMsM1lJcJ
+bXvV1W7j1UO8T6v5DnNgnwNPEC1V+GT8TE7sUkroN+uDHHITqtzHwONen5A3YXSqQPTtglHakOheZar9jabarh5SIlYV1HtlLOFrebVDDnBhXi2QqxoNcX9N5no62KjYR+meCtSDlCKKA7HoLLIdiX/UzHVUh/Q5V6rC22LhHSg= FXDs7zTsgnnZQqcNeUL5cXVRGFSjNGg6pFfR8drsnxgrPuBTyApyHBZDCDHCCJnAS/MRQS7VCvOI/+aPUgNfXDyTnKL04BQtA97Itadsau2CK5t2a3HN8IPB7OFovfnng+BpDdL4Ljv+nMXmIykKyeyvpIuxE1MC2XkzPtCmF4Q=
+SorBHV5vDBgoyBTZqJuofXgEvOIyceF0e8SEHhp/bQarAh2DC66IaNvMr7NtNXi0HtAoyDh0TDpRNWXgMgVvRMmObrXSzcLrLNCBVtL9hlXBfgAVnuLAQ6gmimgQZe7lqVxRbNpFdFKykiFQIS+jmEfVOy1GgEJ1k+u7WgNDpS8= C7hNUfxiz1k5v+xb8syrMf21Fek5Nm9TSPXB35uRF5StB+DDbhB1KTMRdsfcm3RcFnLxvRsecj4oQQMfYPb4s/biYpWr8H9qgVLSiBENjX07HLK7FYWY6u6/NIx2I62fR0XcXIlwwAtOcd+vTKJvLp6EAmc3lDpz5qsMPkvdtg==
+OoWH6NQCJUkhx33Y5/JuJG7zxDIP3gm9y+AgsMKhbsCwKJ7POv/o1VJ8YmmRsWTmPT7pzPsIRZv8lX5ZMuTQL3YuOpyYkpYXswMsh6/DcOVwXPV4gukic2nXS1Ndxk34I2to6W1gkVg5NYuXgruxa/MvPqFD0x+LIFeuEMem4Kg= AIM/4NB6m6YoGLbyRehgNbHU2K5IRmg7Z6hZPfV82M4aqgI7opMWqQtbDHadr2mlNhAENtPW/yxZaOP8eTjZkhrPB02frVvbRJ1Jl594ZU4qqOtjtKMz82EmLfPh9DDuGAxnx4OT294JGLl4TxaAYBudKCHzuNHXP1dZWkU+ABY9
+OQgo34O6AM9ucDgniT4GsoQFrFcGJqURcVyM2qJYA9bEhMyLsPnnVV0F19o5VvIipw039MDmjqTWLZc0Msr1UA2Dka7/sTFoqaFN71AQvAOVvGURZo9WMzHwvxbZFCdr5ErfhnV5W3XetENctiASf6lTshM2wH+Sek+lVT43t3U= AJoGDl5ABmWUPB6klrOAlFkwDC1O6Er5vv1aqwtt9tV2zXZuXeHo83GQv8q6NtKuv7qqtG4KgeUDexSrlxNxXnPXEn1GBkhvm+A+Hdyj4nWHdccKX40NMhW64EtPNgaNvJYife3e+9kGOSWTbZ+TDDMrgzIrdTPrCBrPO2v+yxUF
+Y4xjipK7diqbTeq9CtqbW0Q16M8jcmvZWWFpUwknwB6BQ5yHs0rNyYxPPetUOvNRPaVfwKpBFJTOkOSYyMPDOatNc4q+OCRx1DkllRdDLWESlVX3VWIXoQ9KcLjWX1zDETdWQAoDHjs2pt5oIDcLZWDSFYcPjvG2UIDKhISZBaY= ZkbvZn9vfsvM9uPDjGKtjDGTI+fvn66JJ4G/c3m0Ghs53wqoHBwmn4DpMfjdcrfy4JfaD6c39ESvFw9TOzDdmoRu3IT7gjnldCTCBzZ6QJWr+PraHLHhq3EAiqW49HB2Z3W1LLn0V1jT3BjUPTK6mo8psAutkEFHqdGz8Kk+xcA=
+Jl8XDwQrwjDWwRkz5laiYh4BhbS8odblZAWzdkThvuF1UKLCljrzx9i03mLTPdu9S7V3owlvIN7bVAx4x2yazcRpMTKjN948NKsfAQMuKvqMCgwCw3EaFW+yYmSujsEGWK5VSfFUQwiLuAw5B3E7L6UaNuihYc5e3wudNWO1egw= cl61la3SXlS3B6Wktl74VTZPRWJBhAf1ZnYxs3Rcm2+RgsbwsYdZVxoIYiQK4EgmHBxm2mGz0GC+rsCZtPpE46gxDL32djP5D1ZMGJYo3FgXu2AF7Nn38HcOaJHEqA+QcTnjkIvGUXulH5nMNAB0bgbY4xQhS5U5/4p2tXyz0Jw=
|