receipt of own key reset in grouped situations works, but there's a corruption issue going on. This is bug fixes to this point. krista-local-7-Jan-2020
authorKrista 'DarthMama' Bennett <krista@pep.foundation>
Fri, 10 Jan 2020 02:46:33 +0100
branchkrista-local-7-Jan-2020
changeset 4321795490894153
parent 4320 6097fca474c0
child 4322 76806e5aebb2
receipt of own key reset in grouped situations works, but there's a corruption issue going on. This is bug fixes to this point.
src/key_reset.c
src/message_api.c
test/src/KeyResetMessageTest.cc
test/test_mails/check_reset_grouped_own_recv.eml
     1.1 --- a/src/key_reset.c	Thu Jan 09 22:02:58 2020 +0100
     1.2 +++ b/src/key_reset.c	Fri Jan 10 02:46:33 2020 +0100
     1.3 @@ -38,9 +38,7 @@
     1.4      PEP_STATUS status = PEP_STATUS_OK;
     1.5          
     1.6      *dst = NULL;
     1.7 -    
     1.8 -    stringlist_t* keydata = NULL;
     1.9 -    
    1.10 +        
    1.11      message* msg = NULL;
    1.12      
    1.13      // Ok, generate payload here...
    1.14 @@ -70,35 +68,53 @@
    1.15      if (!msg->attachments)
    1.16          return PEP_UNKNOWN_ERROR;
    1.17      
    1.18 -    char* key_material = NULL;
    1.19 +    char* key_material_old = NULL;
    1.20 +    char* key_material = NULL;    
    1.21      size_t datasize = 0;
    1.22 +    
    1.23 +    status = export_key(session, old_fpr, &key_material_old, &datasize);
    1.24 +    key_material = key_material_old;
    1.25 +    if (datasize > 0 && key_material) {         
    1.26 +        if (status)
    1.27 +            return status;
    1.28 +
    1.29 +        if (!msg->attachments)
    1.30 +            msg->attachments = new_bloblist(key_material, datasize, 
    1.31 +                                            "application/pgp-keys",
    1.32 +                                            "file://pEpkey_old.asc");
    1.33 +        else                                    
    1.34 +            bloblist_add(msg->attachments, key_material, datasize, "application/pgp-keys",
    1.35 +                                                                   "file://pEpkey_old.asc");
    1.36 +    }
    1.37 +    datasize = 0;
    1.38 +    key_material = NULL;
    1.39 +                                                                      
    1.40      status = export_key(session, new_fpr, &key_material, &datasize);
    1.41  
    1.42 -    if (datasize > 0 && key_material) { 
    1.43 -        if (status) {
    1.44 -            free_stringlist(keydata);
    1.45 +    if (datasize > 0 && key_material) {         
    1.46 +        if (status)
    1.47              return status;
    1.48 -        }
    1.49 -        stringlist_add(keydata, key_material);
    1.50 +
    1.51 +        if (!msg->attachments)
    1.52 +            msg->attachments = new_bloblist(key_material, datasize, 
    1.53 +                                            "application/pgp-keys",
    1.54 +                                            "file://pEpkey_pub.asc");
    1.55 +        else                                    
    1.56 +            bloblist_add(msg->attachments, key_material, datasize, "application/pgp-keys",
    1.57 +                                                                   "file://pEpkey_pub.asc");
    1.58                          
    1.59          key_material = NULL;
    1.60          datasize = 0;    
    1.61          if (is_private) {
    1.62              status = export_secret_key(session, new_fpr, &key_material, &datasize);    
    1.63 -            if (status) {
    1.64 -                free_stringlist(keydata);
    1.65 +            if (status)
    1.66                  return status;
    1.67 -            }
    1.68 -            if (datasize > 0 && key_material)
    1.69 -                stringlist_add(keydata, key_material);
    1.70 +            if (datasize > 0 && key_material) {
    1.71 +                bloblist_add(msg->attachments, key_material, datasize, "application/pgp-keys",
    1.72 +                                                                       "file://pEpkey_priv.asc");
    1.73 +            }                                                      
    1.74          }    
    1.75      }    
    1.76 -    // Attach to message
    1.77 -    stringlist_t* curr_key = keydata;
    1.78 -    for ( ; curr_key && curr_key->value; curr_key = curr_key->next) {
    1.79 -        bloblist_add(msg->attachments, curr_key->value, size, "application/pgp-keys",
    1.80 -                                                              "file://pEpkey.asc");
    1.81 -    }
    1.82      if (msg)
    1.83          *dst = msg;
    1.84      return status;
    1.85 @@ -322,7 +338,20 @@
    1.86          pEp_identity* curr_ident = curr_cmd->ident;
    1.87          
    1.88          old_fpr = curr_ident->fpr;
    1.89 -        new_fpr = curr_cmd->new_key;
    1.90 +        new_fpr = strdup(curr_cmd->new_key);
    1.91 +        
    1.92 +        bool is_old_own = false;
    1.93 +        // if it's our key and the old one is revoked, we skip it.
    1.94 +        // Sorry, them's the rules/
    1.95 +        if (sender_own_key) {
    1.96 +            status = is_own_key(session, old_fpr, &is_old_own);
    1.97 +            if (is_old_own) {
    1.98 +                bool old_revoked = false;
    1.99 +                status = key_revoked(session, old_fpr, &old_revoked);
   1.100 +                if (old_revoked)
   1.101 +                    continue;
   1.102 +            }
   1.103 +        }
   1.104  
   1.105          // Make sure that this key is at least one we associate 
   1.106          // with the sender. FIXME: check key election interaction
   1.107 @@ -466,13 +495,26 @@
   1.108              
   1.109              if (status != PEP_STATUS_OK)
   1.110                  return status;
   1.111 +            
   1.112 +            status = myself(session, curr_ident);
   1.113                  
   1.114              // key reset on old key
   1.115 -            status = key_reset(session, old_fpr, curr_ident);
   1.116 +            status = revoke_key(session, old_fpr, NULL);
   1.117 +
   1.118              if (status != PEP_STATUS_OK)
   1.119 -                return status;            
   1.120 -        }
   1.121 +                goto pEp_free;
   1.122 +        
   1.123 +            // N.B. This sort of sucks because we overwrite this every time.
   1.124 +            // But this case is infrequent and we don't rely on the binding.
   1.125 +
   1.126 +            if (status == PEP_STATUS_OK) 
   1.127 +                status = set_revoked(session, old_fpr, curr_ident->fpr, time(NULL));            
   1.128 +
   1.129 +            if (status != PEP_STATUS_OK)
   1.130 +                goto pEp_free;
   1.131 +        }    
   1.132          old_fpr = NULL;
   1.133 +        free(new_fpr);
   1.134          new_fpr = NULL;    
   1.135      }
   1.136  
   1.137 @@ -719,7 +761,7 @@
   1.138              
   1.139              // encrypt this baby and get out
   1.140              // extra keys???
   1.141 -            status = encrypt_message(session, outmsg, NULL, &enc_msg, PEP_enc_PGP_MIME, 0);
   1.142 +            status = encrypt_message(session, outmsg, NULL, &enc_msg, PEP_enc_PGP_MIME, PEP_encrypt_flag_key_reset_only);
   1.143              
   1.144              if (status != PEP_STATUS_OK) {
   1.145                  goto pEp_free;
   1.146 @@ -740,7 +782,7 @@
   1.147      // Revoke that baby.
   1.148      status = revoke_key(session, old_key, NULL);
   1.149  
   1.150 -    if (!status)
   1.151 +    if (status != PEP_STATUS_OK)
   1.152          goto pEp_free;
   1.153          
   1.154      for (curr_ident = key_idents; curr_ident && curr_ident->ident; curr_ident = curr_ident->next) {
   1.155 @@ -752,7 +794,7 @@
   1.156              if (status == PEP_STATUS_OK) 
   1.157                  status = set_revoked(session, old_key, curr_ident->ident->fpr, time(NULL));            
   1.158  
   1.159 -            if (!status)
   1.160 +            if (status != PEP_STATUS_OK)
   1.161                  goto pEp_free;
   1.162                  
   1.163              pEp_identity* tmp_ident = identity_dup(ident);
   1.164 @@ -918,8 +960,6 @@
   1.165                      for (curr_ident = key_idents; curr_ident && curr_ident->ident; 
   1.166                                                      curr_ident = curr_ident->next) {
   1.167                          
   1.168 -                        pEp_identity* this_identity = curr_ident->ident;
   1.169 -                        
   1.170                          // Do the full reset on this identity        
   1.171                          // Base case for is_own_private starts here
   1.172                          // tmp ident is an actual identity now (not just a skeleton?)
     2.1 --- a/src/message_api.c	Thu Jan 09 22:02:58 2020 +0100
     2.2 +++ b/src/message_api.c	Fri Jan 10 02:46:33 2020 +0100
     2.3 @@ -3805,6 +3805,24 @@
     2.4                                  is_key_reset = (strcmp(wrap_info, "KEY_RESET") == 0);
     2.5                          }
     2.6                              
     2.7 +                        // check for private key in decrypted message attachment while importing
     2.8 +                        // N.B. Apparently, we always import private keys into the keyring; however,
     2.9 +                        // we do NOT always allow those to be used for encryption. THAT is controlled
    2.10 +                        // by setting it as an own identity associated with the key in the DB.
    2.11 +                        
    2.12 +                        // If we have a message 2.0 message, we are ONLY going to be ok with keys
    2.13 +                        // we imported from THIS part of the message.
    2.14 +                        imported_private_key_address = false;
    2.15 +                        free(private_il); 
    2.16 +                        private_il = NULL;
    2.17 +                        
    2.18 +                        // import keys from decrypted INNER source
    2.19 +                        status = import_priv_keys_from_decrypted_msg(session, inner_message,
    2.20 +                                                                     &imported_keys,
    2.21 +                                                                     &imported_private_key_address,
    2.22 +                                                                     private_il);
    2.23 +                        if (status != PEP_STATUS_OK)
    2.24 +                            goto pEp_error;            
    2.25  
    2.26                          if (is_key_reset) {
    2.27                              if (decrypt_status == PEP_DECRYPTED || decrypt_status == PEP_DECRYPTED_AND_VERIFIED) {
    2.28 @@ -3820,25 +3838,6 @@
    2.29                          }
    2.30                          else if (is_inner) {
    2.31  
    2.32 -                            // check for private key in decrypted message attachment while importing
    2.33 -                            // N.B. Apparently, we always import private keys into the keyring; however,
    2.34 -                            // we do NOT always allow those to be used for encryption. THAT is controlled
    2.35 -                            // by setting it as an own identity associated with the key in the DB.
    2.36 -                            
    2.37 -                            // If we have a message 2.0 message, we are ONLY going to be ok with keys
    2.38 -                            // we imported from THIS part of the message.
    2.39 -                            imported_private_key_address = false;
    2.40 -                            free(private_il); 
    2.41 -                            private_il = NULL;
    2.42 -                            
    2.43 -                            // import keys from decrypted INNER source
    2.44 -                            status = import_priv_keys_from_decrypted_msg(session, inner_message,
    2.45 -                                                                         &imported_keys,
    2.46 -                                                                         &imported_private_key_address,
    2.47 -                                                                         private_il);
    2.48 -                            if (status != PEP_STATUS_OK)
    2.49 -                                goto pEp_error;            
    2.50 -
    2.51                              // THIS is our message
    2.52                              // Now, let's make sure we've copied in 
    2.53                              // any information sent in by the app if
     3.1 --- a/test/src/KeyResetMessageTest.cc	Thu Jan 09 22:02:58 2020 +0100
     3.2 +++ b/test/src/KeyResetMessageTest.cc	Fri Jan 10 02:46:33 2020 +0100
     3.3 @@ -621,7 +621,6 @@
     3.4      ASSERT_EQ(status , PEP_ILLEGAL_VALUE);
     3.5  }
     3.6  
     3.7 -// PASS
     3.8  TEST_F(KeyResetMessageTest, check_reset_grouped_own) {
     3.9      send_setup(); // lazy
    3.10      pEp_identity* alice = new_identity("pep.test.alice@pep-project.org", NULL, alice_user_id.c_str(), NULL);
    3.11 @@ -641,7 +640,52 @@
    3.12      ASSERT_STRNE(alice_fpr, alice_new_fpr);
    3.13      
    3.14      ASSERT_EQ(m_queue.size(), 1);
    3.15 +    
    3.16 +    if (false) {
    3.17 +        ofstream outfile;
    3.18 +        outfile.open("test_mails/check_reset_grouped_own_recv.eml");
    3.19 +        message* curr_sent_msg = m_queue.at(0);
    3.20 +        char* msg_txt = NULL;
    3.21 +        mime_encode_message(curr_sent_msg, false, &msg_txt);
    3.22 +        outfile << msg_txt;
    3.23 +        outfile.close();
    3.24 +    }
    3.25 +}
    3.26  
    3.27 +TEST_F(KeyResetMessageTest, check_reset_grouped_own_recv) {
    3.28 +    send_setup(); // lazy
    3.29 +    pEp_identity* alice = new_identity("pep.test.alice@pep-project.org", NULL, alice_user_id.c_str(), NULL);
    3.30 +    PEP_STATUS status = myself(session, alice);
    3.31 +
    3.32 +    ASSERT_EQ(status , PEP_STATUS_OK);
    3.33 +    ASSERT_TRUE(alice->fpr && alice->fpr[0]);
    3.34 +    ASSERT_TRUE(alice->me);
    3.35 +    ASSERT_STREQ(alice->fpr, alice_fpr);
    3.36 +
    3.37 +    status = set_identity_flags(session, alice, alice->flags | PEP_idf_devicegroup);
    3.38 +    ASSERT_EQ(status , PEP_STATUS_OK);    
    3.39 +    status = myself(session, alice);
    3.40 +    ASSERT_EQ(status , PEP_STATUS_OK);    
    3.41 +
    3.42 +    string received_mail = slurp("test_mails/check_reset_grouped_own_recv.eml");
    3.43 +    char* decrypted_msg = NULL;
    3.44 +    char* modified_src = NULL;
    3.45 +    stringlist_t* keylist = NULL;
    3.46 +    PEP_rating rating;
    3.47 +    PEP_decrypt_flags_t flags;
    3.48 +    status = MIME_decrypt_message(session, received_mail.c_str(), received_mail.size(),
    3.49 +                                  &decrypted_msg, &keylist, &rating, &flags, &modified_src);
    3.50 +
    3.51 +    status = myself(session, alice);
    3.52 +    ASSERT_EQ(status , PEP_STATUS_OK);                                     
    3.53 +    ASSERT_STRNE(alice->fpr, alice_fpr);
    3.54 +    ASSERT_STREQ(alice->fpr, "6E8AD7C3AB59FFBE62CDC1B5B625A54EB1D486E9");
    3.55 +    
    3.56 +    bool revoked = false;
    3.57 +    status = key_revoked(session, alice_fpr, &revoked);
    3.58 +    ASSERT_EQ(status, PEP_STATUS_OK);
    3.59 +    ASSERT_TRUE(revoked);
    3.60 +                                  
    3.61  }
    3.62  
    3.63  
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/test/test_mails/check_reset_grouped_own_recv.eml	Fri Jan 10 02:46:33 2020 +0100
     4.3 @@ -0,0 +1,333 @@
     4.4 +Message-ID: <pEp.Q3V8VO.1BVSUA9AUO2Z1.41175223-08DF-4F3A-AF02-F5A72C524B7C@pep-project.org>
     4.5 +From: Alice in Wonderland <pep.test.alice@pep-project.org>
     4.6 +To: Alice in Wonderland <pep.test.alice@pep-project.org>
     4.7 +Subject: =?utf-8?Q?p=E2=89=A1p?=
     4.8 +X-pEp-Version: 2.1
     4.9 +MIME-Version: 1.0
    4.10 +Content-Type: multipart/encrypted; boundary="238e1f2946e87ccd3d1b58ba507ed7ab"; 
    4.11 + protocol="application/pgp-encrypted"
    4.12 +
    4.13 +--238e1f2946e87ccd3d1b58ba507ed7ab
    4.14 +Content-Type: application/pgp-encrypted
    4.15 +
    4.16 +Version: 1
    4.17 +--238e1f2946e87ccd3d1b58ba507ed7ab
    4.18 +Content-Type: application/octet-stream
    4.19 +Content-Transfer-Encoding: 7bit
    4.20 +Content-Disposition: inline; filename="msg.asc"
    4.21 +
    4.22 +-----BEGIN PGP MESSAGE-----
    4.23 +
    4.24 +wcBMA1oCBdlzCD9NAQf9HHQ9XVvTExZSkOdS1KmDpH1yIQFKfwO3S2njs0u4o3Ev
    4.25 +QmzD8y3zzTR0CY3BNI/olWYMzomeJ6eoCSfL7Lwt2aLgECyr7tHMh7TFX2IomRiV
    4.26 +MzI3sBFybTdFuSK1NgRgT8QxYBnI9TmIIiLonpRLBQD8FzuIC9lI5aKesBSRLk2T
    4.27 +NWYfNDqwRRPTZTuVlK1tJ+E1V0SrRdM5wFMR44k/636ZorfZiZNMOQe0bc5/yMR/
    4.28 +Ynmae9smWcWgN7Zg7Q2xW2bYNYkDEoJlStO4TcBxHvApel8e/Cy7VSq6w6gxxqcI
    4.29 +RIxJfIi8/rVWpqn7daZchonuNehSrmUtTNn3fxeqv8HATANaAgXZcwg/TQEH/3wO
    4.30 +p7FsCGHujBYsS27Bje54/7ckFhxaRTTZa5XHQOIopKFktDj0M1XZh9SbeP1NC4LJ
    4.31 +pYTDtz046H+DOYmeYWVgZlVLdenb9DJNQII8FUkG3zR1B0yEjIVYLjrQV5Uf+Wwo
    4.32 +rXmCu6/ko9T6z6CRfeeanAQlFAgpNKYkkx/sePQTd/wT2Vv9Hjxbkx7dfHmUCkq0
    4.33 +bpcpd+UMQA62cfWASY/tgi98VxOVKWCOK4X9UsSYGf7P5BPD3fDmp0e7ZL/Z4M8a
    4.34 ++hXLpZnfV1GCj4OQz0tlx4AXM5C/4XtgEMoileqGiCmatJ95HwQXPcYJKVUkq8/y
    4.35 +DzSJ9S04GrVoA+HJhzjS/wAAN6MBUx7pme4qWfMGXSFDPa4kUlB2f2OyzikKzfmW
    4.36 +60OU9Y9C2vhe0WOgH++RUIBO6JPTzS5dqgbfFLQfbJLWUOK6a2kvVYfkjdb+8/3h
    4.37 +4YN2V6ylvfUsBWn6/XjiHGNRq3zWmFzjbqLulHmHoTs5wnOaHCeKwmdgtjPMtiGM
    4.38 +QCTNRjejEd0Ib2KfjTC617UDhBGfeU8+msGalde0rMNL0Ja7HzhqBCmpkWCIR4+t
    4.39 +zHwgDei0rpjaoJgvAKP9Rw7yk1zuGw143bCk5V997FtqaH2VusE6P569stScPlQi
    4.40 +DrI7agxE+Aj1S0paIeKPOtIN7CGZOEr2zsb3QJwFIILNrTNXToR0hfkWA+kpqeY6
    4.41 +gVEBkNpZZbCWERCasyOnQ6GHcE3zAAuHbtOZQc42Ks+QKC1rdKTi353uuIHhpDQ+
    4.42 +g5kM6pWhgNmoiob0T51e1ev/RlJaaZrwtS9WFx+OCyxl+/3iZ/6i48I9tMHI7g1r
    4.43 +vyjTWQeS6L+SS0v6hLKqr6WkyTuu5TmkZm4KywRNyhTAWyOpT5gELu/fXUOxF6uA
    4.44 +zOWRvJoluRA77/sKAitsloOnL8O3051LjVGyaP1vw2xVlTHpGUmn+b5AOcLjZ5LT
    4.45 +/qFiS8UQkRHH2/wekxJ4na8utRZakORrxTNx7Aig++Qfn6ZkapWjY6nvxAsDNYAU
    4.46 +yprT2aiEEfBfFriI5q0K5flyxqfkbvVmg8hkOLlpT49HuoXrlNclEMIaEzJCfjKN
    4.47 +cio8/49+uD6HH0sTfFN7rKOUtZMNRb2tdx9YRCo6BdB3g059QS8B5tjRFvUEiqpg
    4.48 +1DJI0Zi6TrKK8UPuEKj3JeV7UPqXXfdpVTKhxwnLIRVnh7Czy/WOb8aT8zURnMIU
    4.49 +WFaSlPFflVXVFkaPVBE2NSxLqmBT0tuTjmCedUUa31O+B2HADHNsCNHNkQluvLxX
    4.50 +oE+JTRN7JRO1syTMWwQpeyEReRdZmPWkdYwW9+yFH5zi/bTqx5V8YuLxs3nM/wNQ
    4.51 +9ihSxhkOiKxl32tiiVTfo1GHXIkDEus1G4c6XqVZ1ZaEUghVT2wvTGuJE2HUE2Ir
    4.52 +GQvxfZY9zGwrJf4/Jq25HeZ+2fB13LpvKBXjaSRMUM7xuw5ZE82JFg/VF8RyRObv
    4.53 +HQiNKM9N5q+dJi6lMXBF/GcuhgkrShL7qf9Cu7OtQO7HEWOAvqZyHMYhSWwdpKYI
    4.54 +4HbYTgL5vhs9dKyPONhgK8hX4AleVkWpzURxOR5N1oekHEZ3TxFeU+GraumFm9Jx
    4.55 +eCCTmnY6rcnmPNmk5a1kCcXDJu6eUtUMtBTmLmh/QFg2eDy33r/PcdxjojoWmGY+
    4.56 +wKg208a6vjhNGBOP2BteLoLtsHLWvl+Xvq1TTx+7J0h9tdGvaP2MHAUInqbMXkOP
    4.57 +oDK8qJ/7/EzUQ5EVBtO7y24ggGuAOlbbC1YX8czn0G+DcRQe6B/pNUFE4h1dw8Ru
    4.58 +v3BNlVA7CpoTTJl+1pM8w7YEelX9KZbSBabK9AfihEKo5hyOiG5fzBB4JSLzCCOd
    4.59 +8PMygmBZOGNiTjI330T4XkPL5XxEl0sfMd6VWqa+phUcxY8cITHbfpMBdRVUFSbb
    4.60 +gidWxVJ2LknjBGFpE2n4wjKWZhdBQiJ7qn8MdHcYR8vhlWtIJ0nPHKHB/MnBdfSm
    4.61 +SDC3UTm+lkmwB29ehXsySv1Lb1WWDsShRJyvW0/p6tdlrUlLsMKy+6Y51rE+9yn1
    4.62 +rHJnsFuZVWj5f0vomHch/4AN8uqDNoDKP5Z66Nnd6xlw+WqHQKJnR1jxZftvF2xv
    4.63 +IPoM28DBwoUXvep9JLsslLAZOUqCokkr2JaokaqlAtYabCE5IrVOF0aoyJ7nDeA1
    4.64 +Ud2jn4nd6XZbYJIeLh2WEOaIaLmnLrBFEyqIaggvgbqnrpOwptiz8Z/j4yLMONKV
    4.65 +OjV85x0LUXGGyEUugrW78u0GDqOTVHkYZtgP77NaO8oxiBjJ4nTsdvZJFRntToXb
    4.66 +8WNtLtxWoIJXSc8bIZJ8OpzUqxHFL0U8R8iILNyy+7dcUbqpYRIsXMG+N0mTsTIj
    4.67 +iwFGs1t8z/sK67j8L+N+fPumseBbxBBAaxVkjXLCAtSPvmT8nRiH9AWK7taX65TD
    4.68 +632roR3ekC/ljaKGPV2xgzlGUW3UvmJo8H1+Il0dVgo46my5UdGDzAivpm/qSAwH
    4.69 +fFQAy51e4dxpV1GwVF+j/6RlQBGuZhHV7zpQOxt4awsQeS9j4L2DWvAKaE2rzeHY
    4.70 +Zvlnx301ThLHVEV5PHVkjwYoxH5ESViiYMQGS9dAk+masIkGnpj9Wgrrefyffwm8
    4.71 +hTlARiCpgELoE4zzZgJ0sWaVomp9AUP/9sLDgPyGkvrv5x/yVQlopgxOJpecfZxJ
    4.72 +fhjIBbi5ZxfzcW+z1JCFe/WpLAXbO5ftMGw1gNlDRGmuNvEnXJbzLUvSY3lRQlct
    4.73 +cf/e1IVfD7/mU1L5B9l4r1X3lGlg9Ykb7elhm7kl878TEt5dox3PSFGsIMR9T+B/
    4.74 +FHXQHKqcGu80J+P09Y6TSLMHrbiu7w+tlpKN0bbWZb2plsaVfEKNAY/G/KurYCb4
    4.75 +eCZLxfmNhtEfiZshPPOyJNi+oBgEHDtO/dXf2MC6+TdmXy9OzABBdH+3mltVRCJn
    4.76 +4ZROb3QQTzrMdYqTRaR4QpJsFkRvsPi6n0ODPBm+H+lsvX9lt2FJ8dIn48XfaaEr
    4.77 +hwmaxad6MpJrmb0FWpbSpI9fUW5UKnVuq3KEKVUAJI8ZNrWGEzQ7leVffpiaWX49
    4.78 +TnwVJj9Si5gh/fp6KRE9A6Tk47Jd+bW0FssyHxd3sq0KzIG6ZcDKwcKhR3UQtn1w
    4.79 +bL7XLUPv1NqXZWhfV21qVE0XTKrAvjs1aROxIbLskqm6K6TrqrTQFDd8tNfjWycD
    4.80 +bwq5QbrvJzScRk07HsvuSLbxCSnAue8I68eIVwpiS18XHfr6VNede4I7S/myq80/
    4.81 +J8r+z/2ZyjwVt3J/J0gAt+Qvj8F4RPVbieN/RSQuiY7vMCXh3GcoWbrbkO+OU+kU
    4.82 +4YqEQ51v1LnWnODgNENMM8wBkz2XFOEAW7PhAVOXhqnRtKa6BeomqrVs7hO9MHYu
    4.83 +idYYzbK8BTW7vYAOmNlRwKGQB5tmElmsGhTINOXneL6BBHxg87UPmoXZ3LZd710n
    4.84 +QOYNi6SlFlJcyEQZppWtO+wFNvhBuT0OflLnTm33DGAtoTFMUhm+EknKnXU3+qup
    4.85 +WSK4f7lmOIejfk0Dl0hNHRk4whhStX1axLQP0PCOJp3Mtbb6LnCaujAv/b3oVPSz
    4.86 +k0qxl38yAswArGMFonViJSqRm6HM8HavnrJqf0V2sLyWAx8gW59CZD5pHXTzRV2O
    4.87 +IUvIUX9goGN9g1nBlmxBIOAsUAkXcQ9YIp0gMOY1IK/WQv36yH9moyDzCVuoKQQX
    4.88 +UkaTCJ7Z9A5mZ5kTCSTfeW0ryd9FKlN9lz0UCxOAtVfvHVE4eVP4lp9isg6sxHm4
    4.89 +psRIPbWHVZkxiC0PAGZoc82cL8smQZPbNcd9BMiSzuPDhk8QawjOC0haVDGyQUgW
    4.90 +af+T1nPWCuB8CyJwKHeZxu0UqObZ911xDhlBJCARHct3FlIU9FlZthLLszqcx2Lp
    4.91 +P3dzyQgSjeyDliaAUTCY/SnqCYCeu/Vs1F3hygcEIyGgCewGJ/rQGazbghHSteDE
    4.92 +e1Yo8z2gbqncac2abPiSmnw+u8Kkc1zTLTGzrcIlSz5PsDk3gNVUnnfhU5IxwOKg
    4.93 +56PIK51U7CP1ett4hTd5eJV/TJPibLfjBjmTk9LFnVvJgKqI+9dabqNC83jxDtkH
    4.94 +KhMpJxGoH6MMLmI7lqBd6rSOsLfzhHFGnId9b+oIdi0uKvPZO2tNdabn7HSmEsxu
    4.95 +ethTLTsRQUWpTut11tc/6fTxWyaxF9ie4kaBIhjQRwWQyoXgVucYbnBW9pY8Xqb0
    4.96 +QmJK/JapyZorAiXg6OYPnu4VuMqa146TR8yEhXk4BaMBEKWFMMbkXf/OV2AC44Eb
    4.97 +vRNpaoxUw/fRFRv1s0eGqWDWA610cuvOE9TViuebuzXHSElNzQUZKh1/8yBhK5zH
    4.98 +bpo2IaE9/3T5zZt7PW8tE1zrzpJPjioML9LOQvM66d6logVAy4Ev3xC8PpJNU6p2
    4.99 +/35NpILZkfiLahQrJZKBI6UeyTEzd3NsfxTOCzwXuAp8ljkInleXi9jkCBhdJPye
   4.100 +2oKkA7PfgHJ5blyfjOz+d3tkMhyLoxHPsEVu4ATjtwW70v7LtheCBTflKAr7UKBa
   4.101 +OME3VCtAowWRSRsWM5BjZSoRM4VofhN0XlrMYcLqTrDo8cs60xYwUcAt1kIQdAo/
   4.102 +EyyStR2dsPPmz7h9Vh1MzbggbOO4GzRs1drjKFeLkmwUe0F2He4S0ZrCoi8SBtpj
   4.103 +JGs6xoQW0d3Zn36JeQxQQ9aFDGFMPuuqrOkg1fNRATCLkITYWLUMvVcYB2ldv/Yk
   4.104 +yvzZgMNvojIpugjb/C6/MzKpZqaRjgb3LZ4fEDUspdIzVa1jBasxbi9I5yxicIUb
   4.105 +1ON6m2PcDrKTZPtJZInaBELOcSCCqfsU0CNuv9/y6D7XPxWJJeog8MtRLF/5JSUX
   4.106 +wk1cHPET0Ooog0ENbD4oY7jqOQcZRHywLWCnhdlK+yWq0rcmxs29bPCAtZIUYFyU
   4.107 +wfgpVQCtpBqQCzcoCwtx2TdOJeokBp36LMevLWthujtwnkh2mqWT6J9dh2BrMHDY
   4.108 +TTeTd+lBmsXvPc7xwwcXcdLkeqKaJpcdb1OZSEZ8GPTEtUwOEM/NsOoVY4QEwSq3
   4.109 +QW4Brqd6J+g+B5E1YZ/AfXO3q0AgO7o00AzCHGH4NlxaaIAbvC6Q5DqOcMPwM6EF
   4.110 +j9vRMUOmhB35PNQpwZ5VLZSsuxUZ8xNGcVfOI0pCc/sKGACaqHyOXkqR3FLhu65/
   4.111 +MXywy+TjYWXMZUik7QS5b4aaXNbvn2S4zr0+4YLdWBDwKM0GlD/nxLGLt/c/1kB+
   4.112 +pJjv0lErVOHK7cQM5B/Xl60cGRR+bx0jMHCGR+fs92srjmjsYAB/Zo5dXm/Kosma
   4.113 +pNDBa7ccabk0qUqFN3JfDdVr8YQudZE3CQUdwddyxFaPcLDLFfU4PZUI0Pq1cVtL
   4.114 +b2PiOQog5DjWuOk+RP8fF/hSgUtdArOtATmNMV9Lh2w1rvGCO7gxIOOetfmE461B
   4.115 +CcL8NFs0E03J4YCjB111fQ32bvvfIitq/Oyoatv/KYP0BeyrrdJKFv/qfAzJzjiO
   4.116 +TJ1NWqUeSZ13kREfAe/eo3hkm2GDjbVFsJXyLSYgCh1+Jm0P4pmI4VyX9I2gWYU3
   4.117 ++LO2ohdFkJn7F45YRwst1kXqbraso3O3MLAwVT2WT6lp8hw/WTZrG+Xoj7ltpJ9L
   4.118 +OHdWM3rQVXzpcSHK46cQWi1UclhAwvTkYm57BxYQ04v+mwgjkA8GqX+frfw/b/FR
   4.119 +qWLBn6Wc+06YLgc5Yx12/74oLSfqrUOQtz3oR0972IeCeLvc/TccAITwlB91pEnH
   4.120 +e/eXhh4oneHQkSxwZtIkmelysX3Y/fNvx+dVlevq645payzuIV1WpAdQGROlwVm6
   4.121 +vCU4xK55kDyazeFJYo2Q4ADtTeGGFTu67xEqsAKLVnA3wEvaoybTsXZ1IHpy3/mc
   4.122 ++Ur9TWtqEli2ggDe+J2uGpkq2H4CELdvQiQ9MkOltfBVYuEOlbKBVho87S/TOQS7
   4.123 +z81uHwRtEH1R2ome7vtrGBzpQFFLaDfqnXQcBfL9npFUxXuQqU/I9VUlnCqPFcJn
   4.124 +TkxkYLLtfNwItfsC/c884hXPQwY0narKfmwKjAEHeDqJ0XFUHj1u/hc0n/L8KM58
   4.125 +1Q66P8IgJiBQLOH1iP6+Y1N6P3V6SNgEMSEiHxnvL1t5z6B4pp23+pIZZiTA1CNB
   4.126 +5fnkMIx/gch37hVTg8eHPK/eIYq7Kln2UklzcdYUbwXU7TvJCAzKrVTLzv4eq/Sh
   4.127 +nfO3JvLDCIDmDEhalsE0GADqYJjmfvmaEWVoOe2XIIe8oQMWzXKjXJsv3Kti2ubX
   4.128 +/AXvBcuWF6RDEnnY0rrAc5OMJz3y0DEfsMse0mZnptZ4XKUWxFWD9/qB0Ul8N8MU
   4.129 +ssSAvVveywiz/p7NTIHkr+NRWmPARo46XRpcA4DTADavYAfQYZI1FMA7esKBB90L
   4.130 +2MBqTuL8T9EyguIx/rwIUa4LC4K3F5EPUHD5FJG0uuPEPTGeg7ijsBCxF9FHW+tW
   4.131 +wE4jJmZifuXYH7+8HNiP1jR0Xe9M+WK915Q5MM2sznJf76Cd7ofb2A16evJMUV8h
   4.132 +0+KodammD7mPMFKBWrXa9quX8e2javzpuMpFC0r+HmezJXsZsZvLTJW+pCVHiKtj
   4.133 +iPLwObZITamgueSNNxZQ3h/hGamVM7wVMAFaBhXgAjIMCf1DN1q4dNPVakrBy7gm
   4.134 +NgPTpQd59/A1FvvP2Juq3iBePLWve7AsmkRu4lh58Y1Jayz1JCRsq887hyR4hRO9
   4.135 +M19MEaWPcoggVI7uvAtUEInPXVucW4x/B2RYmW8awIgs7DjF+fH1Fn5O6FxKZT1y
   4.136 +6Oyt16kZ6CGYQV8uwFBpBtA3FcImDqn2JnClvZB5klKKp2ljJTJI8IZIvI22mmHQ
   4.137 +14l6sj7iP3+ieqSJtq/r6OW4LaEwcpB/7tgH9t0yKTMqZO/rE3skkWaA6U6sc7V0
   4.138 +Le5eiTtSrNBGh8k2AAifdeV1izM6/1YWUbESz+3RoDjJ6dzoF8AYlPQrntVGf4XZ
   4.139 +IHtBDzfkCX8QlkXR0JeBSZ0YqebKsRNNRTHvQiTYHoXKYOi6O5HjTdIcNCxMGrTF
   4.140 +wu5R9andOK7pcakldAW8vqLW9iM9bM6tD8IdSzShMNAINfVb7HsXfDvjxxu6Gwn6
   4.141 +bm9PeoaX89PN5emABMOIcU2gjmIUcBAsA17RJfpnQzosqVn+HFi2WiMOb19FGsXl
   4.142 +n8jFfPOaJ80+hlBC5CYnp3WFRDy/YS+t7HQggSRNN/iY39+f2f1uktXbfXZuCb4b
   4.143 +MyJ3axz6bhAZf4mTUrlCHWHiA37N88EHtebWLl094slEcA2T6I3frhwva4vWt/Q9
   4.144 +JMlNpEMGpdihBd0ubbUAJGO3HIc7hT2FwSV3jRaJDHASwdF85PQBSIFqOdLnXUmE
   4.145 +cOcItqZC4J/2vcoveZktYu7sV/N8QJh7jVBGdoqZO2tKBcbwAVDWKI50cfcjJxfq
   4.146 +G4xYHTSo96IU8757pklWS7z1DSFwWgNGNJIjFbs7a3gpI6VrRmNO0joeZMCHcLvD
   4.147 +jEOkUPM+SS19ILT0Uq5WICRAG7jR+cL9Jn90+a/L17B+R0bYrgYvzMe7HYYUXnNy
   4.148 +BEdiWG83DbWpYk6dhB+KdWLJm5qPyztL+tPPC5xtsGTK99De4D+GVOYrG/VOFEl6
   4.149 +MVGQO9smxeLeTm9ErvC1XY2lNHCgYFmIWmOYsR3Ttknl5rDa44elI/vNBdk4oFU4
   4.150 +X4exGVrN/wzuYCNr1UmaRJFyeR8lvC+1I/ljeyVzYhYFQJENeQT4KsSHzaGzPojB
   4.151 +uNMZqkthcwvkxdPJxyE4eHW/CoBIhjQBFQc4gGCqKS6uRJOchMFAbN4CLLpcNUye
   4.152 +/qNAvt45upE61mI0aMEX/W0XBwwj70CjOLYsDXY3Seul1jDiCZub7nnVtk0LCess
   4.153 +uB6fss0c4R2Pfze3vFp22MgGunypRYCRQrdAcrb7YUmWgUKZjksGT+xE4FzxMDie
   4.154 +g7aaiGrJx0wDQZalYRv4PSLIMjjd19N/tTvvQ9GTFK9Xpql54e4tZNOvx2qN8Z1U
   4.155 +Fhs/z9rtpni6cyzsq5Y1fpi5qAaLQ/z+bY1jw6/y80fNPfPFJUaiccj0spKnDJ+I
   4.156 +ZSQnynAcNTSsRGR+Ip5LUYm89IJSCtBwWFKe+VlI5WAaiXz+IKmRuoiaG32HoLf9
   4.157 +PfZDadHB77CDyjS/KGD61EJBZYk91lrs+LBI9k2S64hmGJeeT0KBJKAWU4FFErcm
   4.158 +s46ZmYZoxHOGJo1+MroAjYD7vEs3UWBJLT0o1bwp/euQYzlCVM60+0gSr0Mt3cjJ
   4.159 +K3+X9iLv2Icw3kp8zsQFhBPHHHTJy8khOlVfDwHRZ6q/tHIpIZUCCAue0RD5J2f0
   4.160 +SMJ6ttAMQFmlFHP4Krq+CglNPm7dtiY3qdid+6ykLl8SORJfYdG68GFUX+h6Dc27
   4.161 +sBUX8YGO6M8Rw9XxlNN4BjDo7AibXpJWMgzcTJ4ijnIC3xR0+4xeoPQtaCKsooKk
   4.162 +7ETnmkOtTw3Ch6sfzafA5lVnHEbcVppBnH7HozXAvnKPPmQNfeLSFevY3va/RAH/
   4.163 +Yzyw3ZEZHCZmbpmryqRIh8iHJU5+AUqQ74WT1CW3zvZa7uQZk5mm6DmtVLXpEd6l
   4.164 +iBTIlqZiGz3DWoNmJN+aaC391PYGkOo8MJq7XXKmQhpYfTeTOvdKWh3j6XC1Y4P6
   4.165 +PAWufEax82cpgcwfzzyN1LTsXw6gc6ZVx/7tHEt43Pp2RK6V/P9WXBxq0gUWlT8y
   4.166 +liaq0Vmb3uQ/4hXq/Do9sGICnwTc/8kSEf0UsX4vQCq0E22tB4c8ljQdbgKnPV9O
   4.167 +12PPeYyfGZigiPZjTDsLqZLqi9EWsb31fcei+Hmyr/N6oYh1nf1jGkrpFijNodeJ
   4.168 +vS9AJy8SbVpUW65ikROYriadNRInWOcT4UzTS+ZtrW8f5lXbLgiT0M8JiuV2i5X6
   4.169 +KcIJKWZY00ec5b/0kJyYfK1gWqPDvdimCL8EwuUp1WN9pm+QeQgynoNIdlx+u8yy
   4.170 +WUaOntA9JypLF21ayRqLEGg4TGkTb+wrB4nE46KuoPJRcxyfNmR0CBdoFLOv/Daw
   4.171 +8Z7I7rfePZYe//P7FQ75zD1FGjH+Gl/bo6h49OEJeHzDRH/yURbD+/HmBV1DfGzA
   4.172 +cW4ZsOmFff0uKFdR83tT+x557m0Voz3Og//Cjo244JPTNKc0dNb8GmA1IVsXFirb
   4.173 ++BZVkki8Vqjm9Niou1NpL5jn2SZIpe5be3LnL0TNWgTa/2yhH1uqWyY9e/l2dl4M
   4.174 +UbnnQQGrsTQkSR+lZ5fCkDOW0y2fe0sTGt929yok/qWF6Y6JDoHiPeHAG43wlWJf
   4.175 +1xmynj1WhyyIRnicE4hPB+X1HYRgJqjI6TIfg3nbXi/iIPXMQbTeRU8zasIAOgPN
   4.176 +p6TQgsYBR9B3PGA8+ZAncVAyEEJcv6sSgT+p9Lt2kTWqLHTSsYhSlVUXYajTk1KE
   4.177 +/nycDbEcoZ11RnvkAOmnJ+lLPbNyTnyepYdsIOMPYFvQUbm7fdqjPfW1zxSyWLAW
   4.178 +4HPB9WgqR7jUHujXiP7WZKWBWUP5B1Is0ix9JxQQRnDTc8BtDNbnkvhw4uQ3HduA
   4.179 +pu2j3cRy4AKtS7qxTuhcA1qnygVqWX516pCHhcRGRioD4cmKZYQFkG9uti2WN0Ub
   4.180 ++cvRCWuaYrZiq/D5cBjc2PdrORu1iu1fLOF+Xf7UguYVYH8NUyscCQgO3yKbgQyg
   4.181 +qv+9K82pbBs4jdYN5e9jVz7a6f2mWsTDdhPpO7uJ1ETvaCYdAfO0XauCdil+SSi5
   4.182 +8rvnd/os/kX8GTAAvBZyKQ6QHD2PLhXXs4m/pEJyGHYR10LWduDH3KlEvuyY7dew
   4.183 +XR0/0fa1QuO+ovZs00Tr4FC53Oj0rw7hM+ww4CDg3GtCnohFbubZheeoBMT4YdGD
   4.184 +1p3FQNcu2MkPTEMO416HASHkcDquZZMZTIk7bAQ8zixEl8zvonTDwX9Be51MMBIv
   4.185 +6DdfsnqC8snvCtL0XoJnTwryAHfMriCi7IqQxK8RX96zjkqbX3CwIvJR82S9x/Pg
   4.186 +5Q4T1kpKTdWToGpsf1WtwDNAPBNhSSWrkfgqQpu3sE5y15d8kuoeQqxK6pE3/nBi
   4.187 +g6zZdgeqmdwM2XOsEdpRCmrFdOSjevVVCDFhvezRTv/WtJ1sxJw15U0cJlcplVey
   4.188 +tBSHiFJIp93tRm5gPgT8r6Ong65qmaxzRvnXoWNWuK3Io1M/AnX3KFntJu/JPxYd
   4.189 +F5vGrjoIxkqc85KcWeQg7IKSrDN5EU9jIg9oDnNz2VntdHBvJCmMaGw/stmuOp7B
   4.190 +T+DzkFfTT3M+1MJiPExPfz5M9cFJtQgbYWanwpRlz/wz+7cVyYPPW4s0stau+oYJ
   4.191 +rPqWG51AEG6rwkEMlpWnlKOOhxH+5yEweapeWka6TG+svwOPs+06sFHbdTw6p39G
   4.192 +ocDldJlLtqcaPF10tNarmkcDBKjOgFBdnjWLw9PmjA4NMKFI/MjRlYK7tlgimKhe
   4.193 +V9NxbcYI5SHOQBuzTrSQ3J0Gawnk+9kWNIPXC3pYWrIx5EYCaLbN9HQfpyS6zsO2
   4.194 +VFt6O9TAgR+xgrJZlSdbQejmZBwW8jhAIaUR775GtPDZKpIy6lHESjlfRU4rdJFV
   4.195 +XInQP9BmM6dHj1z11rPqNCQin6ueDAEwLE98XwGeaD44Nb3Ei9uh2QVBZghu2yTd
   4.196 +1VndtFAY9YLUG1/k/xVULMIzxpmEE5sdIFHUCzJ7vdylyAeD3VstcmFS1ez699i5
   4.197 +6nauLRhpFDH0D+aiTaYFZSr+H/2CcdFCLQexbwoOjlj4MiAi8OZSS3KUAfMqyGYC
   4.198 +TBUlC17oBVBlBzJKOdr1Zi+jNjVw/Mez4OsUyImwNGNgQoYzKs+slCeyBldNeZv2
   4.199 +VeiCz1HLDEJVeuYKLCaPxe4PixMGTnY+IxWOoqd76Dt8IYspQ9mgcVDJSRoSZtqJ
   4.200 +92SnoR2DnVzArIT6LZ78uug7hf8gQzzV1Rr172YH9vIAKu7NsO5WPyPsOQrrqaKE
   4.201 +BzowfU0RErQtaSa2EI58N1TZMhfRbznvipPNLjGH0eA7IfVEnz2SX4IwX11qW86x
   4.202 +CpiWEC7SlCQGEoitBi1d5OExV0KQrdqbIzI+amrF0oFM4eNk33NX53+MO9rfEoIj
   4.203 +csSnzJmBvUilDZBpGjY7J0mgKgyHT0WEifdW0gu5P/A0X0FfuBw+0I/ufo5JTLW7
   4.204 +GnQf42+rezyrH/sfcCsXyOau4Q9ofZmyYBnQulAq/KKBu4z+3ox7Gs01tqz0SXGd
   4.205 +4QjqghaQQ7CoDjNaoNP+k4qAPsRo1qwC9WeRWYZhoUjXAdnQdMWEYjG1KTe1sMCD
   4.206 +q4g+r6tPYW3QKuXJCzfy5gUXObWKxfSacnz2U+q3r2zw+T7vuFe1FN/H4NNE2u19
   4.207 +H8suW6sAbnZCgInUQE6TnjalJhtaJF2dVo5qVwaGp6Wg0hsOD2id74E5OYOId72H
   4.208 +vPgTmciiiRqilZAeHSaaHjren7ypWJ15x4gEqkjb5eBhf0SydrLIWa6GbFgybSjK
   4.209 +szS+yHK/8DHlPWkZdoDjpz8DKDPW770ilxoLf9ECMf9r2Znf5Gh/wt2RT0lxv8C5
   4.210 +atbxybxU2G87BAwl/Urglp29hMCMAHTNOBe/3ia2tx2jrB8y0Jn11o2wI8UgTHoz
   4.211 +xahpSfhtyIbSo4RuZqhn4QhH88jBqxzNnuPq1dNp8zJdPUbYRxjNGOw6Py7KU82d
   4.212 +nMOpcm35PI8M1v5CFUPiAeJ8If4CNnPC+Z4Nel0qfBp7KMPG+oFhKPI4XJRMNynV
   4.213 +mHHxXb0EvF8JWP82pULdCWgJK4V+6GxEP0spLWIJyWVvOQoPLCIuetnX2LJ9rDeh
   4.214 +pejnpmA/ucTcWeHHBnBYqy4iI8IHX2RV/FYlsQ89iEezfZTgbhPwHKV8o1jnPB6U
   4.215 +py/Dmi+g/RxGFxHajJZ3GMjNxDO8j72fltArwUR9IpkBChqnhOXE6X5GYjjFD0GH
   4.216 +3Twni6QoAjM2Y41KxMpousQmixI1L4BZ29fZ+T91//RLf+Cdk39g3bNXnkg99CYr
   4.217 +O1T8eCU30vsiWm3W+OhMfRm54lVtDqjQX4IPcRjOFchXt3O7n37VoPjBvS/sg6Il
   4.218 +hESauMnawxjtzCUtL7/7cQYS11dKCBEnSuWsvbUPFe4hmC3w2oxrJaF1UI8wPHng
   4.219 +O0KiMY32tlKv1HTaeh68q6Fi/HXRurGxSwo3tiBPJCixIf3DOJPwAvOzkUQ6yuFr
   4.220 +FvDhqZpUPKR+hKL9fIFOT4o1M/3wthc/s+Jt4QFIP+DGhmuBhLyF5Y0096RpVC6F
   4.221 +5GEeo9OmRWm86mJ9fsBEcf9a6ZO4kRHs8tmfBXSOTkR0Is/vpwqyIRlXE518vZsp
   4.222 +df1kh4TYYYTCcDSEz/GbzQTO3mIUkjM2PNA+0UUhbsiZh+suHo0sdYLkBcbG+qGr
   4.223 +94Tq5Wu3IKHegiRc5lE35BbM0THa+UeEk4rH9E6MVEQL4K/S6+OTU+wWju1ClkQt
   4.224 +WyEZNv1CfoLhmah7dYj6sgXV/QichSeyj1SGqf6qub0YJ4bMpc9hxTDysxGtdx5q
   4.225 +GWNaZ+Bbo4qY2v5bGkMjvtnkRnu0MHd9gNW/R3lVzwqnaoSfCe6ML8p9lYXUZgtj
   4.226 +Sq2e579yATRGHHNXBnJBudxZB86uDNGfDB9BEta+B1hLL3FbxZlL8S+J+UEcizPO
   4.227 +F2vWlsRSQnp6JK4tbKmOfPI7vFYdvQZIGdVdEjKrzn158SAq50TcyZTeG43oDjIo
   4.228 +AVVNtdEBl6ZOHg0OoTDX5bvFrDFvCzWQvOwGoFhPSF9NcJ3vmRf6M0m8RtX2xgrm
   4.229 +NiW5k+AGfnG80CZZd6oIF+5lPcaZ9JrRbw7eDzcz6yRS9utWlwsAOhz19ZxAUf5w
   4.230 +YQAsmvQ8aGhX+r3ZUmEvntolAcYmmjACTgjyd5ORBlDoxGX7QhBBczdhloroVy2U
   4.231 ++yVOYliWv7lDBxvaEPvzSpPQmVwx2FkOXQ+rP57Nkb7rs6zVHaxz43wy6P2WdboH
   4.232 +rXhlzBVj/OO/CTwvQrYS1DfSh8xd/yfuyPTMwi4HPPK2lzSyp+7hhYLggIHB+3Hm
   4.233 +H5EgoihC78srS5y/RvkIYKBtNSP/NTuql64C3azke+AcejoyX2rSVtq6WOHmBQEZ
   4.234 +VxhwWxVAHRuwWkz1vUDst26FQ3mXSxSrjz8kelNDy4W61Yc8ekBPfQ0tf2R2KP2E
   4.235 +0buPr3DK5ka/si4SqpsatqEAfLcaU9sQT0m4o0Vh1pvlwtEzgaleUEsjMlp1mqjh
   4.236 +4aA+Qo+/1GQwP39VGObbwj+DYDPYho25uaasoM2BhrIrNceWwAnJSrCowIJ+o3Nn
   4.237 +pP2miqVL6iMxaev77TpuGdesGWFd8b6DFVG/iHmYd4PMqMTi+9Wvd5Ah/Ud+AdOi
   4.238 ++9Tr+vBcncCNTfB/J7brAWsPyWltm+s0ZEcgRL7635xbXZ4QKGMLbhnCiugws9yE
   4.239 +Bu/xRjlvhtbtfJDaDLpIbGl3s4jLigRLs4jyTexRnb/ohTNCsf8qKbX6d/lXB4hI
   4.240 +lpm9dGSMARNPefBLUBNSNEgE74ZHmphGwOiw0i70A5w5F+QYDG1lKXw2seQYpIUe
   4.241 +2loxjz7mDSmnKpV9L7imzqwyJRGTRxcnJ+4aPRvcn4I0pSuJZ5uDh7kz/075T1v0
   4.242 +iuwxJ8v5Rm3fIyZeDrSg/LFE3TnrvHPiCVrT+mGJgM6sh4jfjLHOSRsGImJDuFp8
   4.243 ++EuHCrCS5apiiFr6j15g28i1eVIHdSvqXYh0dYsVfyQm/9tfZdNeh/hx85PDeWFl
   4.244 +hpminvYj8+Pwglsz21KxQFV/soWamkSxDO2Dw9II/EaGfM+XNYDXPtMpqy0D5CaB
   4.245 +QveiGx4LVCsAfcyNIYPKFUBgippWy6BO6co15bm2eVYrazOCVwvDuMVJ85RX/C1D
   4.246 +CTNl1AN9yTf5XM0eiWi9Yc1plibqtgVs126dj4+YG8xpz6wtAjm9zqYjD7hv/6/1
   4.247 +Qua75Tn2vPo7G9sUz01KtJbP3fT9OMeCmn775BmJ5fckr2shqBuRcso4ChInxom2
   4.248 +2G6ZTXyWCu7MT3+xzMYLgtvANL8pUV4Iz09M2tU6thOYHb6Bg9qCOOw7c8aP63W5
   4.249 +6ooRCVAI1Iymk9IkqFUPtdiPseCSU3v+Undlp+IyfH/TWiFtg+1+/z6rvpbsjlIT
   4.250 +vWzTA65Ag8unU8UaRH94pwbO+SXgS1hY0TS5kYj++3nTYhP5aaaxLFP2uJE4z+3s
   4.251 +8GwI8T1kxe32v5eabVV57ilIEOyQowOy6kB1JgSNRZybigaFhKQANRGQhvkJVrIe
   4.252 +VS1MxFvsz/5Uxs06ksHvCYUmfcIADqfYnDMWAwIttKTkcAXO0FKYea0fK2bYSKXp
   4.253 +MZxRnxcC4feP3fEeru3cg4JWOW5JdlvBshcW1yHFg3nBQX8K2yfR5CpbngeKYD3z
   4.254 +u0PzH61pshidr+uyRpeiLAJV0H+qI5e9zkrS001G7QvbhG+HVcP4As82PrDeDAzM
   4.255 +IudfoYKTd7ETC7fSRxuELezB9JxSRKrdNlqacZhxJLJRsLim+jt1jjvTT46G6XUi
   4.256 +JuBYyynoOC+7BFHn6/Xo40/XJG4Dvv8ZFXwkGQNgK/SQaMpEXWcJck3IqqsB0iYr
   4.257 +Vc4TBpyuekLbRmdtWY+JoGy/yTp95mv1fs4tRIsnL4v4F4A6ClSvvEIFUW3ZoE1g
   4.258 +hpaOKDTt/1C4ORR3zA8Xg6z4mIrFdwIg8d9QLlhc/RqOx0A4P0fgCIfQp+tP39OH
   4.259 +Lf2ETzH1+GNsrqSP5en1s93d/p+fykjZVF6fDVp5hMrnqFPDEeKhgfehhkioJP9d
   4.260 +u58j/fegrIy8h/F6c6AJ1m9FYvKA0qZwUnhhq0DVEb9sKE+sP6wzltS9WFjmyF1B
   4.261 +TgINPOywYC3qKKAB9h7yBSRLu/MjGyeBUPAcaoFkVCl1tkxRwOR+WfzEV8BqGQ5G
   4.262 +G9glJF3gXHMf4bqGbPMJ4QUtHK8UllkwWiPJ2BfR6tr8gpRPiWJV2iA5pcExo+aU
   4.263 +0oV1VEA8YcNdt4l9VetHmETkAele6XI5qJpLOfdTyAPh/C1A8sLGNJPqPtOxVp2P
   4.264 +qcJXIgYZczTvUl/Hse/y3PefyNZR8uiHdDA311A3bZoPrg5VdXEvpEhgXG9U4md/
   4.265 +mfbZxrKUR8xFtDGQgiUxy7h3ErPdtsHpGBacNZ/U2DeCkujJ+Ba2URvXucIHpWq8
   4.266 +xekkRizJQT0YB0J6hzNaeRCpUMRk5G/JxfrvJGL1oj2gugFWFchEqZRw3ry/sbEr
   4.267 +G2BlsW8EIgZ3yIjKgSaiyZTTCebeLnc5QPyYz0miLo2yMzto0KCzzGOi2n0l6bUR
   4.268 +W2+HtyDD22vM6j4y+1FbpjzFqjwEfWtABivqVes8KzjIYkh0I7J8QBrPkR6Ttzy7
   4.269 +yiTJ9boHcXjavAAkOJcYW+LZ9jenLgklwen+R9nS75tKQCge7O5rZxRShM5zInkw
   4.270 +22iu8ORbVLt4dl5plzpEGU8JFre6JcLXlcG27c+7DFUkvAqCeUEHol/u8743brG1
   4.271 +qntYYAKMzjlaLc3QL/gG5bMzibUBdLei4nLxTYx7GqsDK1H5vdzB5bsd63RlrbVg
   4.272 +cGN78uOV0qSCPxm+9yINs4H6q1qQH0gD0i31tNvOoQ+H8OHbMDNkjMKqWInBd6YF
   4.273 +l9leTYuAsmBi6iH5O7bZWoNGhYdEuQ3c1KM2BqaFz9XhxmQ6gPbQDscsikh3fr6H
   4.274 +KVAmeXP01TDu/e2dy+FFT3Ja29MxOR/BlsL8DFJDJbYrJZYqF2jna34g485LNdFC
   4.275 +BhyC0JX483UR/l+t+AWsE0pNOU+9iCr/vXoaFQY9yt6qv2gEg4b8HK2eS6uMcUUq
   4.276 +PVmMkazZl7yt44uVOnqtnLiT0kFJywy6RhkZoCaUS2v3jadO1PvjBCiYTZlvSaWi
   4.277 +qlUA8h4HmQ/kx1R+sgjV/MxPL6To+xcElc5dhoO5jjXkFgNBNJpntnnJd8TpC0f/
   4.278 ++gsjKHlmtTYG/lCIo0OYh68pxzEEjjDFMuE91JcdKU86m22uZjw3Z3JBlqDTyLLn
   4.279 +FmW7sTuMButCxXtoj3TgZ+8WNgL2wBA8lBdWRODqkCgb54yzpD3YW6n3GhBgQsIy
   4.280 +js8iQMkIwUhTa3vhi8ion/J+cypqigI5WzP42QUjEVmofK3De7fq4t/AuBl7OXnS
   4.281 +EAUFTmhSxau+THqUrl7us0UeTG1231n+9sVwjo0oVorc73ptlG7eC9Lurs+1WMGG
   4.282 +avCFOMCXs9x3q7HLSCKaN8JcHcv81xZdH7YFWkcteLLuACeAmTSKvwQzdixc8NZA
   4.283 +zwxAeGKQZFcL3Z3NrHcRuh6VKXOsw8TwJysP1cc8+VSht0PbTecR35UFqH0CtdEr
   4.284 +d5c7cilT3ug2wJW8B3P/6HcsOfaq7SpnD/uxs1S5R8KxI2+oGoDXwqMeiSSvT3vf
   4.285 +Z/l+L3ZiWp+d9yWQdxdjirod3NrbhJueIYxmT3DC7dcCXbJXg71kFEBHZ8IeHvpr
   4.286 +M2kSU2o36nLkMmnjLQzh3n02chn6HWe4Db/Bi/FBOljAOqBBPFbp2e329xtHbG50
   4.287 +zGbTNpVUjg9xHOSo0rhyelxNQy3bnBQzIbzqPEh98CCUkmqFx1jiPtloVusNTMHo
   4.288 +XyM+8pu7GztVfvvztv8+XMUB4TPUkeuqVRm1kFAxh23gsnwyBB4rbGvOB84VYn2/
   4.289 +vyN42XUcIj6PS9ec2fnidAt7/SwZPP5C/FfqbweN41+ZPUIaqcpT9hXeiNYfxZhu
   4.290 +0bObzzdsjK3tIqlkpy7mnRLOUPu4ZLG0dA5ZHrtgr8+90YtFFnKO9SNmZYkqkhcb
   4.291 +tDPqaJlTscqx5KJq/d7j3hiQLzqrvbbi7y+3MbBGbPCB90OK2a+zcgXjl/UOes4A
   4.292 +cyh1juxPCbv+kMO3J5xx71Aub0hWtPkgoX0kJy5KRNqXjVtYnIMw8Zq2f8iiro3M
   4.293 +i1iIYn/DeXWvuDGx6E8C9ITaxXYvxsSddHCEjr8XQ7UUBViNHat8K47omkXDnGlx
   4.294 +0WHZFsMVuhZowv5vQBi79H7gBy6Y8pXRdZt1mDFQPqvjZVG5Aytd9QxDlg3z0Bde
   4.295 +uyjUyIWjFMU2YaA+uS7f5vL2hwHkQh55beq12FecJwu1gQZSPZiV/96jP4tu5Chp
   4.296 +17k7jZdtpF8YeJoDPu3I6T0w2pmEp8JUZ2mt6P4wzCcT/q6hDli0VACJSPbe5Bxe
   4.297 +CnKSdXHH7ErGCXFCp3lsx0RfRkCOBLfmphY6gqMSYVi7+eXj7dIglFtqYmVgga1T
   4.298 +d2uxQ33a9en14EFtNyfaeWMlLpsI6abRNVuvPSnNvcVQ2KVl0yILMjAcxcA0VrEZ
   4.299 +3BFnQ8DJeGY/dhw2hwPNkQT7K3Oj9V2245lG8zXvTvP64KShhVzSxvwipPBeRhWM
   4.300 +togK8hAX6x1gW9omgbxZFtk/KEOd9SEEhIkqiwgfDV25o39i1Cw762kQXPTPeDvw
   4.301 +caNCLKKCswvkRiocxgRGeEFFhCqjHErpKYNS9/cqz81GyL2Bs6S3v4QTuwbINSm9
   4.302 +yinpmOgd7CVinxEpH6XFm0a1QY6vSBgq8rMoZAs4c9SjrXnVe7MazYzPRkjTwTx4
   4.303 +NPUFNaMvyrR3Kj9SQMLfFt2PFH3d34x2oO9+X2ovaC2EsAJZ4zG0hQGzJIJ2o9Zi
   4.304 +j26nT3t7UINYJjwMgXHylmr9JXMLgqJtAKSnIIuM7LsXh994N5lRpD7DEbUGc1Qv
   4.305 +lDkFxiHAw4SchJGD3AEK24D9eoaT7TyWAEQ20UI8UX3uDrCEoOhhRDio0SmS2pCR
   4.306 +wqWT/MkQE2NLanzXMXicu/aLHmhKJ1dRq4JTIbzwosn2r0fFiLfcZA9Q9QVqXiI2
   4.307 +zy8j+rFPyZNTIejwuQ2bMhHsbakJjpztb9clksB8ZOt2dSd8CSkf/NNqFoUOAzqs
   4.308 +/OPjzybhjTq7u7Wd8bWfhfvItfgeLtXagufEtv9/cdKkmzec866ANetxS4BeND6W
   4.309 +XRWgMze2zKPxixegEku9e3lsjPkKp8fYHixXgReTEWKFtafALtVIqU5AOMMEsL99
   4.310 +t6lhGJ7SaMba5dNng6uxOTe+8ZfOjSoyoPB3M2EUsjco/NvEu4v7eXICqsBtRZSP
   4.311 +vKXbyNJs9yUGCFQrLWS1g4lpA41xJfy8VT+UVtyBK22CikPIQhU0tk2vAxO+izPa
   4.312 +atwjbzP6WFPOF/EyOH6MQU+t7HARxjCcubQGV1tKXW9NZUQtMsxhDhZdxhyTg6sC
   4.313 +/HRdiZQKGMRhdTqo+aOlEpPuQUlx3tHn7wWtJzxaFBAyzZblPVcoS08lPrZvZiKD
   4.314 +AqLyCla+Wi+TSqJiy9cOeu/96xeNVxsSOWJg0Vu2QbWPAmfdQ2AsgfMAlZT9PLQw
   4.315 +IyfAM9DpXZPLA8gMUUW6MZ2X6L7aNXyxSrlT3/TwKRPJ7iiLyAleCVt69+r5AKZL
   4.316 +kV7Wu7vTvuU5x8xLxMpRQwCBcPIIonYl9xYYLzVWHYWk8T7vALNEJe+YliRpzvCj
   4.317 +RYe7Ck5r64abHtVT4LDWawmp6tO0StMbWZ8YXMqcQfCqUkO8Z1aASKqdjCE8OMeg
   4.318 +dCOs6HeffKSjqofXtpos13l7M+lPcHjMEATcFqI/ICqYvUbuv9Ka6NrlTNpkBd3h
   4.319 +vmUd9EFLGAUJaUIAvFQRnJjH0ZCLc3PjeYNB0xBPRWKzfAkV41qrqzpkwuCu/fil
   4.320 +0KYpl5erDqMh+IYUIWDLZ1IBFxMh4fHAl1qikbC+CvwGdf80WROBcRgzLnDFgEa4
   4.321 +asdZ2Ql31ErWLZvWbaJK5XdPzgU61OXyH1vEddU1/r+sSIzG3YqKx7dVef/dqr5Z
   4.322 +QTIwwfkkZoGlUVS2de5UQ9gyDdpdUx36Tfq2LLWtXYF79uU6jMT+Hi/d+dPAz44G
   4.323 +m3jHdhTR6us7XPj9OOw7wa0n+Xz5eTpXwga8dyPPT7Z+5KF3PS3hgX9ombRk2b2K
   4.324 +8Y9hxVVA/t5gZOvZKmn+W2IJs7ici6qV6b8pOnAvePu1lmBDEspm+CMQyWGeWQUG
   4.325 +/puJj4URxm+dXjl5Y0lyjHqOt+9a/+kSBO0GNVE70PQXJtcPU/XFRj5msbr04b2y
   4.326 +YpSbfyTXBegWJkUHRlgKD/n4G7to23kQT2Azk93WOy1vIaiSPURbpFslB1Gecayv
   4.327 +nWiLkRXzcu+jlWQxpDpOTReClZqFXt1Sh2YnDYLhfcTctBCpnyDM8E/AV1/I22sZ
   4.328 +/6GiLI9and4Uy7D5VkGc6BYh4fAVUWo+Gjobzx850Gb4BOnfkL34MQ8ZiYGTCNO/
   4.329 +HSQNnsVeK8ggIM7F/8FDWYZIB8m3Vt2X5KLJ5GswOhQQleBeX9ssh0QOLrtzBfVb
   4.330 +lbEkGB8aZ3P/yJQXNoEULSmhk/qRdniI5eqD49+JH4dF2Jbxs3UZjbt7pnHQCzcj
   4.331 +66u6f2mwfxbiw5AO0KzmABW6otUuK4x622F/vsHGqnGGFExiWIOgTDKBy2LzHOUt
   4.332 +8ic73twNvA==
   4.333 +=lEzO
   4.334 +-----END PGP MESSAGE-----
   4.335 +
   4.336 +--238e1f2946e87ccd3d1b58ba507ed7ab--