|
|
(JavaScript) Decrypt Email using RSAES-OAEP with AES-128 CBC and SHA256
Demonstrates how to decrypt an email that was encrypted using RSAES-OAEP with SHA256 and AES-128 content encryption.
Note: This example requires Chilkat v9.5.0.67 or greater.
var success = false;
var email = new CkEmail();
// To decrypt an email, we must provide the certificate + private key
// that matches the cert + public key that was used to encrypt.
// This can be done by adding PFX sources.
// (On a Windows system, if the cert+private key was installed on the system,
// then Chilkat should automatically find the matching cert+key and use it to decrypt.)
success = email.AddPfxSourceFile("qa_data/rsaes-oaep/cert_plus_privatekey.pfx","PFX_PASSWORD");
if (success !== true) {
console.log(email.LastErrorText);
return;
}
// Email objects automatically decrypt when loaded from a file, or when loaded from MIME (which
// includes when being downloaded from a mail server).
success = email.LoadEml("qa_data/rsaes-oaep/rsaes-oaep-encrypted.eml");
if (success !== true) {
console.log(email.LastErrorText);
return;
}
// Note: It is not necessary to know in advance the algorithms needed to decrypt.
// The information about the RSA algorithm (OAEP vs PKCS-v1_5), the OAEP hash algorithm,
// and the content encryption algorithm (such as AES-128), are all contained within
// the PKCS7 ASN.1 structures and any decryptor would read these to know what to do.
// We can check to see if the email was actually encrypted, and if so, whether it
// was successfully decrypted:
if (email.ReceivedEncrypted == true) {
console.log("This email was encrypted.");
}
else {
console.log("This email was not actually encrypted.");
return;
}
// Now check to see if it was successfully decrypted.
if (email.Decrypted !== true) {
console.log("Unable to decrypt this email.");
return;
}
// Save the decrypted .eml
success = email.SaveEml("qa_output/decrypted.eml");
// OK.. getting here means the email was decrypted.
console.log("The email was successfully decrypted.");
// The MIME of an encrypted email looks like this:
// MIME-Version: 1.0
// Date: Tue, 18 Apr 2017 10:12:16 -0500
// Message-ID: <7ED75DF554717DC7994D7EB757E30709E8733C5C@CHILKAT13>
// Content-Type: application/pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data"
// X-Priority: 3 (Normal)
// Subject: This is a sample email
// To: "Chilkat Support" <support@chilkatsoft.com>
// From: "Chilkat GMail" <chilkat.support@gmail.com>
// Content-Disposition: attachment; filename="smime.p7m"
// Content-Transfer-Encoding: base64
//
// MIIorAYJKoZIhvcNAQcDoIIonTCCKJkCAQAxggGgMIIBnAIBADB1MGgxCzAJBgNVBAYTAlVTMQsw
// CQYDVQQIDAJJTDEQMA4GA1UEBwwHV2hlYXRvbjEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ
// dHkgTHRkMRcwFQYDVQQDDA5DaGlsa2F0V2lkZ2V0cwIJAMRwugDmvniwMBwGCSqGSIb3DQEBBzAP
// oA0wCwYJYIZIAWUDBAIBBIIBAIJY4pN5LdVt8UiwC7sHnzEu15pJmDyiHLL+E024quIP+wU6k/WM
// 9hkNKDuUa5lyz4IqI4/KWlqFbCf43/TllsGHjEnKyWvcmdJxfcf1BU3+nj6t9LFRPYWeMkZHoa0g
// E21VzlZQgq/OV/1bG6hzpqtyQyQC3kAszR6GzEz89BJHjRIUv5rpgPwvEhdvG6i8nyChsCfK/ZYw
// VCv/HbBQrYXnJemiE4OOBy8nea0dMTzjQH2eqGplNh5gq21/FgUKTfNX+vqyPFaGZ9jjqdOGuewx
// E58ln/3NlfOWnL61evVFXD99XQEPzK6FPep4b4sC4gQKwH+tudYTNFn8xskN5t4wgibuBgkqhkiG
// 9w0BBwEwHQYJYIZIAWUDBAECBBBd6O3DQBKr4muGqiYIMHaWgIImwNU9MZGkfh0KoIlYodHUi6Mb
// Hic8dFqXkKSbfZi9+ofsSaQm8xoytO/uXbpSkdyw8kMruS64IxvuCcIa2kebUhb2nURT9vs7zaqy
// nDliAkEyZuMdZuzqGlPqbCCrXvXqAeUpBUz2k/r7bdgQVgBFEhsIOrB7acCgLPdJi0b8qozR8CGd
// lvUxX3ir+dAJiSqUlyE3lSE4ldk9Z5u3nhEGAaVAFdj/aOeHyqtz5KwObbuNBBresbBovi/H/XDQ
// xStJkMkW7luijk1jPaMoupnMI6gfDW6axyperKOIPveyXX2b5JkyFJWpg9pbvp8WFpPTsPjUqZrb
// VUNNh3+JEjhkUkOpWLOxQ0+qnvwJtfUg7tH6CM2mSUV1AaBAkTrK8micVqNwoSaUjSiEvvaWTFi1
// mjAhXgcRowuP1hHjEbm7Ia+h7k9eJCDeCYvIVWCsOFSREkgujQphMRRDwUzFq3aT6dUXDhMJyouq
// zOVttHBFFWcgzcExTQccIfDLB85GN3YXPRf/dWv3t4iY8KbVj1hI12WkDjK80dHNY1+6UfixFPMN
// P2L0Ojh+TlRxoJF7D1jdIklkP1lByAqIOptyJqyQ19W2GzXUlqbTt9wbJpTvtdyKQrrsyDT0nYWs
// R9P50zcxtvxx8mYQP7fExEf1fZYpUreGfjMQ/+vorHNTAvvq0MIpnzsAzm8nkjY+wdyPdbOC94Wa
// MuimOUOkWXg5Pr0MS5nnwejns2G4hYHkZJgIoTU7drsfYpQn8eHxaJcWK2c/l662bUJKyxT7lQjZ
// 7I+iWYkKB/NvrQQLaQO82QqZml+bR6K9bfRIEz1wtozEj5X9YG3DxNtR1pO2NGOZC0Sp4eegVFkO
// IQojbCRrnmPQ6lAY7e8zLIR9amsHQ7aNyuo5L+mSzJZ1SaA9NMIoKSwT/Z3GvYQHNwpsU3rsN00v
// MUumlLWCJkK5mTuFsfekmHhD9yuAsMviqAabwgay6BjjJdRA6cbQhv9N+OS+e1XnLOCDhgeKzSCj
// i30QTzV1e3mXN5uop/kJDCToacMymWpFbKZDZXFkLWFbqIz5dK84Be28uUAOYVanWHeBeddWNhfC
// knUcRZri6Q7zExGyMzCRv+MB4DtY7gBGQAPvVm6SOJDzWSSmH4yv+DK9xycL3MouQyj5O7TOHKCS
// 5/DmJy2ucNCM/fKri6sW7LrbljL+Y1t5lkF7brL7t8GZ93pi4zc1TdlTwqEf6xgn3I9vu/vkPx+h
// mf/10k9iiRtorUx/b870Myoisf/fu0CQbMQF9ar4E1wcNvgyYw6L/61U8def2BUPkzy2KqzeY2zV
// E+iZwlarEfcgY8BUIt/rsT8cbXu2hPWsZ/wqBOxdersIQiSEs4bn4bkB2YAUQ7AtIrJCQtcn+pXG
// BIZyzUYw+nuICcroMQEZiIJ5QzQX+ScRkIrk2vCBoTqVwfu0fh8Q0e9dNJug5LIMurddR5NrZGbB
// dpa+RrRZqWRXHXjCLDm5CGLWZN2C5gJhnWgPtgGgBe2sAaAFJIyImmhe9aIo2Xbf/ZiwDX+HBcMk
// fnPDsVcyNjP2OaiogLWWMdZK25HQOhMl+tC97iDPJezhtq49iQYaNykD0XHWQ+ER2RHzomLBW6Nl
// dGH/rtLEN1aEj6MJBA2AtivXp9SLvvsdKonOoOiCIi+HfUvPnK6drmlrz5BDeDPNHYOQZaQIXI6x
// ogTozqRUvJnuozJ0eHdvQGJYA/WoI7XCWZVoSvtkaveFJch9+V++JOCt6XAZ7Y2c9RlOZI+USc7n
// 68V3aHCAKBQHWcX67+w/LWbJHxfzYxE4LaAX6MHDVy+GjKWk+GajJlwzgnyDCyG7XNcY4HQ/gZpM
// HINz4THt1AqqHGKNevSTnQcQs/6K4r+/QSbDFhxKugmKtI1aZLTOMVd6I7qEYdxlKliK5fKaCVM1
// OLyBZZnVYVH5owJjd2/bppHtxxQfOJ5TIQBU8ecffSEy44FBaCooJSxVScRljtsl+pwQri87eU2U
// Lme5FbRNOu0qtrm5f/H5fQOF6W4n17sCUuJm87yXEa6sU5M+nsuQfw8Tc6mma3Lc6iUJYPhUFvn7
// pOC75VOAS0ehJv39AVQiwBPFITEPl1klDS5811wLtqT9tCVspkbbjEHgdUWJX/a1l8eWFYGKn2LQ
// txPEo/LBduvXJp2kMIDQlEM8FodH2RFuqv8T4COvddBIh9GE0LIKHD5YgT+XhZAKF/Ofp4n1enBJ
// 8fJCNdYoQcp1uPirTs+F74U5C+I4FHZ6J8EW3pKaaXD2Iy+c3V9kAN17WTgp1vdmfUKq8CsH7vQu
// a/v4bIeVSRWT8VvQehSY9FLsfNdKKW4hLcjIZj+JjCkL5kniyKVQ2qkgWVjKSu0nkpGnJ7x2ty/x
// 7hl8CvJ7nx27KGYc1CVNFzXXhYw0OOPoD8UwfcDFaZ/6MsWGozu//mihrA0x7QUmG79DhoR6XBnt
// 3hVucMHorxeYuRHJXv6ulRxiODdJn/hcaIVd/t1waDeeEkWvrG80ghtKLP4YbLKtW5y+rJ4ryzx+
// LkWKG9a50p4cFdlkkxt2axaV6cyNjkKoHJOIQPvUX7Vt+sJyiYh84wYF+C3U5x94ebCLJfKpOJ//
// gSA3JY0wayiWMAcYlWZpV+5zngUatynCqa8RT/x0FG5nevsLiodCEHO9aiOcpYGtv0pR7wr1caME
// iIHQKZPwQmMMpfxy0LZStrA1zIFIkY0x/+kZJsIO4FBBZgiZf5ib5Ml0C2FGkhums2oufrzl1MjL
// 2pLz5w5vU4Hoq2AhJSplTF+GeHGbZC78FTtwNLlrgUrmBnudC4Ma5qJj8nTLsXcDzK5c3Y06Aya4
// BQwVum/TfPjAMhwvKzMACreWqq3C4d91HmIjsKtBfTyOMyfxA2bJB88wvH5Cxe7r7Ccp7TxztC2H
// DyNqC1yr/q4GzdGwCZXjo3hC9zdjNNUcIfhUsujaux8ygXZYja86BR4luQeiqHI44BYoI85GTdd+
// V5K2dDnvvcaIo6DGVgqTlT3wMwmzNbdozXec2ZzVkTJMQvFJws7FIG7gXS3ztoi2LG1y8GKFZZoQ
// VkCu5uffPSIpgJx9nXzH9NdW/HAtXsvmhy3CRxFgqblYSVlclJH9pzPlI+S7pVIwB4poleTOrXnD
// 6jyqoKbjJqTRZsR7zp9Bb3A04Knfw5+pOc4LwLf11WAYRRdUmQ3on3h7HXNXKw5yaC6DoIt+EgnN
// 3RRcL+WEzcQEa98dQDaGN7e1YtLP/bw+fYFoLmn2QCVAf4BdjRPpw0jnOgFhkVM4ywlGsodg5sqf
// A+FJivC/HhGWwVDPuRNW0P/3kMXojrExlmJpYGZRY3w6h9ImO/F7TjV0ueljqqK+8QvS1RuMtANR
// jPyXWCQ19V8W2bRObeuR6TA8dEm1p+MeJahDBin9YieH1ivvaKKOOVkY9Tq00YW8ryCmJ+BX76eQ
// Yo6nJQZdcvu+m4+5TBFNwb8BYKNbPtouBui3wCJlxtEBCwp5XiZkWxErR+NYnyFRPlpG3pn/OUjn
// Jwaf5j1oxQxcVNa7mMD/cVcFzrIWSvioxY08LXWPItGarBaGrX/5RhiuWNcHiO2yv/Xfm3vN30KG
// SF/stTW8YgnzeAOXcWdwnZTxim/lq0GxoRJtIKgdeLhcDjQli6bIUTKw6d6vBn6ldytXKAtAmf2S
// si9fmkj/69r1+KajpkZZsxI0Ul5BU4LXFqj5L/vUELvQ3BCPR3pUQNve0RZiwQBCeEojkdjckDU2
// rHDFWlic/nBY/EtUArsY2TtxcuwynIXztr4jAM9efy6oQ7RW/jzoYgGXlStypxPjpB6CdB7VVOgZ
// 3so7EOB+SQjzYk/KuC7pxbq47o+jm2rbFNrwa7wRfifdwRjfvtgXoYPJ3dF6bQHfWMNhz+g+Xmhw
// vwgNmPAXCRPzopqZDz1aIWc2O607vqmfAnJ+u4BLKLY1lf3bIzsKaN2e1SckfcSAAg9k7gOOJHW5
// Lds62NL5mqYpkrbHKBRXKoayl33jOa3a8Rd5GScA6MdrDzwQ07c12SqLBGeK1VfaR9C4n+aNVI+9
// asnmigzP1L7I+KGMIHnQHDVbSDPCic62YsYW3CwDfqgJgH9/VuNuUpIhqxnvDrf8/0O4q+H2J2pl
// 4IkoiKy1x6T8Br90tIbyzQdfoIUx5HLJrXBcUGZb/LHCS+n2GejEYXdXNoePGra6AXUWE99rku37
// g0vyC0ehvp/0knd7x/hGvluKaDAoiVtNegRqSCOtvRfG0MycMje3kGn/ShWKPBYYE0srAn8C26Zp
// hRp7+IQjsO+1rh6pA6jWpOaoYOXWA8ATH9ERODHV2VXJvtlH4fChi/svS5neoXHaDVpt5DdeGYqL
// 4ACl6WHWv8O337aAY7nhIv/uZWoyG6BQ6jJWW7vQKeUp6WJDXD4NSx/sjcRJs9WPXzFRaVygQ7No
// UPqZz69W6ADRwooRi1lwcQ224Z1eo+mreGzFSAFY1aBht6YC2nLLNAh73YvhSM6+Wyx2SMK/xHBP
// 4Rq5Bs4o3miVvQXMLFE0xODFSetapUo8wEFP5coIEBOKP+KdCcsgf9zHeA2ShGnTy6xpiDFF1KiI
// hAVBpLt1kNJRR3NqjftB781iAsI3e5+x/gjUrn5OqsIEGRdnC669rW0INmKlTNUSoONUgzbEMe/+
// hI1iA6VWD/1t3W4UE38Tw101e7zbp99tZA2Z0echWWH4Db/3G05IbMAWyrbZruACU3WkGsa+7sYP
// 2J7ncs4QFJ2AlW2K3OXORPLpg8MKuPhl1nnayngpDekzg/Xp1cz85UGdt/YnkodaNZZB3zKDaWyX
// YIOyC3SNVrK5O0VGmegDtnwhXWSKu+RKGs6AjtbdY7sM+U9B350We0A5IGcuv/n5B/YpYpz83qrE
// 5hTOBTts1CpIjOnPvjlODD2eT2kp2iebQchpgceqLD7veOvxEhv7Xu7uYNtCnOpAG8TWfjgTsivy
// GZf5lFWNkSXF6qGG2GO200dueBC4X2Z38yy1OD+3yx12JxiPINEcIv3xtzDX+u4RlafY5ibunZxu
// T/Kuo+dF95slIARTauoolQ2+fcTPavJuSw+lkP17LzhvwJysVGKaQ4BlaM0dRerGc/2ya+K9NVwQ
// O5euqPaChoXjT/0Gd/IndxPQNU6UxlICIL3KGGMXIYNwII9KwJYbHBuCF3KuNjeBvTNbx8l4QSkk
// fVcePGcnMta2nGvQWKhRtumZDDnpUTYYhqz1uStWJ07P6btLdxAIvWumptpPHq1EbnWS2TXRszbC
// CeYkfMfYQunhZ4wZN3hI0gewiePIXM5uTlQEvlQTZ28yS8FTHXWuDmh/1HMRuYlQoF0Pnv1XX0GH
// MRw9O6ntkUrIy1R6TMtmqmORmo3YHy1e7N0LFmC8e59HbS+mvEBl8wYubmqN+hVXWC9hEZM6Bj14
// tA4k0lOlKz3Aw2ZP1KPNKoAPJr7FdZzYK2KXTQ609eY8c6naYcsVy+Glgh/P6ScsWqxnv2iDqtSh
// fqQ7Ug8iKE4bwqTEKT3iV5AOqLDFmZffdw3qy7DpH0/hDhYt6eEbAKuHLUT652lGNaUuuSz91XQj
// rr/DUoEiB+B48x5Xdfu9KVHP00KoPXnaXOJOXzdFnGqQIP78SDJbIl2RqeUDMrOTZvvXTBUsmpox
// e8pg84R4OY2C7Q1wTqIHOOB0G3N4vUFuaL70WZShzxflsCCXdvTbuDQLEJjxhaYm9HkyncST7oAZ
// gU2OXZ38c0tONe74npOaJdzMxfcmqH/IprhoqpWfpUdIDZVvcAkTlRa30sdm0gmlG/xCS7N1CIez
// apyrmv7FW267iEONGbgm4fd7aaWNENPW+yXRty5qw/IoEjLV/yxGQtw9Y1ioCxn4DtKb7DmWfsQL
// qpZvJNzno/fPF1QKRkUFOFFXVGmC1btSgL+ww/99KTmadkFm48QInztBPMj/a/PuM88LO4GYohyq
// QBx3wFjP/5ZHx3h0ddWz2S00qUzKlW9j3XVjOhVR/jGtXMYqnWnY/3AHGj1vmMiB212UhDg1Iww+
// Hba/H7GcoNk6MoglaohYjx4kQnrMg37zQKwQ5i61hoT5MpX717Xx+KMLsbjUtdEIg+KlkRCdNnDC
// Y6eywWkNBh6cAeN6Phos7j+Xv+Y0yMlqhrD7RuziItEoMTPkWTpBfiUI/58cMycuuLYfz+V0RTMr
// jHKFiipwi6RD0GjZwzfotGcset7RytLggAnxtE7c/mnNpkEp5zSp5qPIq+KQqSbeAkdN4SHMSm06
// dHFiE5QptOB1dZ2F7RebTHwWjB5gNRpeYrWfw0cQiSz7N3lcdP/iyoxYnj6V0O8+0VU/GlmrWG36
// WtkMEcSUDNU0BCbRY1x5URDEjRR7OB0hgnaWcSB6n+Wk7sXMdQ4DJdZHGsRlP2P3PVbsPzIjNrLG
// 6DCC8EQ6ivtqvhHJy67a2hhL7fgsVBHitly+3U8hH7mJEAAMY6l0lO9OnecKozOv1G0uvwu7WcrF
// hS+qXvMIBEgo6XkNt8lsyvSbBkG05mVEw5fy5HjCqLi7US1jqwe1jtNf/WqtXqzGfRwTfmijEyGf
// D4RCL2fXaeXIJcGD4T0El+6LmkUoAo7p2DEHHYgazMhFY/kuQTw71ZDFiPCZ9qIqg/5jWJio2Sf3
// 5HvQLDRB8lbIGEY4CkP6bZI+5nJK8VQ+Vxwp2YnwxOnP+YaCXmUWLQVn/xNTjFmE42mFkhXoySCR
// l1vBbTfvm+gpsJIuG8iUCKKAQEcU5jegLnBYzNOrtANNwAyTjvI0ZDnBCWASyfYB2/AMzb5PLD/K
// QwQp+IlRnzQZwVT+6W2HK7VWivyuoR9y/XqWWTE8RfY5xaZ451jHWURmbVAIXOuD34jkJUKK2Xv1
// AoqWag3aQAqUU2HeBnC5CCTKza9WoCTPdu8BcxD9DYQEIxerIKzXyJe8G0Cd3UNI9OfAIdhcvpkw
// IArWfur9p3vQmH5+1VFHFGLOjVk+wzlwpPNta5DE5DLa2XPuifboxB6OEFSfDzbTy2hYfszZXBh4
// 81zsmiiOp52hLCvzF+mebR46QmCqBDD953V6XcCkL2pEF8yUzz+Rn6mWNf7sp90SoeWnh9d5ynyX
// rq86PLQWQYLgGMNSPHerD8k0ZtcXDNZudYfbr2c6/au+lw9a/ANetSrvXD5mrgMTjxusi0vSidd4
// 4c4g2ntJY4AZu/+/F1sZukGt500+WYrusjCLYqhSFUGjur0918FItIpHHGok7nyD9S7L8NWC3mo7
// DLLruEHoZEXJ0zsf1oKb0zaQ3Ca4tMZ3mN6re9/+eSeMgGeQuda4h4z2bA5m7KqkIIhejJyytKRI
// Q6DlXZsNsnENsZ2vvFBtHQAodreCOObKkWdYidFma93W0BorGOJInqVH7qg12DfC3kesMMPeL+nU
// TkSC5eSiAwGsFt6ar+/T0Z249erCs/11jHTPDIGc4VGtN1zy148KwrzsHee2XyE1racuVXjbNpuM
// V8O5E11kggown7GXbpyuZYLj7zqh78XoIJsDMvck5Cr9PSE25cbOthBBzqzF6N/eqsuIYvKShtt4
// YiVQd+niHTal15tzKq2gyD1ua9BFO6xOXFhzK3U4RSJzL9j3U+kgKJU1uW+sEgWn6OOBIJkFOKX4
// l4XHYoayq/9cOgWHVZEywhHm+p7k1A1nmybzAosq4NCiwGV8d/Y75YgXSPvy7ES54NSrJ1QZyWe2
// oYEO054EA9QZD8FiyYCggQvTujuelXlTqWul9tL36mJTqaTsyfz5rkCZ1YjHnMRYyz6kyi5BPRKl
// vFOQeAVaz1n+JEtmIiBwwWunvwGl1qhQYPc9SBKjPiASPZsSCVY4H3NSL6CssRhUpKpDxng2CGRW
// zXl8xxI9+Nya7k895qHishUTGqfz3OlkE4Jpr2wx3vjsTKP8+Fxh7RFv77XMLqaAnE0q5JBM++bi
// uEDtLg2yjq5AB3VtYmwZTHV5CCJbk1VV4vjGwDljEoWh4uaKQzZvZ9u5IhqL/OSXYhwGVNE+WmgC
// 04r/7myL8eOZwHiG4Lbh7yiaXru3y7/df2c8WrJrLX+2y5Y0UGRV9nhMKU+d4dE+EmPAWs7MY0r2
// QxXSXFwcBinwobZSTsxTZg1/bsH4nFSK1EJ570ywBBKSZfjtKEOUUH+7/o5/6rf5XBLO67V+6PWE
// XrUhfOHTKBEV6vQSNADwP1Nrh5z4XK9PgaeP7LF9MA5idX0B54CNpZwqkXITTgfrp72+HQQ+vHqP
// GZ0RcYD0TmmWr9/UY2/3yInoG4qcIKit3muIIPx77YFmta2qWhlZn7SYN8lbnEHLmcUHgcKqhcf/
// Lvo3nqP4iF81aJ2ZivQ5sRFwwrw5EuUotcjCOVL3lH0He4v93cRNYMoi3PA9WT2h1iMEPZc68n6A
// StidspXIP0mGECWwYFirchvZox8hMunf/qLqHADXoIlSqrtbI6KlEWgD31OXzuDCqxZrFMQwh4np
// yYieBl94Uwxa/9jqpzbKSHx53EWQrQIMxUfTahmfWm8uUVU5xnlw3hW1M77KzqQOUfhjOsUSz+XD
// k2OlZXPhyWpWJ2/3vtzi3y/xO4nAcOL8XhUCf2e1bTATSyJf+L5znGe6tdp0jZeKFYxFvYIjePwC
// iEiFErkDfXt6jN8K8dNk5XMhn53ZW717dF2KZ0/gZJ6PMfAd+x4epFTb5Jb0uRIINvoJQt7LKq4L
// r+eMF6Uv4n0I3DJ6sE9X3I6r33J/W2hy6csbb0hvo6J7j77LwU7Mqc5RPrw0dMFXwWR5OSE+IGkh
// VgiPpTet15Am5vkSiCDHo0reSQmPKM3XU/UKksU3DFqpmpKfWxZUvrLfywLqtgOhvbepPf+/wZAf
// hY53LKhQEuGavkRnfImcFl3AXayA4HUzJbdz30DWqJnUvsMyzhK/2UzQaA2inLoclB72v8XcwdJn
// dsDVPHLlhu/x25y5eEWei6O14fq8lS2ZbkVL2fg3ciXBsiRUazHyK3x9c4Rtwzg0zhUab4Rm2OKW
// q1rR+Aw2EXbyWCy3eNj7gJMTtdIRru+x331pv/XCW57VMAOm7Dxx9RgBTk8mHfAjH+/LSBJ7dOBr
// FIMAkLY1pFP9Iqg1KR/5+o0mozX9G7SzoRrTu2n2w54HmbLqNuZBjg3B5dentxu6POt+F2UDqBWb
// begcUqF3kqyZXWa+/TgSvUq/CN6n1MWskMDjOBT7mHeyGRW3P0MNmtU3kjyo/sgJZdCHoYOEPBp3
// fi696PvuMIuwTouBUttOL8sd4M+H/bRGBY1StNdYaGoJSk+3cJK0FNaGMp+JvwxLTsXryJCHJJjW
// EXhLoXXGLIxEsDVCM5uPTPK4Lzolm3k+gNP0RlRO1dnQu2bsURvuwQwYXQYwdP64+RNqeNvnXfS0
// 2OsTg/xKpm9J5IHP8WwwoWHsOCV4vgIE8vMdolTNn7KOvwbkU+4eHh3c21UsMDFPRvTH+EsTmoCm
// /LiB2nllxJnZuRcbX5PrdV+KjJGNZvuMZyZTB7x7Ns2EeSRuy5bG2czaBgT1tera9TmxekJyiD5f
// iYllwI8RBi36VFZdn5pA6i/gpwq94Sr7iv1nTGCdUcqNMUG5DYmesJw2VEx4mmmW10i8HJB+3KVz
// DK7NybiCR2vfKBr8HTlHQSMydFOuEjznZ58VZ3ApequE+ThYlfdWsbMMN08NmRr9NDu49nkGRNie
// j02PCFbjd6JfM81UuQ+xZo3HZ/aY/AmDyzT3X8H8vbtzN9nx3/x/uggtp2MXdPCskODaa6nPM0h3
// lucd1Yn492dybFv6JX4L9G/2wZqSWIucPLqbhVv1nLmOhrsmnyRbpkc6Mn+rtdQMj66yVGDGl+ob
// MmgbFx2rrCP5E9CyMfwO/RiAbSU31S44fW1DtZ+taWzZYGgHeDSNWGK4SpF2P2PucPeulPCgkLZA
// QJ3tx7xIsxhPSsEfzQNuvya+4KHa1TRqq7zS1gxYvJFquIwYgXo+tNvQmCVFXE1E7p9r4aq4Sz1h
// YH8bj3tplxP6oYAp44+i7a921RIfmChZrTzsvTaNQtW05pkJX7eHRZ9Dw0yfFjXU6kkjS5FZ8hvh
// yMcND7SBXf+WCbuUId/tZa0skq7KDmvFWnyJbXoacjMpFzSe6Ot1VDl2z+DRwUUKldOlUDEHf/uP
// xLarF/4g6/1i05UBSVnCbDVB391mBcaLaOYaMNhwdr4i0sYO5F1h7Xt7SlxUTp7B1o7X25AJWGMg
// lYEdO7HWuhRfrybjPWO4CdkMRt+NeXilsqA4KiYTCs6MW6GItilAEXX4tC3bcfwvezQijvSWkXnv
// 5ww8/ZzDJCCol6qjgpReE/Vp33dNo54QeQqa225HTqpuN1Dj59bCmyrVZ/lkZ1OkD+aCiChfn/Cp
// TCq4LNk0lY8a5IES6iZBvpPcNp6AX9MY74XdkGDK8t7cABPN/8IGRynUvP/Q3nksdH3zNXgP/E2o
// M8MfBKM5/rtpMPfuWlrE+wxzzrPMcTkZhyxtDd/Ersm/F12E8r3DolxH6LqidfDaMCApUED//NfV
// fE7Lp9vj3+Ut8/1WhTRVw49nVIQiWX0fOJJUfoR07Euue2MnrBIAItKkRWskv+fucGTWmZkLd/dJ
// ruxXyZJa7lSyduzIhyqUfZi7PnWlsgc1qR9sI3E0CUlQnNu/bY10+ia9bqFk58uSVzZDZDYIjOq9
// ioEoiX2OA0oU7xKeVYBBOyron2Lh/TryiXlhSfXHMalgxvKja4O3rC/YVaJ9spsTdp+bm3TYBZIv
// Ee6X4L2WlcVEXIgQ1sFjQyd1mGAVGd78zpFLN0dOQSn324qruPmgoM+RFd7xGJmcDJAx9Adh/XXz
// N4DsutYxck/O9me3JhZl8frktps4BofJv/gqszyw14u2HCdIM24vFqh/cue3Q3h+3AT0wMksb4aM
// ucsA+pVOdP5D7oyNr0YsiKFbw4yK3L4KNyXanMV5VecXCaE729+ikHDP/XGf6sH2Ez0A2eWc1Fnq
// 1nUvZA2yxtkwJdE7HMZAF2KVTBOPBtAP6wKuM33T6rB9zgkaWE9Q95FmUJFmp2V3iZC9jURkQNbc
// JwhUIkHe2uME50eVRaK/80qvalQbtvX8IoRQr22lm+YRhJNeTDCtByNkTXXoFDmd36yzXoGRDNjR
// DOikel3MvdNYMwtg2fwpww4eS8qxJ6+yiwh6RFoYS2uctbjORwMwUUil9FPXH+69qUIZyhAYkLKM
// 1QvfbGIHb4xm2+hn3GOybrKH9kZ73yopDoVJGvKVqLip/EYizabfPNtlZEwIX+ReswUlytCJdzAK
// vlKpNUsKLKGqZdhHQzZzJmR+fFWgvAWxBGwg5ihUlXeOwgaOjfYhh3GQ3b3S1i4+3xFuqR1/BsAw
// J47AWFkNVW13yuDaqRG9AZ+XJJuRHIlKcEWU2FMqx/TCs+EytU6ZT8kgHAbju6EgaHs/NUptBLNM
// 7KJnXPZox3NE39H1qu9qn63r/kXX+SVUa/OWUL5CmdtPYA6aToJZjwZUpIshOfS6hNPqEwzqwpzu
// ZPVO0pn1h+IMOyFRTOTNXMTpq6j3QXNIr6BqKkEGCSH74Hn5zJf2YWsoG5XCgEQu4NLk149FvcOv
// 7EHx3nBedqW5b/Yd/GCshi1hbOabWriTWLQLv7dAs76DjMrpvtbH2/kZDIR+RdfVULuyc9KqH3gf
// THC7NdHl9/4OYPqXpNEPR2V6FJEcmnZ8l40dVWKyx20h4dBhEhxXi+Avn7aWXDUZCQMi7bMY5Mga
// PNTu4o4mMNQMKX5b/3uzWX1IC6+4OUWIdyuWO7V8w6PcrbDFO9Xtxd6WGR1AlqqTG9Y1cQMkX1Fp
// MJGy3A1E5SrSIlnMuQncV9shz1+OR0ZcqXz1mO7RDUidL6F28DFXCLGECfVJSBf8I5hBJURCsfP3
// rLKP80Fvnjdj+FkGj/NDa6zh29pEphLDX8TgQIHZGm5N0xtn1ee2uBVgHsAFDGKo49bbKHGd+JSu
// ar7W7FiNIfhLDkkYEaSZX2O1zhpoK4wljijv9ACyBNLbNKLOOtU1RMeMipzasMuMi3jwCPg8HaXv
// r9VYkBRcBZYhPGDS4NIuWECW1U+ujLXesyd/KeBY/ECLZT8ToPomPcXUgEXJHX6COTA2Sue0QlAs
// LbPOhowKQqkYOniZo/ARGLH4hYc99g0LAali5dly4sC6x7za9hxpNsm41+AvGjkrcezFWco6U3k8
// tpOiRR3ZYnfBDlit+97xH5cvZY7Ij/4aXrI7U5ndrrNfhBPpuW72RBgxm7ahli9IwW43Sg/jU2AQ
// UUr7SvPSdaY1Drsrz1iwT+egPbdLZ5sqzHPyXNz3/hlZPe9BgKPLFMw/X+D42s2S/Rf7gvdupGC4
// EpZagc66qyhiN1xBXjMel5inlg/ACrVqVySx+pkV/iAqLU7XUJ9DFSdpSbaljOjMjCVKTTOqj+Wz
// nijPCuhjUhDOUw4FpVd/B5lVeqxLVD+l7YQ3/FgTLSV2fhobL6CsjZhf/ZHXQJtoR5qeuzQ1LFHU
// xVESEhFJpIrPRhJc1HOrEA6NUUdaZ3Uf3zcbjZzTfXCy7Qh/Wmc+tqcX15cYunzDiw5VA9oL7VI9
// VRMRsbZJHtTZ00vFqD4Yd/RRhx3dFX1lGP4h4AxkhGBlbQs9Oouoi6eKPUTRRaK3YrRzc5Cqtps/
// ZPOn2kmFnQd6FWkJ/FEVC8F3zqiqu16/I2vw4KT2SOMO69YxfdtsfM8yKFf6jKxJAIl+Hj3uQ+g7
// PC7m9SOgzRWMfOi/H/HelMZbq/5j/tIngqOuJg8BUgSmMSKqUNjeueaUxZffCYWGCr1AUgtVQzIG
// 0ao1ZPw07LneJh9f3/hSyShg3+3MP1lGO6ZwimAZ5M9y44KxZwT8iJ9LqbKAUkRuHQ3Jy6F8CC+Z
// rLiUmW+ux+GieqZ9OiK+25RuyTX83Qq65eCAQkJp27ms3utu7H60e4Ca99S1+gku4hEQJro6YLOh
// AbxhLmY4wfqDaGe1p+RAsxyUcQk40PYiOEvGyPiVdQ8Nt8iIYEHHVglnrxdTeXXsv+1UNpQ2uPXa
// /GjdGUy8dEb3AjUWFysDQPAk4vlCY5yi9Ko5EBTNuNhF6aZvYLqllv/wfa3d3eaFHgfvy/IMHQf7
// JWzGI+kI7Mspmarf68EFqF21f5p8CMZd4zYU1JhClr6kD2GJnEJLPz1naTvJvrwOyR6r8J/n3628
// sqf/bLplz5Xs25sZKj+jmA8xNDKmXptT3l3pw2pqxIVA5tRakXRjOPSD
//
|