diff --git a/internal/testkit/testkit.go b/internal/testkit/testkit.go index ad7fc437..f6bb52b2 100644 --- a/internal/testkit/testkit.go +++ b/internal/testkit/testkit.go @@ -63,6 +63,7 @@ type TestFile struct { comment string identities []string passphrases []string + armor bool } func NewTestFile() *TestFile { @@ -87,7 +88,7 @@ func (f *TestFile) TextLine(s string) { func (f *TestFile) UnreadLine() string { buf := bytes.TrimSuffix(f.Buf.Bytes(), []byte("\n")) - idx := bytes.LastIndex(buf[:len(buf)-1], []byte("\n")) + 1 + idx := bytes.LastIndex(buf, []byte("\n")) + 1 f.Buf.Reset() f.Buf.Write(buf[:idx]) return string(buf[idx:]) @@ -122,6 +123,16 @@ func (f *TestFile) Body(body []byte) { } } +func (f *TestFile) Base64Padding() { + line := f.UnreadLine() + paddingLen := 4 - len(line)%4 + if paddingLen == 4 { + paddingLen = 0 + } + padding := strings.Repeat("=", paddingLen) + f.TextLine(line + padding) +} + func (f *TestFile) AEADBody(key, body []byte) { aead, _ := chacha20poly1305.New(key) f.Body(aead.Seal(nil, make([]byte, chacha20poly1305.NonceSize), body, nil)) @@ -231,6 +242,11 @@ func (f *TestFile) ExpectHeaderFailure() { f.expect = "header failure" } +func (f *TestFile) ExpectArmorFailure() { + f.armor = true + f.expect = "armor failure" +} + func (f *TestFile) ExpectPayloadFailure() { f.expect = "payload failure" f.payload.Reset() @@ -255,6 +271,22 @@ func (f *TestFile) Comment(c string) { f.comment = c } +func (f *TestFile) BeginArmor(t string) { + f.armor = true + f.TextLine("-----BEGIN " + t + "-----") +} + +func (f *TestFile) EndArmor(t string) { + f.armor = true + f.TextLine("-----END " + t + "-----") +} + +func (f *TestFile) Bytes() []byte { + out := make([]byte, f.Buf.Len()) + copy(out, f.Buf.Bytes()) + return out +} + func (f *TestFile) Generate() { fmt.Printf("expect: %s\n", f.expect) if f.expect == "success" || f.expect == "payload failure" { @@ -267,6 +299,9 @@ func (f *TestFile) Generate() { for _, p := range f.passphrases { fmt.Printf("passphrase: %s\n", p) } + if f.armor { + fmt.Printf("armored: yes\n") + } if f.comment != "" { fmt.Printf("comment: %s\n", f.comment) } diff --git a/testdata/testkit/armor b/testdata/testkit/armor new file mode 100644 index 00000000..7ebd0dbf --- /dev/null +++ b/testdata/testkit/armor @@ -0,0 +1,13 @@ +expect: success +payload: 013f54400c82da08037759ada907a8b864e97de81c088a182062c4b5622fd2ab +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_crlf b/testdata/testkit/armor_crlf new file mode 100644 index 00000000..b474ce14 --- /dev/null +++ b/testdata/testkit/armor_crlf @@ -0,0 +1,14 @@ +expect: success +payload: 013f54400c82da08037759ada907a8b864e97de81c088a182062c4b5622fd2ab +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes +comment: CRLF is allowed as a end of line for armored files + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_empty_line_begin b/testdata/testkit/armor_empty_line_begin new file mode 100644 index 00000000..5900cc5c --- /dev/null +++ b/testdata/testkit/armor_empty_line_begin @@ -0,0 +1,13 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- + +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_empty_line_end b/testdata/testkit/armor_empty_line_end new file mode 100644 index 00000000..0a6975fc --- /dev/null +++ b/testdata/testkit/armor_empty_line_end @@ -0,0 +1,13 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= + +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_eol_between_padding b/testdata/testkit/armor_eol_between_padding new file mode 100644 index 00000000..f69d0cfe --- /dev/null +++ b/testdata/testkit/armor_eol_between_padding @@ -0,0 +1,13 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW2ewwwqo +mNlxYv6gMOKyDNzgiw= += +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_full_last_line b/testdata/testkit/armor_full_last_line new file mode 100644 index 00000000..54439f09 --- /dev/null +++ b/testdata/testkit/armor_full_last_line @@ -0,0 +1,13 @@ +expect: success +payload: 724a112a2cac139a4fca3ea0f799f2e5ccd1d0db46af654dee40567bff16ee33 +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW3bj4iHS +YS3WWUtZB5wJqKgEe8kpsp0iOnD2CNG4DVKBC0Z7SAcCFb8xdwV9CRavSEE7OU1c +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_garbage_encoded b/testdata/testkit/armor_garbage_encoded new file mode 100644 index 00000000..8f95ca34 --- /dev/null +++ b/testdata/testkit/armor_garbage_encoded @@ -0,0 +1,1379 @@ +expect: payload failure +payload: de2f256064a0af797747c2b97505dc0b9f3df0de4f489eac731c23ae9ca9cc31 +file key: 7aa5bdac0e6afeed3dd0a7eccb42af44 +identity: AGE-SECRET-KEY-1EGTZVFFV20835NWYV6270LXYVK2VKNX2MMDKWYKLMGR48UAWX40Q2P2LM0 +armored: yes +comment: there is trailing garbage encoded after the final chunk + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCnBkWnErVDB2ODdFMFQ4UW1XbU5m +U25jMjl4Slp6VDJkcDZ6MSt0NW9JcUkKLS0tIEJLMUtNY2c0TlllcHdNaFVsWVFF +VHFsUHkyMDlXdzdWeTRiS2NLTXFKekEKyC9x64ICm3cTY5nkheh59DyiVHEv+QMv +VsRatIRke5d4B+ruVrfJ+PItgeoGV74jlMRjN0UYOHFWss5j3qFhgiRiLzrL6AQU +Yyo4H2796NRBfo6Gyol4NMrleRJUpEH2AW82NzDUQsdj8ohjNIlDpvYn0jvavi2Z +soh8Yu3gy8C3QMrlwNVoKcgt3dcI+rdIPponeoWK+xqgZrIOkrlSD7kMKmt+Kmht +s0K5mJ55I3anKgb0sxGPMu219kJm8OZKzEW22MIqzhTCBxE+RlKp3XxYVIKDvYeZ +ig87GECiE+hvrUjsA+lovQOXL7xrwT+kXcOEZu5AvmHlaE+mfYQhZHZV+G7EHk+g +3rEZr8gU9iyUoVQP73ch5XB8vwofF9MVzccGOk0AgkFvwBp+P+vQ0ESH3TwJWNLm +UccCUl7DkMAIpX2TuQ0bygZxviRdt6vSgraU8XLo108AeEUNnI7feybE+mVAREgc +FctbcI8gT7SGuoRMJX8Gtw1X3G4cfYPBkJb2yc3+rtQIHp9ggFwALjlNiNynVu3M +R5FhccRwNphuVz6XjNgZxsrahwBRCGs7nKtdCL0iYLf49wm8H6WAkso6RJumrzmr +iTNRGHeNlPegjo4CHgK8swWi6epHtghbPwRwZn1ug3xqK7Hc8xdb8pGg7HrOmv6+ +OyW+V1uH4s/5RRp0crgDNt2VNcBABeTxCUrKBzKuZAW1BL8Xjo49tbFTWoIOsOx9 +FeKYZwOC8bUeJChxbedFMAxJAMU9uWcaWOFiNJ/NqhI2w93EDsDkb0YFW8Lheuuq +ekbsLe4MxiDWeBQxbATPBgu0FweN8HmD5RmwBOkxt2IjVGWhVcw/tX4kUlvSojBX +0kOYEurv0ikPjV51JoICqWbngpBIeawnt3W32EADjHfe5Ahp6lcfIqE+iN17mjoP +aXVUmJ1wluCEV+YQGCmYe0g8gqHCl/BE3syNOiAj50DJh/JABa9on3AWaLj9sYyG +jl4GMQ0gvXIHEVNE0OUZpUVFWL6Ig1uZdzMnnFLwI+hPMr1ILQ3ALoAwQZPm1XP8 +qCKJZGT1MxpgISg8I3jli9YLiWi9q6CXjJPajHfEmeKj1qitTNQCTiuYI/s/4fMS +urkhCPbHIiqeNZnywAqL0xp+LyOAsTqI/ySkQPE3VuGkZor64vefkK8p/Gdgxffw +M4a5/KzgCN5MALNBIZeUD2ggiCXacgrY3RsnCoLLVD2TzkLFYCWJr64mTifWY0I6 +ElsCNsSpQfp7X2Mg0yzAd04kB3NuxEgQsmHdLBQLY/5k+O0bsZ86/ZqaxnHpfaGo +KPGmjZKG2SoT4Q8dNPZ0yIruqznOw9fG4KU8Kwll+7Y5PaYYA4Nyjfpmc3j7xrgu +peTwt2y7kxS81xga/NVam2QU2skUjzBkrd42D/CcND/nYBQsLPtIP4umlGmZOprv +9nl7F7boLFAJ4VgPL8Xxep0KHEVoNhdU7hMxmOkaavv2WUnAt3JAW/GZAeMXfvJl +rcncjVd5zc3+X2MZwTo2v5CTNa87GqdM7K0+zZxA0M7DZNPG3GJLM3WZnVqb+Er+ +ntLpgJSbGVVZ1nh6Fmxo5osZ58IMLK5u92g3UlFar0BaJJ8eirMjZ09upIH/wsAh +rFXsA8ESydQekcjjOs3A0QxPHAlR7OOtKhOuADCtINVYX69IAAruBeCeG2EqE7f3 +s4ndFdwbgWPJvXflg4uPTFIc1OfQHvTpQMFjWXmghJMvPZAaNOQu70aoVOtHDBBY +Qhzhp3/WHEoGGP+sbYnwr8hipn60wjFfbcmzCYvblcJRiC8N/o/E6hCYdxXTUpG2 +VBccA95x/ox+5f3i56gz2uKkOZda6jvR2+DlDgw/jM9xzQ12RFNU1Ysq+JHRPRqV +K/hatKk9UF/53B/dRfyzmvyEkN/Qp5wbjOiTxRBAAcgEUxzCrfgEZ+h/cNO2qr88 +3854zUXHl61k0cw7uV8HiAhwzh+RyeLdWTdTYJ8sGpv/GdLPMfhaebcdIGD/g91K +NCsdRmem5pcT6CabJZkXF5Ksx9HjLyM1+1HNHsAILT1o8LlJzLOR1kFT0UOWcL0p +PgLEbHy7bMFA/bwH6VireGiSJZUkh5RpjIz+Dkya8S/sXaaDVlUSmPFo7F6KOdsY +TLCEcD9U1u/JNAOpZ1PpZAjUu0Sm/GWqVrqkYQthHKrnR8s8sfnuqTf1ZNfmDnr/ +D04O8g/gbiat2Pk6sC/yNiV1c0ZnNAKJALGNghNf/vChFjSTF6CXqJBsWz68sAgT +2Jr+4CymiwxJBLSS9jY3kZgK49HoTMAntNLf5GGDPpTFHSlWlHs+NTWMdhnnL37m +nUMSCONIP7EFQWZipK5VYezZTtEDkSkyyhzgVHKYjkP78KPCssJD4dXELI66hZwj +FHWHzVGRqmrdvjW5pfg/stQWbbaMH94TTf1AqY2+LCmAN02rW7CP8gB3wR7Nj7+9 +GTVEr31nvt6aEqblt5InkAcwDQBgl17Hs/zui4jUl31934saNgJXLr19/j3jC+N0 +ddJAAo01BEEef5PIAtfgKwoe/H4OOpXp2uJtjGhzf+e9fzcSutiewoQCu2UYlcBF +U9nDDMm9z2y7Tw6ESZiIa0aLimiOpSUA4MeSXjbXdvnyLIPoer3fvBsE4Kij6Nbi +NQi21eK3p4EKhrO58f9+3vexf6Kb5Gdi64A4XYrl7F4LOpjlhNQv08w/Zna4npOh ++D1voXp6nKNw5xAwMI1Qc3U2Z2a0GT2myO81fguLvqncDwMhJ6yq4H2H379KwiAQ +gI7YTJJcIMiCkR/UAChmG9KW4C1ki88WbXaIpb1oOKMq/DFaAgsTTWhvLIUl/z4L +iQgyqPQn4w/zIipTyveS3zd1epwtEPcCQccYOCqTK6cZGgtAh9m/JJXQChFhTKIU +odT5KRJC/Cs2wSguH1RoBh5VoFPX1mDdUvVGQ07RtTUMFzQVpLPnESAXeece2oQh +MDQO3F+D1cywDg/r9b4tPvhE9rGGeQrfJwkZhTMwVVly2xmLaos4eDRB59ixu0i5 +Csz48FZqnG7ljCmgv4KHkgBcSSErPSeSJL76LsWlX9hQcokXBQhPUEqo72IZkWZA +pZ2YOuM2UMWxzFWJ/+g5qYi+rWvTjB3bDKh3H1JHrdw1ImGoIMykNh5abxwXhWjx +ShaQojxQssNCXZNXpyR8kVY2EEIfrY2Xr56LBSCvVfQhyieB8wc7ii6c0QbwvW0H +1Glb8YNneJZo6LYDR5p9Sof1D8KYJrz5GTZYCIrpL+l+q585dAlguI15Fdh+AyP4 +ZJ8PdMVGhhUzcnoEpBbOkOivQhSNoMCAPQVG4gWp6aN8dGTYogKphEj/wWoAhHdr +sltUt/CE7hLKL1lbxVp0JhUUprmcCav9RaTZRWj4B7aUvNF5M4RIOAaAjejos0hF +maPGeobTduM/Ksn8Cy75nHHSP+T5qjYV89xY0ms9x1oScCu+AkpoyYrA0wZt5lRQ +WTqp2G6ds0wz7M/GMs+tyeU0+Ai2U/ijIkMw6S9W1qYt/6W6FH93DZ69orbUmI6V +ZgrTTO5NC/tWjih7URlZJgBblfpSUVdJVSg8YLeBFGQYl8C4l3pmMa/w+ooZf9D6 +jdZEkdFy9vHLC8Mhzl7RHpx8AJF3gf1UpLVDsYU47u7nleYzF2H3gjFHVmS7K4BS +82EXLVJl2DpzUO1b1UtPU0V5pQ0rIjoo47eDskqx9BrpqfHngqzFjfGLtyZPHQHI +nTHmtmApAr++guhhwduueWmXaEQDwU4c5u9RqvCC+sTtvHm4bDBJYkOCHVwjqM6x +s3sSMcsWb4yG9ZY8QNfWynfK3E2qWiJy+kLG8A6vG6H7WoUfMCTzF1jZQ0+e2lsa +e0qjwidDbXp0xqnsv6QhpDbYQ/0n4twAZqjcBUujCsf+XVBP4XkGIbeJX4HWb5WC +q0/GaJYO9XnGmATKEzm+BKYDIupBq9/B7tkS3xXg+VDlhnYcRdf7J75DdrZ7fQ+o +pjnoZ8UwyXSoc8MIzgp4vDHZ6SHZBZeRtJ7e3F2aGGrY2XlP01aQJIo7HICH2Kx2 +nAtv8RCxsYRmoUjXYQetN8YSJc2k4sGiT+dh8ceS8JatI//nywmAsLr+al7QSXAX +0FsXGD5C0H8R0ysuJHW30Xb8xDjM0sHpisVaGtu3ViveNCzBzl+jgMYtVsHUxfcS +sW4e8XFmwqliCHtLLoH5B9fNLrKHynUNTNjx3oFI/Jl8EQc32Xt4gG+HkF3IlVLL +wgszFodp+MJTlut44Z3Xxah8Zw5PrjGUP967af6s87UoMeXij56G4vPy6b/uEQhC +/VslwcIUk/iGGkOSGDr8OOOOPerX0Z+09bjGOBOI0qcDUlKCUNnRSg5BlreA1LMy +sNeln+dlpmYu2Ba+OP7anR/M+tTfcKudaINQBuwykc0e3TpbryiBLzxvs/WtQimG +QVJoV2K7y1yXlRS+le/y+X4Jx0nCp48I/uwD4vcPch03WPc/iPWwA5o4diH0h0EB +bxrA89gMZVQ7dGkb4Dn2MjZOCONcvzqhiV1iHep6R5TlbgjhF6adCBBhpbMsdahi +Wjdw9PnjPfI3UI7yAQmXdGzqoM+5LtYZ8TlqVNRcCNmFHbfDw/ne9jsGqitAJiFu +QSqmmeeD0jBxWuWlkoU3MoEf4D7C9UlEGjgg0Shbngv9RDHCezGMrvslikAU8IBK +8rmm7kxhz9UMhssgpsCLksaCucwthseBrvfwz7B8vIS+PWgWuHdBUhmc8NgEbqqD +td3MZdbQ5qR9LW9ne38Vc8UXLvzSkmWluLCnZq0mm2sz0Fodi+UDaSZc2T+/7pW5 +jXFddBA3mibEqu4BsBVtFjW302NcGNwcdrJ7FrzPx2gUwKc3IYywrPJhJsxDKajS +AXvfURksvDIuYBlzTwm5Z2K9t4RiKHGPV1WfKgqH6ngcgaRQWfmhFrj6abWJg40G +OjdmMQ0hFMZBNfRsCHOtdRZdHOL4FzHPSKa2h0y8rZ24tXyeYUh5UaV8++A9i+0f +jzsZYpPLoi323UiVEGGOsySenhFiOdHTx8/dmKiFuQnAqwyeeMc2To2a5IBmiNJU +Dhj19iKhCZ1vbOsz6z5GbEmOTDnxX+QhnRV/LQazkCXKxtpTb3pUbv9clNbSXoW8 +PNn5bJ2gx9kR0fBnBgWk0R/BzJq0fhZZQ+ahi8EGiVC6Mh8B9+oU3uGLzVox1pWm +bRyCAPvPC9Cmg8j2IBXzgLXPETc+yF8Ve4JqFjBoHSZ/htj31FDgNfiBTsYC7JUH +VWUxFCTLlkNvAMY4dTDylPefWEHz7kTVNEcOlcXZK+37tYCEVkFXUBnOf2evBeUu +dKT6RhGDJOXs47CaKjNo8Ju7j7RlDXVM2I4pQRZIUkv1ZaJ9wen1TllxQ1PS/Nep +hzPapGIs1whcdHNaqkmohbfNhZ7O0/amtGHfdDJFukC5zNxMYuWD+BdIiLPYY1Su +vvpSHEVa22n9nThx8vwQuWmmXicBfMTZ5lUp5h+vU6C+Z6WohQaxIOiF5XuMeLA9 +6bMaNvVSVBeJU3nzYuP7XWELlDd5kUBvvh65Pbw2OcU2g2CLf4aorwY5ZFIxvEWt +WE04QMRfCrCNc7SX6/B36A5wsNsXPofPFnIBGYOsgPEhgUsmMBIh6MJxV54e0IY7 +WhAp65jmlwTYjY0Y6Fpzi9oh5fRrpWnX2fY8r0NJ7u1ZqHswQMuHaoUTXQUmWvM8 +Ybtjx0cSJQyQDJCwZqBHnwwsFWLbo3/q+iClDQ6QSAAdgUJAq9QioC4HG3OD0M83 +5d9AmzRwbmQcxKoGzug50UuqmEXq1vBjO5nqu2IjaTn8Ud/3zCncWlHQG2Na2V7I +70rJ6xGUBC+eTSW/lFkwVvfjbDeTGpm8pGy+HnZaxnuYccOA6ib4FbgQJCh/Rw5C +wAhW6rUBil7G4vK5tONDmeUNoAROpr6JbjesC3N3ZyQzO8qqvGt65/sONBD9jtIm +9hSMP//yIIVNKjZORMk4y7HaXxEbXHMtjXUKiFhb0SKIA+DLRcuk07Qcs4xSsFOj +PWcsyKb1z0qA9sqJ8NoY1aIjtxDg8VpVsxxAUZNl2dzjGdOSnPqf0+JI1gPLmiRl +VFVVT8OlSiBRPk5cnrByB7cEtlTjSeyLSktljJvY1bu7kt96VsuIb2+SZ3xpPPf1 +wgHx0Rv1NVzIpOkG/1jRuWOt2HG8po8l1V1h7RsIlpSneWxH6ZrlhtcJ1fknhDPa +fhu5qlBbppPO9jBpSur7eFRUE2LahGDry/nD8kwE5g9VZbLi3eXzDAY34Avxfa2E +oqNY2ia1Cj0QBvnaHb+yG299JeFX8aTUCQQKNww59xguL4yvrp+KZXj1i44eUkjn +LHqZCibdEcx06GJMG53upfGY++5oiyAwnqvF5D3RCgmHE7lVcuXnMo56VvmcRVsA +1RRnt9Xf0u/gLyDpLIR5XPHQMq0/0obCtfKdCrSWtwpCdeBigPD8EcEtm1gfAVX9 +lmUTC5rDImPcThdh8wAhIIzUErlC0zZ87kaGE4J93sJ9ha8cR4QSySTAwljeQot4 +QuNygcumrJwdj6v4TTHk+Kp/48i3Z4lhjHsIvpzqQjoNLH6xVMAbWoRwjgAY26OW +xSZpjwb/om3T3g0X0f3eJbe1YtHaroonk5Ig//eJu2WGTYbBefmZVzGFjH3dAGN0 +GDLuyibci+KbWfhPz5RVGNQqfiQ1YOGWt2I3Te5YiHgXvAjKlGMaCpZdJCJv55fS +QfyDz80ura2GS4TE0d4WpUJA7o+bgNzDAnYOnUxlTfRnkWtx+XdbtfNG44MP1qoW +4pJK9xup0qw1skb/QloJ9M28DQKdypyhxhH6m38YLvmxr5LsdcXsAMEyovPLy1uy +SWfIxVUF9PkA7jgUOcZQ9SodEbvTKW7Eus9jTYHh29U4XPVYIvTwigRgUj35+Y13 +K4s3l/LrGS7RGnRxxwHY8NpwTupq74A+vJbAy09OmPRHRmcIaJGIJKTQPMmKWiGN +zCeVwYCspWOk6aAGpOHuQ+smVfOjZxIXsi6PD60veABIajyR1x+RIpMkPBcE7K7w ++i4wC2qSSgICOZN3jLVQQ/e228U+SOqIyi6p9xnlI4z5Vr2XI5n08ooKjVTYwa5M +1J4Gpv9rfDnk7BX25tc/xMuM078z2DVbEn3ddBVOZgCmRfJ5OuuMTsbgUCOJgDaR +QpRNk6ARpy9ha1I9putGDUB4u+MjydZpB3wrW93DEBgnLy1oU5Q6WcsZ2vpmmwHw +bjq7p7jGvGAkEa84Xd9WUwCiXJRXWJueO/I3W+B3JU6Ga7z85RCZwo47rrT2+SBX ++GiBCpEpHC5qjsSRJrjh1QYlCzLvNABwnRQd/KCrb6Ojzjn+y2+ibA9KDynIwVn0 +AY5rWkManXKuSWOZTx0oe84Zk9Sc2QhGykIsjqWUsBHHo0/UMF6ylgvNx/dmAGjJ +2RKACedHxhLKJol7PuNadc3cOKULFNcOo8ngKR883620eI8FH1aBVR6rP7EhnICg +96PwoUtxF5IFo2VmVR0ZADAvLMwpeMFQtWAQ5svAwHy71RAiIMOKd+OjNwRyT08A +jv2sD0JL9T+7kTdRFmhGD/ZXD5W1eC5WAEgHn+sr0MqNaHfti1xD4E04xWxB09Bp +Znxasm4izYmP4GJGIfCr01MT9hGOcqUEKgvOs6dbH9RdjBLY0VMfVntTkti26+NC +DABqkE/g7ga2KFw3IVK/EtiPB9LpzAIKSdVp9RIKRYbLyPYNJ1f7QM5uXis15seB +zKAdJkIUVUXgyHH7CAkaG9rUbUtjX3fa7z4JHlSDzlHn3c7TxWt4fePOMLeASRXF +LKHhyhNzkf8Sui0ErbgxuZ340TAYPssUne2421KBL6VdTfyaZldyQGUp0LB3BPqL +0RDJTSIfEgDGW5EJE6rGLOSmvwP5xB3VNLpG/dnkKDd3qlPoLTRj7wLfy64DPhWu +Z96tMBtrZ2ZqGaAj8ugKXDCRIOpac2HDXh/fQ/RJpDnPO7geXBPaYMq/mb7t9U5q +uSOqKSek/8o4rWoYFbpIQAfCayXuffLtv2wwoiBW/z6OzcM/dYingiB9uTi+b2Pu +sRvE4TyfJjYToSQn9y6x9r51K6p8ScUgsIjCJ5q1kxCLc58GPxM0N313QWV1h1TR +/4iSnH2KOFl+EZ7QWQUFtFaXtC21iAYBxhlhPS/KpvnwI5jN3+9GxllnZaIXZqyP +YpHLQUwyyyPmrIsZaqxlPEkuVimW7mg7g2Zbm+OyhdjrKnS0n97e2YZ80eoSnd6T +AeF6mB9S+sqibha7gQQL5vyLAqhQmNRViqw5jYfv9zQJ/jOH9YlmnIQ9zYfAxcqt +CSOYLy87JSgWJLnY75ty+bA7Au4iAlvJ7R530tWTYlNiMMTg4AouQCNx/27nWQWC +TBP+MoX9jsL7svpeGi6dwEng2DrooWA5sTcEqr06XnieI3bxtuycBcjJ7+q+AFzc +9SURNNKNHuj+rjO8mIXQvEBJiAiXjcDuhDwhwmwGIMdtQwlvyZNykY6yCe+2SPJ1 +5awmkc5EQCyByA2S583W9Rs78i24tN5AICSLyaxcOkAeVZIiYCNL2sUfFUE+gs9r +VQpqUJfOOSKr0Ge/c1nXoQeodzgp5TR4kytRjkTfghMEmZoURJeDtGqrMGxGhDf7 +iKcZc5j6HE7gli0iS9pluKLvre2/gleMONC/LdtrZ56GHhhlq4Q4tSyDcDVu4YtP +TFBvGEgWKQgIaz4uFW1ldCzpv1QYNGtVU0ur5uplPfPBI79pFN310FpA4hgx5uZo +ffwI9lIUKCs7j8RVzAizToxbUCei+8si0UU5XCb6ld/SSsICzCxr5rkN8Du3LPqs +Bq4/bdQpYWEMV0SvMeNfHu+IALVh85Mz3PNh1QAgS8Wu6kisSUdsbnuiiXo+GuZY +/hc6OTQsCnlCskz3vPfk1znFcxofI8ER45MDElVYtt6VYP5eq7r0zsN8eJRsNR2D +p0oXxutqIBUHIVz01EibGErE4u/fOiNKyPrA4G6DIoEal/0IhTJHDU37Ra2nrmVh +0BpR7tlmbAIIMLBcxaK6cUJU04zAIJM2ZRIwIKGnfQPLj4SSGCeBEN932L1JMQWM +sGP72PAriVC6haR1illY55us8tf9qD4BKO9EkF4Ec1GqiH+0R98npkLP9dk1dLCT +ASYxslSoGIPLVVY99+3nBTsXmDmo/5DEaKP0vos0DmO34CUk07P6yZchheQp7Y2+ +oWV7zZHcztCI3YyZENbT7qDfee3IwqNsJHYnSIIHxskyZ9AW3AUrp9l0JBCTX6bS +/3WH7npRUP4CpDyn81pEgCkWuUcUJFCh2/yqukHA2XXcx1F+7IhbS2VesDu3D+96 +6uZGEl1LcoL/X2y/bXpidBgFBr9SNjDBblrBMbWQEXVH1Eu+fTTRDWncudc/REC+ +PqfdOx74DOA7Zwzt5zNvJKm2WwFWMltN6iCND/pmJSJyZFDw+Q1ZH/UpYrbi6c+5 +Y3CUmdMVJJ/uQ4lCGeVsL5qzHMxZ/xYB+PsQDAVpGGq3PJYfEysA8A9iJ3mJP8ji +qNfZYBDpJMLoNfjkXXd7fWE4k4LXvPhKre0PhlpuAf8brewZoxOHlEgB7/qcNfCI +r/gCebU6XR3zpbAwPcQwRgCumg4P7mNBqsJNrqnuF2lWVzIDZK4AGoHtvgH5/Wdz +aSjUBTjew7qMAUNo/1Mtf5psB1MKYjgASTCeQyYfRwI5v3WLE6sRHRDaLRHvTiwe +sw6mvX6ZKacdhAPMNrV8SRwSmZFVQU3AYJIVomO6MBi3XPtxJtuZWxVQ3i6KsS+o +qWY6t9er0xBMDcD9khkaW83OgvldtG99sCu71BEQ7OObtLHVKymOB7yVMUlDTrgU +7+OsFZlRIUW1jjbl5mJg2aCc9GHxGbP6G6qIFMhGkNz/Ji5DOrjV85SzPKyyiFe5 +1nZj58hLRn8/Omoh4Imph7EHqwGWwrbDPevz1EeKzUNyOL8bnilSqIJWek0mKZHO +lDT1kuZ8/U8HXTVhCN0GV7POMTK2hKlhzBENl/PhQnNUnkGjOBSucJLGVkd+crjf +5JM75J5m9J2gWeHw0Q/oX7PxGDTLa+LNa08PKPxmose81S1YwZZbEZHnk3JTVf4s ++xd7FZNYc8wjhWeExMriAcq2H3633QpIK7bfVDZfm1EkJ9RrSh6s4WS5SAASG+3F +oDByS907zY5n36DkUqoD4Jg8/xiNVD5SIkCGOPdi3eKGYzZe8T4CgFvhQ/M8mRdE +TY7t0a4VTDn27hfyGJhVYbnqtWrVDzx07iUuVR1xd7OIk6ZpIPwjvhBXiavsYxCK +ljX+oTTPL4TKK/SiYoMpdVdpfEzvK/FI6cVHjrUpRb772coz9gB5vuQsJeezq7TN +VvMpIZxySUs/0ccnc8xM8vcJ0Wue1HHTPgqonTJ/bmW18R81dxzBg9lNnMICdKpg +fjxo0Y4wTgopUZUvhJE7jxQ/lr9vTtQWH8tfzmGg3nOBQmQFZ0SYdboVE2pmevY/ +KMQa1+9sZ0n6F4+aVjj0X+8Fp1gRu7+yA897aaRcFu9BRSrA3pm5Ks/i+P73SX9X +nHmuAU/bm4beF3sD33YVVr2LhqEGBEVfk1pPmMRNWg2Nwe8QQEOTqBXD3BcyeXxo +yWoAL0V93DUXp3ZG5sZe7VnU10OlWXHEmTFekXZGA8INuksuWmOqCZ/Yzt1sjcHX +dma3nF42NdJ2WOpukpaY7+h7hQUX8q0T4Xyrc67dNBXtwHSS7apYcaSswTX/NWAd +JZIM41+5qoMOQUHd7eQagaGf8btz/i2uukA73DmjccXWk19LVEX4IYgjVpT8EZpm +3ESkh+ZuZWR47DAV8GIb+Eghni7oWJuQxCPXqqu44pVUHue941A7ran6+4D6RSvL +3dED+92ZnM75bD4jlnJUywUOHgwuNUyJIf6YY6G5Fevfn42s6RFoSHq9wbICZPvK +0LEzYY10kfsUgV1aYHkiwxNINRYKmHLnLGB6WaJY4MS2lSehpFgvhfekDv0Oun88 +2NWD5R5Zp0U2U9wzyB5sEh6VAL6r8LP7O211jf0LBlzcW3a779CdvMs3uER7UEvb +y+q3mCtDBNrCSNdQcmFtdMm4BgmKkTraGzlFJRIBduszDajMOPWijyIZdTKuoBhR +oKCO8AE+CUtqCOO3WNuLsWrHOzexL4QI6Wuu/cLLBEy5Wf5qqmavz33JUYaQtvcH +fozGlVcYjNqW/3ot/VhfZRyF/JR4RjCiyVAG8peWrAPV8NxU2g2hB6Zv7hjxK2Zn +bq0nQM7WakpwwBh37AK6FUdXEOn6uokfxL+zOUJZbOfzvuDhD7pBxrRCn19DeM7z +f8OD93XpQwP4F6YPojLayDwpyiq0AKFb9PBbZsRs0dkUs6qM+DR4QnNrAoYzMr9+ +hmkL4ZPs00wBQc/DI1mxN4SCGK+YIAETiN0AHlEjie3KaSHQhgJoRmQJgo6lNEIh +uXST98DXQlbRGGALS+IqQhMhPZ5xs7m3TOlzEVtejKVEGXaKExfoaMWgGg0S/RlF +k6TX5jMuu5KNcK/2OjsAgZU2tgGJsn7D2G02SwSmukUwhxYGfGiKXrzJaYn3Viic +R7WYS8ghf4zT/ah+HAaFAHkyR9TaiJ9aN2i8iQYb8EL+eEWH/twHJdh/hpN13PlE +IHdHmdklCkMYCArQV2Hy+Yahi8pOQY1XPfb++Iru5F0mj3U7/K9lo6vA/i9DsmwR +xttJ7Sq3QJgRe9BM3KugjGICEg/stmoHJdCnvbYtdSPuo8kONn75CWx/vHA163CP +MolnAl5I5+S6ObBqR2TfQTSyhUjoWDZrVa2FTUaHehtpGdJHnYPQDh9mUJTHimrv +HQ39BFnSGiDpa9UeTOWQ5GzPw3u/NeYMR/skHxL95EUmWJgRIIWg0EPWr68az6/M +M67sTR4y5L13Ol2VaCzRVQcff9TyjyG7dHIyqz9VtpPEmlq9KsQryFXpCYwzYRTx +te9AmtvydBDaT/v9khl9eMCu5mJNK+SFKX6Z1CYwpT6G1Tf/LnOVREOVesMSTF7R +U1pahM7wKL909EMoS5iPj2Nu/espRJ4HwmCt+3LI7vlmNQQgU+g6ovWHGQ1euPe6 +Mz0cNj5hWWKKD5TYjrdE37J3ZWgSK2DGm1vsnhVhDNeylRGtPC/T7czxIsId7Hhc +nNMt5K5Qu8GkVawfr1/x4fUw1o6kO4OzFRRfxPleCP2xHIz0PS6tpsUh4u0XCiF3 +TX7s21VXVsdBOmOddpzriNede7TOgKnUiN8JXDuVEYn/Tsyhfx2eUt2HC5BYtG3O +M/nOJZfJsect1x/mU/7OLBdkZasX/ZRcVEMoTnfWqNHUe+Lw4d4+tIo0olQqswaV +HK9KjwXjgw/nmbAfAh9MEUr8ZNQUVmMw7G6yft5oboH0GKOVNPeZED+s118TlziI +UnBRSNgZBqBXUsqel7ZYCih/zRbX/bymWJ/sPI5i5HjldOLIVsx/pjvRqysG/LBC +dHYUCZQzwSCeuB2ABfzs6SBFnGo+DdVEsKtMglFJIN3HhznIFLFt75F34nZzRCkD +/zeitviqMDmzh4+pT/MZMAeJjAeYlb1dbnPOieiqsUr8vsK24XJ3+ckPsLqp3wt3 +9W5Hf3lDa85Vze1K5kXtUS3Iq9bGl7APZc3Ow09PujQzBa56mlt7dY6qBM4LxXsz +bQtVIPsISG0yeQOEHK7xWb6w4TAiwHJSThJuU7krhw9y6CcLLLL4G2zx5WbzsSN2 +bbvWXt/eCNBBcl7Qdv9nOZ9U5znVE6eDUuV7UuGB2gGNG0UZ52S5D/QqGlI0gPOK +/k3HySJ4T+wFmh/2Ui5evgLF2Yk5G6q1loJvILpj7mXvU43yr9mSkYs5Y//gdE5E +MYkYe62yLeva6XlW6Jr6JigRo0CutdE1GEst0VS3FRF9WyPC3l5aZR2Fa3htmodb +bvF2/EOhBjMRsI6u7n3XQXJvNC4BcD8UO7YU9HXPUpdSl6Yvz/hxU0H3p6IqADQQ +u1lydvpyZBWgWGClGHHsXkmwv93cZXMM1SFz7fdeLr6gSNfcXBWCbkZtFGhIcuXE +IHNDvVXOMCWIBFbrdjC6soL+Ns+wUHnXJijJ1/RXx/3PzCI2vD/napd6kSeX3Xap +SDFRWf4YR+S2UisXV3l0gUG2+dIlPFhJE1B6p3AyyvnX7uEyA0dPMoOdML9Aib5/ +UJVjfxrb8VyKtq5+d3ZLol2X4coHXzQtm5HByhGOKEkgwEKhFE3JJphbYEBtAP7H +YFRsHlekEsXbxq0lfir7KOa4Y+l5GYAgk3cA6/5KXLJxcP9SwCMsj21loGVz14Hc +9Nosh93H5R9N3m8flxJgLS6n1T6FYHPSwM0S0YHDnbEtxClE2j+t5bU+wygKFRxx +Qp/5JoXMU1ZaFrsr1QEeZdNNbTCcYI4jxEwXOx7TwBrDrfsPTU4Qq/fUtq2KJNz8 +gTu1QxVoIzNv2cRlny0BHTJVBasnvO5iIh+bMzTFcYr3RlzrIdSCgaeR1GUj3CEy +CnCz+0lF/fDxiNsw/hS/8RNbDBGbvf68TKAA/esm+gm4jFS7GjErz1Me5B8c+o/h +oWg64Vo7ImWqnOSxo+fQXTjSGIqI9TS6nV+azMt77v6LecXbPyemcmpnOcG+kKp3 +N3QNzOB560zRXNFAgwsozSl4bzgkGTDdPHrXTn1UvWwlBG63gfC9XacS2LylpSlx +FUdXLvKRx274aj870YrjH8qoo7bux+c/746zm+Fck5w1KHK78a5BOTnkBt18lrow +Gi38npfmx519f/NcAFaFlFNdJxG9L78lNtVyViiVtmUHDJhiiZpQ6d8K0znSVgla +nGvh6VTqDv5lsTgT0eMMev87KFOciJtir4UisG97yH7046P978xW0aWFA7GmQxM/ +4OHLtKccb2Qw3+SMLnTLCJfm0HY8w2osCo6ND5ZNV7Fsf9UuEZ09tg95OETR+Bui +UwrJPLx/bSFaQlPFdwmgB6QPlMKhSn4nG+zb3KH0BTuMQlLzi3CEeyy1wW9QVqBa +VcV5ljGA2SDRfLhWr7XuEsk71BUmGTejN6q3HfYmaVvBidR/0TEhQSNrQQVq6l7/ +3lukZ3ZYTi4PF51G06aJCd4WUbxhKGQaJey72zz7WIA1UHebS82lMA4FR69jbUv2 +d7qd/3EvAsnAiLfEgYAX8fAfV+1DsU3XpPOKqlKiW0ndP8cW2UozQTCeGyFQfnTg +Hik52dgj8RIzf5wE9yRd/dRoYO7i0jmTZAh+Y6tEzsY5pL2eBXfAOFy3t97HIWh1 +jIuQ2Sw/BG2KtMGVp9soK2b/L41Jap6fLA32VKg25u8U7SzjptlnfvPKtSQqgML3 +hr6siWXMjeGPhzJkLeLZ2x2rofMklQmqT3n5qEkHIKObVV6Htl8AgqcHzFVOOV8H +DIdfAKzbLr4YTxrGwqwgSnba/g9LVvfGAzxJhotNax488No+FXjfJae8tdOf2umQ +UFW5Ilo7SAZ3hx0AVjheEmXlj0AEZ1855LwdafIkHwoKshnksihQtt6R0ZHO19sM +46CfcA4Q6V2wSvvn78dwDVqImOZh/o+OC30XGapoXW3m36EGvrFQonrQlgZrvkLP +azvmjIXTEjzsHMFQioen+uwisaOKo1IfirYYYk9gGZ31smOWIkw3X61uptybtOOV +3yLrXAP3hO2VkHJ8YwOr6nRBF1Omc7cv2m0zrCuggn/5OfMw0eXw3knilKoYp/2Y +mqhK+fQuGycKAeCFx30+kIx3OtSdnC0cobooQWiQ6lKh+ywgpDq/HODQ8kWOsywd ++SN4vrPDtLoJumQk3AiLHHgpXigpbYWy2cHHVQjIMBprAr5WCBSaP8c9B4SyhO2v +RVqz+rjoYa98q5cbf2vdfByVf9lKWy4kxUv3NktYvbt7HAbyQvYDdO6VKAdo7s0g +q1EHMuIWTWTfh8TP7T0JnX8agmALytmcHCA8SbcefAJY+gtgR5JR8S8rhyjtqjRn +m0HcMjQ8rHa+gyTaHqFCP5bTda6/KcoKeWgfAwsNSR5RwJOOQQbO+noqHzqQx+GX +D/3krEhS/kTUXFJLgjLHgSTSQ/Sen7RQRe0huTaRrtoHERd9g43JSO2fB6U9M+4E +jlotgEnUUvXBnJyEiiGkejKzwXxmsddzwi3EN/MMCGx5u08X2ds5YrJNORk8K3DS +0p8z7KQl7TZI5xq2tuZVHGZ4w54sJOL0A3eQHcDT/axiKs4640m8FB/ANVjJwVRo +8eYVsaKrUMtooRbvAno9dOusTLxd2QXuTJqxKKWNFR4NAgtjkXIDwqKPV0euOYWe +wPz8eSL9Pb3cI6UOXmBWs9Uj5wGX4kBdSV2E96FYdnnYFHkdkd0MPAvWjbILIGeS +m2dm8gJUc71lWEquDY9z8FP/es/jXRuX0QQDhSfQMv/DF3wfqGkVCALSmB+LDSON +KUys4gxGMZ9aQdkzM1oMmv2oMgVobJJB8rtmTvvwuUAlZTwV5JbGEacPV2pKVDkp +B8vkm6lP7Tbe0b5oDEInmYDAwUl0SF/53Ojdv0RDIZzGjN2aoLyT82janItbdgB9 +hbLU8v0DRSw2oKE7j9rYdPHoBXKYfuzbYMPHvs0MGqv/dXFWoqzpi6P27OlodBul +psYu0+ifIJpLisQ7nT8TF9Ozi3I//AAnu+63QrwNZpJ3sue11HEpLvUaPawcQgYb +kg6vywgddxA+fU87FAe6v8SuABogXatsxtYGOPP76rsv/wx7LUWCv0pQetNCrKjV +I7hmGnYI6V1CHZv8Y+PXegynBUW+XhuIZu722fipzdxRTjyZ7lWy35tQzndFvoYF +L24eDSR7koN8QM2f5CZVaE6ol1V8UQp7/KoS7P2/FUR1ZNJJHvTcf3z+XW8O10Kv +0HbNyxBHMYn533Cp3/okN8WQfTTmzBOoCDtyczc+vZ+StHCD16el6876xRQj2G3V +WlbjKoW29dJrzxCcQf+q8zRGDhyYFT+XanFG1lg9efTxL+y02pu8DHG9VpMagAcz +DuGVPoHl1OBbPcANVPy0rbZscE+3nqcvwFUJ/AZzjF1AM+ajQWdBd0NMW/emxDJV +INuVBGrlFhzUV0b/nNF7CDE9XDDu6/3bJv74Kki2NxtPAaeecxJIkkAYaLkUqxAf +SimFWpokTnfu6oVBLjTFvDCkXiZlPu4nXliqjdo9wbuG1LzZkPNz8hGoYJk+AbnH +hxHRZ82lB+Ys7V6FwIXdreR6JDS4P64Tchzitu9Nyz1P/cQuFChBPXmetkKH4fqG +3zyOEmOCBIc7V8bOaQm+upXMPc8/n5cZlsDFg1B3xpiQkZcdZc81E0vfHCNK3Ows +07RACZCIIM0MiCf/nZYFSl9lNKWm4xutGiJS9A3cuBfN7zfEw9/PikTIX8b8pLRe +od7wm5/aoNZ+vvzeJdSZIfZsA7X83bj67Cf1793Kaps01AYHcUpSoIGmyN4u+Aoo +WsFGKVp4TSqE3yfpQPYTfBj57HAWpAZJRXV34xPSxH/VaHPoPiahJ//5u49RmZmX +bl9FgnkBtbxbVId5ySZTR3nWM94+GG1dAOX1mb48xuSdyDsh68JBrueWIVz5Cx/s +Ko1PEsWQUJ6j/jqTKl0wp+J5tG0eUChq8y6D/zYJ2wtCQ6bb9ByFuI2O+aWz6yHi +FYmLwcojIDkBuTanMPMew58vq5PcZn3V3PkWCC2TeK38XQW2aTjt28APqbYbRkq2 +lwCPK2HlpHFm19feTS7q7ywjBzXnyb/DILrIk46Oi50HzxBN7XbLuGrn/RCun+vT +AGFRvox1x/0FKOY70YTc8jyms4549qGuKYDK+OflaT+RXbJzCD9ntW73sR5VXGik +dqhDwCTBF3fwVHZP4Z0bpwzJnlblIUF2beD5wXZ4Q18pPPN7k4SWh0HqJtU5B2Vv ++U8Vzl+McRlvDzUlVcWAPvJfFphJU2XzHHNKiHVCGaxMHgKQykj3J3lPFNkFs/oZ +tvKwx1WAGVXSwNO23X0bNI6t+E1WD8d6M+7FBHT3CLLbjqVgU8xa9EE+N+fVot45 +qnRhHImzEQ+fAnCdSAHtjhLJsP+24ZZYuUZnbzcC8lyAG5GluQIGQzgZTMDycvyp +qS+LoQOtHf6HXi/NxX+l/lthZtr2pf5IpgZykSkAGRsVIh62QCqAlOUfAvieQmx/ +0deC5Pumqmak0KgufkPO9PpKnEvWYGVrPq6mZPENWD6caRgs/z3T1+WerEwfUcIS +n9YYMN9Ca+Z4nEhGrWfsjRvHY7RTqMQlldqpjPVv+GrpDI/1YLX3MVGrjm7Dr0wV +c3LQ3Zq9KO9hUhbl4ns5Wd6Ea5frEtDX5JxmYTF93SL7w2rj0a3FKer8OshaGFUJ +7wd71R0e3YGmbjpvFxWMIcLKofrbQHTU3y/nrxg7+ijKcDoW9AKTv75o4dq899cA +iKdN9mkHTBNL1zirvtqyFy5Eu9bYGxOF3j4B1AdXflqRg8NiFsijOeoEY6ECFyBT ++Fi44xXGlmWkcxUXBY20x7GTheXgefTTj+dTG8jyFvb5zlWmQjdxQLGKB9oUU7q2 +bBlZMLmnR+JfR5L1gVNx2+fRI26ikmdfwwAZBCx/PhXth8mpTHqOvcKvfM71+SQM +u1LidDbHFOty7FE4UtBhBzetRQsZyt6OfC8dO9IczFSIF1zBU1uzblUSR42iDC6z +ZTxJvTUg8d1/tTuAoyCbv/DPwNHiDft36hvjkv4xV+R6yv4Y8G5Fk2AEUYwN0pxF +FqhQqsAz/y6Okj2IfMuagpgte/V46cKpd5I/AXeBJOTfVOu3B6QQoAGyb0YlsCWB +jzzmxivGXQNDxymVXhNhP4LTPG7L7iWE/k2Vv97Bgsc4fVvSm/NIUqtvOraujaOr +XJgQZSZ9NLi9HExtSUzsY9y9ettziBwsnK9UDJHHNzNK/k5esQfL4X4pZ1SJMvrm +jdzC7ZAuW5RL/JddRF374ClUB+vWla22hgpFHp3uOmmlaNUy/3lDqNwdTcYcagOH +CUJCaE6Rgrg30rGRQRGSmF6qUS1YvD8gCDLw85s0SgYazBo4ztUHTevqB6niQRkk +qOauj2MN9ceMr1ajcowOvPSVuUpqe1KB65BHZDF4bjZ/8Lvbgr1h5vgntK6F1UFb +Bh0fLrNPVdNB1IOZEBXOKnLMjsvO4VA1ewyQG2K5v4P8NpRIfw6Rig64w7edlCXk +8HzxZMpNz9MKFgGQbmze8mX905suIMZvsKBsp2uOQMwYpM0tRErdZKzvaP2vlJeC +HBmLaKdkn/wqD2GjgBax2YabhjVNg8fH4/0dfTQqd7WqPzlsIduVJqgax2Ymy9wf +0bsIbSAXrpea12nSSl1vqcjYu7HfvnP2Z4zbfQ6jhmwHNKytqWOX2fVVHhju+znM +84WT95e1FskYihC2eEgj7Fcni/wctWVn8mT5TMxQLKOYnKUUCwdshUG0U1tiV87q +xxNJnJ4TwJxCneMWBANgxzPf8fCxlUVW7/fyqVmeNdM+U3GAE0wLjgtOc5NFzlXC +rtPZ6gW6yNaf4TfTMry97cZnx/Bu0y7FUgj9CpQyMsWpf4ghzCInSAzJHhhcwj+n +imnMawfd8d/vBe+pKw/zkyzKNRNGtorsjos09A/LyO1py86HRnjxzwa8Qi/bajNM +ENs/wvTt1cdRD1ejmn0slbIWC2McngIAPeiMD7BbMHs9/u/YOn/GginsigAjLxTS +e3uuIkdRi/QagjfdCvPvei3pgLv9D3oBg65VGstUkgnQJDCvPi+r/4u4aUQOlhfQ +FbJhr7x8N9gCiL4dU4uM92Jfz5QdDC7CZPWPM1EtUurcPQ04z6Yp9oxBNfHSBqqt +nX2QTE1vb6j1ryteqysA0/Apbh5V3Zxg86HHTPCBNzzdFEuF3WOE/ZpI5VRwQSFC +BErIMLGER2YyF0wees36iPExPWDws9zznskR8l0pJpBICLG0k90UZipJL9FJgLnO +4Ko5IWa/IHk7xPB6xQq7tcP38XBVPMpeEPp0xkal6kNLomrTnDQ9VSsFpUceGCYv +7imNVcPDuT2nDs2AkFi5FgqDSNnMTEuMlqpUJpbtNp0erZhxC4NmNgDPISgDGgTu +OmHwV2OCmHRxiswgstJ4dqnmQXzj9xZ/ik8zsa88e89IKy/o1p/X0i+uaq/Ol6hY +oAy0OJJN7AD8/wsy03dn11EwfXSFFSusEDldwgUiUjlqId8TIbn78zFzJJAOjYow +61KV27ZSgIlqehbSbwYnK3bTG7NKRK1JQtvO46e/vfqV0NVJPILYaYmIH0qjyJkR +PhiRnFgtPnJjpVeaj7npDRTYmbBw6s4pCzBBcwRGJTPD+fL2OC928dQmIfFXiLxX +zfSfhwGWmq68/M2RjHUiLkbydBnyNT51zwHem9s7M12dlIzdVV1emOjzaGfzhRnf +FOGSoKiQ4zd5uPcYVpi3rrvK8jQkhndFMEQCUlllZbWuIJvG0KCJ0VzBUc9XDPhn +FSK6YL9tSfdzY4OvuAtNcI8XDTu4FXoWjf8ziAqogFlXRL3Mn1xzSBHuDpi3tIL+ +hdgjtShTXavHhRm/KjTCfSGqQ7/VlXtMqNu8wA4csyaj9MTCOII7lUJmF4njKIN8 +9Zl5zP5aQIKmuXri9ybqJsZl7dPGmMR/Hm3SUSlJCwjeE+o3/S4TZavgOSu+zMGh +Z0ShpQBAp+l4LpCdJST0WiBZ9KTvR/UEvR8sBlqTmvJEPuhp+f+nslmpnRU5tLBn +DhFEfR6Zurjq+r5v0nOM8P8X1KhIFS1TekM13FPc1XixiR7ZELjvbvixxrITUn+a +yCALz/YE9eeT2NojJfO3GVr7r+hhl/rzTkB0ff81GfZt6nsQeC+oTNjh/thbNF9m +7jn181+Tt+EtytCvd67ux0sRNUehLI4y9tJEmikrXj3Hzzbc/N9Ykx1hgsoEwC19 +foWFi//Moi4f+lqerK736XGc/59f136nM9PB41YHRU+PVspbY/2Y6I/N9HXiosfy +8yM2YPkuprcUu2Ezy3MKzXgcRI2DJiXVnH5K1W+xgVRPhoaBPu9L/Gb7DlAUoXKl +/TtxAoNbbFFa4+g73HA7srSeiLllBP2oWNBPvm+51MoVA8KdINzIeWPgEtrSFSo3 +WH8CgTCmB3830k3nR32K8Qz0ypKHkEUGSXsNvRqba78o2SO/N6ioIq5HNKuCQaVY +q4aUw5NcA/0+4ElHsEBT0BgB4uOup3ZaixGV6J6w8TdmD927jyDNYkHizRxKWEN5 +D4dJ7CD7aqlR9TWA0ZM8P9Wcx5+vcm79QWYfNppofG5DKBxZT4iypJs5W50Z+8UJ +VGUMxBxQlnxDKX2rtBOBcHiT+IVpAHRVcHQtTNKsXUo9shTpFFrgrLfyVqpiLkbX +5zXPzrsdp7lQN/tD3UEvjT2GW/wGpoIxd1JE4nt3BXbkR7GtvQdEQuwyUFCPd3gG +MYFb6MMYUVijt4v5WcXuFFjxgQCWrpMegcN2+9K+HAhMA16TpTDNtPv+RguUt+LB +bWui2ohDgiB2+fFud6u8d35PWBhWscz+RZFA8ZVBs72e5APqqeaovfF5ZD3e727J +fG/BdZ7VNF8a2o5kIXIivOZSHsp1fgal41omRyjRTPS2ejebj1cR/KQDcv7NpOU9 +uGGn6+jw6AOvM478mKBVavTRj51W5B/TJhc6EQpRxbZqn4PVmym8SoJqcdkrAJHq +K/VcC+3BAbi0f2Gg+SQu5tf1CTsvCIUJ69TsRTUfGfF2zxqqxt6jyVo5liPw+elh +EX4fGvZiIiP8QiCnH7YI5oxWTtUpz+P1NNYhHzQ3Ffk7tjxDAuEb0sEpkCuhxtVB +zWwc7/TDe4Ozkp99bz7QX6Q4Sc+TcBapalYfNauc1iVjEbzrWeQBe3XJhPZGC2+T +L7hd8IA1mCcYjLMXG2MtdykvlXcUhbUPyPw3rkTwKdDLlUz2liBD/1faK01GiO+3 +OMDj7dK6frYmQo5+0vLmTPAsemYI2N4mpTIpSRPm2sFuKz6f1BLfjZND3SNJJSUB +PTE+1H5fQPw/+0FVuf7nxY8BTTBh1Fq2VF+G/hiwI4B3uwo5Pg0waShVgyJ6PRaI +HBrAuyVV1MyHK2msIwzx/8rxVPuG7U6U3bEcsAByxmlgupejg8WyqegqA2XhS2Uo +gNxdDT4hMmRKAV3TNKEqhCtfaqPSH9pCnxm/ibPnW+llMVAmYYcTK1cuLEXbDyPz +LNARPktFbHsxeyaTGeY927IutGm+HPd780kmI0Nojjend7wLopuLx4qdiLrLyO1U +/Ius4i7dsf7BQtX43OAgjrtP8gdv4hzegU6m8GuTT7vRV7zJCcywVe5UdbD2EA+6 +9Ifa/IdV3XAFfA+YCSjEpIWwWEz90O30Ysmi4CB5bDC7oyzzN1GPbZy0dYGF4l9p +7pzwkM2D0UVqGF2RvCT9rLl39NBXBgJD9EN1R6FNUsunCos9BQ00feMH8I5T+I9W +teMHN+N/AUGd40OFT+hbc2HWQSzSktlruJhwqyhWjYoSnhO1zrBDySzDWWJKYeaW +kzXAQXuHUthGEkJhjAsLHLWsyLWmszA1vJ4fLgfgHlL1Rk1EX1U4/izb905iqYQE +yu5kHmTzYD8UxUoFdW4996O58cN6lfKkXyUiU4z6E7xPVwVHl4MPTLJItu4KYkRv +/bnvfTG8HYhCYmUtiJnbNpNQJTLgidVa4zdofKp8O3GPvbaousVnsmWxb7PyZlCN +/Z4SUXC/zp0ONS6H4AwggxP+ruwVDgDb2GY67b/P32R6m71pqrWC1+euqSQaDz6v +XKa+O2WCXXGhYr8FFZv7XDadturute3hawcbR4U5eqTmODIIkn66TUA2Z5GvUe+X +9DLMwwT+D9g0VX74NivDD3MK1AZbxFuKlZ7vMd9ZfQD3p0PKjnVN4M6E9MGDSifL +1lgkc9DTwYrUuqEHEjKqJDlCF+8iaJYhV5p2Lom8ag3fVaiqXCEPcZdS5dNseKHH +z+eVVtNH77nnSq+obWVNlc00ZcqhvI0L7Mv0maCkGispVNT6qS8EvT1z/HsWV2Z9 +QHTEDTz/gKZApGXG1MvmaysiWWJiL4Frtvi8gBH8BXodo2MtJHLOnf9fNGXosWJc +XLeanI9DeiLtwSuSAD+FOEvIrMgKbprT9W+KWam5i8X6hagUGoCxe1AH6PyPozQ8 +q8bbcvnq1v4fS4dbs92xhrt4CDzj7SCfboSAKFGuujfI7DDFSsAtKOHDya0OTYr8 +5NR95q7yyIDCkvu4ckwNT/qiXlodIBUddMP9wEcZI3mXBs9UMv8KLg86dOBvBjrg +fPizqZ3g+enWWTF/WXXSbT3AWdnClbRpgjZUHTzFY+RADbYjXDvE6kZIpdeGGWpC +P9aIs3A9avJQsByJGp2rQOLmBac39p4M5Z8PPIC9V/eZ7cnTG248/wersmsIELBW +/bC1LdbcokpEpRyl27QlyUU12usK1I8PXRIyosxVxMzIcgiOfk53MojcXsUe0xYF +giCqdg6nmsvUg80WLFIJqJ5HO4I+SeMe38LjZXtI03h4p56B8r0rvQWMPcuGc3E5 +AxYZehOfOkP2X074Z6xWGI/97NWKpNK6a8uKcR0sN8Wj3I1PVuySAZpWzTVdORVb +zsHxbiUcdX9yBecBbJZEnD5W9gNFMzsU+yngHyFh6XdQaE2WEPGqS5rmUJtDqas9 +V0DdIySMmKRWq+gf0/QSxvP5GMy5m/Hx0WgJR3eFOolNaXlcG7OgSR3K9Ao6Ok/w +dE8e8psT/x8hAfRwxVrtBiFcOrrbk21Hr0P7Yj+yJ58y+aVRBJC8MJ3fKifQPdj1 +qTaDMIaM5ypfMItRHJVdsHRHptB8jT6ewyiNBIlh2++vj/mp8VWSObrcWew4k11Z +SFJTcx1E57/TRXVj7LERyDpBDHYuQQyOpby46w6Y1ICOtOxpEmJ1ITFiGHdvJx/8 +BvdVMTeYxPP/JHvM4jeB+2u1DqGQYm6KCYjVzusJN4Xtdrh91KXI2AhBUW+ZNd6G +ea37ZGU6tFX8dBDOE/JRpJOT3sqSJkK2ZJtWBppj1vogHqs3CTf73Txz/yQBKk+x +WI4w1flvhh7BBl349Qe02NvnHgvH0xyUhjS7rN0godlI/CRPVdR1vLIQ3Ea5SYAE +6ZVR1HjIgY02DfGbgDg5LpVzbCdvNLV16g8FKePvZBC9TfCIQWmM/GRQFEGyNaX7 +QeE3ceBEmXp7HaQOyjdVsKRlqs0tFmQbALTqIFRn4mOXn+4/8vhQmJMfMHXkJCeF ++/kl6nnAZ+E3DayhCNh+7fDuvBcE+uJQqkxYD48mIG84jH9MQ1pYjRxRlf4SBSHS +TqzCrvzqcwQS2tQlkJ3jwfflF7bM3IMl0TTVlR7mcYYwv8L3WkBXV8+JTej7IZ+6 +4JuVf3Bh02rL0D19AHjw0t5VnrdlwIAXns+6Ok2SqCJPHOjKBobylbgap0dA9hrb +LMM2nZEmWUXsoYNd/AvIjRQjJwYgP3vd0zPfRBsSx/0XzU5yUDxyLVZIwQWkxwHz +xzBRyUSvvNNEec1e0YxwEMH8jiHK5DDD+HTPux/7ynHAcbPKz9Fo6pocNoLmHXKD +mhATsxTqaXuPj65Jz1Kz1IbrQYLIDMVrTacqpppSGkELi2Il9bXbrZUtrqtA/Qdh +GXnkwCF2hTg4HYfKTHuLvope0FrDfTdKao5Rq17iItBKKSB3yLbxRBH/DNH3o6c9 +jcLJSKOBRDdgVOaHloiFNSDCBP7IXNH/uVHydtMt2kcvjW3kSfRsp5gR8bjwCAb4 +PNKLCOAw4IpNgDL8gGTT+n6zgtbG/hRHq5WqyNhLzgcIEAeyzSiFMpki/hiCrmYL +WGg8RZhp++bKbrGbjaU2+pxnLgpJuexQ3ZY9LARPKuchQYt79yRdDdUAOANT0Diy +aYbuVIC3+qiUaGv9rD74+AG7Jt3aevd+QynbxaQEzJdb8+YYIhfQZD/79gm9Xo45 +Oqyzj3h/UutGwpOwbNB1s+lxWytaDjSMuMAlT0aioxOTvCPT/h0/KWFRoUB+iKem +ggKHQwSPj6BNw34S/VXo4gC8hXZQyjZftkT0LvDt0ZSyjdJf9in3/Pjyr2laSab1 +46SwgAEvWpy3ANnqvKYI8JY9pG4QInk+wpf/gJ02C8Qe+N3JbmyjrBPwxbbFkA+4 +yf5QZe9Ut64Sx0gfMgSJaKK6fDsWRALZ4Q+W6A9UG4WegC8jErU57gCJu970uBQU +8I+8Jl6jpWMkncPIrN7dmjPkxgHKbYa3UGURiqabQlq83YEQBoPDUGouf+qqL4ln +noHjduy0nXwAk77Go2uBewit9mucu/jK3XfmQkdNNtnY6tE+yErhcGZ7/rwjR2uq +m4IjR3XFiUCSVUnvCHLNuvOYSQkvqgqxa/1BtjJgB5huDjoWBO/h5kSVhxSkf+AM +8mNKplKY6feL1BgB2rxOcIuxjSomd/jI/Qub0Mr5AOP9lKHsIIUlgouYusurd/wN +2Sm3AQh2sNR14mGTpiWdTbkTfe8qXp6j/+DhggDnYDbJTITfFtsMQlEHE/dw1Gch +z+WBZX/OrXAvAMoaoUjAjUjhpYkrTCc4/fD/QXcqmmADANasq242fIQg+Vf+6Rzz +Lr4yyNIQ8suHMFCvJQ7ex36/0vi/uCmUAXAKli4o8nI73baHkIJSKJBkLa0LU6Gf +GZxkFJSsQzt823KHw5WcM9UhKBuz7Kg0fMLdbac0c2PP9bLxq3iPQR/B92uV5vEh +do9fv5/hcublLj6qEulVAc2Z3t2wUVSR4f+y+qZOr8gqmO/VazhczxIYHJSpUZEV +NxFnMTtTkgcSSKQVsUwcSqfyuSX5Qb8YqjztTxjy/kOSt7Nirvv1/QG8Mf7go0Be +EkuR7uq6vm0zI8Z8BRzE/mcz7rOvJ+XHVo86jYVaWy0Rt+G0U223qGIrxAH2W0lS +Drn5ybn9Gx1+vgdifgvExEqDvqymsFGPAGQQwfj3drhsRQC0qEBG0DVeaZD5a3If +1lw+tXMgauAVUtOCcxyHyqh7gqVHWV6rxb7v7GMFZAl/dHkwZAR+CPPg1uqpU3At +nDZsc/s1YI5alFL+JNBpLJzG2Xm6jOohZ2iFfkwwKsHKlty7EuaZ0NfFa2oMZ+sk +hK2njQW7HtAU3R8RgHZp9sgwKcEa+DOvOikySfnkEeQ38+rCzflKkAlaPYt4a/Ph +IZ6qEkgiB8hMdcdd1Tuhx8XcNxo/q9OyazOMY9l+C871TQit3edLPpk9/tPMdWhK +ID4abUkvQwytadq4TCC/jqMqqZgvTcd2y9LMchmHg0UZWZBXR9kE9NqKrJw9ENlK +dz9ee4bougX4tAXHEYwgeiKr5O36b7Hyz/aFRPJg/jkB8XNLatXTagkNZws3O4e4 +4u1lQZE1DQauhXPYHjoIazWiRqmNv69pV8XcMC4f5N4VqwhAk2O7dsjNtBC13cA0 +ZnFJuvntVfcNS4fqDPFRfral51yBR5Ic2tTm4KM3duqnZqx4YPw0jqi/m8ymUZ1y +PDCD2EMpGkVHczNLKA1VYw2wDzYijmvbNtxYfuerCQcoYYKJAnaUn12MYaTm/4cF +2bpaMdeV1lYvmvGcjXiI7Y2QJRtsbzsO8et+R16s83B4keVgLuBXmJG0nBU6Y3MB +Z1rtQrV66gp8fjrGj1lUpczyBva2u2wTbSm4vGOEkmteA71jwnueMADnfklqwo+g +FBjx9ieVE9QP9A6zoaJlhiVKJmjCpFNhmSqMTfM+LRJQtv3fVSCuQWkr8Qfv6iUd +lPtZywPUpgciF2X2khfzuncrcuB6RIa52KObuL371YYJL1e51aSJK/PMKxQEJaXT +P7cq61p2Kb9mlnZHMJsIujUT6efjAhv3VO+Ke4jfzcmPPNYs6fvUEAPtS1c4eGrq +ZogVL5ccL3ac+crDimLBZySrTGbSUilhKn8JADCmZDQlk+bH4jmKTRZwzumP8rMF +1IHZFE7Fa39oshIv3dmsnOaXfMuCRLEqSFNdsGgmu8xSr7HCyy4/wYwGTesWCIlm +LtBK+yJwVfLoz3UTZ2XlZxRkX1VVoxHsLX6SbSfY5CLR8Q1M4YwJB6NXeuIL9WnZ +zqgeofazwNpDcl59S5a6PLI2R6EB5I3nufNXqINExmM/zMdYPrLG02nUOzh2ljS6 +DI8onkvdPrfZbif4bQ2XP5mRnnAr4Y/YBzi/nakPDnklB5mm45c9XTjr3ALn73Gt +ImIKfIzlCW6JHKlpEXkod9shW0D0ejFfzkPv7tF8bf8qZbeEq92SQijqCEa14rA2 +hPUvC67lipmnYrgpvoqD4+xpLEcCTyUfcmULHVFU50V5OqlLi5VTwBojtg2J1sqo +fpnTFaDRG7W31hKiaNKsAILmwCajFb07X6v9iJld5s3Uz6m48nN53MroJYbqcqCA +vumYXvoMUqZsjtPZEnlrVGopEVX/bL5u8nZfkrdd/8jWTf6DxeGWgXgUoHcRD97H +8Khy1p2YnmqTNUe663Qngk+qr05qIT03C9Aj5yeUk+gUUM6tgLAazR11mU7k0+26 +Nw9feQCD9jQ7xowwQNuMI8W4TEPg5a9yLHGOtuLqGa4dBZoYx+SeDuow65LUkwbL +DyrxzPP1Jpc6TqfUIkZeg6pnCu2+GAMGGceeM086jpDWHmPixJ7vh4oUu4K15T++ +Pk1AiIUCI5evrWh4z3KPxbPYhV6tRmwU7CNS122BQDRBkI7TnahmS1UJiyy2WBYM +HPzT6PwpLs9LsIJA2+LHIyZTfMCURdjUL4pJBznUWGgsNNzGzcrEz/WwPN0N31Gp +m62rgh2l/rKuPR84NcvgJLfpIniFzb3HIE5EcIzykBHD3ARU7+X0qIaHI4vzZtq6 +/U23w7oYmstM93A/du99PYN0xKH7yF3gE5Imbat465OXIlMQLaRI6fqu9dWvWYG3 +C7ngMw0L+KOWBOgvqgAjKbpcwdTOXN5quNVUTXD7RZBguRYBoQoQZSLF8EGcPmOV +m+2K2kUUcKMVjzCWyRJWfU2XpRRU6Fn4e2gkdEeo/R1nhLoCOhWb8gmsbWAhZFnQ +NI6bGUM8oc/hes9nAvbt3JcL+Y6MErWgKNsDNZxI38D8L+MNo+efFsUfx9UoBozo +6w8Nin9gFLksJkagMfllWTs+BWJAgrtCIi4+JppRNfjE/Tm3oT4fcF0hENY1GA4E +RAvFRXUg7GX4s5O9OeElar2qeCcE6bEDFTQeXqPVWJ6SECp3Zpr1I9UIVTOigP2R +87quOb+upeRII/4Hj1ptW2fm6TGiCD8L1S1kaBVsT49a6e13BVGLBKPFo5GKRy9X +/+wQoB7rpoW4OOep11XG3jCEWKoW0w3zlh1u8i4KOxi+Jb9Lfy+dtI/0UekPlioq +K4C/AFRZGALngiDeFSKUy+Z11jbT8xrpzcEP+k3R1j5J7UFZxD83yPl/gL7x0VXl +RrkCMV8C8Lf73EV3XJ6VPyHaTxR0DA/no2IDS6JJ4Po/bwes6XxBKYV/vasrBL7G +IFJpT4czqFuPVkpSG2Q6DF8H8rPfjtgBz7UPq4PoOGmqQHi8z3gW6O4hZm0hJWP1 +HK3C0gt6+NsLRCgUlrM5PnKIarOvh+8aH7EttpCxZ4sll3fpWsrU+ZfX2puIO+ih +VIpCY/j0nI5o1atoJvKD7ue/BN+e2wnLirhWs0xjKkZy4PKuyX61jLzgKSMY11JE +daaDsdQZuGA3+h08QO5fh7oSGPFjPoLr0hr8OYSCF0v28XifyR8ZqQvlDYc0FXaj +AnHwGG0kUTc2bEORnUk59AUFs87bRcLPvSsFGQWp3Ru4t+wfhTqIPuOl3Xg3ERCQ +AIFzTYXmHKRIienEfBOHqYdO7/9igX1JSyVZCqPZHoTEshy/yzYRcvokUXqvuKH4 +V7mlBYX9Y602w3umOoG/0MlCTXcdo7dA/KGNXCra7vLPPa6BxTHAxw64/zkQusOd +s0Qnl1Y0RAWTLEOeTeG3/cTUwbJutWdGjB6G2OnFe2d0eBodIGJyO+p1qlGuOhYt +81mGnaWi7ALPBk+yR1W1M8oIfP4RlPn4N9o90fbjIIIbFbm9R1PALZd3lTHFsPBA +84+qUZe1K/japX+w5O9VHzPM+Y82/Cs4ehLGb/ew6I4fL2pi0rmhkXd4IAYtzTaL +DCZ0MjzgKZCRXHIotQ4B+mlZeuZ/3qoLyXxAWIcST0X3Btz765UTJutFWVy8o710 +deRNxr34HwKTAy65vS6/gCHMwPF0NTvsSLq7UDhaxMpXEoho3hGBtnLKLBlxlkYn +v1ch+Aays+IdkxKCDUydc5nb2mAeW8L4nnWdIZddFJNY/27LFvi4tO3BvdV6nPwv +qVX3t0zJ5Hrsf6qS41qxtcaqsEwZimi8p3b+gD5othyu7Qo7yfRWTlPr80Im1bJv +FmzgfZCMZ4phogjN4iqoRPfViPpwcqSojvlpUhd23wdDyeHDcFjxyMf/Ug8ztM+p +rEvt1/uZMq1uNFkJlRjm9P0HVpuDDsEZQDh6B28AbwCR8Hed7vGYOuc04IMITjsa +fKdRl+yHRm+rZcYdheEm7nA37FQam/8b/wA2h5q60EvX33LCa2XwhKrTpIhhyzF0 +EKk4EpdKXBDq96jc8/PtNv8Z3/1GYCGB9UM66ZKICrW2ax3QinwBrJt/oK2IsFpB +u5PQAqtolIOYTIgCqSd8d4waoJUuleTLfqdiJXhbuTycZdNWsu0UAEtkV4zfIXi8 +hJO17TGQo7N3rW9rgk5XslPS1IINHmlnCydKTFNO/fphDBy/46FPXjUjKu3Aj3Xz +4tYk3FCTYt/rqXvdpUfsBQXZZ0ttdeH2OlbOg2NAGMjrpWM34Oe9WTck/clcaArZ +wH09SgAlHpc19jx6j3rb11PE1Xs9wBNVx9nNTnCv9E/vdJoxA4T1HyLeN0iggnyY +zWBfU6MTHLG6HbVO45bSN7b+sTH6nuND1KBsFpBxTvfi/Lfus4u/8PlvGJVhLo5C +duvpXhuEqaUuFqXnvZYdlv3G8PO8lJl8InLG4Q7Ss93dDw6ZNKw0eDGtWqTMf96f +bk5OPicXIykNC9aq/ZyZorZNQBmZs3rpmoD93TeaNL0smHEjO+1+xFi8TrW6ZN0h +q8GLe6dzIyODJKbRgCC8jW77FsDo4vftWmhi/8j3LbQTGsTvAl1y43qgdvg7XpK4 +jlU/S+eLbwE3RhE53qX/+Zj7Bk9rTWkRPzjLcLNfXx3++eUA7FhkGCGXhLApguvh +QIJ74UK8wM9izqo0zQ5HQgQH6qRzPsi+anD/3ioFLujhYqdEudqti9KJnxhYz50r +0CJHhgskkFISVj2qxh+MSd5L9p+akoI1QLvB30ffpfshpyHCi18Eyq8uijaFhEoG +VmvZQWka1IgEwhtTV2Ma89CVAe8AWMAnv4M3FC1EHTRUnYzFD6WcJtSv7rBuCh9D +rVpJzY6Btovw1wpZgCZgw8vsPZEWDVkgsmviOTrU4XWDtzdLT43WczZfZthqD+AA +Ih+C+KtfDbCLhwK9DEGSKPCSB8q70yYAf+r5E51jzPh4Js11hrULqHl9dJHpYesX +sVO4ne1aKRGzleYO7rDtkUPihVl3Bw6Mc/OiukklzA5rI1qO5Ba1mxmoPG2rj1T7 +MnkNjb6GAchr+muTb1gkCfQ0irbOoo4vdIV0WFPc43TbDY0I/uF7pQvZAJXE5e38 +T2kTrjJNPJhfScMrkmKI2cvXP25/e/JwNLY7aJem0WrBLjSVw8ZK+Ondob7OufLm +OSIPIij3+aPz9vvHiQRvrobCKMw6M+tGN57fj3+m8tE0APQ2q+aZWHrYsb7B66k4 +5sAz0Myvgw93IOkR0Va++qHICJIt13wnmr/QmMtn2KniN5SNbHL/UPt97pptJ1OX +Bc3YTH5WqJkPYLyPMiUSjOhQX9WvZ1hQEGiGjBr69OWTNwRGkjB22xE08uVg5LID +D43oVThC1INHXzqFBGHM59bJEMmKGxiCWbDfUlMSDvXJPi4rwDmj2qog4VLpp/xT +13z9CXtvCy627Q9JZKU1htXwa/6HOQQK2LLd0wzP56NgGtFs7lFRDeNtW3hLli0S +7/kMtEg7v2V2UPEyVWIw+I38n5tnbQ0ik+gHzCSeyI5tNdT4vkHdYew7C+I1uSMn +ae3H8hdXDWigOWMi5qUA+t/YBbThEhLVKnihsPMuKUvs5wIzHeHAUwM3+YYes3m1 +HHox/IPp+mYmM1CGKdSnJaJeIYuQdjljDtWHestkdJu4BKeLr7yrmFMsefE4HL/q +hC5bSeUzyeycq4/J3Dt49bTYgkBtilzZx7YEMBNz7iwaiHBqXLtnnWrjHa6KdMMF +VLJwq/0mfPTNDawWrmO03Nd+7Ri7wJi7lcQ3U5E4XWTsfvadccq3xPtTIGIecS/t +d50GwzfJ6hLvz8YMqhAds6Jil2QqFET3XxAcag3UQ0GmcQs5URAFEM6gKJMv1BoQ +huG5BT28/9Y/EZiZwU9O8jARsUlyWvVvhmaTYkL45vaZolcQ43kgYpA7m/7fAVyx +a4HhS833yIJPkEjd2vCICLIO98gq3+dziwhad6UJptMgEyWc2A2P1Zl5H0BHziXR +dRVIM55BzDRLsy+aGN5ZoUKvO1jQLrb/UWmrx+62xrciyUTX0wihWtKRIWAmNv8F +ACbEj97jJ8tzWB7UK6mFpK4duUZDx/hP8CtVqgMHXtZZeCySEClaedZGshf0IGkL +nXcGuWkUw46mkh/Kr313Td8i5d1sGnnLW8cj6CNSL+pZwl9IB29Y4PX+5mfhH30I +mNY6A2PFC89YDariDIPicuQ8bsrgKQcL34QuEh7ZBaixVkXJsFekLcjLyifEe+1e +pW1t27m3TV5EG9CgNSGAT2cQUr2xo5lAKX+KGuSbQTUndcPUgc3jHkb4OMQlNijS +nVbOwQloBorXlRxWNzC0VLZzE/jDxo6MX2upqOHjAsCXDxeUzjupmLE1XfO81gnM +2E00iGtNHayr82AYKLZ7tIKrah4eu3reVYeYl1pKC59VffW/0rETwGz9qWbE0PxI +n9k72Dd3p2q+HIBXIMEBRYc40WlJA4S55p3pZwbSLjOKkk9NEB2kHnjeZO0gX2oN +nFuPEj8SPZoI7/E2w42ksCjS8lBhgjz8HjpCtkCxlpERQx9WcDcNTlS4Ze42G6jb +QonQAV4cR+kM6ezLOg5UNtyDmXamEiCybJcstCfYEepOUDS+gFZEuD70UF7l4Cah +sXZyFrbx/1eye7KnEsrt3oPLPLk0pkIOejz2Cc3A/5My1hh3VGnyUWFHgftbz5eX +R7zdlEUUMoUT/EY58UFDnlruuc7Cn55pYjaDz1KUSMgxFb2ikvsdTcRfN6K6WgQV +kn1CICxK3Kv9lsjOkgfvm5MZiaxMxcV1FooHGSWCvjI9tcSokngIQjg4DeEQGnMS +2qB+Hc08Uf5+60htbFkOfsByrWAuGUz7pgJpukH39Z2Qy1anGjSlsy5gBtimw4Nu +AiXVh2DmdTX/SThCLmWI5nUvQMR9QDW6K3EnPnUBKIQ0FnlTCtCHXEvL2AuRDQto +nrlCfbWnLudHxc+JL7Q0u3hwAePK+4cbzcuRZ7CF+pwec9SUnXgOcXqvKBgf7zSt +02tIxsntrLCgxQyQkGsNPvBQI6JuzdIc580lp8Jz5nfBayqTt0FPnWGqel9wUcif +dIjD41AUWYOc9rFiETbK1orMj+iscxnoW58ZxK9h4ul7g1TvIYs0srqBzr9vJFhe +OF4JK/rsmxhClbV1TP0uQGAT8QLYc+rJi90t9oskT/ee7TK768iybbyQmq6+/vzb +TgrRUDZq+ABnig6X4rWmKA9Hi84MIqbr3C839hS+NCwa4kmImfZxD7BKpamMX7E4 +KY5jUj6XUHj3koxZt0saZta8+lVNUGoaaXDucM3KrOBnVQT5cAokGbbIE7K9OoJg +9Ucc+bwsWoWud4m/CHCCuIUT55OWwybEUnY01y2KQkI75Pa70HjhhDGz63oeOdnr +E9QAnxY+m9Mvo5ckBBz8y7bye4Ece6s6D5NPpP6bIZE3y0D/yL6dejvdK1GDMoNE +tzInlX9bDw64u45gM8RPM8G9zGQpdpDe091TCtOjlG6BG4L6E/b2AHVUzYyQHM4F +8Ra/XZ8/5L5UAeawmnn/ExLAqYrcZUgQuTWbt2TftDSsgCEilEFFVWBTdbpGPsIi +zn1ybJiuBkcvq/XKDe/wWonU+0jZt8TKLZ8mIj8nzLliE9IpCfYiS6rDIh+sGXP7 +hC1C92027SdkhqxJZdSNgJOtIuvLmSFKVETi7qN8ksFhOaIhcdKCIn5IutImcWxg +4Z4BUzaGfbcldziPWefkUYgEru3UjTw+QlqoIlz+xa1lBxTojg7TZJ2U7Wk+ZZCo +am8JConKd1w9q23D9w6Qf2jDl1DCU63U5IG/SvfCNbJn1gjIDFLq8yJkn+DyjPaO +h/wGM1BIhGUEtkzRnUdSx7bWP+nKzlZSW38+Q2sw7adKe2QXDO3rI/XSKJm2sUjP +UdKCBMygpoknH0hZHlherbn+cnEHk/TrYOHr/gv/C1Oy9ILcxPvV2rTfX+shcnCM +07IHipy/rjQfC0JX6XLRnjfAUr6Tq3c7FuBH04LQq1eTV41s3QeoVJj+dJvvJWLX +lSX30W9qZYktoxkD9MH2rZQacs2TmcQAll6Sou2Ih5RT9R30co5WltwsdzOVZb3l +8xEeTt8Wma4xHOikG8K/YE3eAX+uMl9E6LQRXXEuWZzMLJEj1plfB4JirOQfj9HM +0n6bsGVoubMdtF5pXC1/Gsrd1VTdDl+iAISbUdv/UQXfOCW3en2bvDgEqz39GngC +oXmMZzb8t183leDzg+Bws27Ex0duWUH52FjXmri0ouQ26qNdMOur77DlJzLu3v5L +cgNJnI746gPbBVIMfkSogQFolfT2Z2CQ9x7p2M1FfIhP/OWNodrK4pPtHCJuEQ36 +90XtUrKaQ6saBqlBsMpSqSGUeH0uRyE31efdSdPNw8svST1zOwaPwm9g8kipXUJZ +YYLUWJYGpXJMRp/916L5LqUWfNrRC7XwhgH4cTnMk725dqkmWRj5/pxUsHE7ySKf +pqHUwFV2ibiw+9c0/WIZRaTbXecMCy2hs9ainlbcJ+2sWHUFXuUGEmZ5vyPezLx5 +QMiDxj3jQWx2PcArRE5A9VDp6AxUOFRo9XbZsVROJ5pMtcWnCxpPb8xpNp9OV0oi +OBzAyEGNKmZnTdEdwxLCwo42HSq8YOEPWk2jZ9zJB3f5T+UhXtLiPv7lKtVPL10j +y+JNh2yE4oreb7IAqV/VSS+i7j10xnCbSksj8McoG2NTV5zbXlAJghJlIeFycFTy +LR+Vb2qp7F/kYj+5gBhvT8NfGd5VIYnbY4V6OhRAEhFOvwuRyG57O7iiJpZTB8Rg +Vfe3iPt7FbMIGsMSKrbmqTGEiu9VY4gENhIDDYfysREgvdosX0eniHrOKs/f7kOV +/mquXR6nhBewHF9HcLtM2Ra0gHvAwFRCZcimmc5a4r9I9V9PVu0vT+nLCMu30KTj +nqe9myr8n1nOnxcvBnvcBjzKtQ4Fva5AATNp2Zsu3Z+cqgs2vu8ChOsij0USq1Cf +iBJPcXcoNoZlY6V9XJNv1UfB47OTHZ3C4SxfsTdMR/of8jLYhepB3v9+9h/vmGLm +BbFSQW6yakmPAUv85FKCvVnofDFYuI6EcKI0JMDORGQx8/OqLDts+sp3ZEfE1VRh +Un5DbJF+w6u9CCLa1tSxeMeOCgZspY84h0bdlTZbtZOx1ZtyRcI1UHzBvSlwGhH+ ++DSYrdc7x7YZJKny9Q5XUeLeIUWwbgiN1EMI7T2Tls5UIHAiehiOi8V2drfWZezT +E6QiR9IiQjfw/Gl9NM84lS/VfGZdalZGMBKFvkWCJq7eSkHekioHqlJLS2p5OwiX +7fhjs3Ug6KzoJ2r0N2E7kdLbIay0l8ORz4s9nysUgPQdAgLgSsgcH7gSjTXrkvKV +23MLkmbNbbIhAscYHawhlJwcRkWfaKGe7gfAkAz5cLOIQ7xrH1r2n0RaTjB4dzxB +NDKLlLFK/RVZeDyUBWZTFBqTzdoUXx9cV4Pqal6etnSXyd6WBRzkln98hZ3rhq+t +GCLKPxBhCkVuda45SMQ1lW559/LyM8LJI8BGqviXKRq3KGJYrQzrdtT93CR1UZ0P +r7cF0CtgJlGk9gITuDb64ZSCflvnxEE7z8kWbyAjr4Y/89J7L1YLcBcbqs4NSm3P ++a13oKptug++uxRtgpPH2UdyXVThU/UATqXkW3Ff0WjtvStTEcRGHxKJ+MWsiE82 +cX7/kg7XHZjoAhONznOSPrs2ENoZotjCZg5pwb4Xox2ywXjOua+NpPZq5eZG62v1 +bNPdDaCdeWQ6raR29qBJLaZQud718vTD1ycrTpLFvs+mvzvOLg7rg9dSBLcf7zzk +EkP5vjY/IVlymZGwLmUV6B0zkskyiJ/0A+IJoWAlhEwZ4Gtj1cYtnTuxvbJQDcbO +MYZBSZUwiAR/A41f/BXYDQBGTdYVEDXfR4zbX/A4T9HFKPzC9hfdkNlmoDxekZ6a +8ldgweaxftbVEOlyvvQ7hgl+zJBxEQWyFBOVsVZQ0ZMM0cK4AMpzN8fb+qvUbIrz +6UaSwV4AgfUPGZXHZ+n0dXbxYg9WsO9DTdLf2SdUWYW8/oe+GFDC31O+aOxFEETu +oVZGdKm+JlyQRAMLX9oG4Fvf5XWXsJJA9Ghx3uWJQubQF+cRVCTlr0xPl6/nL4XR +vdK60iRIp1cxv8NqgzBvKVBYMYLaZughcCVT9Dm44pYFk2bK8Ji72xCc9q7cCgBx +6WtyD9NeO5rg+4GfqeiXC8KpyMmkZB0hKJIVm/aqFPW/n+Vs56Lgl3VWD85tnk6o +k0uqjPyO+LnyNDa9MHTrkts5crFN0/4d+8Zxed8TwNR4Gr+bvjhEHcRoNasKCj8w +gts3PYpCdp5jdXNj79n2ie20hjwk3wa9hUW9+mC57JnKHUpu/VQgTZliu871YX33 +IPVzE+rQp7ktvMSGaxPF5h6KZ3w2eIdR7p6V3D8sx/7+B9x7YFlD/3pQOnBaaFGk +M5fs+M7yXbq386UmQ1ktdWoHeOP1TAisgjXd5tou1AvPo/EVqnrq0hDJhj7DxOAF +eRNXx25YOEedCKu5djDlpWUH8GRjfZ620J2v/OAZ5zCxjiSqZK76g2gt5skyvQ5Y +UenP58rb3g/KWplggkZCUbOZkQHt4lWyL7nm4Q+b/vGSFlRBHnNYhA9XQHuwKgYI +avfvmGSeWEE0TxHsDCzxxd6vnt8xljrUxndKaDDsu0X5XnYGUObr7tpqZjN78OOk +juGEBzsBk4gnJWX8oZ2qNb8vkIEt251kDN1cON3YzYE0q1SQUmQh6bf8aiste3hR +MAcCJswGtnUtUFNhXbPi/uk1wc3BKg2YTDYCON0amdkJayhDEzqzIIsxUARh5BPh +um44iF3aLdKAdblpiLZVV4C1t82OnEoMO0JF+2hzLdiJLkZYi2sbozdJBeT8d+EL +O28Vwekfw8Z4avg/TzCosliApAEOHUICJISCBtovdKyDM15hyI9jtLjr6AKIVl83 +LdKHOQok3DKG01cAJoKE/0PwDMscXEPocIwPo8M6ASxcv0HWJrcwQM/ss0kK9Ise +FfQxDEouwqsOBUsAPlmCYHXdCrA9ggP5XIY0ny729PI4D8r9D1ZGmCXyN8zPjUQn +kypXCW8SgozzkCsITWxZzsXqKMUfLYLvCAs6iOA/MD2ucar/Gd7sNFu7kgILEEEd +RYP1azeHX2Yv3owlmAcbZ2XkUdBir1AaSYoMP3+Np1bec83Nfvn3t+hO8yemzvE5 +oyCCgQvu1STBBHLoxYWg1Ut6vPkVPi/HQFEldKI/5UaLuBvQB3ZkkVithnOdq8Km +dKghiCc2J/vh+pOaMpkafqcaMJAVzt7cnLIiUHkk9B4mYP119RKVrqZd/ZncxH/K +a52n9zOpl2NJgucCSVgJE5V72gsAETmdojAPl+i2Mxrw4E/JiwoETmu1ynX8n0Ve +3C5vJ4YT7S3JyHh2VrOfHSRfahLpXTZXs7NmNiCrRJksICJS605dILGArYkHdx/f +XC7RTrnrVth0cq6EhG8yHMoVZsLsR8WO+46x0Vx/sZ/1IqFWXnuTpJcAOhFu1/X1 +0p+odMcx+/rKmusc5nILHMZmIIV5bdCc2ipzcvYT7YCsFcyNvhJTufni7tGSAbqG +ePr2PbXzMNuDTyZ4P160rbS9Lv7ZHeTI8vkq35jWZPK3S/bgkreG7uzUeTj6VtR6 +c+tvsGO2Tggf9WSNv4lN810FH1Er9Im/TXI817/IHV5IGkS1jWgcYw1FruwRw7mP +en4epkcAAYMNHdFVNEz8DhV2HAK5V6Ls4fJEzZGjQNR17PdnXc+YEishcafXo3A/ +U9ZntxdF0cvhU5g8mMDZ1S10FBEz7jmPvOHcUKEjfAJ9YfWCLUYGEHk/MjjmY0mE +iKQ8q+/QXQ9i87r3byex5b/+ZZJpZ930MQVmYDpLDPvfpvE7hg7V7990nngLn331 +XvOqo4ybD/dRmkL/zjGkpgjr6P4P2WvuIHALBYnoZbgw7z/kTz6qb/aF7iMuko2p +1GDB2lcmOY2RjmNelAIHqJo7+vYWct0w1u6QRLWm92MUbHBsmyLLqg4iwxRMzdt9 +6rtz11ShbxOm7S1X2yJLHMxRLHfmowQtX8hiCASRoLrWoTnMnguVt/w5xey8cKpV +frX666xeyDHzxBhPR6eXt1YDmApMrFTeCCyyZwnKLAdXDZMs2A8gUWTY3rmaG5Sx +mBy4P7pC55mDIa/eVuhUmEeMbaRSJgtepnk6dwI2uqznjMjRl/K6M0Rgel1a/j2t +k1otEvjYU3J9KUtyAsaP+oiT4b3NxXkTGSRlqLsGXdZFyZhGTFY0htMpIIrMuW31 +anRtSwLEqsAaO6cmNhnv1nnAVPx20miVZ56CDPZtqZgAg9oGh0Uj9jzixfsaWize +lbKnGzsA5Pr3nCYBuyAGWQ1ihLFm4okIeTEU1SgO5Q6TImwIwkn+RCQMIGdkSwgC +uJDeBYwFqN5lWOkwu1KuRQdtjLy2v5LIjSXC7YK2aWNTltaASNzrA/VuPMRxpNHu +dcdpJXG3RLscNU/5I+Bv27wI4CKcHeTjFLMxD7LgUVA8uadJ9zErnXnTSA19BwBA +X22L9dBUCNni5EaVB0uMF1apc5Ono0j7tzbgLwukxBoRzArbFb39thYq9bHZIRpd +/CKRE2I5+3clv8ODe8ySG5o4d04SjQENOJqWKYiNHlz+oDWqs+ULt4UQ+i8UfcHn +pXkEAUzWV03ByND+vE0eeug9XMJpI2pjMdSPTLNir8EX0KtdLAGbOi+++y0Gpvdc +99X/a26c/d+USxe1MKtINavqhzP6/RvIWxb9WNEsu+IFTOvZFwdD5r/smvuYztIB +yOhEjPRjvPq+mZYsuc71BybTobhWOEi0bWKFC1E1Lwhop39FzHbEWdxGXyyl5wtX +J/4Ef9eki//p8PK54O36RHb9Y3x3VEsCmhIyAdr9weaAlBrpof4cP3oZJZI4Fey3 +JgHV1sPfzEY8SiPon0Ctw0Du5+JSJOLiQiV6YI12With42onKLY0XdJ4L6C1xhQv +LHnEgEHr95z7EJ54petWt8ecFHGDmR4bAKZKZbjYoUNjEkC3P2xkK4wAfVXAUesq +D5OgFnsR+QDbSeFwCp7QCgTwMWynQyo7A/arCzJMqGT0qbBZTYQ81SSLxIVOAJbF +Nf/RD0cJ9E2aHiGfpoJmJwhXHa9huhY/OfRojQSo1kjULZaOwFcQA7Lh4ph1BzD/ +Icfk0FfqSHvfGBRdaqHBMJeLdf1FEqoA/U8t7doARIYQbU8sMg05QLRp2RjgyBQO ++K2eZR+m450s3TGG+ZstfM5xBQVA5vFRHaHwhIP/nGawqfbNJ+FdxjLKzF9XUqLC +1FGZZiZKS9VUDOEtnnxAddWCACSirfNPp3YrufBYkSoXVY+ggI4y51fEuaLUL7Sd +kovkCj0USwNBlbAEycnEIw800pAzkHoi4z2nReGF5RPP/9NCqeRxNrmuWmTODdbo +Ei7H2XOCbCWKOZq8AmX7UU+Pwrrp8nL+rSsv27MB7RRwZ45Pctma44QkAPJViDY5 +bK3ogKPgA+gfNJvDWK9J2JrUW5jqCLaJDojAzhQdsha6NtDI7cgxKQpdZe+EW9Hk +noAUSKVVzPazM0EQWwSLKN8k7nKz88YDdwDU7A+1+mlLskvx9AKrE0Xm0HqPHy9h +MYNJOby7UXAqdIivJzFajyX1ndO2YB1zfaNtbEmmwquhe4OnLFOa6iF6vmh7TFuX +7XWASSrWiqmLz8NBPrOJEArzBzNun0aIxIACYZYK0pxn9eg7Oh9UHHBtypIfAd8M +UzMegyWtNl4NbohLDKIg+68ckcB6VSCMHkGMOJ+EuFQcL5ZSBzCidVFI187o1cHi +SfImv2UGyy2ODUGYVXNrYlPsgJ8cjG6AVFJJUwxrRETx1O4VYWQPqzRiVmomhhrO +SoTHRFAvUFbVLlaNQ0pmd0MgySVhkYL0ptgLMWRwvy5Gy/LQUAzabfPUd93Sm+3H +cso6cDNDFnRKiM2xCnwIg/La7R0MnehymWd5vQIM5s7kQp2CSjNa0mf0ou6kdPld +BIsp6yxNOZ7KrTncHz9Eb8Zkef3PiTnjmuTCGPVjJ6I3PSjaPH/VNvtUu28BqUsg +zheDzBgOTOgJ9ISsouuqC3yBq869a4iaHE4DnkdHQ186994QygITmSTcaKfl0CUX +5iBzGL/Vdxrnl8EG3pIXCdInSboutB+u1juHG/cbns5K55RFUHQtlkUmh9Nnu8o2 +UAIlA/rX4nM+3TUUYvlGoAagRJqugcuKvMk18GKR37bNGO1Ikdt7+eZcVS+1xGRF +IQyvMroLnFdU1tYsMddaLRXk4jvZE8W8lmMgq6TzYkJJzKpCg2A1rbGaA2HsNwG+ +Yq+PWUXVr+4J/p9IjhCsU8h85XR0htEc1Ky8svbYawsaiWwjWVaW8EZ7wF/Gqq41 +5dgbbxJmLnnxb4lUM4kcf7fmTuMb6NJqYF/B4pVCIjXyh5SVVRFbNneac2EfTBth +g7R58c5KVzN2N/dfqBzz4xQcfX9vt5FiItVY1Ukf+mzKkTNuts7A4Aunp0vKxm7n +2xHcYqv+r+srq+aRIf/wmClp6pagucUzzcYggBFYtfQIjiWIZ2FCh5EY8a12pC0o +9RbDXtco9PZqeSlTKjGe2yJtes5RR0ykr5Mpqs5xov5z1+GvQ1IvPMsUnqKK2h4H +3q0T2DJz4xEBEMVPKesz3jvS2VL6I3sGObGqH/NfSXUR4TIkuvEq/on+30oLV1qp +6/1qFsayEkn32VXgK1uTvt3t0qsHPbiaT2UnF+ndoyi4s9w7pwTDbMNq5wPFkxWi +doi4eDAaXBN0WSyRRyV+ZqqBEAJzrGWHsvrHQPVZoI+EDn5lbPc8XZ90WXoWcmkc +Zbz5qJtsRBwSek/JOx+vVlYxiY+lnF9egWfAqafPJNdFvilcRnqpAgwS/C7GWC/D +YADRI42g28Xq9ONaA82fkdtAfMQoLsRkb7O5KFcV/Jd5+r4JhQ+mN49m4oo6Y+cN +W0PHT7G3yjDPkASU2zHlQb2502wRxiSl75K3ma7QaCn1ZgT+znVLae6Ic5eAS19d +H0I0rdjKqyKEsQWrFWO/Thy/5yJfXT82kYmmNzM6shkKvv0IcYrEIJWJfGctq5+D +FNBowxmQAPGGmauMT3MsdKr9u0iBCAmaPszN6f5Xe32wtdDAFaPog1CJUw7a9T/Q +XZCwZheeOaxSBhlOoTqttyKFOltUOvneAUezWd+iSnYF0HN/qY+KGLH7JAVu6HcS +daGgiKtg4529spXWxlTaN+erMNzAaXeoHG6QYnYZtsc8CqMYFJeSS7lZCSb81vV+ +COeB59PzygaWLIRvb144gsnjY8g67vTN/sw2hs+0DfICNSulGzq7S5gJiDokvClX +zReFiV9LFTu20BSoyQVOCZyPYhM/MgewgTBkfMqwWXkbygQWMCd8w98XTbeZYZM+ +6fv836WNE4niKNdLFtNKKOd2iJtvxa6a/mIDkdXQrWo6G/kvOAEFlG2ASB/5uI2w +P2DtJWKL63q5UWGZmjO1UZbXGPEbcyW8l+bDt4W3d3fr4O54Y++pPPpTmtijpJRh +FMJcqa+EKUggYNg8JIk4TgFcRZEtGwSOzE1NFhnOj3qZXEiN0tJlMaQwoHcFjYyj +goo+hlGwNWv0qFGogelFzTyHcnVbe3DBp58KhKtkA6RiQirikR2QsnsOI467L2AD +zgpUFO+xwveq7y9L4+56vBejP7KASUWp+Yqqhmqim9lsZWe8J/jrNHgRv4pdiCkm +z5IpMqGRRgVfdjYocYBolJ3T3VBdebj/uisS1op9D3zjZutOEPEjrf5ch3EKOWY2 +SSwokByGqD5ER5gRGJ5noy7At4iNLyWUfEcsZwy9OiSSVWvdESSoqwLaYLHPtmbZ +3Ixq2b2mCLnWFFEHlHJSbouvZ/XSAkP51U8wEpu3Yd8SVY0vZZys6tP9B2yO4qvu +8bEvLOxGlgCelOCNVa/XKXucQkzNK4fsUng4fNhG6hqk2H1RaEYE3LF1SumI+nwz +J94hxi6bGORo8eT7l/1gldSUs61n86O8y2Ha9QG/TgJvB6am1Teovag1ORJfcqi/ +Gn2XijYaqMeRUzn+h4ijIxlBYYbdHararSVAUYEDQcw3hzUqQbSY9Zp2aaVseGUf +T5ULjE1XAinD61fJZ4hXUZuOuDQkaYUEGCpBQuQAkP9Ohhg6OwNcQHTIUZpZlmJV +EMtQ/JpQnRzJbQf9hXyyKrGf/uEhkomnH7aFSAGuWd4M2k5jUgGDOrPv5Ws9o+1J +YBiQ5mij47lDGP5nOixER9GKvLA4R4qXwMWuLISYiV7PjG0UlJwyePvq1aoGKBJz +FYJAVCvbM1AtnaIjVutfdgPA1ru41Ezq86SBtBEWknlKcvDmHUnqCTnwoMYVcKU9 +u0g63QqbvgXpdSbCtFJVR8xV5aismOsJy6fv8sGgeela3IeSik4GA3f0Q/9xBZrR +623tdMLNhEeOxpKnDeymBBv3VILHmPwpUJp2Ou98Bqx/l0dOLlQ19H7ArJL8X7pR +I+gNXKlJKPUnYx+R5rOvsCi6bHiSkhMPqMMus8Q0FwurS2ExvzJwLKviH1Rvx/v6 +Sgjs6FGrEfT9M2rukB9T2PbKf00bUvjy1IpTd2FZQSj1X26THO19xGWH7nYxPaL1 +86GyLP4BdF+f9VMzUYFR1kBlopl240fBC9tLRIc06npqL1tHuHLMs4gblJCsqY+7 +i5VDREqqFbY0607FBE5oX72+QmeFjMCj/CffCZgxxIRuqLIcpMKy72GxU74PQ76c +TXNcN4K1v2L42c2H7YmdF92Re6Or2FZTK2vb1bn4UQ/g09NFCUsLUII2uWlmkfh+ +Kq4sVjoJca6m28183d7AAv8Um2Vwiw7XSr7EvGebIP0I9trzcHFkBojr0oekx2o/ +ni4HB/EvBrq2vEnH7S0DhLTx25R/fw7leYMchtXxPZKtLa2lwTTwJRmqWdPZ/pz1 +7WK6p01LyQR7ilQtGkHedx7QNXF3n4U5suWPXAM9CC1ll4wi/ndHLWdD1PbTGRwf +M31FXQO/mfdsiCU94pfY3VB9iAlylo8gM0ITpVXFo43YZRdGTVTLutWEFnutUerc +SD0GSdCfGmiA3xRWluThCihRC5PXr2TkglgL6yHV5ukX6zUZLSwimOVpp/UWBnB5 +mnkCIR/YI6eIvdHlSzK/YEAAGSgaauRmkRKitDMwZWn0NTJx8l0fMb3PrXjBu+Kr +rTRiaMe6GNZwEzc8F9JdFNBom+wdgj1WNRElyEutqfnwbN+ny8zpu8Urqo2/871I +922LQ6/rqfx7f1BrEL2H1MNoFYI0OPcF6g+L8Xr/y5EXIp/XIrGrDFwyUw7O/wCI +8PU5EXxSPN46VdRhSCWE2fMfqunq0n3MdnSInwjD2Ry37BgXP9rluyP5J2ZdzxFv +/0l+HKJsrgy4KzfXSfC+Qokrd/HyVtju0bKIpilDXyGd2G+YNuzyxDwZttNnqUCz +ALDOEXmPGn/QUHsqFWlU4YMK1ZpEaQndU/8hMFrRiGziQu3raSnXIqjxlNSdd6OY +Vg3NXiT0a7j2jPw2kePFnKbcODMbQBdLTHEevAkI49i+zCsFAl5HDLJg9EUQLP+S +CkMyKm5GqO78NxIgUHUvONUr+G6E2CMwgzXVbS4xVuqZGighPICVx6zmn3SuTcTP +MfDf355yvDN9LUd6WqSOZ7uRhZSGmTYiHmZg4Hy0PuYL70v/Q0tzGRRh7EAGADhh +SuebNkdXzQrrpN8fOLH/ygZztfMIluPI5yFRL4TQJi6mdcG9yERHf2NMrgKetmhY +sy+i8O7dcMNhHlj12ZLEdAyJPbhiiGc/m1RW7VL+ulh1P+8MEaIB4GY0h9sLGNLL +ZD/TmE6jcHtjvCV9LFpOcAQJeaDxs6HkPLE7hFlTa61xG4QwXJemdTTqtPG08iwK +rlUMqvK023+v+PfdIu6ZEYFO7cGSabVA8kOMS1hpYWL3Ovx/NKEDrOQlZoQR+ykE +J4wMQA29y3rUmO8kStpAKRGovdOjTt7L9rROrKN5nLiYOZtgrxAK1j18vvVqBuJX +b0E4qJX/5WW9NdE5l3Y7Ll9UYwo8rJ0cY7KghIj+/GKq/8njgqBl9RbfuGkfY60a +ICbykxO3LZRlpem5rmbkPdtMz5lgsrAddnMGryI5KaW4VzKEh6T3BIBQHEuhLjQR +N2rdq7kH3BdsVWQjcgu9ZdTfknkKsH338iLL2K290f406WPQRoEE+dX2yqpZlcIY +pluzlq0AyHtCBPBbJpnpSdZG1g6acN2Kfz6OEBhGoPIZeKsOfBG9VPogrgGSQrKI +xdjJeC6vbL7QbGrxyNYy7Re1pN9RDRnXcSI0vt9gsIE8AoyGYwePP/XHsSlEC1of +1TSARlyg2i6MmPQoQUwYsKz0Yo3zWdTnVLkgix79eCkfnjFsXTESKhOx8tF2tbi0 +2ys94gKQWaO04e6M9BfRhyJAgO6gBYeR0r7oZjTSvBRw6mtcc7QFhezVcItxAVzx +cUqOUYWCj8+u6D542nFxU3nrcoxng3xLqswJniPCn0TGjLKX0NtKaKrgEReb+M0w +6AGGrwcc6QSN+wN9USRh3stgxo0sEVwp3R+9Pa6cvumRMytOkHsQQm2m51T4ON3X +PA11RTW671hPiID7VZo5eHd2fzR4LJ1T8LvMMvRmPIwVjbZO879ezNEWGrf9eFZu +kRr/odJN41pHoUyaNvnc0Y6t86MbJMzX5uQqe2FPxlMS1T7BnXS22Es4RfzHoX2t +5ei3MMIorA3woKuPZBnSOXZWQYTnpfqqtDI87RQaRT6DSlfBpKZD/LeBJpMKBGvl +QbQifM3RY5xfRqMfq0B3tTQ5c0wjgWtAsoPxQweaBs+0tk3n+8KtwTEEDlhhsjo4 +f9InPwjr4ikyiOduOuxEk/R27fvm5A4SR4slBfBvyzbwiOoIImI/lsZ7y5JcQIzs +DnBK9T1640ntE/EQ8vDoJLjPtQAaEs6eu8BHIuaIYqKEL9r10Fwu1ZI5+R1H1hvS +PBfUhR1ukaHAbw+bohom82FoGeBdEUJRp3KsZzdIZsd3BtNGNrovWKyfpw8yMmky +W6h8IEuLBQfBH40u14yMU5gy9eLvz89PyvPn8AC7Q562z1t2NXjMGFgAfDi4CbE0 +1Kh2eoELZpwzVjaXbtsQaefA/dACLsU8ysfqCWTHk63fhr7HA6s9yy/9xu1MT25Y +K9bXnXNTBWWxcY/9eJC9MbhynXK3pEFQyLYX1WGQtb4i2sAfM2FZ3BHvIFSkT7SL +xQnbtQG6jTrEaIcbG371wrCMYtrT49EoiLYqZCM4JxiPi+CLveoJTs7QO7EbIRvA +72Dba6BrWRyPdYU2zeFdwYHLVRO3HAENrZkfVdz2+dq/qs8JXlIUkPe8xXyCmI26 +JzvcSDUm1L4xpX8KhLiuSEJY6BJrr6uP1VCBlKQJX7jquChavo818RKJKQbDz2yV +IdmFYjf7OVLwtitSpDzbIwxRGTiyfspADMvH6lpJH0wkuIfnOrEarWbJwAw2py9t +QMpiEG9xtcSvCJgClL9Lv8ByHObnoJbzN+adhQSjBA4E7c4bGFizp9vJKgDtdO7i +dnu3kg0vazSQN0B1dKQWD4OFAAsXKZslDBwZPWr7kXuvHGb8VQdFLNmqCBWL1a+W +d2WReyqq0aVs4PVExl6bN5u+RgO7F5Y9s1LTUFCOn9gG6My1za3CJUe3vPlTJaf0 +BwR/THwM3uBpkMkI1OoPsZSgZholJ/gC/o5vQljEbEHt1PRaliaAhFEEOwbX9AHx +Mr1ihKmz3f7k5Ycgu5G0HcN1loyVasdwYKqQZPIDW4kDKg2NzxCuotXfVGFL6mvY +wJaUlOUIIwcokKD9G4YzFb5ELZoDDSiUEZbiicV6SsZJPF3WroAjWK9+npMzv84h +dQFbR/hBgmHLcWgSa56TK4kOM2g9b6ZkXHSB5vAZVQJhz496yW2UEGfNaT7noTXX +JgT9yXptLIpIR0BXEKv1/egOdIP6/ezLXOk92mg2R+Q9/qPv09eq53mL6bt1yqnR +Dx298GK/KxhMbqyQzMrusEiTlBxyAtCzUqM0R/i5BIenBzwYKfEDWTzDiGeKYILB +liC2gZ1wMw+ISGE5OcStsIN2XsnBHzVGUhZvJc5Rp+d6LeBL/WIM2NnDd/GbrtNn +7WGoUeMQ41y/e+Im/R7FcYzghuvUM5rCxeKdgbgWr/tMR0ZXU0tj3Phg2JhmojaQ +vu1U0szqAfFuxHwzhIHJw84J19rTubyS119Azd0+QGrUGhx78Cyp3sC4qGNPgSnK +V7/awoGX8SJw2YXcfhIO2AAMNXDb20S/WspecgIx0rSW8/gUSvg3JLrtGSx6E/85 +DsvsYKst8uEBVtIy81S5KLgDPDcCaewCVQqs45N98jmgI+PEBGEkOt4xyWzxp6By +FWhk05GLGuYQgY3bd23sAZVhSTFlYQG224oIarT9xp7rtUpYwMeT3QTfHXN3aEUc +aahgnuWcOPsCYftCoeq34OmI7PjmGgCY/i0GLOTjxBccJooEThH3/jeoHp0Xf0E9 +eo4QzT3Kgp1tNhDVVGloH5wdYFOOlXROiJ00CQK6T9I5+HJLBcFQ6TxM01fQVuK/ +hN2BfbwPhJnoLywBtzzeNqWRfOD2aPItNrGrk6p+uTRGCZsdVFXdk0v+17MQp39f +yyJlRV2kpmCDMixSUD2K7w5P0P5zDXkXqHBij/3SQnDDOQClpW0RrDJ/D1ejLSSH +NpPQG6YtMRzbNVGafYrV2tGnFn+lSzPBkQaxNQtHAfyKbewCeRvO4zxgK14g7D9p +1DqyQjLusGbxd4H9QaUlNcop157xf0tsHc1hrpnYc+pJwwsGhYu67IhAFDNoqhGv +aB5+aF1Uk/feR3/kIauu7VutAy6+Mp01BVLBEPzbQ/+ts9REeKmMV5fFEhgRE9Jd +P7W0KG9tlNUARV++OCJLZOBpdQJmPwchSw4Ts3la7LWPn3HZ2mMJgS3hEcC4dogH +YFkml7aknynJkVQwvq9+mLnWsLtQrp7fY6QpMMwa9y5jrnn+u9OhgZdFF46AZXkW +blgJ+GqNTyQ/hd+JSBMTwNEx5Y664X1y/WUpdegQBMt6exxDeYlBzUAwYqgueZPj +mv6JRopTgJRKP5ylbZIUOJNfG0cdy0rwa/lw6/joyTCQxfuqCoAe+4otxnzO7Obi +xgFXykBeWZwXS/18TNe8V/b94JyxPWTWH8cVXIOyUZlMiXaf7zUChKq+TpLXHPS4 +91AVVbLk3XVY+kWI7DVZ2qSgXqrvf/13WbPYzY74YVgqGuqyfzoK4i4KqdJ2GlcL +PtNzZW1QJovWMOoytfD0JhCbAecw5K0+Uq1FdnU9FapFl2ucQ6rjD+sbUtveVoEh +hFezn3xwkV+Cj0aZWMkv5Iiffj+/GLU2gNePxyqGd6WXQ1bMSpT3Mze0gnk3K9Wp +QfS38ntOs9ErMw3pdKtHK9NNMCiW0wAn/S93WlgXL2k6LC2kpI2YrP8DUsY0AvUF +W6UMISXb/zj+DVgHaGw4ziRzrFNNB3Icmjo06Ur6RayVTq1Fp8h0EiQc9xlrIOxv +qjeKu0WTVXo1iWgn3Y4dKiR9el0Nv9MaArhIHUk6hQwWt08RcMJZKG2bhIYA9Dpt +dCnjRVdPgMmRAzyL/+P78Aj6wccDKtWTm02yX3o7acTh8lBTgBfhqthU9d1oBQ5w +mRIiN2/NUwNBPBWa+2z1kFWoRY3wES+InzDIwQ9/99B60cAl5YWXQwxrusnPXW7J +jeHmcrmAfkH3lqk6ND1rSiJd3ueUZTv9UQ4sizAWvJoZY5OI0bifPXhIglWq2Bqd +ke6BSc4ymSx3cckmjK/9vVrZWMilVv0mJvT3h0O9hutdKVwFeipWrLWx27o8LBlE +Lrk0TXBRINR97+7xY7kde0KZ2gbYhifQNuo+1qxoOlu1dlsmW+/oQRI6PomSLl4C +N1VdO7WysUmN3ZandaqOuBCTp6fN1RNx39NaTM/FlRlTVwPut24/oz2/YW/vjC1v +zbwfr0VzMVQDLRZHZ2jT19zmgBPfDrgMgvvYr4t87maVfyfAQxGmEDTQdLnREfHy +mv/hhPTkHwkvrQI3ug/HYVpzU08GU/uxI/QF7CRCp6Gslk7UE0S62F7to48+Tu+C +4VwpNwgzMoFdDO5vVkqbAvzV+1ddMJHR45tdgNetkGPET2y4fCoriEQ9vZcnSXs2 +ET8gYwKUZ371WIgrG5RKUU88iQpJhsC1Wc5z8qmMpwvB7HHcXJGaVeXHgEBI/x4d +995B/QqteXvzjWX13XQwzatxBAPh3RvYvohzmI9exeRCrHHat113JtIEGJg2BWd4 +dwE9ujxl68bNWiifc4lp8eezhlTw8CQc3PNjOpNixoHhwVN4BnB0LL3f5ePYaYZt +QCaNj9w4I/K1xV4vlzUA78IigPix5Iy6ub2aude7FHxDPkJxdu9GyxIe5+2UVWfy +nAD5XWA96+RDvdRFsvtYDkG+7j5QX3tcn9eXARpJTM2T4pPCLNU+LjOv3S6f69pq +di4eHw910YS6p1i0T+J0YIVyu06LxfHSHa7zqRKHnDCW1IZjsMTqBhS3Rq9tOfq3 +MzLpCDqziPf6MRc5kpOGRhEpwuKpPDB9VNYnSm6MIVUVD0VblHgYCLm/WjUoCgJJ +zIxza0/CetcKQzj8iFBKQ3Ht9tmBA4rKXjyRkiRwdy2vMhSimjZ0TJcqTkBhTPlR ++yi2GV54gQJLenlrnzXOolXSzG/NrZnbAdVaXTrowSGsXZHpyzwcY3JA0qoSsVQV +FC9q7ZpySk4R3U1RJmwD+3l8uLS+wLqAc4gfmAJDOIZK2m1UwfONyuByhlccz+q7 +Um0EDSt/e/NkvjzEUhCL336OL6tYdLm5WWqCdYhlEkfUQCgVjrFTHYap03l2RdYp ++gh9VN/zO5NQBVtTZJon3Qh6LPs0HgvYkGX5FLpT4NOvW3faV1xYKfevgmB9fiXI +jaCHCp01yGowHQxqmcv6SWezoOE8J4voax/zblBNnCByKRLPftcPFETAJcIDEFmR +uopis7W5HtgReh3mNkTTovKzeGbkARMZmn4LprE+8iz2kEwbiod2fwle+QbJanht +qOJuoY3YvdqJL3KSov6dj89gJ1YSZWZAsOfKKSiK3XKtOimq/8vSpw7k2Y6tc5G3 +KvHHjP9GHONtGfQv3RLeEi1BZcjZGB2jfk1D4/R5zEuL23kyM4OrShyRxUySfA5b +pe9gKrhlIcPpKEdh1RhgoFxpNDn0AaHeoPqEAZ6siNMu248bRYrwYZf18jVKx4a9 +1ThHAyPFiZXTyjyvAn/vmLabcKzEtq7FWRN9gNjbUGm//dTEuM6HzOU+bLdcZ23j +u5ft4Prw8x2ybW4PDcIKEx0wcVQPDlNObZiDDCyqU5kUaq2jchQKuDlrydKwBQAO +oHGYjWR4buhouk2P0AvfB7l5sCc6/nA5gdamTe9qGL1Zoo2W5Z2q2uFHdYaWEC3f +JKF1RVIEVuLpAOehOtzG/myv5ryJte237QWl6Vw2FNKSsi4rl4zQQqrx9cjPaKcw +VBdnAhf/2m9FO+EFJMa8WKKhfK53od65/dmjvprBWHg/zAfgOzHoKmgLDRnN+QKy +2X/CvQl4Wl3NQpaNfsr4e7tkLXMVb6PFSvJUSUd/xAtla296GcucsOFeWUM8+N9s +IKxP+IWj3rtjoq8UM15l/DtWK3jx3EGT2S6XC4HdOke98P0Ahd8W0ShsjV0XdXF0 +8rdfvFQdLigEXHFNCyBpCcDqS7t2oiyBbkHctHItYDyMZet+18m9ytss86Ac9Lpj +BOw31zn3XU5T5JtYT90WVxcH9RYGVHLlewFatfDNUODtaPi1f81btc4mUgiDF2hW +AMpGTOk4iJeJ9YctlMQpZcBSklh9oXqmKNK9bby+Mxjxpl8sE4dD06IuZmfW0aNE +AcAEeZbd6A1Pa92ox3fprY1Qd+JI+0b3ydXUCp3kTeVF8URkjF0TfbJR9b7TkNUn +npecOarSUlPqI69AJ/PC7g9WbQxyANrVc+JJsDNnMdN9gXEiQu8EdobtAxKZNLC6 +trtxL9zOo4wAZMtUWSEfEItcntuuqxZh3D5+vSzlR5NVAQDfcWTVExv6j664rz/D +zZOHZ1japGwwoULYhm5a3kUEAVEn+I/AlTqWJNxfkFCkDn4Vh65bILl604gvi7u5 +fMivJ+tEqBdP7vR1MEdhITJ3rmD2fl0U+PTYBRiBfBfsbFm1kADybHy9ydMWHaQn +ZwoUhoFlUL+WCB2nkb85DXWp4MIez/p5WWFJoxUiE8t0U8ccyMQwkB31ac39NuSu +C2Rsu4U8xnpGAM8XghxbHcTp4TAH9uKgRy+vkU79H3PE5bAqz710Aba2DNLRaVPQ +b2Cs93Vwli9b3J15++veaKuW8AZgIZeFjdYV4UzypFmJlj5CSztxQdwj/nkbGqis +1ZcLJoUqpo8HgzyxYjl6oVgNUElIMZFuECBt6L2KDWEbLkqWyLlcTx8KSLw8QvD9 +FfxJVk6K45kPfs8IJvT72rCfwcPS6JlEro3SbZyWZee0wvtUIq+SgoyvSfHt6ioB +kAKTrZEcElisbGWCSPROZedWNFLSfti0WuAful8zwVb22H7J1WQQKuJkQ96nM+6M +8B/77Lk5dysSHIPw/3WNEJAPBmHZoDuVrSFTlMvWN8I/UetgqHhN5zpkK0evvv4v +fUCaP87Gfjk1DLwgwJfOfGsNubZ/lCDNcd2SKI3aJVKY01ggIe69OCXInsuqvO/J +wD9TVLaKDLHswiH8hsvA/5M0ains75k3yPmmoiurf6ZwNRSCKBk2cExfjcbryeYs +qtvn7j69VF5qYXkB4Wmh+KEPhJapyryPjBdvRmvCqJOB09MzZOEWC9+lkn8f2RYj +lWe8kCw4vywiRTkPxiYpX3Iz+zJ86nphhVRJwnxoIEqhHAcjQEYqhlNXt6wQ4GpP +2bu/4ZoKT9bbtDjSb8ptppLME/bobO3PxUiC661Bcm1L27eHwm/FRvYacBdJm5W3 +ua2/NFhKoqb17QCdCsrEJd9fES4+F3OJTLAc8gzwaZ4Uh7hz5rqLRkRuqZ3sTqXg +QlPPHkurKIbiaOwkVpwvSvt//j6hq2itIy4zfMIE9hAurx95X5hAZOWo40/2OJEQ +vhmPga90MeVIgZi9Aa4DBNtCU2NepeqfLMKiGb2At7d3RoyeLjd4ozW+pwfBqBuT +OpGVpuOkVoVj6ahBx0r9HnUCPI27Doey1PQKvQrrj/EbpM44LlNNuOgvxRKgsMh0 +rt5VbEo6oYIL5IUqWpWPH/vxlcoAU1D/utLeV5Lkd+mW9cs6HlNLMZkl5kXx4Ejk +3B+XbZ3xB9b75THhwJoS511pMTGplPvyBeDDUTi/HIkaJ0gAVAotNTeziiLA5eYC +/AKz4hZAlwKJ6R2jvw6SCXbCpCKjbHETkc3R3xepmLBZcL4CdxzVG6cxHLfH4k+w +GLPhR3AJvsFx6oevQabvYuvfeW7zabgbPEp5AQHJanH7RZd5h8ZankEkRx95AQR7 +013PLCwcrTzOLXvuxagKg3u2+c5bQ7vVYXqhjYkgs9qhmJrkb+1E8Xbig3c8OenJ +AUWS5usThIbvGhLUtjHK0Jz+8G6x7sefGfj1UDSO3SpMmmaAwfMPU6aIFPg5DRGa +69Kux2K6WZY3Y59t2qfx5bPXBMG2pL4Ly4ajUcqdbHWxzNY62AqUHdna8godp7UX +Yo+9+5wtY2p8NRGPwrlaljEALhNcx50kapegTnmrqY6Czuyo3NiVasCMA5j5K6tu +2ErzyE6UrWZ7O1/vIVPCOX4QqVYC0/LPfbs35E9hHFSI3D2Qx+pQVp42EWn2lqZr +w7i9oZP+FIjxravxkCQuLaQdZaJmWjVRyINRsDMqZ+Fhoz2dQQMReqJBv8xb4LvS +ZPqNQro0ba7U+uM1qHkpCGIveapsFeHQDxdEVFMNCIZ4O0DS8SxL2h9SaPaVO6F7 +iEORmUwRsMu07vvd5pjN1dWDeIqG5E+lGZ0L/+gsB/mYqBWbni40R8GplvAcAClD +LhfX8ISJJ/bIJKgg8lXarv49dp8vV+cnBlV0Lx/+ve0/FxGUU5Q+T58fSIc+Bm7x +eqLVkf/JwNPySf+EJ88u5npXQc46MBohcfpGZ9Z7GS+pm0dOJ5bNPDTlZmtSLr20 +XUQ9ebBlEwtxXAup87hwTdxRvMCmKKwK1gQTocmddjmQupu8fwH6J/4Qhm32Je04 +R/NORKbtNZrg03EFVBeOp6Rq1iEOCyHeunRN1YJvRE0KfFJpR9aCyqwHDXhfgSlX +WZsS6qZLB9ASTKKSd0Q0CW6cOQaw8tHQpZ485+9j/YFI3L1+cT8mN58lOkpajYyC +Xnl8K9q1FFQcWjpzFR68akeZyb5IhtXL+lx1L9Paq3Heb6MfaoT7gX0l0Wox8HMA +ENhjoqXGtRgy+t/DLXhYaMHZBJZqnrwXEDLp3FwUjjIInu8dvVsEGKNcfAz4V96t +5LYiQBWAAvSiXvStwokc/k0xxA1K8T6LIkls3pKVK94grMkHk8sW/g648XD+FC98 +8kJ2r+PeNW7iI5HOngXjf1UqeuLNDaZk89NQcIIIGABfWWnad946kS0m5rq2VKcr +YK06esO5A7KAmhYmjYeY28hwW2SqU/3njqWrh9uaayAplhfh47p4Mkp2Aorhs1Q2 +1DEsOgrDDr/sYui0cYclQKWNc5aoqz//vHmysGQXN+U6wWOiI3XLJy5YcX+Eu+cx +VADl9dwl18mDhpoWIe36Qw0rFEkNkMCb1iPtbOcOTYpyKTL94JFcwAQsManVw0Bs +azLIsuffttJFipRgm/Qz+k9zKqWoDCDDq7fqa19yq24XdcxMn4RsfzhrKZqTuwE/ +g0Ac+zr8WOY85YzaAuRYU6lRfOJleIi7Rrgms/p5X5Gnc/IKNYTD9itVj5dLrkb6 +ysdR6XwQVvDGFxuIgZ3kia293Zdtiq+eoayi8t3i94egcaGE89surD+jNORHmsO0 +XcTVrxOaws6vQAzW7hizDLoeOViJydgYtYs+l3iozz36PMBQqU0DWzdZxwOX933v +gMriSowCX//Fwx/30jvtm8kNcbgozdlmcJ3aO9D6IxK99KPV5Eo0wgqheI2nKvSG +79FrIfRQfey1kLw7+Cmm/NodcDP+R7I9pC1ylo+q1ClwsWIIausQct0gEu9zVIXV +EA1z+LzHi3pakx3kiH9nQykBx4RpL/SS5TTIcciNQqTKd+n60wyIKbo67txVvMtz +rcnqUFnMwEsdcgpZGrjeUwbgoMDhDcN1PccWsaZxxJOnNZs4ETwj0swe5oCcbMKn +Oo8yxBE7/lCoKhP3pP+AmpdMnuYO01DGIF7bftdv0xmcyIn/QAI5X4Am8lgEiMdG +hLqe0tKGsPaGcsE9kdyTSjmXi91+Dxdp2sYSeUsaOJuMMw9aCUA4y7USUUyhwNAB +FqNYu3Hj9W8cD7xNaneJDS25vW14T4+I6QiVK76QY9V1DXCeh79LHagE0oO6X7QO +SPIk1E8xL2f7q2HD86qmz2tyXPbhLIa19dAaryIAT30JnxF3qfzYydHVtGuarFWe +luUCy45lopR7hbM2HnKmmvTX6nm6nOWXH+1+MgmtzICJ2YQ/eXO8y3ph2lZ8lbiV +cOXA+SX356AFH8rnYw4ePGJGjNSLeOiyIEBERgGCZR2owafen4HtZ27kvGfbpsLM +jcskTnPRgrsd+InLZOr4EcvbpVBnKxl+J6bb/assyYNRO0asqqV8EiE6Z3m7uVYS +QR1WsTYylmwOBbLWqadYoRr2fdrYlPVuRgXo7zqqsGEqgsl3dRMrx4CbJCdrPQh8 +aFkLg9psN+v5DHZ0gGUEDXeB5cUvryWRJ8+CwZT4x6YSlGdOeM8k0pWIXgbC2JqE +fVWbcHPURv4AXMDisr7mGMZyl99F+iQgzwyqLtlKFE/I4CsY0jH9b+POzRNTZTWH +FMpUWQxcuGZb0hAUtr9XCl14lt5BO1XqDQZNYVLYPR5rs1kSwTHef/9fuGMXgnAV +A9jSFZuSAWtBv/4NJL4QOaf9xjXNswyJrB0yGBS7vdbfr+fMkR2TnPTXkCnySZPf +XOM/Byf6UIKrV/p9IdszQ7HM44imN0t7OE0cf7ufn6pPgZqvVa/oZDE/BR7emkS3 +aPYqGe+jg99E26IGiTe4HFxmH2wKKAPhYVwCN4VOicXFfjlP2DIeocIMJMZhQlQh +t26fCqqPBxDb2Hkh/Qez5sloqKdvZddhfrBgcZ+rFP0kypYxlWZDGswsJ8fuywOu +ST4C/HXVEd0F8EP5+NcilFviyo4/qW8tWwj+sik6NASTkyCcLqTn5DbPvCSG42Qe +2gDNyvhTVOcZ9K8iG7UXWaqM1B6gJ9xkWSfBs6zrHv+hAqVL40R0OnpS70JGfOD1 +BR4usr2H5UjJGr4+NFrP7fsmk5Xvb8JU4bjFEs/mGAIdmjM6PG2CcRhYmOb48HH0 +PazykKuReSQoHkinx6nNb+btpIoN6xZQ6wKJjv+Ih55dkWPTmYan59dc8TGH99b0 +zvPUAz8Effn1KWUMpBJyNxpMUwJKLmjrYcwDQ5sGi703PjHYh79NuQg41pHzyQn3 +1LUXODw5tLN4xhfkbUqM4DElINz1ksNSSOnJJS2ROUictUKg/XZix13gFWOYk8dg +qxmoUM85D5SWDVVb7wIkhkPae4+eOdyXqzJKzbhf6p/I21ZU5qhwQOlTWr6lme9T +m1JhXX3cuWSCNr/cwCm8573gj7MPg1IGbpcxnwi98CsZC5mDktjZGGMxBzlGtb3/ ++ALpcAi0KCwt017U0cJJDOLsy5CcNPFRFtlWpiPAJ26WlXNZMGl/3mo+pc2RmIaG +/fz0bEenWusp5nm/5BxG0X4uKDahwWhTie4Doj3Vuwl7fEi/rce7ggbta8Onq4aM +ux6eUXTDFrLhKpMQiZdS+4lvB61eZHxCWC9xOJTx90IKOahNK5Kz5h5HIr/5oSRT +2bTWaoU2PKyEIXqZdISDS0eF67+2GZCx1FaSZdWuekZsa6tKjYh0j44AYuFIEEZV +bf7whgmlcbCg/1mV+oFILIQGzoNGomzoYP1M8/J8wfc4X7OgoaYWbmbr+uQ7nNn0 +IwmrEocSTR/3NxJGMRfvuBzpsZlHunrxaX2ZX/ka/nbBFk+R5EW/RFouwnrRQKyv +ZJg1R8U0XNU2pmGL6JnOsT/56Orpd/OIWFZZPrdjM4TZvZzDB+mZLAWq/wsl3kq2 +oAcO4OP0Quuumpl96go5zFrSq+Hd65M3vRy0czvNllh5WnOXuDpsj0oPwQNhXlS+ +tzuy68vw7p2F28SxyIDJ1DGqkCZUuyvdIEHIKGBiGjYi9KCa2T2UgHC+dEtHbrVk +kiXVEwABLUF6oA2tx7uaLeo17Ks/ExVyKIY/3ocBr5dy6o1r9/Q5qMG++Wikd9Dm +xRqN+cZwOBJxgfhZfAZnjqwhKVacKwDi1YAQy7AfyKVteWEzQpQc0CLGPWPYZ0ym +CY0QwoLjoFEJlGxJoTUQV/BBZMDt0dgShSgYCp8knzCrpf9O3+ySzBs+fMSWrEot +zunvb/EUJ1B3HIvppKkoM++VvPCxUsmRbOw2aDctaFB6o/gWO9nU30B3HYNQsySa +2U6TwHe1crWV0ehhmQhr9ajUrzylrMOGLkPYk3tMPvc04TFhiHKvLL8VJITeypjn +DuyUa4073VMaJ821D5bsn9XUWy/HvBgQrJJSfE1A1Ei07S2KiLgpBy7P3NjG7sp0 +kaM/UAvHcOFCFKXlPPmzd84+1/gUPs9I6Xg+hVHQYUh9x+oKn+MnHTUt3FfNZ8bn +towsHP6g0X+mZjbB2zyLcPq/PZh0Ok+oKNGnWjDzbe5c9wScAkGmmlx0HoRcPvQ3 +IJf48wAk6rVaKiMPPfufmM6aSu5C0QQ9uliofVZsh0D4ejU72cZtOEsIjxEBCh8f +OScCtez8dVmCPjQQjJKZCAhqTwOrMVFuKqG+O89aVuPC+UbxO26e6NaJiJW2wLNa +txMzmOUdbUwIHEad+BzKrDk9DWt1IfKgrgEUqRPW3zqitHNkFL/IhtwPPxmDjPRJ +1exVOM/iTKz9DREF63XXlJqmL3wfYW1jTNkWqjOnq+6ZDw8lBGL+LdX0f/kv9FJD +ZwiceHpWxiYh4rfV9wdWfvI1loQ/8hnDGfvcbJDxOQE9wYzmMw4MsKyrbAOkt0+M +NWECOB8z30NIl+9QJwG+VmC3J51SFkqeHsPckhgRxMgqSWoFv67kzJKlvvF6v3KP +4ZmNkUEoQPbFbhKhpb0KLcf1NFsU/BcFmr8Fw/YUKTfg7hMU6XiXKk59Kj4a+DzE +LZMcCLSigzYg5q4hOJlUfSYrwX5FXnNVuiX2AmnTuGC4/e9Qn1Y2BF7b25tLZfpS +Zw9uX7tv7TFnz5syCfNr/khmD6Wr0kKUYbwoP4a7qG5vxP1JtxUIDhmibObbF4fT +ehpG5M9HOmOhhktP3DeRFRuWRFDDg022xCg9Re2ablLID1scQH2DY+SOo1r9BusH +bSDmJ2x0VAOPWb8kwaDXbGrV66cXQ1TYOiPox3P7sJkmv2fRyNVCIM8r0WNm8WeC +h5+OYlEkzvpIpQHRRrYqh8C0vHtFXa2P7DwV6ujiw5aDl9ci/bIFVYf628nODmaD +mgqigHx+HHOG3BFI+wYk+ppz0wiWmNCcLSYD6Jzm0fTDZZQtvtDBmPz7ves9885H +f9EIUiS7jIyxqiupxWCJu32qVUP0qs6GB1xtlZYaUbDQvxSLVMR2+Tl5W+UavY13 +EWXiIOCtKfpNIu0YyrHtTqGoz+n7nTjOLkVkExm+TjjyDnCFcOHsAtj6XZ41FXiI +Z8tyCgIVDCCOntgpjNOE5bH9LnF3PAv1riKyLqQG5DiEGNkARpsMB2dEfz+IuOAG +/Upb2GdxL7+16sb8QqwFQ8Kdg3SWzy97GI/I2+tywr8yTxkx9a/JUbyHM2MC+W75 +9fACQkLW8HZBjnSOiyGy+iV1PPATwgxfndneaocdxINuUW0Dmat03w+sq5SbwoC9 +yjmBLp06buY6ZtYel0gDzNITaIWYg+qH5MqDoRk2IfcRGg1icsVMArkNuz8+CUnO +ywr7ufQSk/ch2+ESornHs2BwklbEFpW5l6bGQwsM6TRGv3sQ45OwpikPrAPzuDf5 +cuz+McwBe9ndIzHlDRvQJTV9vYVBd9KgyMZDKQPhwLley+Lmc4KVJ45GeMAuAbnc +FK0tDlVW9s0eim+KpAXSP+KrZYrJzsS92u5V/95tb4Jfl2C0HTPaH9NW6jcn5s8r +D+YPynJZOf2rCA4HAey5m6EWNGwBgwriLwY/Es5EFy5pUZDT+cNZ9s8sVEeJM9c8 +dPHSoZcOIYEpN5FzCPhar5+LYnPq0eXgDS1WGlFn3vM0C9uG357QFZ/btMv6vj2K +hzWo4WxDFOJBJAfuWFX8VQH+lLuHktMjPDFb5zx63P7PFAVaMxFvTIIyBZYvPgF5 +5fmLWXF/Vw28jPqzC4B7PaK7bwqQVa8Ec6kXBFjtpWvGMr1F0CfIyvKXgJ6wSUmT +UMAK9V5VcZ7gMx06XWLAD3ifSMmxxBIGcv6eCQcvTAjaIzl5k0K4pjr1kyMYVsSg +/rFX24QdbRtgtLmA76ZfHxM9nF3c1PXv1I/xv527yfkPTqW3ZLoMrU39YqQq5f1/ +T47CICKs+iU/zaoIZKdSS1OKqDRDTiLo1FCVO+COC2KySP4boA87EudtSNeYA2rK +CxTM3eeXbAE5J7m3jPeBnzJsHmIFuLaQFWK9iq0fgAczm3jFZDYXfa97TG8aAHed +xrsaf7Mh3ydBPWkfVj/2B+nBZ2N1slpHkOgsG42nOY8Pk8OMwqJjb/Cv20o6PlvQ +/4KnRa5obKjjfg1huOSIDLIXbXpGKsUZu+0lJlNv/iFsBMg0TjfGlcVfP8KECVMx +6zd3yn277yafeQ7VbGVoED/63d422P/O3izSwBmTIZ9aLHfjgSAh9Kf1KUqKjVDB +1768cEt9HyvIiq3EgmPQPzBYNrLqIJ7R1knoFEb1LQM81N3USXzKMKHeNk1EzTF3 +ZX6iu8HAWNpFT0tEk7jvvO2G5Ujsu+oJy1Hu3O4yGz9VeB+mj+2xYlBGs0phYKRT +/QfwK9gsCNIzRRKHn1IFRQYHt7Yo/xjPLqy19HNZ+VfrBWNikoKKPLlS6nJuY+gG +SZ3UCZnyNC6AOpTP+XemZCwJAeZTBXaDXTqUMwpcf8YrG4yu9XTojNu+xr/P58MX +2azZDyQCvC+R8KjfdkkANGHTvTS17dC7gxiOTVYFKOz2aOXAQUrNt3ItASl1WAOj +yvTJiHIoQLrkf1Ry3EBUjsnZ9BG6d4preyyZOKA6N/lGx9zZPvAsql/FGLReVtIJ +ysnxiQAkuGBdjz41DHGjC31eYzUJn/5aH1nW/nKCFEdwYbsdDhw/Pcy+eq6Btv4N +gCXjSjNJE8Oa4UJlP9LtpHHqtoSv+igIzCOQfRq9g3mElXXxE2YKmBAlNJ6VM45S +OeecqxfodB0nV6GWXSK1KcHKUFFYiJG1i7Mrtw673rUqLNDoX2i9ZlAEg0doK7yo +P6pmKuCfsOtgVHnD3BMzHQ1n88qajPZ5poN5zz3T7U2EcDyedcKpm6eVCqKdGsLe +ByCHDTtCY3K7V0u9HJFP85wz5urTXRsqwZLGVBO3cXqxK1maupaIWczMKhbF2/yQ +EhEhYlpNl6QxrWi+Y580XKcBfX7Ogy7x/1aGAAiM/w6Q6y9TAnNI1L/ZbIR7hHPU +fALMorRoIDiLoTDevNecTlu7JcqWn2T3WLSVQ78aFpNiXMPU7CozGOmrdHV9Grs5 +DayIbDuaX7UyTTT7Bf7xBUSjbmmGJgsJiGmsyu/nUJiufLhSzH0z7GXEjxanw1AJ +b1gSRfNV6KeVusrSa9IFJmRQXfpFMXpxmpGj7PcPhZdGNKJKbZqsSHcCnKNci+dd +gVlTQwz6IG0bFu5T5yHgIRyj/RMdm4l58dJDld6RzMtkd65bDYU0r3XdFp2gkzM6 +yocvV1neXziCmR3NRmEI4GeF/Z63H6VXnY3i6tfTsaO/SUWWyChX6m3o5dY1kP3I +3CCAuyOfP1zT36HTCsZWYegDFF1LapDvEaNPMRpB7/BO84Yz6tCJjCI/hHQfQOAv +QUNNQnIGfp3MKduyItNZvWuNi/LdoPgLa4d6+US1yxr1SMENRpwa08ZcVY7zsEZi +ane/p2dH7gCQG3pT78InumA7WjCnZilF4/l+T1afqlunltFxtZEJ1W2PK98lvoEV +clRiQTofql8xACmxnERNfOTJXwe+CYm4DSq5k9xiOWwXnTyGKmVTACCm88j0QJM2 +0/hPx5gb4kVieVRgh2O54bEfPegA37XVP0JSnANJEXdBg0vog7fQlW6Vd6i+dTQv +CFFKMqMoTjwr3VBlNp8vgYAK/D0+tjt/yVX24IH/a3WZjc1KJ4EjOX+br71Vu0e7 +RtWb3j5uDKQuHouv5eMycBOEL9TRb0u5ZuOGhjru6LnEWE1/7LtulfGwxtC2dVu9 +46AM7IPHBWSIVKm7iW5m4oFk57dhG+5S5+RvbMkyDUeR8SIjp4E+WzXppy8RIAVA +kVB5/32tlEhW6w3DTmP1dyy/bwt4cafxCpVh2j21TpTtcuR1b2oaU/OB86Xm+//b +UYc6ss68WLOl+WBFkwoA2Qt7N4NOjWJbSL67bbUMZPTCKBDy5ysN4wMKr1cgfPxT +FFBznr9Dkw7+/kRtvJKht8Pt8wjLKwHMeX3L/KazNdR8yMgossPsbCBvq5o2WCKH +C9kW7FtFQkHfPix7tmM4xb9tGxay4iJl1m6EsRBJmz7Ci7/gcs4ABLC9mzpvh8a/ +yfOqoijtdDKLxw6CuniBGjjTBbO+8IdIM+Y9I1BtqG6xMlUX8AivZSQh94J4P1EE +bhS7fZ2kcEngKrDPflCMfK5u77oQom4Kp0RcyTTDJSudy0F1kJh9R0PlzXh78vX6 +smpzk48wMn40lXS1oD6Yb7vmQrWmwaofNPQM/FDDkvjR6CYR7EAQDflkPJZKVdFg +GMyjN2Qs6wfrjZmngVbAictBduxaHIr840sFi8Rgh2McQsND64ZSQbQV5j7xNLh2 +geTExr8xpcdarmTE/wqPUyKcN16RoNdWuJxurGuTlRvsa6PKq1Zd2M+1JvXzo2C/ +n0b9c1ODq/IRmEtLJZ/cQhJQCDXLdVjGXp0Zq46+ANd/EzIC6qI+IXC/Mb+7P7Z7 +1IMLc3T9XFsdHnT4GBAKnH42oWrAXmjHCjXVjFykW8OFZKepVMwUzbWMcFiZ/rup +nLGjitbB3GAtPisgk/fm7Ctd0QC4e5qb2YofmEpewKUk/3/ERdU0uwgNa8XBSQOD +V1fGLQB68SUkCHBv/fyU+c29xJQz2ZFP8/znVijT32EIn4Xt1Tmyokz1rYnbEG5O +dTNOo9dXRP2USfe9wyjPWdjBlFC3x8xbh9AHdXdyxekaYhmC8Vm/qFuaYcPby1pK +LsKauWVjSVryBsj7wfyjA3vtOJl4wuSfqsK/KRuvWDC8DO2/+TX6f/6me9jpuIUU +Iuo4qki1FhBPzq4W8zhOKUpHHAb88bn4w99Pd2jb+MDZIMQnJA6v/FPiZewHHFD+ +vlVVIhy4JU7uip4U16RU1aarIbm9GyDya9uK2xqlibsRtb3NizaHCMrmVUCzGCmK +ZaQivFgcqgc+PO7E1CGJXHoA4nIrFiU21J4v3okLGqZpSFzzBtqGjlkF4fu+TVUD +2zibBQrQBrFDG1Pp8nBX0VUWqsygMU38y9PMQGmAmdtIh6sQu1yq3VtQ0Oz2ubaw +MOjpNumF7NOegwGEgAjqmJCHuEOX/1sUJYp1GnCV+8TJFX5Mfj0Rht2glUQV/spB +JRmA3XQUeOoG56hfOKxSvjvHUzwccVbgNbC4spUwcIObvXfyrBGYzBWVz4OnnKaQ +lkGFNkDkLWxl87xGGLJUKW+GIp6SC/cChepyVfZFICe1UHYx8Lqqz/wYUfRg6Jf7 +XokyJ1NT6LwON1N3YdmsbxqXi6XuJ/Z4zP2qdtehYvZGYB7TZacJGrQ/bUYMZt52 +UAdURcf8xlprC0lr9rMjdyLYws73TdvdROhRmEyVUzFvX5izzWp+Qx8kK1PR9lQ+ +2xeUH0vy11A2rQHWCaPxZqPhL9iFgMhtdRm53OgLTaDW4Z29bD9CjMScKSFcS1RU +UlT6nYM0HtSUW/M0aaYznqad3PJPC6+q47+JREgc8RZcWq24IDorcXmPP9XXhzCJ +XQdaKh+rLn2xv35dk2XvpXRY0vWkepjecJlnCoGy0fsmtuNj+9yMlI7Dli1ZSKTz +TyturmNIcMt3juv8yqXmtQUaJgX/03oTrPazk+sPwwoAkD0WEn/vpHZY6BgC/JG1 +Ge4LKJDgmye82TakhNwmY5sNISLdBQ76bIXHNFf9V9goCq4uz/yaLLI1Mcn3sahu +x0IWBcXEq0tG864tVRoe3TDa7O/LMhvWNkf++dH/t/RyunZ4joPEv6mhXzrI2DuW +ksYB3MLIDYYOQFFJBNVjseEHQ+A17nfBJquAvlKQxE6RHes++Xt+mqar8ZWuk3Zg +/FCdo1PbWALnmVnfHBN3OYJ5FPlN27pxiUEUPKCYiXZxOecsrfCDHysVNVIC+SbS +6Wh9qy6rAXg8hTj2wJm8EQ1cRe+RDnLjlMBMOYdEvR+/CvrLY6VaY0F5LJzxLaHH +sZLUCzaLaVlhIdGfP/C7n2xWXh9Uw3Yp1yleJIcQjpH0O3abH+FZESoHANY7ZEXr +bz9kSWyll7jxuQJey7MbmQXDigj1psIzN4jK3cZj2DWjnDywqZY553/HUgLE8Rmx +ciBkNRBZSVIWMAk7wJF70zYN26FqR84Qg5bPYRHT22MupQEd2Wvuolr6XEtOOUNy +q5YlAzoymysQ9gygnM1G26/pbm36WLn4fiva0SfoHTEhKi8VSaZAnSQp2QKn2Z2B +jdsxwDfgBf0DC8kh/+9b1AFWTdFf7WYYBMw19nthi5/8qBSnvKB5Ey3oECG8Dp7S +FEo2/8erOaE440JiuBougdvutjhs4bVd7GYi/LS4Cp2WXeysl9UvVd+VZ+zFG3b7 +G5BWy7k4SZ3utAu/EeZiCzIMoXcYbKJonUJIW0syYz7ujoEDGo0mi7zYs9GcVYuV +xQBIfKEFK88d3DOl0qBqnDO+m9NkAKi3DGcr0xkO0LfzBh5k6DM9IER446EZowNb +a2egNkP4L7Ph20up3zhK1x8llbDTXkoLho/h9D1sZO4Z6Ji3RVKHpUj9afqHG+I7 +qyCZAF3QO+HHxBpxv+eMgllezeOLbxe+T3sE5ImuykEqV8PtYjGd8n02jcQPKvJX +ioMjOFBDTgC7bKcWKeqz4mdkbCBRoAkVrK8KH4ozvGV2OF/0F6RS5US1FUcZtpTa +MMLUjmBV1nVV1239OFLr7uJsHIAeECvFmxidhCO79v3Pgv/K4bLHAh4rfdCMSMg8 +9kmamyJ/KxfWIgpP+nhl5X2obcuIYzSu/hiDftZ0Lze71+TkHXhTaetjpNsu5mQF +mMhSJiYfmr6JSfA8L5h1QpgesD3R3WVX+/EoDCdyT8zxBZiFMqH6JJjl7JAbMNDG +7p6IDLc8j5qn6z1nURxgonmiv0kSGPvfPjmkyvAdg6z6MznoJJtSLEt/4ejaNMzZ +7C9Vf0OR03RGO/afTUbOBVQRvSqJKe6djRGsclZM7yzK8j7ooqQ1o+t6rkLpq7Oy +iJGN6pYYwDVralp5XoWeUfoVSaiCtD68ZYlESH+FS/eY2gnVtLo7zyUffSA8f0xj +2zh4Mh23gT0+UB29pPAZ0cWFv7NO+2/PwbZGDWb0uPECugjSWPePslcOToUXWrl7 +VPHU6LZdDiLX/Kn+LwppleyZcSVB4gCMLZCBr0sOqXifU6jM5Yx92LrnvmTWTmbX +hat4Fq01+7nWJHpsW+1MYykAMDAEXaVumvjkYLN/pO9AiYi2KIPANozBcTzT6Ler +oGRHDCkXVyt2mjVC8TXvxsMExj3YOHHtrOoJ0OVSiZ8c0tPJtJqE+DrApK5tcEqy +uSMPku/DCc2KnYc6mm2I2rL5J99MMQ739KtzSXzRjn2/HoRybbMVIPVQpA/xQ/Xn +6Lv37RzxNiNn3/YgHy7cneho33N+nUWQnRJ+UMfPdzsgJQP81Appkqdxrfdl9Qpm +DaVwGV+uuAAkGFTzpgCHAkD0sx/xZ3Y8qKxaNappsh9+jj2Akmv7GhU+gVk/g00c +o3fY6FEEIP2sTnz41pZX1+XMnq5BrSjMnRS+tGDGo70/XmabNi2sOnCEQxDKbuHy +EpO80EiocGgeiQuuY5MyFm7cVIIEL5FEL0MJg9kdoLI54Y0ywv1D+WGkPC4XUSSy +pfEKpOf4sJE1mjTu1YDN1KXvuDMzGyejD+JiMOIWAXI5IIMaveYvG+JUa5uPhWNF +1/ek/vZCZU/YjxJczSV7FUq1GY15veuEpdBL+NQuseLwoUBITMh8TeqUjPYxjHlq +teW7CXJrM6pSa0xq0+3GvmGBuWd/JqntO6ZhnKcsRdAibxUgWAY8BsZyFEiOQqd2 +rNMlGndo8h9Z9IFlUaH3OaE6ofIhAWZzyP0S12RDNDz8Lazpmj++e5KGF7mzqvoF +7azd7VJY1/xB2Dq4s8oyKBlzR+s4vN9Fb4prbLM/v/5pMnMnuIHM/yCzmdVGC3s7 +Jg0Tita+Nw3iowwXJnTWeF/9oOKZU/R/wmk8dM8PWiA6AaqOXXAlhY//i6Nsnhz7 +ScWUGPayXVRChpxEKrX9s87A4diD2QhbYxtygrNk5XfNmWc1rrv7E/6S8MY58FiS +tce9afs0/iBceFrlqRUEs8TZO8m0ZbbNKc3i2gJ3NtinnZaU7kX+1TQVDqsqw7Oe +ebvRYB7Pq+JQGxG/WH9k016mwIGBT4HZaCEIFszPc/SFkHRHReo1oIX/0U4UFlDK +Jt8NvQ5aPT+0dcB/ATp1ywJzhlIXgr03UgRjDyxD5ylacRcwASUEjHDaf1GaG0jh +UiU6vANZ+S9Q8OjMQ0DfqgvZI35uRe2m2fsUJxRfbR6oTua4i9aO/g8RbFZ2teSg +boVKSN9cUp6WNzyOERNLlzauzFX5zzOKGW/WVyqmtVcXPZ3OBBlWjZfSPzX2wKrB +Cak9VI4QEnz7S362+2ESH9R4riL7klFd5H6BPsVHiAJrstkZ/0OsSzFiXxxFOR7M +wjvZNvHZUttMhg87VZ5AJdH4Avepzh67fK9LWyolX/VwCykENd3j0a9xiX06Tch+ +mHtSnhFThZnSMtMwX8xkEqpfk9H51wvIjDUhrTNPPEE/CLWzKq2n5uf21R5eoCYF +0Mq9izTcOGvSFOeWVu1cDJNV7CdG0LpzZlITXiXko9PMTd4RVA4vy99CYHSUqqIs +j+HXrHpIpz9s1qz1I0KVJRheYasRNpfkrVk2nH05rW+pWnhrW6SAhY8UROqnkFVc +DzJy6a/wg7nMC3MlYZEE3Q/2IRR8CLOgq1cybWIKuaNojuEbd0fXmqRDS9E665jI +Ky+GSIPhT6N/OgM9j/7mjDITsbWkyzHJvcryA0VQI01ON/L78P2hgx81iGZnhn7v +m2GBwbVs5+GwRqThkhIy3e9PX2Dvsaf1VSrUupgTPPAqbLxc7uasNyvOKfmbxNtf +NFLq1zCvPUcxJpH+QZorRRtzdMEoSOXDOOCmCc1ATDh+XcOd63/ep1tVTo8AJOS+ +EKL3wW4OEQY7dDbBjcoL1iHpU40lV/wefb3M9oD8xfhIpi+0JKDCbSV+idxCjCxo +GDkdr9ycGjRzLDL71y5wPmNS0Sta87Q4Mns0YBzgqCfSSZQNds24922Hfk9R1AFM +Rkh7yPXXglLYQ/Yj39aH16TKbA/LK94We2Mv0v8Nnbmv9NdweR8RLd4MfM+5q+jI +ZV5zeH9nBfGqzQz64yIL6QOcWDtvWQH8vV5NsfDg1y551Djs69ne9/ucpddEzf7I +BxrcOiW0Cb5zp5CKmiISJR78AqfYlJjzBYf7jEAG0wBvEEYUFTPpHXfk5PuXWG3y +S2a4ZFG7Czq8U6TPkiqQ6rLai2JEN5kXQIhPvGNxde9sc5WGl5CUu6SJTeud9jS0 +4PbygfRKHn3fa0hI9OmRFm9hz53ho2UHEhNrlfBLNcZ+S06CTNOXfNldeMZPGNLF +86vTB3WcZIS81Pk4c4fXrKpsTNWiKAuRfm509cVm2XXKFuQenuTjoXO1oeu/7cvx +5NShPGWjSJgkZ1vqkufyH/2GDMY0pssomW8zWvldj3RFNKHTwXl+/llNbA81v1JR +3s6pGaqFUEDLLTS/Wi+FEHll/QLfz6bqHRDGTD/GRb2gYWFxixGoYpV4s/gx3sTP +CLkCWhpAMVcWHQ7PAOK8Gvf2dEOti5CHWtH3CygwNFExJ75qfgj1PkgN47lnMSle +d2KbgoC2bwKBOy45wQ3Loon051vNIELgC2s+e7CfalrLZgf6EucLt63n3BhMwVL+ +RIjwKnJZofqEy/GjEJPBzcb7pWFagJrP8p+Gwjv4wbK29vWSeffoUzfyTTRd+Smf +1skahNG4kugcNAOx1rFTzIaAHL2sU/JGmbqMwycEJA9O6nMMM1SWcqy7jhfkyYkV +ENKfyEC/jk4QIBOIlu61ffBsTyqLI9+vK5dLzfjct/aP3gfJ67Cw/Fus6AFgPqCS +fZQ6hIPegOF8wWwU7UKAV7okFQeHuFQQRsvbWCKMgQwqbSulbVgTgj7nKw6vENau +MvZQueuR4Biof23fgEqVrylNBByToGa2Em4ZHBswtPoQZc38mkg8kNgXx4awrgar +bqbCJzfZM5OPu/7o8VZk5X/VPn8zP82MusUh+gED2+2hu2VBb8X4MWOpMyxXeaSn +7Ot8Du/bbkn+S9rJw0VRGq9Mtek35sPNAViPetxU4xkXe7AX0dUq200OiN/lTNss +xWx4n9gutVkslYqfmwy3l2trFtM64mh3lgbPEnsZviB2PvSqA0hjCz83fq4ImF8z +FXgkdqOuQhqS80Ar7KMqphZyrERV3ozIMFHylQ4O5IvfmC85CTupLetwkTpu9qoE +mzDEg3iuzU8WQZ9ck1W6iaRSe0/a2WTsjvA5JcV3oL08lvZoqCDVPrsNGB8bl2Iz +kW5HTBwok8j+6jlKt9BIY68Jxk3ag4IXInqUU8L70sQJ3I/79FSrfuNzOBmH6E3Z +rdWWjVEmbqZRuQC9pvqJSr8ALw8IYeSo4QpbpZuJnQ6f4d3R2lZ9obZqs82TFwwk +b95A8bonvPM/83YEX4SxDiipUSzPjRCsaHkv9L76RCaBebbXYYwZ6A8bzUANEfOn +brTIrKVfYPeOoEmPuPm8pPevaaIYRagV9zTNFR8h6va6Poufdd16vzaW6ZdQhZM6 +hgDYCchs1VjVRrcRipgpNfNXYYog1RGIM/IE0XfHDvw7lUOM4vuNa7xt9jYifBFa +pUAXvY+62+OirFoyPN8dqJh+/ZlkJ8qFu312Kcig8jtxo4cgff25TTIusSq25FJJ +yD2BpEfyBXrRCiGuOvuH3NenJsapVCccjhTlxZ5ywc7smPmbw9rCdHOxYXMzDVVA +lfMMFBCtb7d8et2lLgGLaMX1qeaVrtqeoUuZ5213QjJ1R6g9gAhjLCL8Jrxu5ePK +oLWFtmtWcSKetRooF4oEAPEvcQLF5S10jjV1ojr587xZUNFOTDZwg9q6shBIW+cE +RY6fGBC+oqsAlQC0YxiHGEMXgyIidcraE7BH0+b64tOjsNIIyTVayYW9MKk91ao8 +myOHsKOsm9L//F27xctNX8O3yx4zqXpfjRkC+k2iNpesYGhVMYrptq70n/5WCAFi +KfafKTQ8LKIn4TEov8zeyJCE0IYumLZIdXjdyAPeaweTGszllmf8pp0jj2oFopQn +MujlAjjW6FnfOxaEGo5+aF+tFDBrPLCZm8OPPbBUkElAaE9JVHUm+Gz4ZPFsOUU0 +t34cZFBQfd/taXRkpIbguworS6ogGmYWitVBdCqRtTiSR2ZdOeacSU83quhtlj9k +/n6OLaXvHjndygYR67vN2EGHITITLlyUbe/Tp0o6jyAeq+uVYImqjm/E7iQZMbki +vsT3xmSMVxbw3J/brJz3pS99m1GYs8QPhBmrHhnfaWxmyrbJc+8iE/eqQzPwsJ/6 +I896DlyDCZiuD8HISi7pOnhulF0oFKrLZG/q2mlVLL3m1eNEG2oXKrEBBE+IYHiq +TavDjDAojg3CKVjiPvtxqTyAMzRbUFt7EMWBVbaFk8wXVGeu4CZ+FTiudjV+hbNX +xRZalb5cr3/61Q6WWoyOUmoGUchwle5TOGU7k90nwhUms0tJ+RXuC+ocRkckAtmk +qIo1f0ivvSEppXAfpXx7D5Qp9pKAK+AIrUDpZ4RJFm0QOjvD9T06BiXTmG8bkjb0 +KHv8DaFw2e5D8YLx1Y8L7TgOFAo0Tj6buE8xzp+m4mIJqkjY8EGTkuCzjSemGP6V +lPdlFKSQKxpJOuH1Ckhh9bdhz+ZvSbLtH2m1DUAJu11mGbnTIcmIeE78CW9D3Ne5 +KBXfbmIUW9gNspLpvRZbXjec8MkV+qhu8lj7PyVTkVqldQqk5wE3Pj9euJwMSNRs +D+nD1xJF6ccXmNjbl8mOjPPIafpE8GGAoGt2ByoVDjdw5j4ttGJo1achh9hHlYyn +5L/0Wmq53jMoD3IRLY6ijzPoYXbrW6BtQF1KneerfaCg5+6vBFhPLx9gaSzQBM1X +jX4m+z19LKvOMVF1pddqnCK1ZmGZmqRzz5dGdejgmB7gvwUB4EgzMkMbw+/3sJMX +sNr1rSaMFRdoM3F1KvsZPaGcfxvWUBvvPNuuim78WRqYb+8ewN80KSRoSvSmbRx1 +71MbeCaYmMeAkv1BaM2tdqiHQs1/HjGX7B+hErfCBkel9pzm5jH/940TxSXxCqUm +qngc/rXluWJyTAeOBq/vIEP43Deh1QGff+/NjMxn/2kSmVqsfGokUXssBPCmaHg2 +ONpDeu2+tCw7Ba6l5fsr7yuvz/cmXRNSvJ6lrxGkJUOzNRVdEQBX6mjFInVS0A8g +qXnQ2sVzh9M9tmz4Sd/doFlX3Uq/BKGNvLEWm1erM/YMX4PHG9naeJWY27k4+2FU ++MknO4sxGd5rQe3buftxPZVLvOcyPWxSjJGWTATeTL7DZwAe+YID2iHehtllJ41g +VFur5sNxQCQB3/cWhL4+zqRRGsJmx0xLzN/46sH7C/KJ22e8unBQ3WLS2zfanNqa +27bCb7hyFkhglMhXp9JhqU2VW9VhHVWgtNDwhxMyqs6roDRYiJTFoTrU9CEkKVsE +GUXhM1iwSXK4es5HFlG6GZkoWb30gApt2Xg1QQ4HRwLz8o3SxtZVaacluyPg+kZ/ +3ov/YC+r+SJVgs+q5OiamS8AZfFqntRNTfe/ZdLJg5bQ/uGBJ1Z+xCn6DN0Uzz/x +zZ8QMpeZdXSA4dIl78XP4K6r7aEYPzYbQQ4vhhxXHy6fq/R2mfCO2G4Byr/fm9Lo +4OHgr3YbT6UJLhqW8KRaleJrpsvZiZ7/+Inxmfr1xyxZfyB5OKeJyqkUqMJ8xwl0 +Rknrh4Hsfn78Js6lusr9ZfF6fSXbslrbtZdR0ZPQxGCS83PTSBXG1Yj9n3AAygAh +01LgCQJ0/JKGbIWQaHqbuiCLnd40n3MvWSGD7iVkJqEVHnqbzieqoK9pmFB4exhg +sEaz/Mhr6A5iQ4WIeBhRgYXP/syCrji/xv/z2t/D/cmVLwgEPpnaJtptK9q1OvWf +tjgIQFyMR5r1lJhBCsy0toL8fisp4v3dXpTOrKDFqemUfyT/v2ZvroP2c7LMZS3n +GudWoqA0CwiVNZWTBDKSjlDO9VTapZQgPR33bDtvTBptkbUkQJMdX19wn1ET47pQ +bhA7UsAUn0h6RZvDRKgUpxgly3if9k0jd2rnyqRg5kTBkIsbozzKJUt/fMUsJr44 +5+u28Im/SpqsElNmGRy7GHULM/5os+Tg8rhvbAvfNrqkxCheSFrzonMvSr0RRv3J +1QOJU2mbQFiYlB6kp4yNNqZT6iWlXhccP0M433/lx9nkYP9QT8dogx/vS6hXIlRX +4ewELZDJx/xMYxE2x2D1PF6Atd9RntPeaM36rrp5CIaie1z70dCQ8+tf5oKJUi/h +mDXDIW9qb6wjIoU0n6khQbPsLRUGhpyRQpQ+ViavXQGpx4jq7YvCc+Z/HlRK5H5h +X5oye0RIknjNX89Exv9sRneu0ZBDUl26MkeEWPvAbctpQ+0DNBiC/wiH1KtaHEMX ++0cQLmrgUk7PJMrf7rbRWb5IDpBG4UlaHoyZ8nCzcC0DeZqSIXwdrCL1sp5S5TS6 +kWayFkLo2oCJlx8rCg7e8rYso9P614nlzPaMv6SmtNzdlThb6LdtiJtH0t9tNzgO +1zK5XQeSy78LQ/0+/vpAZtyd7f50D5pIiJzXpRx53LORa4G24OgMkQmYkTVP4Xug +GcO26PYqd+9MQ7uZ+UoaiAVkf3h2B3wM4+mNcnsOFQ1F0X5C/9E16XsaJDu1/EYT +fYdeYEFgkPzmJMKq4QIO9VdpihSncJWR44/fFO/hMM9nan5i/g4Ya7b974bw7lSQ +Cg5GaYXEqgcsn4OA8+/mdv5dfOm2Jdgf2206oUYP/qJlGb2Yq4WRQb+fJ9DCzgMD +QP/9ZgTur1GZdLIQYrr3ObDrD84eS0q1giP2ZEF4+qZhH9f3LogkzaCyCGcOJWnc +nRbgW8PT31p3uOPdzo87vmGHPai6ecd7a6fFHIn/ax4k+kicOh703IsXeyuoX6dA +VOouTwcAuaGLvHSO0VryQMsZR6LNjfhdSWQE8zA0IFFK1pNF50oZ21iaAiuTlhWh ++6jpJontDAC7HTVPyqwPivTIlgSe/RnhVmsZ/Fgq9hPvy18MJXdFSA6mde51U7I0 +e3ixWLQeJD43e2WlxurQAG2d5xA8K9N5Pz748fKcIon/88lAPSRcohiLLv3NAY6n +dSCpx2rNbIyttUlkorrNV3Kzusd9SeJ031ewEsALXldRkCs4lAGGS8HSEj+hEI3B +qmTCwQ6BHn1OflJ7rj54X+wja1CIu+Bvq9yddcf/O0EzOgs+LkgjY11hdbZWQ0OB +dO2IrNdjsHr0C5XONHd1HD+pqQKr5aU9Nv1fVus/vKW9NAHn6glwEv1/hrzdOX+T +PrWauwDytN1lo15vUJEjCeZ41A88YkqErSb5zNdS/pzfK3UQigJzLbKDSSKQetaP +hrdpov8BcjUU6sWcSUMqFlCEg2C8WKFYjC7ZgEOZ8yHtPBxI/0LyvQLxKknShQew +2fzJ7T5dbJg8sYF5ZDVEGbr1hUp7pJho4RqKSrW1rcvbLtZeRhfEoB3z4W6fMGJQ +jM2MpcP646rXKcAdFltA0cBgmx/50x0e+O4gEujrcwspJX6YPprzzYyndd7v54RR +FxArhO6xJHm0+F81ZN00KoTfRyGAbH5YFsk7voHl4wphXR4fjAtBp3dAkdif02w3 +czpVBSmiPiPtw1kfTB+RjaD/hi7+cygVvwHZ3k/hrwbhHomq4qE7rhIGixu5+WvK +32U5lSvR0tucUt/KfLt3e+47QyZM7tPeq5kr9/HzQ8vnQn80d0Aci3dZi/RQipXy +F+TIPEhcXJ2L04fxFp2DjWuUsY3FJBRjMbCZMra1Pc9s/3BD04+BmJquYBszALZp +QA1j8wTgl4jekRQonvTrOEPk/9dwlxcsgSMQeLTANhQqPXipa5h0nwCwDfgXITd5 +TugukxWbtwjAMugzoeylXQ0HVyR4GcZVqoKKPYwbZSKvHcf8Ek4jmGLVXGoSUe/J +3j/165i8PPidUfmzSAh4ib7MOpQ75M1cX45pSKs8//gGU06NKKcWQ6WBUV6KEGCS +heQ7fif737d+LHZMlOiyZYWPBs2Mjq8P7TGHLCRIqcz3wlg8PqVuKBwGZE4gYTne +j9ZHaNH4TZfsZQIo8oZS/JQ64ljLfpxq8lBFsJGmSUXd+CwAUGpaEksdLgcfYC/Y +xJUvPWJiOPNWTTjkQEASvPbi+cRw0TYiHkf+l5+3ZOJpPRIQeyQYsC4G+xbRjVx2 +BA6T5CULnPHgePSNvINb/tkYcOVHnrhI3bz2nLSTCr7QC6yk7MaWwG31pVwPNEIJ +pNg/uZJJWN6iKctxmaOSRy37BFdH46I79pMjEV4F+JwQij5fL5yZILd8KvM9DQNd +WhDuYJxa4wQwIGCCUvbYWGABkanUoIWj+S+EWpcF46tm3roo3eoFQf7uk50nKikU +tDEIrsK5Zk6EBukC5XKHQ2Tl3SkmSUVl49BedwDw3pY5NEnfzGHEEDPqiMhHTcLU +G0M1wZmOX06pmYxvhkuREF2tyWSxRkHVSuX4ZY9j2zc93PnPXKY58RNDG2/FibKf +UsZCDHje4N6hH32UAEMnKayloh0Vpd4BQGfT913ttfIBAML1fCBO4Umm8Q3HQk3m +xKlfNlyESmcuNlt8aWGhlcgcFHK30WpeWQBky0Pp8JpnOoEZepd5MVNeKg4ocRzJ +2sM5lLIRQpwPkzZcGtk5XiALEx4iRPLl88s8yu6Sj+rd3B5Yuig9e8FGsxaOQYwX +uwHFWAljRTyM56QwpKv84UKc5OzSsRGgH7Bfi+YCvOS8vvILdVoM9KscSBpKeFtQ +m8Gs72WFLViS1UYgHLW0s7hy7Kl/+IMpfuyIGJb7EcrZjs8qriz4/nDDyKCP8aR+ +dgMrsMXUMNUBziTgMJEm0VeaGXKqgwGrS9K9yKybY1oxmv3gm2alWSHHyD6qvXne +Va8RdVs+/xi7Dj/hW0rvYkjbk+IjTBVeHyXJQkz/9J8m1m0IW562XjwCyzkICoXO +pSCroI3m5ei4SP4DXqTwenmLIDuKqMcfYI6bZ4IixIaufOngYQcbBQq4OMec1Or8 +zKs8Qkukc+yLabvPs+fW1u5y5oQ7eOkeZWzd30JbcN39dLmrPqavr+TveUV5Aio9 +VQ8R1qDxqtroX3y2C+eaJfpOcjdAmHwpKz1tSUgvf6DsLbOFT5Z74eGxK3jnfwkg ++QveAzQgFDLn3bjcbELnsbYPwWQhisTugeBHZbbISe6yiXd4jWej1R1iyj+nofzO +PV1ch4+ErpULlU9Hxxm/jScbI/TRLF373lCuJJ5/XAUD6OJlDK483J8G+qpPZsCc +Z+mJLulVxorD1j9D0zjUJfMSC50kLk5Zb/YiIk+p9p7MsDLILedntLTiTBuXJkFc +mZ2PT+hu9tBLS3GRwdQY3+tN4itbrmhRep+gYVWvNjbhy8Im6b5I2l6W5YJnKqnI +jeoPwFQkpezS0ZHZ/Iry9WNbsNucUt5X6WSM6t2O6ZrLoGKiOZ+tzq2knvlD+5gF +d3sZADYbJH7EAm5zhM3niYb7vtt6SCMSFgrSDSoZAbr+1reZUJxBcoIF+HKAD3kP +gPS18na9WzZJqSs+evtRheeumI/WHWgUWG103nR0v/Tzn3Z1Rb+eiqacHS/ctTof +O1Cts7/2rO/h7RMbll/K9oMEVp1wlmfGL3wwQYzEe/It4U0eLOD0Bihte9aXwEc4 +2Jjxgfgzb6BlOdyMMI/kI+hxk6mFmIcW9S5Q1oLQRAJW0xIUVfyU2H3n8jOc3RzX +PNtC8DQBxr2zTxOufk/cT9Ss2KYImeOQfqpRDawzgCmEsomy12f8Eyi0C4eN8xGh +3iYu9AxMTOdsVpq3mDHkg4T6dEHWWwnVDSRAe9OvXiWLZ/h2SlSAZSM7J9nqZykH +llfLXsIRio7bUKJhaEL1QgAnVQ9p8kjvXu+f3fLcJ01PS+SqGXKYvUD3AYlRFTUe +VWdPrOlvJYtWI9KGVrOFOMwZF97njFYESPIZ0BwMGJHOY5lFz0GarxaWubx/HVQ1 +kEqTlrQbohWtk348VZ1AFRtFR8Trxw7FOHHJK05Ezg8JaKGMPcqHPtwGjpgBd/mY +5FEPnhyutXtNF68n/XOZ6GFrPCPGRxbcj8XvavyYCzmwVvgnxV1ktVNpSi/SZ2kn +g6m5z8WWGmTKh8Pkbl0helI+2jl23x+hv5VOxujfdqswSN/6MPsfFdC7NJMRcCLd +p6kjhhgF44PGymq/5t9OWVlqdJa1YG6soxtjQzBT3sI75+mfrjY04gUJ/0qqDSdb +C6TXukSYTa1ezx0U5ZCzZ2I1Vjlvfb7tCifZHfVLLYJQrr4Ou7cjELQrqqEzSxsA +8c9THS3NHjucZvqJb+7LudqEkYdU5EU8+2aGWqp7vcxLJIA23TPHwESNJdKVGVSc +ZA6clMDbJ4k+CaqZwWQtShZbBlyPqXLxbq8FMlQPQsj1pdokB4VKxvKIZOz0yjst +Zuh13CiNuOkXcZW75s+3oDOTzYOVspMhNmkswZRKcUJDKYMoBqnH+WPw3xQEwzWN +Zk2KKOQd0rDjlaQ8Xo94AJEbCvY9CzeUQJLYDMvkZNd6KKDFagSD7sbmCtUO5RiK ++qfMR5ksNcGxkg/zVvKFS58DbzHTzBT5VWpiVVlLZBoarulEAav/LLR1iVcP2OIA ++dhml0h3+JJbsQGPJIzZr8JAaYqLBuUZ9ujCG2/B7t8l23iu3tY/jOTzvLRIbcPr +3fO93uMiPgfR9f1igJdL2luTAMWgiEeyitBTSm8RFTXdqXDxLq/GSqqi653AECft +yUltV1QkAXGQLKnQcWmYGS3Nznipfead2p5+eEC4zyLaiQz8q0Ld1n1dLwUMzGkr ++fEPo6lnY6xmHlBT9PpzuUjTyEt9Qi8MpXYuzdPu5wnhHRrq4yeHtqMBI5yzGnvR +n75fuZJ4IoHOr7AU2CrUO8EtAbEGjvOUcDJN9OyG0EL6EFVSHxybMwfrhn5u0t6U +wckDE2OG/Cwepw7/URCtZvuqmbmhlGS/rnDXPGWgolE3sYrzoc0oHrVWGJ451RrA +zcdZaz/3xkhjEk1JsdXRAqv8WJH/udI1DboLnfVtTiypEpL8h7U4CpfO6eFhWSXf +Izj4Zss9g3w54Xc+6oEUFeDHzWbpULhcmJJ4yX9QvKKgZx08TqI/tIC/bj1pKI3a +ESD8QzkaPPHdDPWmJRCBy3PL8U1BjKP6MjE2cF03cq8CirmKwQcCt/xx+SVGkYP8 +tvaln8Q067leWqDtpOIBhUeMn3zP0GFbMkZaJfiwxrIqczWGRLimZAwRhjHskjAb +LzO4BhoTzz/0dguEOMRXIOlVp/nHuNRavUWeEBeTv1WJFO5rfaaB7TpwXUcPTPfw +IxFouLtpr9/VWDIaY/TcUO0/g1PkTXhIdWPAriFkpo2qQXbbT1YaGgmF4zk+tfgp +xA4z7ZiPRCXKKNjLwwomAU5rgFzMF1TJuhr7bcC29YggBgaMwN0oLrtouY9VLNAs +1UQqn2eEtlJb2vB7QbYAuhSGq0kRtrNppGsgz4CUJy2wT8SLoKwjGRvWbKdvMnHs +fbyp8tmvoncmgxcBrFu3aqEijtof6//Fq8cUZIVBdOsMunxbUsEhFaeVjrDcmCUZ +rdEti9MDArggVjt46LXN67kJGNSp41WVNFTNT7/QqMmC58QI8XPMblZ/GxjtXq/0 +KouvQ2Fhm9QUMaH3TWIMdEjORMCUDIV93PsvIHo8PmmWh6wsuq0Uh6bIawV/h8Su +CgHdZ6oBRJh4j/8E3Ck96GeEB70B8qmgIE97MQ+DujZs65bCy7vPntiDRrUlYKZ4 +OHXqy+NPQM6lNbaSlxk/x/tGinLXOsnjxP/zaCN4TpmXfL2OHv5Xh3t7cVTLPsLj +POEwwKak93s8qsMASqsGDVeXJ3Ba+raoKAqdrn6lTQC8nEF5x3sx+aLmwLXcSM5D +GHJoCURNgvN5ejTh1wOd/KIfK1jsy559ue0vlMFbSGvB/mb2gYJnDWvav9fmDgJi +LT396u0ATg5WNzrUDHxRH92JpixgHuv0F84jdSKs31bJXzHNuWvfzvEldvysOaic +dYFmM7yB5Mqbjz08V4dUogeutdExIk7UC3BLkjc9C8uoqR2YI+T8G2bW4spospoe +eElRzHNe84aft5eAy5HKB/w18WubTDD1d0fybRTzFG5Ldt3kPBpVZXcKqTbnk4FS +HS/VlQWI2Wc5GUhQHlPW1R0S8ehTD+4xsSYP6f3+FQh0etkdxWyhxSIqyHNrq7ah +RtHzGivbPwa1JgQpGMZp8K2/X4AjJ28gCvEDseKDw802WFA5zm+IjTszkDPz1MSf +fS1IPyJBgw+bLdZxkoINkQfICDGlX3MlaBPNVr/71y+Bv+PbBqLaROt4yyZ0YTHF +iRSgrjvFDIbatnSB4UcHYMJaDJAIcV7AKwDnsykcvvu8oQxgWHsTAMOesrTRguSo +RwrsTj19ZGOolp64/qyM7YSiACY4AxB7G5Roc+i5f0WAgy7arTxlkQfBO8btzrX/ +5UmCOwXWZaZeZHjunceZ297eY9YrUExePtE4Eoc6LHeTdU4u0tBUTl0pRfcXseVF +h1juzOFl535/X5VlYMEcctl+ympbARdY9nAgZH7o4ZS8kRKdS//H6KKUtdn0Oj93 +03EIdIpo35NAsFP+bB9TOwMnSTkdNTee7XnhDqJuOU758DRAFkrLjqYbqd8hso3T +AMCXS1BaU6pbwNEPeopScD4yJ8QJAR8mHjEdUJOIwGXT4gZgPhHLZ34O10jdTM+s +n1LFXGkBA/Qo1n0BpiBG8El1r57FVpJxXmrPKvArKqoOs9c8yDSRHXt0kizxoLgu +PXNE8kY69pwE2MvAdo8dfmV6rqVsTpaJee0JVujp65f6+1C9gtCJYhAmldsqfIsJ +9Hw6HowLC1KgnlF6NvENWHUdqkU3oGXWBLvfoatZhUdwEur5Q/EgdYAfHpG13gX8 +cUCgq3tWLXzZBXwBZ8t4MbrxAsWTs1N9ry62p7mq10ynmpu5xLYI61p8R6TB9j2e +t/Oz/bRTILy2uPD0zNEYIUHk353tyD48dwE9AyIZryQ4ZTxo9njY98awYCb+rXOm +Wc7wTvdh/k5zubCls8X4d/xH7AkNetCd4TM+pWNV8T0YzhKuMAQARRIomuUVQRNS +Abu4L42nC4rXz9G3D8wujXv8/wel7a0CcBsS4GeGtSxi9JVzmK2IjH1oQAUjW2WW +moXClBUk7yKn2AKNQYnLZjBa42Xuu8NaI/kVgSHh7tVHdAATy53gGB+ct1e00Atc +TxA42OHYcR2+MY3maB/BeZuKthOVVajmeCXxzvX74dQj6JGbj5wNlWp8OQoaD6ij +Uy0gRTCpIS+43E8G0la7/Q42fI1mQjskgKcH/Wqlk1CVSlbthAfRnJpPwu9yZYZG +7zH31nD1G41OIShARXy3d4gaZkx9iRXKXhkqzrQcaF8C49QH9i4ReZMef6DR4nDs +XVPwj7OtvhBJTbEzemhp6A94+DPeAfA7BHqYf7gOl89/iftAOVlUipAF3nSE0xPp +X/ojJjm3sGMuvdoH5G46GzBl/+gUSy1tNjEgjy7bYiWtGfEhBe3VKX2KcSPfNyYu +j1KDq7oj+BSg85ye+10Aslg4BVayIrmPMz9zj3Qs7DnsA8JUf2mFvC3onZZDB+Eu +nW4BJ5C09syLNpRyTBAsDPpAvMQTEH5wIFMai4x09sdvp1cRKty4AEDZ2beOSq8x +WopL2LXKBLPcvEef+PgaoaNXXX/nKp64c5Mzo3Wwkz3Z8S12qHMHvS/RG9RThKqi +pbUgPakEGkW5xK8vHperNFZ8C4FgF7tiF5CJ6P70iTibTrBuZRGKczOJwUR0AsKJ +GSHRflPAvqASxXAnSTsb/RMidr/PomT6YYLxzV2Y94bFpi//12n4apuIltW+TxCW +GvTYjdtKRyvAb7qnCDJ9mr4yY/JJq+hBYL8o8bFu6TgClC9uQ67LyZIl75rfvV7S +gFYFusC9uYybDyDvrxncZm1RFBRnNsFY+++JCeSKvT1t8CcIwr+P9E5yHJOdjien +WTBGKgFAyM4AHskOGxxur41AZz5G5TOqaZ6btv6Z2kc5dZhqRr2O72GKXEhM/7Dx +582jBXYTIsv4xf8WOFdhIbjZiysWHfIBpWIOD8zn+TrZPJxA30RwExy3ZaIt3WY8 +mPoZXXHcyOJ+6OE2FZqrNnAxyngoZTbUMHCj1at4xuEw9lpLte4XnoF02x9OmTXT +eRTPFrySb/zMJNuOlNKdTYaWzX1+d1yUlr4ka22RlRpAZV8Jw/IOI1WvTDrB2FJL +aov2P7z3MArVm9WP+3mxNJWka7nPjDeKDsHu6EX+xTpYPrDkapqAlpzLUb4xvQe0 +1XTeR2uBofqR8f/gS3kjm+G4z54uWijRw7YvlsDMjbq1PykES9/evKLdNdAAQwAg +Ta0ea3nRHi2WcHGDzHblRtn0kmrsb9KeqjWn4I3ZuMThjnmGtqs6w1V9Bd1lLNAG +pggkNq+keI8U0AOa84GLUi7O/pFCtIdtpbwUxKZ2sUHKnyRwGoYfWNctJpALfWNI +DAKACfHg8xGFBop0Sa6+/IxKwbWjp1qdZ/ZJru5B42vScSyexu2CcjA9R30Y87r0 +S3Ve47fE/lc3JquheuGM/ryVAuZExDbd2HWPOwAijWbqrHP7NQF4jd5pVFlmn7IB +DwxHXADPIh0pePhlXpxc8ZKGtywdu2EamWvnIlSPURddORdLJTfKu4xtJuz2OG6L +qpu3THf12Gls3K9I5o+gW0dfa0rM0apry7pQzHKkNqRFVLIzICEk2dBtdt1UkOYX +OE2e+86r2L5o3CPfn2xTSAQ9/pAyP5Fpygv1XrVWNJKnVShZmBKq0IUAG7fs5d0b +V2jlhe3CsTcb2wps0y87G6d4bP1fHrnPQPyNAq/4JK7caG0xI7A8iI7fX5E/p3mT +7Bv7peCnMjr7k+DtJ8vz7hONe7cUn+MoEAAziWE2UF7dVO0ASigdLx7cMiu3fLyh +Ee8tMlcl5+8dyMR6NHf7dk5GQXcnM2wBeRAQsMXVv6cq9SsO3ZUc+Aa9k5mJ2gU/ +qd5jNDgujlg1FiCFBZ9m5YIIFrJN/Sm2mpTSqI99kxnQxcY9qWAUNZjKYVUBOZD/ +B5Z2r24vKDhd125ptgRd7pNOrObIj6zffwNTx7yqMlUEPCFFFbvYoxnFWdCf3E6O +XTr0csGxvKTAh1nSef4sCZCa2rIsAsxMe/6ltnFz4kXSeXSj1EPDziJ2A02fA8BZ +MIWqm0SYTT7lJ7lVi+Px/rk/XeRj900VcTAr7ZFKESnYDyBNBrJnqHEFh+QmXlYA +dAvASKaYPJqNCVF8VSglvzxyQQ3RX226AO2ZZOH3+lqmI2BdJjS95qAIQ3G+vmxF +K8gih/QF2kohke5jrT6YvMCEynIwD1TCYP/rKoIu7UznkSxcQtP19b5DI4z7HJxc +rq0cKdxS3rFdOvSF+suOWY1z934xX4HVicbVwPBg7JQi+pqRmB+xoGqnNJSkOnM5 +1NI/XY3RvPUiSjQ4lX+pS6ITOKYHB0GAFh0/Y2olY58sZ5VUxV4phyqhtphXa7DI +6Avd4eBFN2cD7u5gjSFQL0G6YzSweRc08RdwJni540X/Zp8wASTYvnJoQTaI89Up +fGZkwBC2aVJ5PvhpHvVyNQO6sSEMeaZa73dgms6s45GOj/VAzBO/lr+8JiVW2Xwf +69pZ2pC2qz/ARG2IZRIlpL0GplgB8jp5VShzSgOZPdUu+buwEIKFkanyoUQswh1Q +P7unzaNq3CGW0vo6ggaabLEs8g1Pn/E0mPxI0HF1D6H4xmpH8G93EK5ywy175LKI +wFYrg7w7JZQQclJpU7EAnLzuN6cNLgV/78i+TngYcIOcoHsZMvOJsEujBEx4WbYn +EKB4etgrBh8ZUXKio/x7ogsSbMMTPgbz/8VHOr+9TsgDdpYDQsM22FqrqsXuUJ/L +66s5a9Hl7R+PGYs0nHPAsi/UaTaHnGcIjPDzATWLIAzEgOM5AgnMMiph8GQWla4H +klkUxbb/k+XFTnwLZoXum2pczv7GLgkqEW/kjEmJJhEOyVGjs9LlwRJ7naUe2JKC +wnf8N4l77ildQUAFz5x87wzmAK1dTAI/OYwz4J6bmDvKUF4jHmp29zWJRqzwYhGj +XNo6Q0yKSuvH+wB/BFTy/frwxJCdCK0MAmo4Ch9SESIc4xqgI+7+BpKoQA3LK+I0 +Z5Kt0JcBbVrH8EekTyIEAw9Tevervs7O/r1/3T+sgf4abA7Qh6VO/N0wQEwtGyDz +fXprLJUae0txFmYSiqeIFICaEBomTVzIom15HjnDutyatKxTg0CjT0shiN1gylSU +ijoi4sQIGdPe/nsNtkOZ/zWYxkDETONPgbx3aErw2FrPHgNxOqowi1XpOv6PUNCb +Go+PXeyolvRQUVo+xzBIRE2THY02yWqMzVo9Vc0K+cWKGgc/iAGtIcijaygPKWfD +G1qDU16txfj5zMmezB7RAapQH5JKaicg0vI/f/dbqMRp34dj7LDySKejygWJ+Cxb +D56O540MERMQTir9yALf6D+Tu+XaOhhYwh1w2dR7t4OsJ0QlwMwwkRCXdduh9lf0 +Wh8LE/nP10gqARd1lLCgAmY8q+XpbHush87q5NNb7OqiwYmGRPN6MKdqxM3fFx9z +yHWQGHuW1wUdg3D4R0wu553bo0Biz7U/R12rChRG63WLXSaNXFhbN1ivldGWmINm +Ty1tsmj8LRLNC8Vtp4ILyiF+wKosivwkpnpxMCXC9rluArwb5962wqcwDSSAF6tY +yo00xkVYF560ta5g/qWS+WOPBx3GTzyGAMguIfyquDzxMZTvFuUmgGrSnwpdaQfV +lp5kky1NgVZvFqx/AN4hQABSlXUm989pnSQT+Usshuj+wnjIbh3Y59sWoXJoDunJ +yJWV9wSNzsId1F6DrO38oIFEeU11VWSFuuKGnXfqkxog60DaBmWki50vcyo5Lchw +eCmeHbhQK0vgdRMCB8iJCIFFykm8FYg6S8IJmd6ENZIzOVDCSriH0wluUmbfZlXp +3UvjbOrPsMBStLL4M6xyUm+YeyQFYhprLTP6IcsoYh44i//7GBE1Bt1jQ3hHCIYs +1TdhHOznwkmgsenNEfPogt4Gmm/8LnkOjLFN+vAI5FwU8rpg1Qoyky+OlufIb0Z+ +CrMvxr17iNpgWmyu9H9AndEna2MVtMWFgvMo9szZLrOSAml805tMfMubFh512p/Z +yKABI6f/v0TjktUwQ+5hRpTGhaMU5/mENeefhzCIVUzbDkoe/lfSXgAZ8r3LLy6Q +omr+5UNN5bwDbsaKZ/E2ebMRlBEIYxjjjHzWYddUZASLE7UKeEFKrCFWHswlIBnh +qOvK7ppGtECa/Xae1BDMJ8tzJOhdul42VODuhBaPBt3inuoDwHQ+WDFWutxU5K3I +iNltnAtqAcDUKQS6/KnSZPAAzkBoAC2tZi4s9ywQW3CyIb0NItu53swyM5grsx4s +E/3VpXVRyVIi6IhzVcu8YyJuik/ihmEs4pCVm3lXxLLU4guJnRJCX9t7cGbvCV5F +ZObuOgdbrqVaXAgx+E2e2yRHMV8DHyfzcBoKHQg/w85p2lmPkSTPRRhaKC3IPtX0 +v9eRAX5TB3y3Ye3y3AwMU9apm5PnbYAmCdfv5ZSKKW0mk9DLNucPaDbkvwJvqvr4 +hQNIk07xO9bXiFYAVvsPdKllcNpBV9UAufcLV3233uIsg6BdNAyX707MXWdDmXgA +7NcvdN9vwEVR8EF/+kDh17eWzMNC+AWs6sZHOaOpJ2OyWuwduwEeStGGqu1COC3t +rQGJ0s88Qp7K/+l8Y5+R7psCzQlaV9jaw9QyDRlqklgt4ZeD1Cc36GppKdtbsGHY +WDcLZiTiQYUKWpy/KufpgcXhAQxs8z4q2yPi2egJ4HXWqzASwhEhlAzO2CgFhbZJ +4dvRafSSv1NNZNRnWVHQWcgtKQoIyawa0qAzbyD9zhiqCKiU6+cy7pVmj4125kfV +xaB19AvhzgYOiCMcLNVtdiBd3yvdS4hPxIVn+FenJ+IWN6Vri1J+4lqHSFtJK20H +yHeCBIzeCdnrK1511Yva8bGAHZwuxils2HMk8txNnlfBTql7L4t5dpAm7jN5PV8T +ttsqLNJZjdTY8fMkew6q4jkkKpJ+w6jc/zZwkn4iTFWgmvj+aFufhhcYhV1OEd6I +8f+vyHbfZiNLyy6mFkqu2QPWo6upqHv7tuCn/oMac2ls4LgOWUgtPu5BI4AktSpD +cw5E+ezFPdgZAokEtpR5u/rbAlzTXSkx7Eqe/GIQSRJkoopj7i4GpF9JtS7Li4k3 +68C86Lo6i3zvfokSyiQpd+nRBb2UohLOuqLiAK106VJq28WRcgbLNVL18pWkFrQD +CCsjWwVgeNflil1nbPEfhNG2pjW9aZX1YBGrwwvJ9vxgxmgujKjAv+mueH04y0Ul +ZjRjvUWEtnk2/w3964WuvjvsF+1MszTjOBR6cxh3p03xmnZzmOYa7mh23mpqjrnC +ilgaVt2djNuJp4UN7a6f1VW+QgkmZWXQ5pfrYk5COQ36+0ju4zv+vXTq4grj7Tok +/6pDCjayEQaO9yqcdW3d1/XH03h631uxqpwqaY9nJks1dUoJLPbGBoKddzoGeGvi +fCxf7J7mRxxruRcAt8IA+6DjBddCUPR76/mT85xzvqKYk2w9S3K/+98vbk1JA1TY +AA8xFd9rfbY4anH6Fk1mgORUKSKsRNwTxeWBeXITLtVA7gXw0iOVgb05PH+uACc2 +4mlipMX8dHMS92GymKspWQR1VpKFvaioVE9Sux6oA5XpXjt1Jo2l1L14b/I3XMXB +K2QnKZnO+Ayw4siMuiotDVeYyKaO32M3qrUqZTNyVutcx/aRGC5Zq2MomZE+V1+j +n0819I2mu0rMrjNsX8LM8GBFCVJqqWuytX696niHJ3NFOl4NvfMVDVDK9QuERvjC +rFzmN9hXDvzrKYAGAiuv8HUZVzsxTMVHf34bODaVL38Y2S43zHsiID3skm21ob2F +3hmEmuGaGgiRtg7HDx8SYWUCnjihl/sWmH81KVrI93qEW/1iwlfUwHT7rK0s3Cic +TQs43HTgttZJ7MdjITi0U4p/SIuHlEOT65SKAVaDIxxx1b1Almi+UHd0TaNgDrz4 +lhYxiNpIp/U1U5GyA4QvrtKrwOH4rpEPolLeu25d4wtR6UGZs06CFMMaAMQlQU/t +24LekrvgfyeD1sM8T1Ao+WvifFc+A1j6nVLiuH0E3MvskLajxcEIcBBu3qvSVLRa +eeV4qADOjPPNWcCAFHxlr9v3KtNhE+GyxWk4tEqWckOdOCeRttpLoQBQllQ/Fh03 +8tZzb+8LOi/kw5kUIkCNPFiHAcEVihi2BAIRtkxOlLDhTW3SXF5eobTlTB64G26P +YB0FPHTJOvu/4vAaPx9h35HijXlVweirif0sqn+gVutaJFU0YU0bjfBOKd0YSK4O +LeBISexnxDWSmbuhCDz6wuQ+xTIyQ1IwWIJz0Vz4BH3kfA8XFT3vdHkddOVj97oU +RCIygkTZpSMmF56FCZVNstUlyBRUbhG7eUUOjhYxp+C7aGxVusEgLhZy+GocpS90 +fH/+ZtQRFDvjrx8RfjP/RyfyVUi4gZ/1exAO1GTsp0e0PShhE8oy5GoHVM2a+aH9 +yaDVxftX5pQXjeF4Sv6krnPJ5EQmDLtvw3GxDE2pDq+1QBcif6slGO5N19Ovymwd +eHYA7QlyX/Uj2F6lBurUTiS/p5Ep54v4H+dcMlGYxw4C6AUlzAumYZPKZ46v6VLw +DuLvqiO2X5FJk8qUb/Il7+ChZTHcSkoYaMyqGiY5J+zc23BkXhlbpS2GQYJab29t +4eqj5VaCRpkOIUg1AyjIvR0/7HVWkrfWmSiPDtvjK4UorsKJvS/1Kl2itet+BUMD +AK/ig81UuMQQqycyaY2LCgTAYhCRXXFXla7At95tpcXKv6/ueiAoc/zFMr1JAIVF +ro4nXWZvN+8yuowj1CDxdRP+zCG/3whCD9vj2Anht4kqATmC7QeC++VxgejQhsj3 +u6TAfXx5foZHZylxfOdMUO5GFy+ByRbselP40UXIwv3V6H2Gx4npNtRb4HXypvxz +LRqTqMdZLgu/SgaELqI6AZOhQhsQVipZXzpzjsjKSlwoXn7I4U7yu/KzYSftYnmP +WhrngCYxUUrDw7Z8T0MmrR4aOLsUjqlxaghYZxrzxVh0ug9yK0IlSKStBhb0y2G/ +U3NksB5MM3aoQtB0t7Pz1Fxx2/iNEC8vKi1inABWPkRj5vlEhyIYI2gZB/OPDO+u +hbfjpEK9Bl9e7hlL08Ck4v3YAC/500ury7l22S1nAH4j4aweAYE2vCXhVhq2XCwV +wlXWBa0sYKhlSAlk13CqsV2xEGnqO1jzK4bY2uvYjYGWrHPeO8VtGLrOIRpy1DmE +7i9b+nXiONh7ml87rGtiYVvQ1y3jf72w5kpBaQcCdaWlYA9q0L4M0eHHD4bHvBZF +6XO12tye4QQG+s/WlRlxQB4sNfHs0l4eGUI492r2wOwXkHMitG+yt2kJqm04ZgY2 +vcjcxmsr+aGkbC16n8sqsvj1rlkdo9HR3kogsDN2fTiArtDonXIRJGnk+0vaXQUr +C6/xFOLMgPMaWsnCAywEuxHAIXjXcKlrMRfT5+ix78PnnhHjIReSvF4G6mmP9Hob +rBhaQrZbkfshFA4UHZ3+sB0yrCKVOYKZjJ04DEuLxmwPLzasOVxBqxEtg8XOYNAr +vO/3n0nrFLAKQr3emuV+nfwY3nctyW25qJLV6JVCmACg7/lH2XJbyM5SviUAaI9a +CFjzHh0L2oQIxgedWHLw4aam4Rw498n09tFPuEp3nfLK8VyohVJ2klAjmiEyaWpG ++ay7Q7lETfH+0K/m8Cfgf+MHATW0uJ2o5WoLTeghgXS2mVOd9cOoYz2YD3D9tEMu +llC2RxaqLvaDSsdFEw3UdhaHkhyk20t4Pxy/Gqdo2ysJuLnmiOCa6Ew0cGs7OqR/ +VXyNAF/4I4Jor32MoJvt6hyh2DyhjwJUJhZfIP5hTqPQ0VHHYEHjtJLq2iIGQe7x +I479KOJRHU/+PJxWxv4JcVSJGhLLUP898DBAoxjNSjf5+JWsezBAeAVS8R6qzDK5 +rENNp2zGE8bZDoTs6NFv3h5P421qGIUZ7lf/VfJCm2uKC9tPtPY8/7aInhAjES97 +4jo+5iSdX9zW9W89M0Z9mf/uvlQpE9p8rx/bVrMJ6D0/y4qSJhL2uGSEGGMRg898 +MVNXA549CAvEGZLBriByezEU8gTP69VSKSZB0UWIMCfwXL/7AMZCwbkkPxtbzlHl +SRmR+g4CKmb9VtmoB9YxNFlJLsu/9pLL4gYUPxUEW95S10ZsEAOhASYs6uyCQ8oP +LMOHJ8h1lezMyEWjjbxHMxAGaFzrLGcdyapjoAOfENQnBHmYDc/qWDuTIUXwGWKQ +KqeHzRVgNV4vBxZIyQ2UfKjQWVB842V7srECnVO+3ZdlGZ50V/oi3uKvc4CXWTRX +zS5RRaKS3IdGu2gziaBpD+jP8ActKUQbKDJcIQkdYv3WSmRcO/1/7IXRxMzmWX74 +RR1tvXadwBnXE1764PszrX6Nh0QWeRq1wwvgw7OVl0efpfTgKEJGx5r4CyKq2O7Q +85EoHVOmUlXQW50ujqslSoqI8Ok4HCehvUdfAb6brCChlwaFJbLPA7kxr1Rbfjpb +N7Hb5UZ+C0hCHibc2CVbZoYByW1lKdIUQ6lL7etrhYiQfwUrmgen1PPanwc3b014 +1duZQZd1DXPyxJYN+KS6PFNnXvk/I1i0erfJwSOF/TqOPvI5VRiJNd3+fR7orwvY +fJG1Wky+iD4RkgISOpJ7/kOAEw03KqWF0POsqFizLozk9sA+JeeiYh0X56C9KnwI +DE0roW65Ry1BfuC/xE1RouvRdhIBOyEjv9GdP/AP8TbXsJDYxMDCzDXXcuevsNst +u4GTyqk1HSGZEZ37Am+1nHZNNKVWJS/JICTNY7IuNEFknuV6bJMZwAhlVfiON5AX ++sBe85P5Mzmi8P7vPjh0TLI6oASUaBy9k5OlVEsHi5AZIx1//zB1saKEiVchwc1L +UGm61hTMF8Gzd5FLyw32kpdbot6BLsD8tCjivxM+m8bNrQbhZSfny/W5m3oVMiUX +oHF1biPtmZpTvzNPNSplVeq4OH3q2ksnyIyvb6+72xgsyc3JLWUZyveZhwbvUZks +TAbNkQkgqgeIFzxacVgnU/BX6mWKylwuqUwu+j5oh9tfNKZ5ZCbRvdWZOLQ7Iqr9 +qN23GWHeSinplFYyrFjrP+R3L1BGUtTrwU2BfmB+56y5cE4h1vEcgDScQsXIOb8i +zi+Mesptys//7U5CCU2Qx4fh0vr/GmRKl0HaSIv72DJaM/1A1ujXOPF6B+3Penyo +99PqDfpve3KGHLTUe0PNEJh+AiQcXteL02Tku04FWxiw/kZoWlXajQo3D99Z8UGE +zMW5DpXsSXtQIYOMe0rSd6ipBr2K6xYGv7P4iUFSOMQqtdy7cWtL7J4JQ8TnR0La +nrVdNmlGUrLzhICXU4j9KnDBRl6X8mCALyJzwGEqTxJsIHN/SiHD3jNUrqC3CAxN +csc8UewuSOP/n04O9V/nuvux899Z9Z/bZOWprsJlDjaS/4i0N0yI3Aa+fQaT40j4 +1JKcbCfM/+yq0bq7ArDs+DSWaFKYea/vsD0HXhiItATDZRtfIDrIveZ+gAPD2A4a +i2uqS0whj/RQSpN0Qxlj4t7LgsTmKuUYAHYUNJMsZW7dJ1vo3IfT97JkNlg+xmcL +TUOSTzI1BOazi70hDkuT/Zt5mAaxPPLYg0/Oy+NxlHqFFlPvSKk2XNWntOgM/DAi +e5KkOb3Y3Et4cwpLP6YSPmFaKTrF7bTT2oAor1VAp6aUqKpdGnF9Ccj1Pt/895zo +xpk9hCNQWqNPVAG6dwnSROodkLAD9COSDtIgJJKa+3whgBCgU6EwVCRXOWRtftdd +CftfnUB0p01LVwE7hfKyqE9DEMkradhZzfU3oRs33tIZdt9CvNci7n4biPuMurIR +eahJbpDvaKD8BJWcVl2Iba+O5xhoK8F5oapBo+/aoaC/z3WEbDpQ29aUtF2x+TGb +VfeUyzg0c7x03jSG5ZZaMBEF9IcNWb9QCaePaw7m/R5wcfKFP6IAFoPKzHI4L2rZ +1E/pm0gegD8oAGcZp0mJDK3F3gQmbeHKxXU7umipx0aH5qcpax4v6islRcEc+O/W +ZfUD5gODFdY6DaMl9Ls9zhAhtP12h+EcixXfNTERrBG6TW+iKFO7EZhr6gYzV0pg +yi5tpktqV/HbC+5gpF8LnXmLA4Tzo1fxA6ezH8AagyYiTrNCxGPbdII1Nn09skZL ++AsOUZEzpj3m50eurt6kLlg8dtG2YpMUU5E9Uv9nvAaD0ttNjKxmpf81t0kKYvwA +VwOpqcHcx9jafycY59+ZyY0mVi8KnLGuD/lQsRN8r7I5ngk9o4fJHLMrQcsO2xt7 +a/opziXJy9ixcCiH0mAjj2nFNPX9aLquIYpCZj2Ch0qdLkVv2mVFr6B1G1GHL5kc +6uXcm9UYy+s/YHyDlcBjeiT2FY4FxW0rJvsHezR9Y9LQi/ApK9VFjRVgICPoj+St +AjagADgfNWU9qv4W9YekIAj1EsiV8g7Rh4TBJlHtHz3lzT3npP8EfZ4ZIp8Sc7fu +leowereWaRqFBu5QoN7WJUb25pnHkTxv1P5RQj/6Oxbl9sgj/D6UpYWMaOAq6bew +4IA3gRTB281SKvnLbdmryuNbKJTy7m1LB6lXKe81lWPuMyb0vFSP1vd8RNMWMaEH +g77env2MMWfqV7sHGxvmK0NqNVfUl8+upq5SWG+7AQddOXrQjhaANOF20AIYGc5i +sLXp1GxgVu7xU9qbQON/oa4qXJQF91KslLRueOwAo9HgH3SUYlrXm9Ntsp9Z+Fe5 +dt1JBFfBrCl7DtW47/mb9ze6GcLJIDyyce84LjnpETHb3h+iRSzCVvMYjc6ZXxGQ +Tl9o05C8P2KWGP6ccba+/LuCp7QE/kKBH4D232HQWUrOckwCFB1jWNvgFjeHXPt1 +iC0wrqHRAv0eM1IReWabOkxijUnH+JoiJBH7/fQdGCrM5L+tgH+jepUqjDH6RpRx +7sbqk+ev795jXBa+9p3QvPJc7cr1kt3u6w/PLh5BXJiqVhSvnG8JVm0XBRIJut1F +w2AtLe9L5keAahQe3HLon0Y3pVFxH31DIdfLLz24q0WXgY+DambicOQYf1yyyOzQ +l8Uhfpr/n/JGMIdQdvnHpiKl6ISvBKVFr5k0Ly0Kmr5PO258i6gKiZhOcVDz1RMO +vEaC1dxqtQRJKDvlujD+KZgpwVmP2hZXb1FIgpxlBhx+UwyUYEW21AyfmkJXsDn0 +0JkOkxenllSokilQel131CpQDEVpWy5DgulMsXvSPaoQI8t+kSx/mBzHdDDuA+8A +iHXstz00iwI58+VD+YpqlD7anx0RtT+wr/pjpv2wl3tNywzkpYbgu5gTZFh4NBpI +lANcf6HEbW9Gzf9gTOWTFg6NSV0AVE2jUf8M2v8S4h21hcHArTbyyKqiejNfhVmk +j0sR32bZvIH+OkHQgx96H74EABxhvkA3C5m5SUnh7CGq8fWsnSEgYCvva+O1ygId +69s2rPNfoWsQcG/ckG9UJwwjRuYqWMgW3BN+Q3gMl80RI9zvD7jlwMq/4hxVVYFm +Z6JYwpm1jWkCKSvCTnSIgItEqWPQs5y/nR27W2u/rCg6vFnC2Mc92+OcLFkMa952 +RVadPGEBy8UvQA2GI8YdIhqS7X3fMYZ3OKBlO0pnDRFDOcZvn+kzeEHWDagWaSDo +V2hDXfP2qMgjUgB5dprzqoGLp1/XyiwzzJYkIDA8kQXkDmr/sHL3fKXvf2XRuaix +72JGuMek6EKBfK4FKHQQ9gIERFbj4EOs/xdU2eVf8XcCKqmg+r7651NuU/gFIJVf +GJqveolkolAH7oDfDr1atmvzJaJmUryk8z2l52sxsTEFqKSP9akLzAiqDOB3CDBA +sFQYhC0aJakObfbEN9ojD6q5HqdJ53aqErY06bzt5C5xcrIojy5f20/VHupDfxQ7 +da8kgo5AiUpjszxhJNqU3dBlCT/WSYBel5oYp3A4/RB7zY5V8LL4yIMo91toLrlx +DSQ716xPWoBuacIrRWwf7GFiEvriSaAvB8sGwfEAL3KLCR3qrN/Sm+pq5tfpDcVQ +VKAki/Ff1m9q92qmRjyXnu+7J6tJISp0rAqrlPkKXEO+ctgTaR33kikUkA0+rQf8 +nWMqHyBO8II/GOakLdREwiiBzM9/cRcSm428GthJi2Aw+r2vo5xGpfTrMNrP2kUo +hUy1oDTbQtQzYodyQvKZ/wyJ587ZVpigMYUbZHKjIrmSdieN6ksXU9FnCwUy9WbF +GjsOXFfPYKAODa4DCVA0ePP1Bx55zzn+F0c3VN6GjgBbFsy6reo/lLI4T+SkT8mN +upI/Wzz0ciE8eRbPbfmiayiH5fudCEaZQqBegBDbtbUEEaUcZXVlIYuYe5Lx0mQM +eeNQcUHKgLzgV6lYlvo8oAXK51F0ktuCIZvrnvprEW5CwKEfIXlzJwj/WxcXCRHq +FKhlFgPJix17GhzpkIon76JgydJta0wkabA0XRMgRCZBb7xDOhrnSVJ2dMFjwQSl +8/fXc6IqoVwWXLAhrqvNedtlqaJdZfw9DG7tNMGJrrrPhFFW6gyjI1FsDTWthtUV +L7RqEkTdcFT3+FnKsMsqIjI1+CEn7JWsCmXcoPiAtB9NKiOyr5RjSKfwRQLAPfMg +BMNGoOwj7J1jEVQdEHI7idgAorOlhaXnj5VbnLRi7X8gGBTiRk0Ao7CTmooboguj +hl7xv9Ayru6NnZ5Me9Q1N1cnBRJk5qDU9eYOLvFrBNEvl18TQpzO3V3TYB2v2IRU +SVfAkwyunt0NNMWPcr2il/dVkfqbaCz/7s9ix86RtDMnTmjU8vkTTFsd5ug= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_garbage_leading b/testdata/testkit/armor_garbage_leading new file mode 100644 index 00000000..f65c11aa --- /dev/null +++ b/testdata/testkit/armor_garbage_leading @@ -0,0 +1,13 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +garbage +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_garbage_trailing b/testdata/testkit/armor_garbage_trailing new file mode 100644 index 00000000..67715acc --- /dev/null +++ b/testdata/testkit/armor_garbage_trailing @@ -0,0 +1,13 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- +garbage diff --git a/testdata/testkit/armor_header_crlf b/testdata/testkit/armor_header_crlf new file mode 100644 index 00000000..ce52d31c --- /dev/null +++ b/testdata/testkit/armor_header_crlf @@ -0,0 +1,13 @@ +expect: header failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1EGTZVFFV20835NWYV6270LXYVK2VKNX2MMDKWYKLMGR48UAWX40Q2P2LM0 +armored: yes +comment: lines in the header end with CRLF instead of LF + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxDQotPiBYMjU1MTkgVEVpRjB5cHFyK2JwdmNx +WE55Q1ZKcEw3T3V3UGRWd1BMN0tRRWJGRE9DYw0KaGphYkdYd1NMUTljM1M2THcy +aStTMlR1MmZpd1FISHNsYkJONkI0MUZMRQ0KLS0tIDJLSUdiN3llMzJNV3RVdUVW +V2tPM01QNnFDREx6T3ZUOXdGMDZsZWxCU0kNCu7PYsfOkbQzJ05o1PL5E0y3TFv+ +976qUsjwvA6ZLB6DMftm +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_headers b/testdata/testkit/armor_headers new file mode 100644 index 00000000..3ca00d26 --- /dev/null +++ b/testdata/testkit/armor_headers @@ -0,0 +1,15 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +Headers: are +Not: allowed + +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_invalid_character_header b/testdata/testkit/armor_invalid_character_header new file mode 100644 index 00000000..599d1cd3 --- /dev/null +++ b/testdata/testkit/armor_invalid_character_header @@ -0,0 +1,12 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +YWdl*WVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_invalid_character_payload b/testdata/testkit/armor_invalid_character_payload new file mode 100644 index 00000000..634b922f --- /dev/null +++ b/testdata/testkit/armor_invalid_character_payload @@ -0,0 +1,12 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +*PC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_long_line b/testdata/testkit/armor_long_line new file mode 100644 index 00000000..7bafc0e0 --- /dev/null +++ b/testdata/testkit/armor_long_line @@ -0,0 +1,8 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FYTnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lWK0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkzZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpSyPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_lowercase b/testdata/testkit/armor_lowercase new file mode 100644 index 00000000..3ab173d7 --- /dev/null +++ b/testdata/testkit/armor_lowercase @@ -0,0 +1,12 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN age ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +-----END age ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_no_end_line b/testdata/testkit/armor_no_end_line new file mode 100644 index 00000000..d4a2bce3 --- /dev/null +++ b/testdata/testkit/armor_no_end_line @@ -0,0 +1,11 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= diff --git a/testdata/testkit/armor_no_eol b/testdata/testkit/armor_no_eol new file mode 100644 index 00000000..49630cb4 --- /dev/null +++ b/testdata/testkit/armor_no_eol @@ -0,0 +1,14 @@ +expect: success +payload: 013f54400c82da08037759ada907a8b864e97de81c088a182062c4b5622fd2ab +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes +comment: there is no end of line at the end of the file + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- \ No newline at end of file diff --git a/testdata/testkit/armor_no_match b/testdata/testkit/armor_no_match new file mode 100644 index 00000000..f694a458 --- /dev/null +++ b/testdata/testkit/armor_no_match @@ -0,0 +1,12 @@ +expect: no match +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-143WN7DCXU4G8R5AXQSSYD9AEPYDNT3HXSLWSPK36CDU6E8M59SSSAGZ3KG +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBhanRxQXZERWtWTnIyQjd6 +VU90cTJtQVFYRFNCbE5yVkF1TS9kS2I1c1Q0CkhVS3R6MFIyajVCbDJFUjdIaEFa +clVSaWtDRnBpSWpOYTBLakhjamJBR1UKLS0tIHJycFRsdktFS3JLM0VxaG9PUEpl +UDFLRThPMWQyYXJyUmV6Nzdtd2VrUmMK3d9y0G+8q1ffPQ0xJJatIYzX/W+AeLv4 +gS3YeUcVXre9Xog= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_no_padding b/testdata/testkit/armor_no_padding new file mode 100644 index 00000000..737ed670 --- /dev/null +++ b/testdata/testkit/armor_no_padding @@ -0,0 +1,13 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes +comment: missing base64 padding + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_not_canonical b/testdata/testkit/armor_not_canonical new file mode 100644 index 00000000..a6c6f561 --- /dev/null +++ b/testdata/testkit/armor_not_canonical @@ -0,0 +1,13 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes +comment: base64 is not canonical + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Z= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_pgp_checksum b/testdata/testkit/armor_pgp_checksum new file mode 100644 index 00000000..c245ba2d --- /dev/null +++ b/testdata/testkit/armor_pgp_checksum @@ -0,0 +1,14 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- + +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +=J2ub +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_short_line b/testdata/testkit/armor_short_line new file mode 100644 index 00000000..a92d523f --- /dev/null +++ b/testdata/testkit/armor_short_line @@ -0,0 +1,12 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRp +b24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FYTnlDVkpwTDdPdXdQ +ZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lWK0h1MHIrRThSNzdE +ZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkzZjFzcUhqbHUvejFM +Q1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpSyPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_whitespace_begin b/testdata/testkit/armor_whitespace_begin new file mode 100644 index 00000000..91c70abd --- /dev/null +++ b/testdata/testkit/armor_whitespace_begin @@ -0,0 +1,12 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +----- BEGIN AGE ENCRYPTED FILE ----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_whitespace_end b/testdata/testkit/armor_whitespace_end new file mode 100644 index 00000000..22bfb398 --- /dev/null +++ b/testdata/testkit/armor_whitespace_end @@ -0,0 +1,12 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +----- END AGE ENCRYPTED FILE ----- diff --git a/testdata/testkit/armor_whitespace_eol b/testdata/testkit/armor_whitespace_eol new file mode 100644 index 00000000..d0a59042 --- /dev/null +++ b/testdata/testkit/armor_whitespace_eol @@ -0,0 +1,12 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_whitespace_last_line b/testdata/testkit/armor_whitespace_last_line new file mode 100644 index 00000000..f925d3a1 --- /dev/null +++ b/testdata/testkit/armor_whitespace_last_line @@ -0,0 +1,12 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_whitespace_line_start b/testdata/testkit/armor_whitespace_line_start new file mode 100644 index 00000000..6093e974 --- /dev/null +++ b/testdata/testkit/armor_whitespace_line_start @@ -0,0 +1,12 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz + ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- diff --git a/testdata/testkit/armor_whitespace_outside b/testdata/testkit/armor_whitespace_outside new file mode 100644 index 00000000..76b891ab --- /dev/null +++ b/testdata/testkit/armor_whitespace_outside @@ -0,0 +1,18 @@ +expect: success +payload: 013f54400c82da08037759ada907a8b864e97de81c088a182062c4b5622fd2ab +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes +comment: whitespace is allowed before and after armored files + + + +-----BEGIN AGE ENCRYPTED FILE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED FILE----- + + diff --git a/testdata/testkit/armor_wrong_type b/testdata/testkit/armor_wrong_type new file mode 100644 index 00000000..28f6d169 --- /dev/null +++ b/testdata/testkit/armor_wrong_type @@ -0,0 +1,12 @@ +expect: armor failure +file key: 59454c4c4f57205355424d4152494e45 +identity: AGE-SECRET-KEY-1XMWWC06LY3EE5RYTXM9MFLAZ2U56JJJ36S0MYPDRWSVLUL66MV4QX3S7F6 +armored: yes + +-----BEGIN AGE ENCRYPTED MESSAGE----- +YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBURWlGMHlwcXIrYnB2Y3FY +TnlDVkpwTDdPdXdQZFZ3UEw3S1FFYkZET0NjCkVtRUNBRWNLTituL1ZzOVNiV2lW +K0h1MHIrRThSNzdEZFdZeWQ4M253N1UKLS0tIFZuKzU0anFpaVVDRStXWmNFVlkz +ZjFzcUhqbHUvejFMQ1EvVDdYbTdxSTAK7s9ix86RtDMnTmjU8vkTTLdMW/73vqpS +yPC8DpksHoMx+2Y= +-----END AGE ENCRYPTED MESSAGE----- diff --git a/testkit_test.go b/testkit_test.go index 166e15eb..a354fd96 100644 --- a/testkit_test.go +++ b/testkit_test.go @@ -11,6 +11,7 @@ import ( "bytes" "crypto/sha256" "encoding/hex" + "errors" "flag" "io" "log" @@ -21,6 +22,7 @@ import ( "testing" "filippo.io/age" + "filippo.io/age/armor" ) //go:generate go test -generate -run ^$ @@ -81,6 +83,7 @@ func testVector(t *testing.T, test []byte) { expect string payloadHash *[32]byte identities []age.Identity + armored bool ) for { @@ -99,6 +102,7 @@ func testVector(t *testing.T, test []byte) { case "success": case "HMAC failure": case "header failure": + case "armor failure": case "payload failure": case "no match": default: @@ -123,6 +127,8 @@ func testVector(t *testing.T, test []byte) { t.Fatal(err) } identities = append(identities, i) + case "armored": + armored = true case "file key": // Ignored. case "comment": @@ -132,13 +138,23 @@ func testVector(t *testing.T, test []byte) { } } - r, err := age.Decrypt(bytes.NewReader(test), identities...) + var in io.Reader = bytes.NewReader(test) + if armored { + in = armor.NewReader(in) + } + r, err := age.Decrypt(in, identities...) if err != nil && strings.HasSuffix(err.Error(), "bad header MAC") { if expect == "HMAC failure" { t.Log(err) return } t.Fatalf("expected %s, got HMAC error", expect) + } else if e := new(armor.Error); errors.As(err, &e) { + if expect == "armor failure" { + t.Log(err) + return + } + t.Fatalf("expected %s, got: %v", expect, err) } else if _, ok := err.(*age.NoIdentityMatchError); ok { if expect == "no match" { t.Log(err) @@ -151,19 +167,24 @@ func testVector(t *testing.T, test []byte) { return } t.Fatalf("expected %s, got: %v", expect, err) - } else if expect != "success" && expect != "payload failure" { + } else if expect != "success" && expect != "payload failure" && + expect != "armor failure" { t.Fatalf("expected %s, got success", expect) } out, err := io.ReadAll(r) - if err != nil { - if expect == "payload failure" { - t.Log(err) - if payloadHash != nil && sha256.Sum256(out) != *payloadHash { - t.Error("partial payload hash mismatch") + if err != nil && expect == "success" { + t.Fatalf("expected %s, got: %v", expect, err) + } else if err != nil { + t.Log(err) + if expect == "armor failure" { + if e := new(armor.Error); !errors.As(err, &e) { + t.Errorf("expected armor.Error, got %T", err) } - return } - t.Fatalf("expected %s, got: %v", expect, err) + if payloadHash != nil && sha256.Sum256(out) != *payloadHash { + t.Error("partial payload hash mismatch") + } + return } else if expect != "success" { t.Fatalf("expected %s, got success", expect) } diff --git a/tests/armor.go b/tests/armor.go new file mode 100644 index 00000000..1c00eada --- /dev/null +++ b/tests/armor.go @@ -0,0 +1,25 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.Generate() +} diff --git a/tests/armor_crlf.go b/tests/armor_crlf.go new file mode 100644 index 00000000..8b2f569a --- /dev/null +++ b/tests/armor_crlf.go @@ -0,0 +1,33 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import ( + "bytes" + + "filippo.io/age/internal/testkit" +) + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + armored := f.Bytes() + f.Buf.Reset() + f.Buf.Write(bytes.Replace(armored, []byte("\n"), []byte("\r\n"), -1)) + f.Comment("CRLF is allowed as a end of line for armored files") + f.Generate() +} diff --git a/tests/armor_empty_line_begin.go b/tests/armor_empty_line_begin.go new file mode 100644 index 00000000..75dfff2e --- /dev/null +++ b/tests/armor_empty_line_begin.go @@ -0,0 +1,27 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.TextLine("") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_empty_line_end.go b/tests/armor_empty_line_end.go new file mode 100644 index 00000000..68ff5021 --- /dev/null +++ b/tests/armor_empty_line_end.go @@ -0,0 +1,27 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.TextLine("") + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_eol_between_padding.go b/tests/armor_eol_between_padding.go new file mode 100644 index 00000000..eaef051d --- /dev/null +++ b/tests/armor_eol_between_padding.go @@ -0,0 +1,39 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import ( + "strings" + + "filippo.io/age/internal/testkit" +) + +// See base64finl in RFC 7468. +// ; ...AB= = is not good, but is valid + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age12") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + line := f.UnreadLine() + if !strings.Contains(line, "==") { + panic("need two padding characters") + } + line = strings.Replace(line, "==", "=\n=", 1) + f.TextLine(line) + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_full_last_line.go b/tests/armor_full_last_line.go new file mode 100644 index 00000000..be76f870 --- /dev/null +++ b/tests/armor_full_last_line.go @@ -0,0 +1,29 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age age age age age age age age age age ") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + if len(file)%48 != 0 { + println(len(file) % 48) + panic("last line is not full") + } + f.Body(file) + f.UnreadLine() // Body leaves an empty line, PEM doesn't. + f.EndArmor("AGE ENCRYPTED FILE") + f.Generate() +} diff --git a/tests/armor_garbage_encoded.go b/tests/armor_garbage_encoded.go new file mode 100644 index 00000000..18985826 --- /dev/null +++ b/tests/armor_garbage_encoded.go @@ -0,0 +1,30 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.FileKey(testkit.LargeTestFileKey) + f.VersionLine("v1") + f.X25519(testkit.TestX25519Identity) + f.HMAC() + f.Nonce(testkit.LargeTestNonce) + f.PayloadChunkFinal(testkit.LargeTestFirstChunk) + f.Buf.Write(f.Rand(20)) + f.ExpectPartialPayload(64 * 1024) + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.Comment("there is trailing garbage encoded after the final chunk") + f.Generate() +} diff --git a/tests/armor_garbage_leading.go b/tests/armor_garbage_leading.go new file mode 100644 index 00000000..a700abc1 --- /dev/null +++ b/tests/armor_garbage_leading.go @@ -0,0 +1,27 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.TextLine("garbage") + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_garbage_trailing.go b/tests/armor_garbage_trailing.go new file mode 100644 index 00000000..51261438 --- /dev/null +++ b/tests/armor_garbage_trailing.go @@ -0,0 +1,27 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.TextLine("garbage") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_header_crlf.go b/tests/armor_header_crlf.go new file mode 100644 index 00000000..5a902460 --- /dev/null +++ b/tests/armor_header_crlf.go @@ -0,0 +1,35 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import ( + "bytes" + + "filippo.io/age/internal/testkit" +) + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Identity) + hdr := f.Buf.Bytes() + f.Buf.Reset() + f.Buf.Write(bytes.Replace(hdr, []byte("\n"), []byte("\r\n"), -1)) + f.HMAC() + f.Buf.WriteString(f.UnreadLine() + "\r\n") + f.Payload("age") + f.ExpectHeaderFailure() + f.Comment("lines in the header end with CRLF instead of LF") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.Generate() +} diff --git a/tests/armor_headers.go b/tests/armor_headers.go new file mode 100644 index 00000000..7cfd5497 --- /dev/null +++ b/tests/armor_headers.go @@ -0,0 +1,29 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.TextLine("Headers: are") + f.TextLine("Not: allowed") + f.TextLine("") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_invalid_character_header.go b/tests/armor_invalid_character_header.go new file mode 100644 index 00000000..cfc7d723 --- /dev/null +++ b/tests/armor_invalid_character_header.go @@ -0,0 +1,34 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import ( + "strings" + + "filippo.io/age/internal/testkit" +) + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + begin, rest, _ := strings.Cut(string(f.Bytes()), "\n") + f.Buf.Reset() + f.TextLine(begin) + f.Buf.WriteString(rest[:4] + "*" + rest[5:]) + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_invalid_character_payload.go b/tests/armor_invalid_character_payload.go new file mode 100644 index 00000000..0738b5f7 --- /dev/null +++ b/tests/armor_invalid_character_payload.go @@ -0,0 +1,28 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + line := f.UnreadLine() + f.TextLine("*" + line[1:]) + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_long_line.go b/tests/armor_long_line.go new file mode 100644 index 00000000..aae9f941 --- /dev/null +++ b/tests/armor_long_line.go @@ -0,0 +1,30 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import ( + "encoding/base64" + + "filippo.io/age/internal/testkit" +) + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.TextLine(base64.StdEncoding.EncodeToString(file)) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_lowercase.go b/tests/armor_lowercase.go new file mode 100644 index 00000000..cb823b4f --- /dev/null +++ b/tests/armor_lowercase.go @@ -0,0 +1,26 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("age ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("age ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_no_end_line.go b/tests/armor_no_end_line.go new file mode 100644 index 00000000..46b8f039 --- /dev/null +++ b/tests/armor_no_end_line.go @@ -0,0 +1,25 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_no_eol.go b/tests/armor_no_eol.go new file mode 100644 index 00000000..e9b673d9 --- /dev/null +++ b/tests/armor_no_eol.go @@ -0,0 +1,26 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.Buf.WriteString("-----END AGE ENCRYPTED FILE-----") + f.Comment("there is no end of line at the end of the file") + f.Generate() +} diff --git a/tests/armor_no_match.go b/tests/armor_no_match.go new file mode 100644 index 00000000..130956d6 --- /dev/null +++ b/tests/armor_no_match.go @@ -0,0 +1,28 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + identity := f.Rand(32) + f.X25519RecordIdentity(identity) + f.X25519NoRecordIdentity(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + f.ExpectNoMatch() + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.Generate() +} diff --git a/tests/armor_no_padding.go b/tests/armor_no_padding.go new file mode 100644 index 00000000..789efb9c --- /dev/null +++ b/tests/armor_no_padding.go @@ -0,0 +1,29 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + if len(file)%3 == 0 { + panic("no need for padding") + } + f.Body(file) + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Comment("missing base64 padding") + f.Generate() +} diff --git a/tests/armor_not_canonical.go b/tests/armor_not_canonical.go new file mode 100644 index 00000000..92efb834 --- /dev/null +++ b/tests/armor_not_canonical.go @@ -0,0 +1,28 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.TextLine(testkit.NotCanonicalBase64(f.UnreadLine())) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Comment("base64 is not canonical") + f.Generate() +} diff --git a/tests/armor_pgp_checksum.go b/tests/armor_pgp_checksum.go new file mode 100644 index 00000000..4172f099 --- /dev/null +++ b/tests/armor_pgp_checksum.go @@ -0,0 +1,29 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import ( + "filippo.io/age/internal/testkit" + "golang.org/x/crypto/openpgp/armor" +) + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + w, _ := armor.Encode(&f.Buf, "AGE ENCRYPTED FILE", nil) + w.Write(file) + w.Close() + f.Buf.WriteString("\n") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_short_line.go b/tests/armor_short_line.go new file mode 100644 index 00000000..7a4df09a --- /dev/null +++ b/tests/armor_short_line.go @@ -0,0 +1,27 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file[:12]) + f.Body(file[12:]) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_whitespace_begin.go b/tests/armor_whitespace_begin.go new file mode 100644 index 00000000..bf34a9a9 --- /dev/null +++ b/tests/armor_whitespace_begin.go @@ -0,0 +1,26 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.TextLine("----- BEGIN AGE ENCRYPTED FILE -----") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_whitespace_end.go b/tests/armor_whitespace_end.go new file mode 100644 index 00000000..c85bac16 --- /dev/null +++ b/tests/armor_whitespace_end.go @@ -0,0 +1,26 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.TextLine("----- END AGE ENCRYPTED FILE -----") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_whitespace_eol.go b/tests/armor_whitespace_eol.go new file mode 100644 index 00000000..32419d88 --- /dev/null +++ b/tests/armor_whitespace_eol.go @@ -0,0 +1,29 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + line2, line1 := f.UnreadLine(), f.UnreadLine() + f.TextLine(line1 + " ") + f.TextLine(line2) + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_whitespace_last_line.go b/tests/armor_whitespace_last_line.go new file mode 100644 index 00000000..e287f0a6 --- /dev/null +++ b/tests/armor_whitespace_last_line.go @@ -0,0 +1,27 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.TextLine(f.UnreadLine() + " ") + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_whitespace_line_start.go b/tests/armor_whitespace_line_start.go new file mode 100644 index 00000000..cb17c9ed --- /dev/null +++ b/tests/armor_whitespace_line_start.go @@ -0,0 +1,29 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + line2, line1 := f.UnreadLine(), f.UnreadLine() + f.TextLine(" " + line1) + f.TextLine(line2) + f.EndArmor("AGE ENCRYPTED FILE") + f.ExpectArmorFailure() + f.Generate() +} diff --git a/tests/armor_whitespace_outside.go b/tests/armor_whitespace_outside.go new file mode 100644 index 00000000..516c5fa6 --- /dev/null +++ b/tests/armor_whitespace_outside.go @@ -0,0 +1,28 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.Buf.Write([]byte("\n\r \t\n")) + f.BeginArmor("AGE ENCRYPTED FILE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED FILE") + f.Buf.Write([]byte("\n\r \t\n")) + f.Comment("whitespace is allowed before and after armored files") + f.Generate() +} diff --git a/tests/armor_wrong_type.go b/tests/armor_wrong_type.go new file mode 100644 index 00000000..de8521d3 --- /dev/null +++ b/tests/armor_wrong_type.go @@ -0,0 +1,26 @@ +// Copyright 2022 The age Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore +// +build ignore + +package main + +import "filippo.io/age/internal/testkit" + +func main() { + f := testkit.NewTestFile() + f.VersionLine("v1") + f.X25519(testkit.TestX25519Recipient) + f.HMAC() + f.Payload("age") + file := f.Bytes() + f.Buf.Reset() + f.BeginArmor("AGE ENCRYPTED MESSAGE") + f.Body(file) + f.Base64Padding() + f.EndArmor("AGE ENCRYPTED MESSAGE") + f.ExpectArmorFailure() + f.Generate() +}